# AI Skills (/docs/ai-skills)
# AI Skills for Claude Code, OpenCode, Codex and Gemini [#ai-skills-for-claude-code-opencode-codex-and-gemini]
CCXT provides skills for Claude Code, OpenCode, Codex, Gemini and other AI coding assistants — one per supported language, plus skills for the CCXT CLI and the CCXT MCP server. These skills help developers quickly learn and use CCXT in their projects with comprehensive guides, code examples, and an API reference.
> Looking to let an AI agent **call exchanges directly** (fetch market data, check balances, place orders) rather than help you write code? See the [MCP Server](/docs/mcp) — the official CCXT Model Context Protocol server for Claude Desktop, Claude Code, Cursor, VS Code, and other MCP hosts.
## What are CCXT Skills? [#what-are-ccxt-skills]
Skills are interactive documentation modules that AI coding assistants (like Claude Code, OpenCode, Codex and Gemini) can load to provide context-aware help when working with CCXT. When you ask questions about CCXT, the AI assistant uses these skills to give accurate, detailed answers with working code examples.
### What's Included [#whats-included]
Each **language** skill includes:
* **Broad API reference** - the most-used unified methods documented with descriptions, grouped by market data, trading, account, derivatives and WebSocket
* **Installation guides** - Package manager commands for each language
* **Code examples** - Working, runnable examples throughout, in that skill's own language
* **REST & WebSocket APIs** - Both standard and real-time APIs covered
* **Best practices** - Error handling, rate limiting, authentication patterns
* **Common pitfalls** - Language-specific mistakes to avoid
* **Troubleshooting guides** - Solutions to common issues and error messages
The `ccxt-cli` and `ccxt-mcp` skills are scoped to their tool instead: installation and configuration, the commands or tools available, authentication, safety rails and troubleshooting.
## Available Skills [#available-skills]
Seven language-specific skills are available:
| Skill | Language | Coverage |
| ------------------- | --------------------- | ---------------------------------------------------------- |
| **ccxt-typescript** | TypeScript/JavaScript | Node.js, browser, REST & WebSocket |
| **ccxt-python** | Python | Sync, async, asyncio, REST & WebSocket |
| **ccxt-php** | PHP | Sync, async (ReactPHP), REST & WebSocket |
| **ccxt-csharp** | C#/.NET | .NET Standard 2.0+, REST & WebSocket |
| **ccxt-go** | Go | REST & WebSocket |
| **ccxt-java** | Java | Java 21+, typed subclasses, sync & async, REST & WebSocket |
| **ccxt-rust** | Rust | Async (tokio), typed wrappers, REST & WebSocket |
Each skill is tailored to the specific language with appropriate idioms, naming conventions, and best practices.
Two further skills cover CCXT tooling rather than a language:
| Skill | Covers |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **ccxt-cli** | The `ccxt-cli` npm package — calling any unified method from the terminal, argument and `--param` rules, API keys, sandbox/demo modes, live WebSocket tickers and orderbooks, OHLCV charts, `--raw` output for scripting |
| **ccxt-mcp** | Installing and configuring the [CCXT MCP server](/docs/mcp) — MCP hosts, named accounts and local API keys, capability tiers and safety rails, sandbox trading, and how to drive the tools |
`ccxt-mcp` is *documentation about* the MCP server, not the server itself. Install the **skill** to get help setting the server up; install the **server** ([MCP.md](/docs/mcp)) to let an agent actually call exchanges. `ccxt-mcp` has no individual installer flag or menu entry — it is installed by `--all` (the default when the script is piped from curl) or by copying it manually.
## Installation [#installation]
### Prerequisites [#prerequisites]
You need an AI coding assistant that loads skills — [Claude Code](https://claude.ai/download), [OpenCode](https://opencode.ai/), Codex or Gemini — installed on your system.
### Quick Install (Recommended) [#quick-install-recommended]
Install all skills with a single command using the [skills CLI](https://github.com/vercel-labs/skills):
```sh
npx skills add ccxt/ccxt
```
This works with Claude Code, Cursor, Copilot, Windsurf, Codex, and 30+ other AI coding assistants.
### Alternative: Shell Script [#alternative-shell-script]
```sh
curl -fsSL https://raw.githubusercontent.com/ccxt/ccxt/master/install-skills.sh | sh
# or
curl -fsSL https://raw.githubusercontent.com/ccxt/ccxt/master/install-skills.sh | sh -s -- --all
# or
curl -fsSL https://raw.githubusercontent.com/ccxt/ccxt/master/install-skills.sh | sh -s -- --typescript
```
This downloads and installs the CCXT usage skills to your system.
### From Repository [#from-repository]
If you have the CCXT repository cloned, you can use these options:
#### Option 1: Interactive Installation (Recommended) [#option-1-interactive-installation-recommended]
```sh
./install-skills.sh
```
This will present an interactive menu where you can choose which skills to install:
```
Select which skills to install:
1) ccxt-typescript - TypeScript/JavaScript (Node.js & browser, REST & WebSocket)
2) ccxt-python - Python (sync & async, REST & WebSocket)
3) ccxt-php - PHP (sync & async, REST & WebSocket)
4) ccxt-csharp - C#/.NET (REST & WebSocket)
5) ccxt-go - Go (REST & WebSocket)
6) ccxt-java - Java (Java 21+, REST & WebSocket)
7) ccxt-rust - Rust (async/tokio, REST & WebSocket)
8) ccxt-cli - Command-line interface (terminal, no code)
9) All skills - Install all of the above
10) Exit - Cancel installation
Enter your choice (1-10):
```
#### Option 2: Install All Skills [#option-2-install-all-skills]
```sh
./install-skills.sh --all
```
#### Option 3: Install Specific Languages [#option-3-install-specific-languages]
```sh
# Install single skill
./install-skills.sh --typescript
# Install multiple skills
./install-skills.sh --python --go
# Install with flags
./install-skills.sh --typescript --php --csharp
```
Available flags: `--typescript`, `--python`, `--php`, `--csharp`, `--go`, `--java`, `--rust`, `--cli`, plus `--all` for everything and `--remote` to pull from GitHub even inside a clone.
### Installation Locations [#installation-locations]
Skills are installed to:
* `~/.claude/skills/` (for Claude Code)
* `~/.opencode/skills/` (for OpenCode)
* `~/skills/` (for Codex)
* `~/.gemini/skills/` (for Gemini)
The installation script writes to all four locations unconditionally, creating any directory that does not exist yet.
## Usage with AI Assistants [#usage-with-ai-assistants]
### Invoking Skills [#invoking-skills]
Once installed, you can invoke skills directly in Claude Code, OpenCode, Codex or Gemini:
```
/ccxt-typescript
/ccxt-python
/ccxt-php
/ccxt-csharp
/ccxt-go
/ccxt-java
/ccxt-rust
/ccxt-cli
/ccxt-mcp
```
The AI assistant will load the skill and be ready to answer questions about CCXT in that language.
### Asking Questions [#asking-questions]
You don't need to explicitly invoke skills - just ask natural questions:
**Basic usage:**
* "How do I install CCXT in Python?"
* "Show me how to fetch a ticker in TypeScript"
* "How do I connect to Binance using API keys in Go?"
**Specific features:**
* "How do I create a stop-loss order in JavaScript?"
* "Show me how to watch live orderbook updates in Python"
* "What's the difference between fetchTicker and watchTicker?"
* "How do I handle RateLimitExceeded errors in PHP?"
**Advanced topics:**
* "How do I set leverage for futures trading in C#?"
* "Show me how to fetch funding rate history in TypeScript"
* "How do I create a trailing stop order in Python?"
* "What's the best way to handle WebSocket reconnections in Go?"
The AI assistant will automatically reference the appropriate skill to provide accurate answers with working code examples.
## What's Covered [#whats-covered]
The lists below reflect the TypeScript, Python, PHP, C# and Go skills, which document the fullest unified surface. `ccxt-rust` and especially `ccxt-java` cover a subset — see that skill's own *Complete Method Reference* section for exactly what it documents.
### Market Data Methods [#market-data-methods]
**Tickers & Prices:**
* `fetchTicker` - Get ticker for one symbol
* `fetchTickers` - Get multiple tickers at once
* `fetchBidsAsks` - Get best bid/ask prices
* `fetchMarkPrices` - Get mark prices for derivatives
* `fetchLastPrices` - Get last traded prices
**Order Books:**
* `fetchOrderBook` - Get full order book
* `fetchL2OrderBook` - Level 2 order book
* `fetchL3OrderBook` - Level 3 order book (unaggregated, order-by-order)
* WebSocket: `watchOrderBook` - Live order book updates
**Trades & History:**
* `fetchTrades` - Get public trade history
* `fetchMyTrades` - Get your trade history (authenticated)
* `fetchOHLCV` - Get candlestick/OHLCV data
* WebSocket: `watchTrades`, `watchOHLCV` - Live updates
### Trading Methods [#trading-methods]
**Order Types (20+ supported):**
* Market orders: `createMarketOrder`, `createMarketBuyOrder`, `createMarketSellOrder`
* Limit orders: `createLimitOrder`, `createLimitBuyOrder`, `createLimitSellOrder`
* Stop orders: `createStopLossOrder`, `createStopMarketOrder`, `createStopLimitOrder`
* Take profit: `createTakeProfitOrder`
* Trailing stops: `createTrailingAmountOrder`, `createTrailingPercentOrder`
* Advanced: `createPostOnlyOrder`, `createReduceOnlyOrder`, `createTriggerOrder`
* OCO orders: `createOrderWithTakeProfitAndStopLoss`
**Order Management:**
* `fetchOrder` - Get single order
* `fetchOrders` - Get all orders
* `fetchOpenOrders` - Get open orders
* `fetchClosedOrders` - Get closed orders
* `cancelOrder` - Cancel single order
* `cancelAllOrders` - Cancel all orders
* `editOrder` - Modify existing order
* WebSocket: `watchOrders` - Live order updates
### Account & Balance [#account--balance]
* `fetchBalance` - Get account balance
* `fetchAccounts` - Get all accounts associated with the profile
* `fetchLedger` - Get ledger history
* `fetchDeposits` - Get deposit history
* `fetchWithdrawals` - Get withdrawal history
* `fetchDepositsWithdrawals` - Get combined deposit and withdrawal history
* `fetchTransactions` - *deprecated*, use `fetchDepositsWithdrawals`
* WebSocket: `watchBalance` - Live balance updates
### Derivatives & Futures [#derivatives--futures]
**Positions:**
* `fetchPosition` - Get single position
* `fetchPositions` - Get all positions
* `closePosition` - Close a position
* `setPositionMode` - Set hedge/one-way mode
* WebSocket: `watchPositions` - Live position updates
**Margin & Leverage:**
* `fetchLeverage` - Get current leverage
* `setLeverage` - Set leverage
* `setMarginMode` - Set cross/isolated margin
* `borrowCrossMargin` / `borrowIsolatedMargin` - Borrow margin (cross or isolated)
* `repayCrossMargin` / `repayIsolatedMargin` - Repay borrowed margin (cross or isolated)
**Funding & Settlement:**
* `fetchFundingRate` - Get current funding rate
* `fetchFundingRateHistory` - Get funding rate history
* `fetchFundingHistory` - Get your funding payments
* `fetchSettlementHistory` - Get settlement history
**Open Interest & Liquidations:**
* `fetchOpenInterest` - Get open interest
* `fetchOpenInterestHistory` - Get OI history
* `fetchLiquidations` - Get public liquidations
* `fetchMyLiquidations` - Get your liquidations
**Options:**
* `fetchOption` - Get option information
* `fetchOptionChain` - Get option chain
* `fetchGreeks` - Get option greeks
* `fetchVolatilityHistory` - Get volatility history
### Deposits & Withdrawals [#deposits--withdrawals]
* `fetchDepositAddress` - Get deposit address
* `createDepositAddress` - Create new deposit address
* `withdraw` - Withdraw funds
* `fetchDeposit` - Get deposit info
* `fetchWithdrawal` - Get withdrawal info
### Fees & Limits [#fees--limits]
* `fetchTradingFee` - Get trading fee for symbol
* `fetchTradingFees` - Get trading fees
* `fetchTradingLimits` - Get trading limits
* `fetchDepositWithdrawFee` - Get deposit/withdrawal fees
### WebSocket Real-time Streaming [#websocket-real-time-streaming]
Many high-frequency `fetch*` methods have a streaming `watch*` counterpart. Most other `fetch*` methods are REST-only. Separately, some exchanges expose request/response calls over the WebSocket connection using a `Ws` suffix (`fetchBalanceWs`, `fetchOrderWs`, `createOrderWs`):
* `watchTicker` - Live ticker updates
* `watchTickers` - Live multiple ticker updates
* `watchOrderBook` - Live order book updates
* `watchTrades` - Live trade stream
* `watchOHLCV` - Live candlestick updates
* `watchBalance` - Live balance updates (auth required)
* `watchOrders` - Live order updates (auth required)
* `watchMyTrades` - Live trade updates (auth required)
* `watchPositions` - Live position updates (auth required)
* `watchBidsAsks` - Live best bid/ask updates
* `watchLiquidations` / `watchMyLiquidations` - Live liquidation stream
* `watchStatus` - Live exchange status updates
## Best Practices Covered [#best-practices-covered]
### Error Handling [#error-handling]
Each skill teaches proper exception handling:
* **NetworkError** - Recoverable errors (retry with backoff)
* **ExchangeError** - Non-recoverable errors (don't retry)
* **RateLimitExceeded** - Rate limit hit (wait and retry)
* **AuthenticationError** - Invalid API credentials
* **InsufficientFunds** - Not enough balance
* **InvalidOrder** - Invalid order parameters
### Rate Limiting [#rate-limiting]
Most skills cover both the built-in rate limiter and manual delays:
```
# The built-in rate limiter is ON by default - leave it on
exchange.enableRateLimit = true # set to false only if you throttle requests yourself
```
### Authentication [#authentication]
Secure API key handling:
```
# Use environment variables (recommended)
exchange.apiKey = process.env.EXCHANGE_API_KEY
exchange.secret = process.env.EXCHANGE_SECRET
```
### Method Availability [#method-availability]
Checking if an exchange supports a method:
```
if (exchange.has['fetchOHLCV']) {
// Method is supported
}
```
## Troubleshooting [#troubleshooting]
### Skills Not Showing Up [#skills-not-showing-up]
1. Verify installation location:
```sh
ls ~/.claude/skills/ccxt-*
ls ~/.opencode/skills/ccxt-*
ls ~/skills/ccxt-*
ls ~/.gemini/skills/ccxt-*
```
2. Restart your AI assistant (Claude Code, OpenCode, Codex or Gemini)
3. Re-run installation:
```sh
# from a CCXT clone
./install-skills.sh --all
# or, without a clone
curl -fsSL https://raw.githubusercontent.com/ccxt/ccxt/master/install-skills.sh | sh -s -- --all
```
### Getting "Skill Not Found" Error [#getting-skill-not-found-error]
Make sure you're using the correct skill name:
* `/ccxt-typescript` (not `/ccxt-ts` or `/typescript`)
* `/ccxt-python` (not `/ccxt-py` or `/python`)
* etc.
### AI Assistant Not Using Skills [#ai-assistant-not-using-skills]
The AI assistant automatically uses skills when you ask CCXT-related questions. You don't need to explicitly invoke them unless you want to.
## Manual Installation [#manual-installation]
If the installation script doesn't work, you can install manually:
```sh
# Copy every ccxt-* skill into each assistant's skills directory
for dir in ~/.claude/skills ~/.opencode/skills ~/skills ~/.gemini/skills; do
mkdir -p "$dir"
cp -r .claude/skills/ccxt-* "$dir/"
done
```
## Learn More [#learn-more]
* **Skills documentation**: `.claude/skills/README.md` in the CCXT repository
* **CCXT Manual**: [Manual.md](/docs/manual)
* **CCXT Pro**: [ccxt.pro.manual.md](/docs/pro-manual)
## Feedback [#feedback]
If you have suggestions for improving the skills or find issues:
1. Open an issue on [GitHub](https://github.com/ccxt/ccxt/issues)
2. Include "Skills:" in the title
3. Specify which language skill and what could be improved
The skills are actively maintained and updated alongside CCXT releases.
# API Spec by Method (/docs/base-spec)
## addMargin [#addmargin]
add margin
**Kind**: instance\
**Returns**: object - a [margin structure](/docs/manual#add-margin-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol |
| amount | float | Yes | amount of margin to add |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges]
* [aster](/docs/exchanges/aster#addmargin)
* [binance](/docs/exchanges/binance#addmargin)
* [bitget](/docs/exchanges/bitget#addmargin)
* [coinex](/docs/exchanges/coinex#addmargin)
* [delta](/docs/exchanges/delta#addmargin)
* [digifinex](/docs/exchanges/digifinex#addmargin)
* [gate](/docs/exchanges/gate#addmargin)
* [hashkey](/docs/exchanges/hashkey#addmargin)
* [hitbtc](/docs/exchanges/hitbtc#addmargin)
* [hyperliquid](/docs/exchanges/hyperliquid#addmargin)
* [kucoin](/docs/exchanges/kucoin#addmargin)
* [lighter](/docs/exchanges/lighter#addmargin)
* [mexc](/docs/exchanges/mexc#addmargin)
* [mudrex](/docs/exchanges/mudrex#addmargin)
* [okx](/docs/exchanges/okx#addmargin)
* [poloniex](/docs/exchanges/poloniex#addmargin)
* [weex](/docs/exchanges/weex#addmargin)
* [woo](/docs/exchanges/woo#addmargin)
* [woofipro](/docs/exchanges/woofipro#addmargin)
* [xt](/docs/exchanges/xt#addmargin)
* [zebpay](/docs/exchanges/zebpay#addmargin)
***
## borrowCrossMargin [#borrowcrossmargin]
create a loan to borrow margin
**Kind**: instance\
**Returns**: object - a [margin loan structure](/docs/manual#margin-loan-structure)
| Param | Type | Required | Description |
| ---------------------- | -------------------- | -------- | ---------------------------------------------------------------------------- |
| code | string | Yes | unified currency code of the currency to borrow |
| amount | float | Yes | the amount to borrow |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.portfolioMargin | boolean | No | set to true if you would like to borrow margin in a portfolio margin account |
##### Supported exchanges [#supported-exchanges-1]
* [binance](/docs/exchanges/binance#borrowcrossmargin)
* [bitget](/docs/exchanges/bitget#borrowcrossmargin)
* [bybit](/docs/exchanges/bybit#borrowcrossmargin)
* [gate](/docs/exchanges/gate#borrowcrossmargin)
* [htx](/docs/exchanges/htx#borrowcrossmargin)
* [kucoin](/docs/exchanges/kucoin#borrowcrossmargin)
* [okx](/docs/exchanges/okx#borrowcrossmargin)
***
## borrowIsolatedMargin [#borrowisolatedmargin]
create a loan to borrow margin
**Kind**: instance\
**Returns**: object - a [margin loan structure](/docs/manual#margin-loan-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol, required for isolated margin |
| code | string | Yes | unified currency code of the currency to borrow |
| amount | float | Yes | the amount to borrow |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-2]
* [binance](/docs/exchanges/binance#borrowisolatedmargin)
* [bitget](/docs/exchanges/bitget#borrowisolatedmargin)
* [coinex](/docs/exchanges/coinex#borrowisolatedmargin)
* [gate](/docs/exchanges/gate#borrowisolatedmargin)
* [htx](/docs/exchanges/htx#borrowisolatedmargin)
* [kucoin](/docs/exchanges/kucoin#borrowisolatedmargin)
***
## calculatePricePrecision [#calculatepriceprecision]
Helper function to calculate the Hyperliquid DECIMAL\_PLACES price precision
**Kind**: instance\
**Returns**: int - The calculated price precision
| Param | Type | Description |
| --------------- | ------------------ | --------------------------------------------- |
| price | float | the price to use in the calculation |
| amountPrecision | int | the amountPrecision to use in the calculation |
| maxDecimals | int | the maxDecimals to use in the calculation |
##### Supported exchanges [#supported-exchanges-3]
* [hyperliquid](/docs/exchanges/hyperliquid#calculatepriceprecision)
***
## cancelAllContractOrders [#cancelallcontractorders]
helper method for cancelling all contract orders
**Kind**: instance\
**Returns**: Response from the exchange
| Param | Type | Required | Description |
| -------------- | ------------------- | -------- | ---------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.trigger | object | No | When true, all the trigger orders will be cancelled |
##### Supported exchanges [#supported-exchanges-4]
* [kucoin](/docs/exchanges/kucoin#cancelallcontractorders)
***
## cancelAllOrders [#cancelallorders]
cancel all open orders in a market
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ---------------------------------------------------------------------------- |
| symbol | string | No | alpaca cancelAllOrders cannot setting symbol, it will cancel all open orders |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-5]
* [alpaca](/docs/exchanges/alpaca#cancelallorders)
* [apex](/docs/exchanges/apex#cancelallorders)
* [aster](/docs/exchanges/aster#cancelallorders)
* [backpack](/docs/exchanges/backpack#cancelallorders)
* [bigone](/docs/exchanges/bigone#cancelallorders)
* [binance](/docs/exchanges/binance#cancelallorders)
* [bingx](/docs/exchanges/bingx#cancelallorders)
* [bitfinex](/docs/exchanges/bitfinex#cancelallorders)
* [bitget](/docs/exchanges/bitget#cancelallorders)
* [bitmex](/docs/exchanges/bitmex#cancelallorders)
* [bitopro](/docs/exchanges/bitopro#cancelallorders)
* [bitrue](/docs/exchanges/bitrue#cancelallorders)
* [bitso](/docs/exchanges/bitso#cancelallorders)
* [bitstamp](/docs/exchanges/bitstamp#cancelallorders)
* [bitteam](/docs/exchanges/bitteam#cancelallorders)
* [bittrade](/docs/exchanges/bittrade#cancelallorders)
* [bitvavo](/docs/exchanges/bitvavo#cancelallorders)
* [blockchaincom](/docs/exchanges/blockchaincom#cancelallorders)
* [btse](/docs/exchanges/btse#cancelallorders)
* [bullish](/docs/exchanges/bullish#cancelallorders)
* [bybit](/docs/exchanges/bybit#cancelallorders)
* [bydfi](/docs/exchanges/bydfi#cancelallorders)
* [cex](/docs/exchanges/cex#cancelallorders)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#cancelallorders)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#cancelallorders)
* [coinex](/docs/exchanges/coinex#cancelallorders)
* [coinsph](/docs/exchanges/coinsph#cancelallorders)
* [cryptocom](/docs/exchanges/cryptocom#cancelallorders)
* [deepcoin](/docs/exchanges/deepcoin#cancelallorders)
* [delta](/docs/exchanges/delta#cancelallorders)
* [deribit](/docs/exchanges/deribit#cancelallorders)
* [derive](/docs/exchanges/derive#cancelallorders)
* [extended](/docs/exchanges/extended#cancelallorders)
* [foxbit](/docs/exchanges/foxbit#cancelallorders)
* [gate](/docs/exchanges/gate#cancelallorders)
* [grvt](/docs/exchanges/grvt#cancelallorders)
* [hashkey](/docs/exchanges/hashkey#cancelallorders)
* [hibachi](/docs/exchanges/hibachi#cancelallorders)
* [hitbtc](/docs/exchanges/hitbtc#cancelallorders)
* [hollaex](/docs/exchanges/hollaex#cancelallorders)
* [htx](/docs/exchanges/htx#cancelallorders)
* [kraken](/docs/exchanges/kraken#cancelallorders)
* [krakenfutures](/docs/exchanges/krakenfutures#cancelallorders)
* [kucoin](/docs/exchanges/kucoin#cancelallorders)
* [latoken](/docs/exchanges/latoken#cancelallorders)
* [lbank](/docs/exchanges/lbank#cancelallorders)
* [lighter](/docs/exchanges/lighter#cancelallorders)
* [mexc](/docs/exchanges/mexc#cancelallorders)
* [modetrade](/docs/exchanges/modetrade#cancelallorders)
* [nado](/docs/exchanges/nado#cancelallorders)
* [ndax](/docs/exchanges/ndax#cancelallorders)
* [onetrading](/docs/exchanges/onetrading#cancelallorders)
* [pacifica](/docs/exchanges/pacifica#cancelallorders)
* [paradex](/docs/exchanges/paradex#cancelallorders)
* [phemex](/docs/exchanges/phemex#cancelallorders)
* [poloniex](/docs/exchanges/poloniex#cancelallorders)
* [revolutx](/docs/exchanges/revolutx#cancelallorders)
* [toobit](/docs/exchanges/toobit#cancelallorders)
* [weex](/docs/exchanges/weex#cancelallorders)
* [whitebit](/docs/exchanges/whitebit#cancelallorders)
* [woo](/docs/exchanges/woo#cancelallorders)
* [woofipro](/docs/exchanges/woofipro#cancelallorders)
* [xt](/docs/exchanges/xt#cancelallorders)
* [zebpay](/docs/exchanges/zebpay#cancelallorders)
***
## cancelAllOrdersAfter [#cancelallordersafter]
dead man's switch, cancel all orders after the given timeout
**Kind**: instance\
**Returns**: object - the api result
| Param | Type | Required | Description |
| -------------- | ------------------- | -------- | ----------------------------------------------------------------------- |
| timeout | number | Yes | time in milliseconds, 0 represents cancel the timer |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.type | string | No | spot or swap market |
| params.subType | string | No | 'linear' or 'inverse' (default is 'linear'), 'inverse' is not supported |
##### Supported exchanges [#supported-exchanges-6]
* [bingx](/docs/exchanges/bingx#cancelallordersafter)
* [bitmex](/docs/exchanges/bitmex#cancelallordersafter)
* [bitvavo](/docs/exchanges/bitvavo#cancelallordersafter)
* [btse](/docs/exchanges/btse#cancelallordersafter)
* [bybit](/docs/exchanges/bybit#cancelallordersafter)
* [extended](/docs/exchanges/extended#cancelallordersafter)
* [htx](/docs/exchanges/htx#cancelallordersafter)
* [hyperliquid](/docs/exchanges/hyperliquid#cancelallordersafter)
* [kraken](/docs/exchanges/kraken#cancelallordersafter)
* [krakenfutures](/docs/exchanges/krakenfutures#cancelallordersafter)
* [lighter](/docs/exchanges/lighter#cancelallordersafter)
* [okx](/docs/exchanges/okx#cancelallordersafter)
* [whitebit](/docs/exchanges/whitebit#cancelallordersafter)
* [woo](/docs/exchanges/woo#cancelallordersafter)
***
## cancelAllOrdersWs [#cancelallordersws]
cancel all open orders in a market
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------- |
| symbol | string | No | unified market symbol of the market to cancel orders in |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-7]
* [binance](/docs/exchanges/binance#cancelallordersws)
* [bitvavo](/docs/exchanges/bitvavo#cancelallordersws)
* [cryptocom](/docs/exchanges/cryptocom#cancelallordersws)
* [gate](/docs/exchanges/gate#cancelallordersws)
* [lighter](/docs/exchanges/lighter#cancelallordersws)
* [nado](/docs/exchanges/nado#cancelallordersws)
* [okx](/docs/exchanges/okx#cancelallordersws)
* [pacifica](/docs/exchanges/pacifica#cancelallordersws)
***
## cancelAllSpotOrders [#cancelallspotorders]
helper method for cancelling all spot orders
**Kind**: instance\
**Returns**: Response from the exchange
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | ---------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.trigger | bool | No | *invalid for isolated margin* true if cancelling all stop orders |
| params.marginMode | string | No | 'cross' or 'isolated' |
| params.orderIds | string | No | *stop orders only* Comma separated order IDs |
| params.hf | bool | No | false, // true for hf order |
##### Supported exchanges [#supported-exchanges-8]
* [kucoin](/docs/exchanges/kucoin#cancelallspotorders)
***
## cancelAllUtaOrders [#cancelallutaorders]
helper method for cancelling all uta orders
**Kind**: instance\
**Returns**: Response from the exchange
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | ---------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.trigger | bool | No | true if cancelling all stop orders |
| params.marginMode | string | No | 'CROSS' or 'ISOLATED' |
##### Supported exchanges [#supported-exchanges-9]
* [kucoin](/docs/exchanges/kucoin#cancelallutaorders)
***
## cancelContractOrder [#cancelcontractorder]
helper method for cancelling contract orders
**Kind**: instance\
**Returns**: object - An [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| symbol | string | Yes | unified symbol of the market the order was made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.clientOrderId | string | No | cancel order by client order id |
##### Supported exchanges [#supported-exchanges-10]
* [kucoin](/docs/exchanges/kucoin#cancelcontractorder)
***
## cancelOrder [#cancelorder]
cancels an open order
**Kind**: instance\
**Returns**: object - An [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| symbol | string | Yes | unified symbol of the market the order was made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-11]
* [alpaca](/docs/exchanges/alpaca#cancelorder)
* [apex](/docs/exchanges/apex#cancelorder)
* [aster](/docs/exchanges/aster#cancelorder)
* [backpack](/docs/exchanges/backpack#cancelorder)
* [bigone](/docs/exchanges/bigone#cancelorder)
* [binance](/docs/exchanges/binance#cancelorder)
* [bingx](/docs/exchanges/bingx#cancelorder)
* [bit2c](/docs/exchanges/bit2c#cancelorder)
* [bitbank](/docs/exchanges/bitbank#cancelorder)
* [bitbns](/docs/exchanges/bitbns#cancelorder)
* [bitfinex](/docs/exchanges/bitfinex#cancelorder)
* [bitflyer](/docs/exchanges/bitflyer#cancelorder)
* [bitget](/docs/exchanges/bitget#cancelorder)
* [bithumb](/docs/exchanges/bithumb#cancelorder)
* [bitmex](/docs/exchanges/bitmex#cancelorder)
* [bitopro](/docs/exchanges/bitopro#cancelorder)
* [bitrue](/docs/exchanges/bitrue#cancelorder)
* [bitso](/docs/exchanges/bitso#cancelorder)
* [bitstamp](/docs/exchanges/bitstamp#cancelorder)
* [bitteam](/docs/exchanges/bitteam#cancelorder)
* [bittrade](/docs/exchanges/bittrade#cancelorder)
* [bitvavo](/docs/exchanges/bitvavo#cancelorder)
* [blockchaincom](/docs/exchanges/blockchaincom#cancelorder)
* [blofin](/docs/exchanges/blofin#cancelorder)
* [btcbox](/docs/exchanges/btcbox#cancelorder)
* [btcmarkets](/docs/exchanges/btcmarkets#cancelorder)
* [btcturk](/docs/exchanges/btcturk#cancelorder)
* [btse](/docs/exchanges/btse#cancelorder)
* [bullish](/docs/exchanges/bullish#cancelorder)
* [bybit](/docs/exchanges/bybit#cancelorder)
* [cex](/docs/exchanges/cex#cancelorder)
* [coinbase](/docs/exchanges/coinbase#cancelorder)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#cancelorder)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#cancelorder)
* [coincheck](/docs/exchanges/coincheck#cancelorder)
* [coinex](/docs/exchanges/coinex#cancelorder)
* [coinmate](/docs/exchanges/coinmate#cancelorder)
* [coinone](/docs/exchanges/coinone#cancelorder)
* [coinsph](/docs/exchanges/coinsph#cancelorder)
* [coinspot](/docs/exchanges/coinspot#cancelorder)
* [cryptocom](/docs/exchanges/cryptocom#cancelorder)
* [cryptomus](/docs/exchanges/cryptomus#cancelorder)
* [deepcoin](/docs/exchanges/deepcoin#cancelorder)
* [delta](/docs/exchanges/delta#cancelorder)
* [deribit](/docs/exchanges/deribit#cancelorder)
* [derive](/docs/exchanges/derive#cancelorder)
* [digifinex](/docs/exchanges/digifinex#cancelorder)
* [dydx](/docs/exchanges/dydx#cancelorder)
* [extended](/docs/exchanges/extended#cancelorder)
* [foxbit](/docs/exchanges/foxbit#cancelorder)
* [gate](/docs/exchanges/gate#cancelorder)
* [gemini](/docs/exchanges/gemini#cancelorder)
* [grvt](/docs/exchanges/grvt#cancelorder)
* [hashkey](/docs/exchanges/hashkey#cancelorder)
* [hibachi](/docs/exchanges/hibachi#cancelorder)
* [hitbtc](/docs/exchanges/hitbtc#cancelorder)
* [hollaex](/docs/exchanges/hollaex#cancelorder)
* [htx](/docs/exchanges/htx#cancelorder)
* [hyperliquid](/docs/exchanges/hyperliquid#cancelorder)
* [independentreserve](/docs/exchanges/independentreserve#cancelorder)
* [indodax](/docs/exchanges/indodax#cancelorder)
* [kraken](/docs/exchanges/kraken#cancelorder)
* [krakenfutures](/docs/exchanges/krakenfutures#cancelorder)
* [kucoin](/docs/exchanges/kucoin#cancelorder)
* [latoken](/docs/exchanges/latoken#cancelorder)
* [lbank](/docs/exchanges/lbank#cancelorder)
* [lighter](/docs/exchanges/lighter#cancelorder)
* [luno](/docs/exchanges/luno#cancelorder)
* [mercado](/docs/exchanges/mercado#cancelorder)
* [mexc](/docs/exchanges/mexc#cancelorder)
* [modetrade](/docs/exchanges/modetrade#cancelorder)
* [mudrex](/docs/exchanges/mudrex#cancelorder)
* [nado](/docs/exchanges/nado#cancelorder)
* [ndax](/docs/exchanges/ndax#cancelorder)
* [okx](/docs/exchanges/okx#cancelorder)
* [onetrading](/docs/exchanges/onetrading#cancelorder)
* [p2b](/docs/exchanges/p2b#cancelorder)
* [pacifica](/docs/exchanges/pacifica#cancelorder)
* [paradex](/docs/exchanges/paradex#cancelorder)
* [paymium](/docs/exchanges/paymium#cancelorder)
* [phemex](/docs/exchanges/phemex#cancelorder)
* [revolutx](/docs/exchanges/revolutx#cancelorder)
* [tokocrypto](/docs/exchanges/tokocrypto#cancelorder)
* [toobit](/docs/exchanges/toobit#cancelorder)
* [upbit](/docs/exchanges/upbit#cancelorder)
* [weex](/docs/exchanges/weex#cancelorder)
* [whitebit](/docs/exchanges/whitebit#cancelorder)
* [woo](/docs/exchanges/woo#cancelorder)
* [woofipro](/docs/exchanges/woofipro#cancelorder)
* [xt](/docs/exchanges/xt#cancelorder)
* [zaif](/docs/exchanges/zaif#cancelorder)
* [zebpay](/docs/exchanges/zebpay#cancelorder)
***
## cancelOrderWs [#cancelorderws]
cancel multiple orders
**Kind**: instance\
**Returns**: object - an list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------------------------- | ------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| id | string | Yes | order id |
| symbol | string | No | unified market symbol, default is undefined |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.cancelRestrictions | string, undefined | No | Supported values: ONLY\_NEW - Cancel will succeed if the order status is NEW. ONLY\_PARTIALLY\_FILLED - Cancel will succeed if order status is PARTIALLY\_FILLED. |
| params.trigger | boolean | No | set to true if you would like to cancel a conditional order |
##### Supported exchanges [#supported-exchanges-12]
* [binance](/docs/exchanges/binance#cancelorderws)
* [bitvavo](/docs/exchanges/bitvavo#cancelorderws)
* [bybit](/docs/exchanges/bybit#cancelorderws)
* [cex](/docs/exchanges/cex#cancelorderws)
* [cryptocom](/docs/exchanges/cryptocom#cancelorderws)
* [gate](/docs/exchanges/gate#cancelorderws)
* [hyperliquid](/docs/exchanges/hyperliquid#cancelorderws)
* [lighter](/docs/exchanges/lighter#cancelorderws)
* [nado](/docs/exchanges/nado#cancelorderws)
* [okx](/docs/exchanges/okx#cancelorderws)
* [pacifica](/docs/exchanges/pacifica#cancelorderws)
***
## cancelOrders [#cancelorders]
cancel multiple orders
**Kind**: instance\
**Returns**: object - an list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ---------------------------- | --------------------------- | -------- | --------------------------------------------------------------------------------------------- |
| ids | Array\ | Yes | order ids |
| symbol | string | No | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint EXCHANGE SPECIFIC PARAMETERS |
| params.origClientOrderIdList | Array\ | No | max length 10 e.g. \["my\_id\_1","my\_id\_2"], encode the double quotes. No space after comma |
| params.recvWindow | Array\ | No | |
##### Supported exchanges [#supported-exchanges-13]
* [aster](/docs/exchanges/aster#cancelorders)
* [binance](/docs/exchanges/binance#cancelorders)
* [bingx](/docs/exchanges/bingx#cancelorders)
* [bitfinex](/docs/exchanges/bitfinex#cancelorders)
* [bitget](/docs/exchanges/bitget#cancelorders)
* [bithumb](/docs/exchanges/bithumb#cancelorders)
* [bitmex](/docs/exchanges/bitmex#cancelorders)
* [bitopro](/docs/exchanges/bitopro#cancelorders)
* [bitso](/docs/exchanges/bitso#cancelorders)
* [bittrade](/docs/exchanges/bittrade#cancelorders)
* [blofin](/docs/exchanges/blofin#cancelorders)
* [btcmarkets](/docs/exchanges/btcmarkets#cancelorders)
* [bybit](/docs/exchanges/bybit#cancelorders)
* [coinbase](/docs/exchanges/coinbase#cancelorders)
* [coinex](/docs/exchanges/coinex#cancelorders)
* [cryptocom](/docs/exchanges/cryptocom#cancelorders)
* [deepcoin](/docs/exchanges/deepcoin#cancelorders)
* [digifinex](/docs/exchanges/digifinex#cancelorders)
* [dydx](/docs/exchanges/dydx#cancelorders)
* [extended](/docs/exchanges/extended#cancelorders)
* [gate](/docs/exchanges/gate#cancelorders)
* [hashkey](/docs/exchanges/hashkey#cancelorders)
* [hibachi](/docs/exchanges/hibachi#cancelorders)
* [htx](/docs/exchanges/htx#cancelorders)
* [hyperliquid](/docs/exchanges/hyperliquid#cancelorders)
* [kraken](/docs/exchanges/kraken#cancelorders)
* [krakenfutures](/docs/exchanges/krakenfutures#cancelorders)
* [kucoin](/docs/exchanges/kucoin#cancelorders)
* [mexc](/docs/exchanges/mexc#cancelorders)
* [modetrade](/docs/exchanges/modetrade#cancelorders)
* [nado](/docs/exchanges/nado#cancelorders)
* [okx](/docs/exchanges/okx#cancelorders)
* [onetrading](/docs/exchanges/onetrading#cancelorders)
* [pacifica](/docs/exchanges/pacifica#cancelorders)
* [paradex](/docs/exchanges/paradex#cancelorders)
* [toobit](/docs/exchanges/toobit#cancelorders)
* [weex](/docs/exchanges/weex#cancelorders)
* [woofipro](/docs/exchanges/woofipro#cancelorders)
* [xt](/docs/exchanges/xt#cancelorders)
***
## cancelOrdersForSymbols [#cancelordersforsymbols]
cancel multiple orders for multiple symbols
**Kind**: instance\
**Returns**: object - an list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ---------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------- |
| orders | Array\ | Yes | list of order ids with symbol, example \[\{"id": "a", "symbol": "BTC/USDT"}, \{"id": "b", "symbol": "ETH/USDT"}] |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-14]
* [bybit](/docs/exchanges/bybit#cancelordersforsymbols)
* [cryptocom](/docs/exchanges/cryptocom#cancelordersforsymbols)
* [gate](/docs/exchanges/gate#cancelordersforsymbols)
* [hyperliquid](/docs/exchanges/hyperliquid#cancelordersforsymbols)
* [okx](/docs/exchanges/okx#cancelordersforsymbols)
***
## cancelOrdersRequest [#cancelordersrequest]
build the request payload for cancelling multiple orders
**Kind**: instance\
**Returns**: object - the raw request object to be sent to the exchange
| Param | Type | Required | Description |
| ------ | --------------------------- | -------- | --------------------- |
| ids | Array\ | Yes | order ids |
| symbol | string | Yes | unified market symbol |
| params | object | No | |
##### Supported exchanges [#supported-exchanges-15]
* [hyperliquid](/docs/exchanges/hyperliquid#cancelordersrequest)
***
## cancelOrdersWs [#cancelordersws]
cancel multiple orders
**Kind**: instance\
**Returns**: object - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | --------------------------- | -------- | ------------------------------------------------------ |
| ids | Array\ | Yes | order ids |
| symbol | string | Yes | not used by cancelOrders() |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-16]
* [cex](/docs/exchanges/cex#cancelordersws)
* [hyperliquid](/docs/exchanges/hyperliquid#cancelordersws)
* [nado](/docs/exchanges/nado#cancelordersws)
* [okx](/docs/exchanges/okx#cancelordersws)
* [pacifica](/docs/exchanges/pacifica#cancelordersws)
***
## cancelSpotOrder [#cancelspotorder]
helper method for cancelling spot orders
**Kind**: instance\
**Returns**: Response from the exchange
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| symbol | string | Yes | unified symbol of the market the order was made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.trigger | bool | No | True if cancelling a stop order |
| params.hf | bool | No | false, // true for hf order |
| params.sync | bool | No | false, // true to use the hf sync call |
| params.marginMode | string | No | 'cross' or 'isolated' |
##### Supported exchanges [#supported-exchanges-17]
* [kucoin](/docs/exchanges/kucoin#cancelspotorder)
***
## cancelTwapOrder [#canceltwaporder]
cancels a running twap order
**Kind**: instance\
**Returns**: object - An [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------------------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| symbol | string | Yes | unified symbol of the market the order was made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.expiresAfter | int | No | time in ms after which the twap order expires |
| params.vaultAddress | string | No | the vault address for order |
##### Supported exchanges [#supported-exchanges-18]
* [hyperliquid](/docs/exchanges/hyperliquid#canceltwaporder)
***
## cancelUtaOrder [#cancelutaorder]
helper method for cancelling uta orders
**Kind**: instance\
**Returns**: Response from the exchange
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | ----------------------------------------------------------------------------------------------------------- |
| id | string | Yes | order id |
| symbol | string | Yes | unified symbol of the market the order was made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.accountMode | string | No | 'unified' or 'classic' (default is 'unified') |
| params.clientOrderId | string | No | client order id, required if id is not provided |
| params.marginMode | string | No | 'cross' or 'isolated', required if fetching a margin order (unified accountMode supports only cross margin) |
##### Supported exchanges [#supported-exchanges-19]
* [kucoin](/docs/exchanges/kucoin#cancelutaorder)
***
## closeAllPositions [#closeallpositions]
closes all open positions for a market type
**Kind**: instance\
**Returns**: Array\ - A list of [position structures](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ------------------ | -------------------- | -------- | --------------------------------------------------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.productType | string | No | 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES' |
| params.uta | boolean | No | set to true for the unified trading account (uta), defaults to false |
##### Supported exchanges [#supported-exchanges-20]
* [bitget](/docs/exchanges/bitget#closeallpositions)
* [delta](/docs/exchanges/delta#closeallpositions)
* [mexc](/docs/exchanges/mexc#closeallpositions)
* [weex](/docs/exchanges/weex#closeallpositions)
***
## closePosition [#closeposition]
closes open positions for a market
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ----------------- | ------------------------------------------- | -------- | ------------------------------------------------------------------------------ |
| symbol | string | Yes | Unified CCXT market symbol |
| side | string | No | not used by bingx |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.positionId | string, undefined | No | the id of the position you would like to close, only supported for linear swap |
##### Supported exchanges [#supported-exchanges-21]
* [bingx](/docs/exchanges/bingx#closeposition)
* [bitget](/docs/exchanges/bitget#closeposition)
* [bitmex](/docs/exchanges/bitmex#closeposition)
* [blofin](/docs/exchanges/blofin#closeposition)
* [btse](/docs/exchanges/btse#closeposition)
* [coinbase](/docs/exchanges/coinbase#closeposition)
* [coinex](/docs/exchanges/coinex#closeposition)
* [deepcoin](/docs/exchanges/deepcoin#closeposition)
* [gate](/docs/exchanges/gate#closeposition)
* [hitbtc](/docs/exchanges/hitbtc#closeposition)
* [htx](/docs/exchanges/htx#closeposition)
* [kucoin](/docs/exchanges/kucoin#closeposition)
* [mudrex](/docs/exchanges/mudrex#closeposition)
* [okx](/docs/exchanges/okx#closeposition)
* [weex](/docs/exchanges/weex#closeposition)
* [zebpay](/docs/exchanges/zebpay#closeposition)
***
## closePositions [#closepositions]
closes open positions for a market
**Kind**: instance\
**Returns**: Array\ - [a list of position structures](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.recvWindow | string | No | request valid time window value |
##### Supported exchanges [#supported-exchanges-22]
* [bitget](/docs/exchanges/bitget#closepositions)
* [cryptocom](/docs/exchanges/cryptocom#closepositions)
***
## createAccount [#createaccount]
creates a sub-account under the main account
**Kind**: instance\
**Returns**: object - a response object
| Param | Type | Required | Description |
| ------------------- | ------------------- | -------- | ------------------------------------------------------ |
| name | string | Yes | the name of the sub-account |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.expiresAfter | int | No | time in ms after which the sub-account will expire |
##### Supported exchanges [#supported-exchanges-23]
* [hyperliquid](/docs/exchanges/hyperliquid#createaccount)
***
## createContractOrder [#createcontractorder]
create a trade order on contract market
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------------------------------ | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| type | string | Yes | 'market', 'limit', 'OCO', 'PEG', 'TWAP' or 'TRAILING' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | how much of you want to trade in units of the base currency |
| price | float | No | the price that the order is to be fulfilled, in units of the quote currency, ignored in market orders |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.clientOrderId | string | No | a unique id for the order |
| params.postOnly | bool | No | if true, the order will only be posted to the order book and not executed immediately, default is false |
| params.reduceOnly | bool | No | if true, the order will only reduce a current position, not increase it, default is false |
| params.timeInForce | string | No | 'GTC', 'IOC', 'FOK', 'PO', 'HALFSEC', 'HALFMIN', 'FIVEMIN', 'HOUR', 'TWELVEHOUR', 'DAY', 'WEEK' or 'MONTH' |
| params.hedged | bool | No | true for hedged mode, false for one way mode, default is false |
| params.marginMode | string | No | 'cross' or 'isolated', default is 'cross' - the exchange does not have cross/isolated margin modes but instead has 'ONE\_WAY', 'HEDGE' and 'ISOLATED' position modes, so this param will be converted to the appropriate position mode |
| params.positionMode | string | No | 'ONE\_WAY', 'HEDGE' or 'ISOLATED' - if not provided, it will be derived from the marginMode and hedged params |
| params.triggerPrice | float | No | the price that a trigger order is triggered at, same as takeProfitPrice |
| params.stopLossPrice | float | No | the price that a stop loss order is triggered at |
| params.takeProfitPrice | float | No | the price that a take profit order is triggered at |
| params.triggerPriceType | string | No | 'last', 'mark' or 'index', default is 'mark' |
| params.trailingAmount | float | No | the quote amount to trail away from the current market price |
| params.trailingPercent | float | No | the percent to trail away from the current market price |
| params.takeProfit | object | No | *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered |
| params.takeProfit.triggerPrice | float | No | take profit trigger price |
| params.takeProfit.priceType | string | No | 'last', 'mark' or 'index', default is 'mark' |
| params.stopLoss | object | No | *stopLoss object in params* containing the triggerPrice at which the attached stop loss order will be triggered |
| params.stopLoss.triggerPrice | float | No | stop loss trigger price |
| params.stopLoss.priceType | string | No | 'last', 'mark' or 'index', default is 'mark' |
| params.deviation | float | No | *PEG orders only* the offset applied to the pegged reference price |
| params.stealth | float | No | *PEG orders only* the portion of the order size displayed on the book |
| params.stopPrice | float | No | *NB - It is NOT the stopLossPrice!!! OCO orders only* the limit price of the stop loss leg |
##### Supported exchanges [#supported-exchanges-24]
* [btse](/docs/exchanges/btse#createcontractorder)
* [kucoin](/docs/exchanges/kucoin#createcontractorder)
* [weex](/docs/exchanges/weex#createcontractorder)
***
## createContractOrders [#createcontractorders]
helper method for creating contract orders in batch
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| orders | Array | Yes | list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-25]
* [kucoin](/docs/exchanges/kucoin#createcontractorders)
***
## createConvertTrade [#createconverttrade]
convert from one currency to another
**Kind**: instance\
**Returns**: object - a [conversion structure](/docs/manual#conversion-structure)
| Param | Type | Required | Description |
| -------- | ------------------- | -------- | -------------------------------------------------------- |
| id | string | Yes | the id of the trade that you want to make |
| fromCode | string | Yes | the currency that you want to sell and convert from |
| toCode | string | Yes | the currency that you want to buy and convert into |
| amount | float | No | how much you want to trade in units of the from currency |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-26]
* [binance](/docs/exchanges/binance#createconverttrade)
* [bitget](/docs/exchanges/bitget#createconverttrade)
* [bybit](/docs/exchanges/bybit#createconverttrade)
* [coinbase](/docs/exchanges/coinbase#createconverttrade)
* [okx](/docs/exchanges/okx#createconverttrade)
* [phemex](/docs/exchanges/phemex#createconverttrade)
* [whitebit](/docs/exchanges/whitebit#createconverttrade)
* [woo](/docs/exchanges/woo#createconverttrade)
***
## createDepositAddress [#createdepositaddress]
create a currency deposit address
**Kind**: instance\
**Returns**: object - an [address structure](/docs/manual#address-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------------- |
| code | string | Yes | unified currency code of the currency for the deposit address |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-27]
* [bitfinex](/docs/exchanges/bitfinex#createdepositaddress)
* [bithumb](/docs/exchanges/bithumb#createdepositaddress)
* [coinbase](/docs/exchanges/coinbase#createdepositaddress)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#createdepositaddress)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#createdepositaddress)
* [coinex](/docs/exchanges/coinex#createdepositaddress)
* [deribit](/docs/exchanges/deribit#createdepositaddress)
* [gemini](/docs/exchanges/gemini#createdepositaddress)
* [hitbtc](/docs/exchanges/hitbtc#createdepositaddress)
* [kraken](/docs/exchanges/kraken#createdepositaddress)
* [kucoin](/docs/exchanges/kucoin#createdepositaddress)
* [luno](/docs/exchanges/luno#createdepositaddress)
* [mexc](/docs/exchanges/mexc#createdepositaddress)
* [ndax](/docs/exchanges/ndax#createdepositaddress)
* [paymium](/docs/exchanges/paymium#createdepositaddress)
* [poloniex](/docs/exchanges/poloniex#createdepositaddress)
* [upbit](/docs/exchanges/upbit#createdepositaddress)
* [whitebit](/docs/exchanges/whitebit#createdepositaddress)
***
## createGiftCode [#creategiftcode]
create gift code
**Kind**: instance\
**Returns**: object - The gift code id, code, currency and amount
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | gift code |
| amount | float | Yes | amount of currency for the gift |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-28]
* [binance](/docs/exchanges/binance#creategiftcode)
***
## createMarkeSellOrderWithCost [#createmarkesellorderwithcost]
create a market sell order by providing the symbol and cost
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | --------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| cost | float | Yes | how much you want to trade in units of the quote currency |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-29]
* [bybit](/docs/exchanges/bybit#createmarkesellorderwithcost)
***
## createMarketBuyOrderWithCost [#createmarketbuyorderwithcost]
create a market buy order by providing the symbol and cost
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | --------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| cost | float | Yes | how much you want to trade in units of the quote currency |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-30]
* [alpaca](/docs/exchanges/alpaca#createmarketbuyorderwithcost)
* [bigone](/docs/exchanges/bigone#createmarketbuyorderwithcost)
* [binance](/docs/exchanges/binance#createmarketbuyorderwithcost)
* [bingx](/docs/exchanges/bingx#createmarketbuyorderwithcost)
* [bitget](/docs/exchanges/bitget#createmarketbuyorderwithcost)
* [bithumb](/docs/exchanges/bithumb#createmarketbuyorderwithcost)
* [bitrue](/docs/exchanges/bitrue#createmarketbuyorderwithcost)
* [bittrade](/docs/exchanges/bittrade#createmarketbuyorderwithcost)
* [bybit](/docs/exchanges/bybit#createmarketbuyorderwithcost)
* [coinbase](/docs/exchanges/coinbase#createmarketbuyorderwithcost)
* [coinex](/docs/exchanges/coinex#createmarketbuyorderwithcost)
* [deepcoin](/docs/exchanges/deepcoin#createmarketbuyorderwithcost)
* [digifinex](/docs/exchanges/digifinex#createmarketbuyorderwithcost)
* [gate](/docs/exchanges/gate#createmarketbuyorderwithcost)
* [hashkey](/docs/exchanges/hashkey#createmarketbuyorderwithcost)
* [htx](/docs/exchanges/htx#createmarketbuyorderwithcost)
* [kraken](/docs/exchanges/kraken#createmarketbuyorderwithcost)
* [kucoin](/docs/exchanges/kucoin#createmarketbuyorderwithcost)
* [lbank](/docs/exchanges/lbank#createmarketbuyorderwithcost)
* [mexc](/docs/exchanges/mexc#createmarketbuyorderwithcost)
* [okx](/docs/exchanges/okx#createmarketbuyorderwithcost)
* [whitebit](/docs/exchanges/whitebit#createmarketbuyorderwithcost)
* [woo](/docs/exchanges/woo#createmarketbuyorderwithcost)
* [xt](/docs/exchanges/xt#createmarketbuyorderwithcost)
***
## createMarketOrderWithCost [#createmarketorderwithcost]
create a market order by providing the symbol, side and cost
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | --------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| side | string | Yes | 'buy' or 'sell' |
| cost | float | Yes | how much you want to trade in units of the quote currency |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-31]
* [alpaca](/docs/exchanges/alpaca#createmarketorderwithcost)
* [binance](/docs/exchanges/binance#createmarketorderwithcost)
* [bingx](/docs/exchanges/bingx#createmarketorderwithcost)
* [deepcoin](/docs/exchanges/deepcoin#createmarketorderwithcost)
* [kraken](/docs/exchanges/kraken#createmarketorderwithcost)
* [kucoin](/docs/exchanges/kucoin#createmarketorderwithcost)
* [whitebit](/docs/exchanges/whitebit#createmarketorderwithcost)
***
## createMarketSellOrderWithCost [#createmarketsellorderwithcost]
create a market sell order by providing the symbol and cost
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | --------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| cost | float | Yes | how much you want to trade in units of the quote currency |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-32]
* [alpaca](/docs/exchanges/alpaca#createmarketsellorderwithcost)
* [binance](/docs/exchanges/binance#createmarketsellorderwithcost)
* [bingx](/docs/exchanges/bingx#createmarketsellorderwithcost)
* [deepcoin](/docs/exchanges/deepcoin#createmarketsellorderwithcost)
* [kucoin](/docs/exchanges/kucoin#createmarketsellorderwithcost)
* [mexc](/docs/exchanges/mexc#createmarketsellorderwithcost)
* [okx](/docs/exchanges/okx#createmarketsellorderwithcost)
* [woo](/docs/exchanges/woo#createmarketsellorderwithcost)
***
## createOrder [#createorder]
create a trade order
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------------------- | ------------------- | -------- | --------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| type | string | Yes | 'market', 'limit' or 'stop\_limit' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | how much of currency you want to trade in units of base currency |
| price | float | No | the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.triggerPrice | float | No | The price at which a trigger order is triggered at |
| params.cost | float | No | *market orders only* the cost of the order in units of the quote currency |
##### Supported exchanges [#supported-exchanges-33]
* [alpaca](/docs/exchanges/alpaca#createorder)
* [apex](/docs/exchanges/apex#createorder)
* [aster](/docs/exchanges/aster#createorder)
* [backpack](/docs/exchanges/backpack#createorder)
* [bigone](/docs/exchanges/bigone#createorder)
* [binance](/docs/exchanges/binance#createorder)
* [bingx](/docs/exchanges/bingx#createorder)
* [bit2c](/docs/exchanges/bit2c#createorder)
* [bitbank](/docs/exchanges/bitbank#createorder)
* [bitbns](/docs/exchanges/bitbns#createorder)
* [bitfinex](/docs/exchanges/bitfinex#createorder)
* [bitflyer](/docs/exchanges/bitflyer#createorder)
* [bitget](/docs/exchanges/bitget#createorder)
* [bithumb](/docs/exchanges/bithumb#createorder)
* [bitmex](/docs/exchanges/bitmex#createorder)
* [bitopro](/docs/exchanges/bitopro#createorder)
* [bitrue](/docs/exchanges/bitrue#createorder)
* [bitso](/docs/exchanges/bitso#createorder)
* [bitstamp](/docs/exchanges/bitstamp#createorder)
* [bitteam](/docs/exchanges/bitteam#createorder)
* [bittrade](/docs/exchanges/bittrade#createorder)
* [bitvavo](/docs/exchanges/bitvavo#createorder)
* [blockchaincom](/docs/exchanges/blockchaincom#createorder)
* [blofin](/docs/exchanges/blofin#createorder)
* [btcbox](/docs/exchanges/btcbox#createorder)
* [btcmarkets](/docs/exchanges/btcmarkets#createorder)
* [btcturk](/docs/exchanges/btcturk#createorder)
* [btse](/docs/exchanges/btse#createorder)
* [bullish](/docs/exchanges/bullish#createorder)
* [bybit](/docs/exchanges/bybit#createorder)
* [bydfi](/docs/exchanges/bydfi#createorder)
* [cex](/docs/exchanges/cex#createorder)
* [coinbase](/docs/exchanges/coinbase#createorder)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#createorder)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#createorder)
* [coincheck](/docs/exchanges/coincheck#createorder)
* [coinex](/docs/exchanges/coinex#createorder)
* [coinmate](/docs/exchanges/coinmate#createorder)
* [coinone](/docs/exchanges/coinone#createorder)
* [coinsph](/docs/exchanges/coinsph#createorder)
* [coinspot](/docs/exchanges/coinspot#createorder)
* [cryptocom](/docs/exchanges/cryptocom#createorder)
* [cryptomus](/docs/exchanges/cryptomus#createorder)
* [deepcoin](/docs/exchanges/deepcoin#createorder)
* [delta](/docs/exchanges/delta#createorder)
* [deribit](/docs/exchanges/deribit#createorder)
* [derive](/docs/exchanges/derive#createorder)
* [digifinex](/docs/exchanges/digifinex#createorder)
* [dydx](/docs/exchanges/dydx#createorder)
* [extended](/docs/exchanges/extended#createorder)
* [foxbit](/docs/exchanges/foxbit#createorder)
* [gate](/docs/exchanges/gate#createorder)
* [gemini](/docs/exchanges/gemini#createorder)
* [grvt](/docs/exchanges/grvt#createorder)
* [hashkey](/docs/exchanges/hashkey#createorder)
* [hibachi](/docs/exchanges/hibachi#createorder)
* [hitbtc](/docs/exchanges/hitbtc#createorder)
* [hollaex](/docs/exchanges/hollaex#createorder)
* [htx](/docs/exchanges/htx#createorder)
* [hyperliquid](/docs/exchanges/hyperliquid#createorder)
* [independentreserve](/docs/exchanges/independentreserve#createorder)
* [indodax](/docs/exchanges/indodax#createorder)
* [kraken](/docs/exchanges/kraken#createorder)
* [krakenfutures](/docs/exchanges/krakenfutures#createorder)
* [kucoin](/docs/exchanges/kucoin#createorder)
* [latoken](/docs/exchanges/latoken#createorder)
* [lbank](/docs/exchanges/lbank#createorder)
* [lighter](/docs/exchanges/lighter#createorder)
* [luno](/docs/exchanges/luno#createorder)
* [mercado](/docs/exchanges/mercado#createorder)
* [mexc](/docs/exchanges/mexc#createorder)
* [modetrade](/docs/exchanges/modetrade#createorder)
* [mudrex](/docs/exchanges/mudrex#createorder)
* [nado](/docs/exchanges/nado#createorder)
* [ndax](/docs/exchanges/ndax#createorder)
* [okx](/docs/exchanges/okx#createorder)
* [onetrading](/docs/exchanges/onetrading#createorder)
* [p2b](/docs/exchanges/p2b#createorder)
* [pacifica](/docs/exchanges/pacifica#createorder)
* [paradex](/docs/exchanges/paradex#createorder)
* [paymium](/docs/exchanges/paymium#createorder)
* [phemex](/docs/exchanges/phemex#createorder)
* [poloniex](/docs/exchanges/poloniex#createorder)
* [revolutx](/docs/exchanges/revolutx#createorder)
* [tokocrypto](/docs/exchanges/tokocrypto#createorder)
* [toobit](/docs/exchanges/toobit#createorder)
* [upbit](/docs/exchanges/upbit#createorder)
* [weex](/docs/exchanges/weex#createorder)
* [whitebit](/docs/exchanges/whitebit#createorder)
* [woo](/docs/exchanges/woo#createorder)
* [woofipro](/docs/exchanges/woofipro#createorder)
* [xt](/docs/exchanges/xt#createorder)
* [zaif](/docs/exchanges/zaif#createorder)
* [zebpay](/docs/exchanges/zebpay#createorder)
***
## createOrderWs [#createorderws]
create a trade order
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ----------------------- | ------------------------------------------ | -------- | --------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| type | string | Yes | 'market' or 'limit' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | how much of currency you want to trade in units of base currency |
| price | float, undefined | No | the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.test | boolean | Yes | test order, default false |
| params.returnRateLimits | boolean | Yes | set to true to return rate limit information, default false |
##### Supported exchanges [#supported-exchanges-34]
* [binance](/docs/exchanges/binance#createorderws)
* [bitvavo](/docs/exchanges/bitvavo#createorderws)
* [bybit](/docs/exchanges/bybit#createorderws)
* [cex](/docs/exchanges/cex#createorderws)
* [cryptocom](/docs/exchanges/cryptocom#createorderws)
* [gate](/docs/exchanges/gate#createorderws)
* [hyperliquid](/docs/exchanges/hyperliquid#createorderws)
* [lighter](/docs/exchanges/lighter#createorderws)
* [nado](/docs/exchanges/nado#createorderws)
* [okx](/docs/exchanges/okx#createorderws)
* [pacifica](/docs/exchanges/pacifica#createorderws)
***
## createOrders [#createorders]
create a list of trade orders
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| orders | Array | Yes | list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-35]
* [aster](/docs/exchanges/aster#createorders)
* [backpack](/docs/exchanges/backpack#createorders)
* [binance](/docs/exchanges/binance#createorders)
* [bingx](/docs/exchanges/bingx#createorders)
* [bitfinex](/docs/exchanges/bitfinex#createorders)
* [bitget](/docs/exchanges/bitget#createorders)
* [bithumb](/docs/exchanges/bithumb#createorders)
* [blofin](/docs/exchanges/blofin#createorders)
* [bybit](/docs/exchanges/bybit#createorders)
* [bydfi](/docs/exchanges/bydfi#createorders)
* [coinex](/docs/exchanges/coinex#createorders)
* [cryptocom](/docs/exchanges/cryptocom#createorders)
* [digifinex](/docs/exchanges/digifinex#createorders)
* [foxbit](/docs/exchanges/foxbit#createorders)
* [gate](/docs/exchanges/gate#createorders)
* [hashkey](/docs/exchanges/hashkey#createorders)
* [hibachi](/docs/exchanges/hibachi#createorders)
* [htx](/docs/exchanges/htx#createorders)
* [hyperliquid](/docs/exchanges/hyperliquid#createorders)
* [kraken](/docs/exchanges/kraken#createorders)
* [krakenfutures](/docs/exchanges/krakenfutures#createorders)
* [kucoin](/docs/exchanges/kucoin#createorders)
* [mexc](/docs/exchanges/mexc#createorders)
* [modetrade](/docs/exchanges/modetrade#createorders)
* [okx](/docs/exchanges/okx#createorders)
* [pacifica](/docs/exchanges/pacifica#createorders)
* [paradex](/docs/exchanges/paradex#createorders)
* [woofipro](/docs/exchanges/woofipro#createorders)
***
## createOrdersRequest [#createordersrequest]
create a list of trade orders
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Description |
| ------ | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| orders | Array | list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params |
##### Supported exchanges [#supported-exchanges-36]
* [hyperliquid](/docs/exchanges/hyperliquid#createordersrequest)
***
## createOrdersWs [#createordersws]
create a list of trade orders
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| orders | Array | Yes | list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-37]
* [gate](/docs/exchanges/gate#createordersws)
* [hyperliquid](/docs/exchanges/hyperliquid#createordersws)
***
## createSpotOrder [#createspotorder]
create a trade order on spot market
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ----------------------- | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| type | string | Yes | 'market', 'limit', 'OCO', 'PEG', 'TWAP' or 'TRAILING' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | how much of you want to trade in units of the base currency |
| price | float | No | the price that the order is to be fulfilled, in units of the quote currency, ignored in market orders |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.clientOrderId | string | No | a unique id for the order |
| params.postOnly | bool | No | if true, the order will only be posted to the order book and not executed immediately, default is false |
| params.timeInForce | string | No | 'GTC', 'IOC' or 'FOK' |
| params.cost | float | No | *market buy and trailing buy orders only* the quote quantity that can be used as an alternative for the amount |
| params.triggerPrice | float | No | the price that a trigger order is triggered at, same as takeProfitPrice |
| params.stopLossPrice | float | No | the price that a stop loss order is triggered at |
| params.takeProfitPrice | float | No | the price that a take profit order is triggered at |
| params.triggerPriceType | string | No | 'last', 'mark' or 'index', default is 'last' |
| params.trailingAmount | float | No | the quote amount to trail away from the current market price |
| params.trailingPercent | float | No | the percent to trail away from the current market price |
| params.deviation | float | No | *PEG orders only* how much should the order price deviate from the pegged price, in percent from -10 to 10 |
| params.stealth | float | No | *PEG orders only* how many percent of the order is to be displayed on the orderbook, from 1 to 100 |
| params.stopPrice | float | No | *NB - It is NOT stopLossPrice or triggerPrice!!! OCO orders only* the limit price of the stop loss leg |
##### Supported exchanges [#supported-exchanges-38]
* [btse](/docs/exchanges/btse#createspotorder)
* [hashkey](/docs/exchanges/hashkey#createspotorder)
* [kucoin](/docs/exchanges/kucoin#createspotorder)
* [weex](/docs/exchanges/weex#createspotorder)
***
## createSpotOrders [#createspotorders]
helper method for creating spot orders in batch
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| orders | Array | Yes | list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.hf | bool | No | false, // true for hf orders |
| params.sync | bool | No | false, // true to use the hf sync call |
##### Supported exchanges [#supported-exchanges-39]
* [kucoin](/docs/exchanges/kucoin#createspotorders)
***
## createSubAccount [#createsubaccount]
creates a sub-account under the main account
**Kind**: instance\
**Returns**: object - a response object
| Param | Type | Required | Description |
| --------------------------- | ------------------- | -------- | --------------------------------------------------------------- |
| name | string | Yes | unused argument |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.expiryWindow | int | No | time to live in milliseconds |
| params.subAccountAddress | string | No | The public key (address) of the sub-account to use for creation |
| params.subAccountPrivateKey | string | No | The private key of the sub-account to use for creation |
##### Supported exchanges [#supported-exchanges-40]
* [pacifica](/docs/exchanges/pacifica#createsubaccount)
***
## createSwapOrder [#createswaporder]
create a trade order on swap market
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | ----------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| type | string | Yes | 'market' or 'limit' or 'STOP' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | how much of you want to trade in units of the base currency |
| price | float | No | the price that the order is to be fulfilled, in units of the quote currency, ignored in market orders |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.postOnly | bool | No | if true, the order will only be posted to the order book and not executed immediately |
| params.reduceOnly | bool | No | true or false whether the order is reduce only |
| params.triggerPrice | float | No | The price at which a trigger order is triggered at |
| params.timeInForce | string | No | 'GTC', 'FOK', 'IOC', 'LIMIT\_MAKER' or 'PO' |
| params.clientOrderId | string | No | a unique id for the order |
##### Supported exchanges [#supported-exchanges-41]
* [hashkey](/docs/exchanges/hashkey#createswaporder)
***
## createTrailingAmountOrder [#createtrailingamountorder]
create a trailing order by providing the symbol, type, side, amount, price and trailingAmount
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| type | string | Yes | 'market' or 'limit' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | how much you want to trade in units of the base currency, or number of contracts |
| price | float | No | the price for the order to be filled at, in units of the quote currency, ignored in market orders |
| trailingAmount | float | Yes | the quote amount to trail away from the current market price |
| trailingTriggerPrice | float | Yes | the price to activate a trailing order, default uses the price argument |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-42]
* [woo](/docs/exchanges/woo#createtrailingamountorder)
***
## createTrailingPercentOrder [#createtrailingpercentorder]
create a trailing order by providing the symbol, type, side, amount, price and trailingPercent
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| type | string | Yes | 'market' or 'limit' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | how much you want to trade in units of the base currency, or number of contracts |
| price | float | No | the price for the order to be filled at, in units of the quote currency, ignored in market orders |
| trailingPercent | float | Yes | the percent to trail away from the current market price |
| trailingTriggerPrice | float | Yes | the price to activate a trailing order, default uses the price argument |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-43]
* [htx](/docs/exchanges/htx#createtrailingpercentorder)
* [woo](/docs/exchanges/woo#createtrailingpercentorder)
***
## createTwapOrder [#createtwaporder]
create a trade order that is executed as a TWAP order over a specified duration.
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | how much of currency you want to trade in units of base currency, only required for sale |
| duration | int | Yes | the duration of the TWAP order in milliseconds |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.frequency | string | Yes | required order interval in seconds, 15, 20, 30, 60 or 120 |
| params.price | string | No | order price, required for purchase |
| params.generation | int | No | *only generation 2 is supported* if you want to use the API generation 1 or 2, default is 2 |
##### Supported exchanges [#supported-exchanges-44]
* [bithumb](/docs/exchanges/bithumb#createtwaporder)
* [hyperliquid](/docs/exchanges/hyperliquid#createtwaporder)
***
## createUtaOrder [#createutaorder]
helper method for creating uta orders
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ----------------------- | ------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | Unified CCXT market symbol |
| type | string | Yes | 'limit' or 'market' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | the amount of currency to trade |
| price | float | No | the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.clientOrderId | string | No | client order id, defaults to uuid if not passed |
| params.cost | float | No | the cost of the order in units of quote currency |
| params.timeInForce | string | No | GTC, GTD, IOC, FOK or PO |
| params.postOnly | bool | No | Post only flag, invalid when timeInForce is IOC or FOK (default is false) |
| params.reduceOnly | bool | No | *contract markets only* A mark to reduce the position size only. Set to false by default |
| params.triggerPrice | float | No | The price a trigger order is triggered at |
| params.triggerDirection | string | No | 'ascending' or 'descending', the direction the triggerPrice is triggered from, requires triggerPrice |
| params.triggerPriceType | string | No | *contract markets only* "last", "mark", "index" - defaults to "mark" |
| params.stopLossPrice | float | No | price to trigger stop-loss orders |
| params.takeProfitPrice | float | No | price to trigger take-profit orders |
| params.marginMode | string | No | 'cross' or 'isolated', (default is 'cross' for margin orders, default is 'isolated' for contract orders) Exchange-specific parameters ------------------------------------------------- |
| params.accountMode | string | No | 'unified' or 'classic', default is 'unified' |
| params.stp | string | No | '', // self trade prevention, CN, CO, CB or DC |
| params.cancelAfter | int | No | Cancel After N Seconds (Calculated from the time of entering the matching engine), only effective when timeInForce is GTD |
| params.sizeUnit | string | No | *contracts only* 'BASECCY' (amount of base currency) or 'UNIT' (number of contracts), default is 'UNIT' Classic account parameters |
| params.autoBorrow | bool | No | *classic margin orders only* |
| params.autoRepay | bool | No | *classic margin orders only* |
| params.hedged | string | No | *classic contract orders only* true for hedged mode, false for one way mode, default is false |
| params.leverage | int | No | *classic contract orders with isolated marginMode only* Leverage size of the order |
##### Supported exchanges [#supported-exchanges-45]
* [kucoin](/docs/exchanges/kucoin#createutaorder)
***
## createVault [#createvault]
creates a value
**Kind**: instance\
**Returns**: object - the api result
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | ------------------------------------------------------ |
| name | string | Yes | The name of the vault |
| description | string | Yes | The description of the vault |
| initialUsd | number | Yes | The initialUsd of the vault |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-46]
* [hyperliquid](/docs/exchanges/hyperliquid#createvault)
***
## deposit [#deposit]
make a deposit
**Kind**: instance\
**Returns**: object - a [transaction structure](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ---------------- | ------------------- | -------- | -------------------------------------------------------------------------------------------------- |
| code | string | Yes | unified currency code |
| amount | float | Yes | the amount to deposit |
| id | string | Yes | the payment method id to be used for the deposit, can be retrieved from v2PrivateGetPaymentMethods |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.accountId | string | No | the id of the account to deposit into |
##### Supported exchanges [#supported-exchanges-47]
* [coinbase](/docs/exchanges/coinbase#deposit)
***
## editContractOrder [#editcontractorder]
edit a trade order
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ---------------------- | -------------------- | -------- | --------------------------------------------------------------------------------------------------------- |
| id | string | Yes | cancel order id |
| symbol | string | Yes | unified symbol of the market to create an order in |
| type | string | Yes | 'market' or 'limit' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | how much of currency you want to trade in units of base currency |
| price | float | No | the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.portfolioMargin | boolean | No | set to true if you would like to edit an order in a portfolio margin account |
##### Supported exchanges [#supported-exchanges-48]
* [binance](/docs/exchanges/binance#editcontractorder)
***
## editOrder [#editorder]
edit a trade order
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | --------------------------------------------------------------------------------- |
| id | string | Yes | order id |
| symbol | string | No | unified symbol of the market to create an order in |
| type | string | No | 'market', 'limit' or 'stop\_limit' |
| side | string | No | 'buy' or 'sell' |
| amount | float | No | how much of the currency you want to trade in units of the base currency |
| price | float | No | the price for the order, in units of the quote currency, ignored in market orders |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.triggerPrice | string | No | the price to trigger a stop order |
| params.timeInForce | string | No | for crypto trading either 'gtc' or 'ioc' can be used |
| params.clientOrderId | string | No | a unique identifier for the order, automatically generated if not sent |
##### Supported exchanges [#supported-exchanges-49]
* [alpaca](/docs/exchanges/alpaca#editorder)
* [binance](/docs/exchanges/binance#editorder)
* [bingx](/docs/exchanges/bingx#editorder)
* [bitfinex](/docs/exchanges/bitfinex#editorder)
* [bitget](/docs/exchanges/bitget#editorder)
* [bitstamp](/docs/exchanges/bitstamp#editorder)
* [bitvavo](/docs/exchanges/bitvavo#editorder)
* [btse](/docs/exchanges/btse#editorder)
* [bullish](/docs/exchanges/bullish#editorder)
* [bybit](/docs/exchanges/bybit#editorder)
* [bydfi](/docs/exchanges/bydfi#editorder)
* [coinbase](/docs/exchanges/coinbase#editorder)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#editorder)
* [coinex](/docs/exchanges/coinex#editorder)
* [cryptocom](/docs/exchanges/cryptocom#editorder)
* [deepcoin](/docs/exchanges/deepcoin#editorder)
* [delta](/docs/exchanges/delta#editorder)
* [deribit](/docs/exchanges/deribit#editorder)
* [derive](/docs/exchanges/derive#editorder)
* [extended](/docs/exchanges/extended#editorder)
* [foxbit](/docs/exchanges/foxbit#editorder)
* [gate](/docs/exchanges/gate#editorder)
* [hibachi](/docs/exchanges/hibachi#editorder)
* [hyperliquid](/docs/exchanges/hyperliquid#editorder)
* [kraken](/docs/exchanges/kraken#editorder)
* [krakenfutures](/docs/exchanges/krakenfutures#editorder)
* [kucoin](/docs/exchanges/kucoin#editorder)
* [lighter](/docs/exchanges/lighter#editorder)
* [modetrade](/docs/exchanges/modetrade#editorder)
* [mudrex](/docs/exchanges/mudrex#editorder)
* [nado](/docs/exchanges/nado#editorder)
* [ndax](/docs/exchanges/ndax#editorder)
* [okx](/docs/exchanges/okx#editorder)
* [pacifica](/docs/exchanges/pacifica#editorder)
* [paradex](/docs/exchanges/paradex#editorder)
* [phemex](/docs/exchanges/phemex#editorder)
* [poloniex](/docs/exchanges/poloniex#editorder)
* [revolutx](/docs/exchanges/revolutx#editorder)
* [upbit](/docs/exchanges/upbit#editorder)
* [whitebit](/docs/exchanges/whitebit#editorder)
* [woo](/docs/exchanges/woo#editorder)
* [woofipro](/docs/exchanges/woofipro#editorder)
* [xt](/docs/exchanges/xt#editorder)
***
## editOrderWs [#editorderws]
edit a trade order
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------------------------------ | -------- | --------------------------------------------------------------------------------------------------------- |
| id | string | Yes | order id |
| symbol | string | Yes | unified symbol of the market to create an order in |
| type | string | Yes | 'market' or 'limit' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | how much of the currency you want to trade in units of the base currency |
| price | float, undefined | No | the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-50]
* [binance](/docs/exchanges/binance#editorderws)
* [bitvavo](/docs/exchanges/bitvavo#editorderws)
* [bybit](/docs/exchanges/bybit#editorderws)
* [cex](/docs/exchanges/cex#editorderws)
* [cryptocom](/docs/exchanges/cryptocom#editorderws)
* [gate](/docs/exchanges/gate#editorderws)
* [hyperliquid](/docs/exchanges/hyperliquid#editorderws)
* [nado](/docs/exchanges/nado#editorderws)
* [okx](/docs/exchanges/okx#editorderws)
* [pacifica](/docs/exchanges/pacifica#editorderws)
***
## editOrders [#editorders]
edit a list of trade orders
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| orders | Array | Yes | list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-51]
* [binance](/docs/exchanges/binance#editorders)
* [bybit](/docs/exchanges/bybit#editorders)
* [bydfi](/docs/exchanges/bydfi#editorders)
* [coinex](/docs/exchanges/coinex#editorders)
* [hibachi](/docs/exchanges/hibachi#editorders)
* [hyperliquid](/docs/exchanges/hyperliquid#editorders)
***
## enableDemoTrading [#enabledemotrading]
enables or disables demo trading mode
**Kind**: instance
| Param | Type | Required | Description |
| ------ | -------------------- | -------- | ------------------------------------------------------- |
| enable | boolean | No | true if demo trading should be enabled, false otherwise |
##### Supported exchanges [#supported-exchanges-52]
* [binance](/docs/exchanges/binance#enabledemotrading)
* [bitget](/docs/exchanges/bitget#enabledemotrading)
* [bybit](/docs/exchanges/bybit#enabledemotrading)
***
## enableUserDexAbstraction [#enableuserdexabstraction]
If set, actions on HIP-3 perps will automatically transfer collateral from validator-operated USDC perps balance for HIP-3 DEXs where USDC is the collateral token, and spot otherwise
**Kind**: instance\
**Returns**: dictionary response from the exchange
| Param | Type | Required | Description |
| ----------- | -------------------- | -------- | ----------------------------------------------------------------------------------- |
| enabled | boolean | Yes | whether to enable user dex abstraction |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.type | string | No | 'userDexAbstraction' or 'agentEnableDexAbstraction' default is 'userDexAbstraction' |
##### Supported exchanges [#supported-exchanges-53]
* [hyperliquid](/docs/exchanges/hyperliquid#enableuserdexabstraction)
***
## fetchADLRank [#fetchadlrank]
fetches the auto deleveraging rank and risk percentage for a symbol
**Kind**: instance\
**Returns**: object - an [auto de leverage structure](/docs/manual#auto-de-leverage-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | -------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to fetch the auto deleveraging rank for |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-54]
* [binance](/docs/exchanges/binance#fetchadlrank)
***
## fetchAccount [#fetchaccount]
query for balance and get the amount of funds available for trading or funds locked in orders
**Kind**: instance\
**Returns**: object - a [balance structure](/docs/manual#balance-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-55]
* [apex](/docs/exchanges/apex#fetchaccount)
* [extended](/docs/exchanges/extended#fetchaccount)
***
## fetchAccountIdByType [#fetchaccountidbytype]
fetch all the accounts by a type and marginModeassociated with a profile
**Kind**: instance\
**Returns**: object - a dictionary of [account structures](/docs/manual#account-structure) indexed by the account type
| Param | Type | Required | Description |
| ---------- | ------------------- | -------- | ------------------------------------------------------ |
| type | string | Yes | 'spot', 'swap' or 'future |
| marginMode | string | No | 'cross' or 'isolated' |
| symbol | string | No | unified ccxt market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-56]
* [htx](/docs/exchanges/htx#fetchaccountidbytype)
***
## fetchAccountSettings [#fetchaccountsettings]
fetch account's market settings. Settings are cached for walletAddress. To refresh the cache, call loadAccountSettings with refresh=true
**Kind**: instance\
**Returns**: object - Dict repacked from list by symbol key
| Param | Type | Required | Description |
| -------------- | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.account | string | No | will default to walletAddress if not provided |
##### Supported exchanges [#supported-exchanges-57]
* [pacifica](/docs/exchanges/pacifica#fetchaccountsettings)
***
## fetchAccounts [#fetchaccounts]
fetch all the accounts associated with a profile
**Kind**: instance\
**Returns**: object - a dictionary of [account structures](/docs/manual#account-structure) indexed by the account type
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-58]
* [bittrade](/docs/exchanges/bittrade#fetchaccounts)
* [bitvavo](/docs/exchanges/bitvavo#fetchaccounts)
* [bullish](/docs/exchanges/bullish#fetchaccounts)
* [coinbase](/docs/exchanges/coinbase#fetchaccounts)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchaccounts)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchaccounts)
* [cryptocom](/docs/exchanges/cryptocom#fetchaccounts)
* [deribit](/docs/exchanges/deribit#fetchaccounts)
* [dydx](/docs/exchanges/dydx#fetchaccounts)
* [extended](/docs/exchanges/extended#fetchaccounts)
* [hashkey](/docs/exchanges/hashkey#fetchaccounts)
* [htx](/docs/exchanges/htx#fetchaccounts)
* [kucoin](/docs/exchanges/kucoin#fetchaccounts)
* [lighter](/docs/exchanges/lighter#fetchaccounts)
* [luno](/docs/exchanges/luno#fetchaccounts)
* [mexc](/docs/exchanges/mexc#fetchaccounts)
* [ndax](/docs/exchanges/ndax#fetchaccounts)
* [okx](/docs/exchanges/okx#fetchaccounts)
* [whitebit](/docs/exchanges/whitebit#fetchaccounts)
* [woo](/docs/exchanges/woo#fetchaccounts)
***
## fetchAllGreeks [#fetchallgreeks]
fetches all option contracts greeks, financial metrics used to measure the factors that affect the price of an options contract
**Kind**: instance\
**Returns**: object - a dictionary of [greeks structures](/docs/manual#greeks-structure) indexed by market symbol
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | -------------------------------------------------------------------------------------------- |
| symbols | Array\ | No | unified symbols of the markets to fetch greeks for, all markets are returned if not assigned |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-59]
* [binance](/docs/exchanges/binance#fetchallgreeks)
* [bybit](/docs/exchanges/bybit#fetchallgreeks)
* [okx](/docs/exchanges/okx#fetchallgreeks)
* [paradex](/docs/exchanges/paradex#fetchallgreeks)
***
## fetchBalance [#fetchbalance]
query for balance and get the amount of funds available for trading or funds locked in orders
**Kind**: instance\
**Returns**: object - a [balance structure](/docs/manual#balance-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-60]
* [alpaca](/docs/exchanges/alpaca#fetchbalance)
* [apex](/docs/exchanges/apex#fetchbalance)
* [aster](/docs/exchanges/aster#fetchbalance)
* [backpack](/docs/exchanges/backpack#fetchbalance)
* [bigone](/docs/exchanges/bigone#fetchbalance)
* [binance](/docs/exchanges/binance#fetchbalance)
* [bingx](/docs/exchanges/bingx#fetchbalance)
* [bit2c](/docs/exchanges/bit2c#fetchbalance)
* [bitbank](/docs/exchanges/bitbank#fetchbalance)
* [bitbns](/docs/exchanges/bitbns#fetchbalance)
* [bitfinex](/docs/exchanges/bitfinex#fetchbalance)
* [bitflyer](/docs/exchanges/bitflyer#fetchbalance)
* [bitget](/docs/exchanges/bitget#fetchbalance)
* [bithumb](/docs/exchanges/bithumb#fetchbalance)
* [bitmex](/docs/exchanges/bitmex#fetchbalance)
* [bitopro](/docs/exchanges/bitopro#fetchbalance)
* [bitrue](/docs/exchanges/bitrue#fetchbalance)
* [bitso](/docs/exchanges/bitso#fetchbalance)
* [bitstamp](/docs/exchanges/bitstamp#fetchbalance)
* [betteam](/docs/exchanges/betteam#fetchbalance)
* [bittrade](/docs/exchanges/bittrade#fetchbalance)
* [bitvavo](/docs/exchanges/bitvavo#fetchbalance)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchbalance)
* [blofin](/docs/exchanges/blofin#fetchbalance)
* [btcbox](/docs/exchanges/btcbox#fetchbalance)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchbalance)
* [btcturk](/docs/exchanges/btcturk#fetchbalance)
* [btse](/docs/exchanges/btse#fetchbalance)
* [bullish](/docs/exchanges/bullish#fetchbalance)
* [bybit](/docs/exchanges/bybit#fetchbalance)
* [bydfi](/docs/exchanges/bydfi#fetchbalance)
* [cex](/docs/exchanges/cex#fetchbalance)
* [coinbase](/docs/exchanges/coinbase#fetchbalance)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchbalance)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchbalance)
* [coincheck](/docs/exchanges/coincheck#fetchbalance)
* [coinex](/docs/exchanges/coinex#fetchbalance)
* [coinmate](/docs/exchanges/coinmate#fetchbalance)
* [coinone](/docs/exchanges/coinone#fetchbalance)
* [coinsph](/docs/exchanges/coinsph#fetchbalance)
* [coinspot](/docs/exchanges/coinspot#fetchbalance)
* [cryptocom](/docs/exchanges/cryptocom#fetchbalance)
* [cryptomus](/docs/exchanges/cryptomus#fetchbalance)
* [deepcoin](/docs/exchanges/deepcoin#fetchbalance)
* [delta](/docs/exchanges/delta#fetchbalance)
* [deribit](/docs/exchanges/deribit#fetchbalance)
* [derive](/docs/exchanges/derive#fetchbalance)
* [digifinex](/docs/exchanges/digifinex#fetchbalance)
* [dydx](/docs/exchanges/dydx#fetchbalance)
* [extended](/docs/exchanges/extended#fetchbalance)
* [foxbit](/docs/exchanges/foxbit#fetchbalance)
* [gate](/docs/exchanges/gate#fetchbalance)
* [gemini](/docs/exchanges/gemini#fetchbalance)
* [grvt](/docs/exchanges/grvt#fetchbalance)
* [hashkey](/docs/exchanges/hashkey#fetchbalance)
* [hibachi](/docs/exchanges/hibachi#fetchbalance)
* [hitbtc](/docs/exchanges/hitbtc#fetchbalance)
* [hollaex](/docs/exchanges/hollaex#fetchbalance)
* [htx](/docs/exchanges/htx#fetchbalance)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchbalance)
* [independentreserve](/docs/exchanges/independentreserve#fetchbalance)
* [indodax](/docs/exchanges/indodax#fetchbalance)
* [kraken](/docs/exchanges/kraken#fetchbalance)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchbalance)
* [kucoin](/docs/exchanges/kucoin#fetchbalance)
* [latoken](/docs/exchanges/latoken#fetchbalance)
* [lbank](/docs/exchanges/lbank#fetchbalance)
* [ligher](/docs/exchanges/ligher#fetchbalance)
* [luno](/docs/exchanges/luno#fetchbalance)
* [mercado](/docs/exchanges/mercado#fetchbalance)
* [mexc](/docs/exchanges/mexc#fetchbalance)
* [modetrade](/docs/exchanges/modetrade#fetchbalance)
* [mudrex](/docs/exchanges/mudrex#fetchbalance)
* [nado](/docs/exchanges/nado#fetchbalance)
* [ndax](/docs/exchanges/ndax#fetchbalance)
* [okx](/docs/exchanges/okx#fetchbalance)
* [onetrading](/docs/exchanges/onetrading#fetchbalance)
* [p2b](/docs/exchanges/p2b#fetchbalance)
* [pacifica](/docs/exchanges/pacifica#fetchbalance)
* [paradex](/docs/exchanges/paradex#fetchbalance)
* [paymium](/docs/exchanges/paymium#fetchbalance)
* [phemex](/docs/exchanges/phemex#fetchbalance)
* [poloniex](/docs/exchanges/poloniex#fetchbalance)
* [revolutx](/docs/exchanges/revolutx#fetchbalance)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchbalance)
* [toobit](/docs/exchanges/toobit#fetchbalance)
* [upbit](/docs/exchanges/upbit#fetchbalance)
* [weex](/docs/exchanges/weex#fetchbalance)
* [whitebit](/docs/exchanges/whitebit#fetchbalance)
* [woo](/docs/exchanges/woo#fetchbalance)
* [woofipro](/docs/exchanges/woofipro#fetchbalance)
* [xt](/docs/exchanges/xt#fetchbalance)
* [zaif](/docs/exchanges/zaif#fetchbalance)
* [zebpay](/docs/exchanges/zebpay#fetchbalance)
***
## fetchBalanceWs [#fetchbalancews]
fetch balance and get the amount of funds available for trading or funds locked in orders
**Kind**: instance\
**Returns**: object - a [balance structure](/docs/manual#balance-structure)
| Param | Type | Required | Description |
| ----------------- | --------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.type | string, undefined | No | 'future', 'delivery', 'savings', 'funding', or 'spot' |
| params.marginMode | string, undefined | No | 'cross' or 'isolated', for margin trading, uses this.options.defaultMarginMode if not passed, defaults to undefined/None/null |
| params.symbols | Array\, undefined | No | unified market symbols, only used in isolated margin mode |
| params.method | string, undefined | No | method to use. Can be account.balance, account.status, v2/account.balance or v2/account.status |
##### Supported exchanges [#supported-exchanges-61]
* [binance](/docs/exchanges/binance#fetchbalancews)
* [bitvavo](/docs/exchanges/bitvavo#fetchbalancews)
* [cex](/docs/exchanges/cex#fetchbalancews)
***
## fetchBidsAsks [#fetchbidsasks]
fetches the bid and ask price and volume for multiple markets
**Kind**: instance\
**Returns**: object - a dictionary of [ticker structures](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| -------------- | --------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------- |
| symbols | Array\, undefined | Yes | unified symbols of the markets to fetch the bids and asks for, all markets are returned if not assigned |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.subType | string | No | "linear" or "inverse" |
##### Supported exchanges [#supported-exchanges-62]
* [aster](/docs/exchanges/aster#fetchbidsasks)
* [binance](/docs/exchanges/binance#fetchbidsasks)
* [bitrue](/docs/exchanges/bitrue#fetchbidsasks)
* [bybit](/docs/exchanges/bybit#fetchbidsasks)
* [coinbase](/docs/exchanges/coinbase#fetchbidsasks)
* [kucoinfutures](/docs/exchanges/kucoinfutures#fetchbidsasks)
* [mexc](/docs/exchanges/mexc#fetchbidsasks)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchbidsasks)
* [toobit](/docs/exchanges/toobit#fetchbidsasks)
* [weex](/docs/exchanges/weex#fetchbidsasks)
* [xt](/docs/exchanges/xt#fetchbidsasks)
***
## fetchBorrowInterest [#fetchborrowinterest]
fetch the interest owed by the user for borrowing currency for margin trading
**Kind**: instance\
**Returns**: Array\ - a list of [borrow interest structures](/docs/manual#borrow-interest-structure)
| Param | Type | Required | Description |
| ---------------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------- |
| code | string | No | unified currency code |
| symbol | string | No | unified market symbol when fetch interest in isolated markets |
| since | int | No | the earliest time in ms to fetch borrrow interest for |
| limit | int | No | the maximum number of structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.portfolioMargin | boolean | No | set to true if you would like to fetch the borrow interest in a portfolio margin account |
##### Supported exchanges [#supported-exchanges-63]
* [binance](/docs/exchanges/binance#fetchborrowinterest)
* [bitget](/docs/exchanges/bitget#fetchborrowinterest)
* [bybit](/docs/exchanges/bybit#fetchborrowinterest)
* [coinex](/docs/exchanges/coinex#fetchborrowinterest)
* [gate](/docs/exchanges/gate#fetchborrowinterest)
* [htx](/docs/exchanges/htx#fetchborrowinterest)
* [kucoin](/docs/exchanges/kucoin#fetchborrowinterest)
* [okx](/docs/exchanges/okx#fetchborrowinterest)
* [whitebit](/docs/exchanges/whitebit#fetchborrowinterest)
***
## fetchBorrowRateHistories [#fetchborrowratehistories]
retrieves a history of a multiple currencies borrow interest rate at specific time slots, returns all currencies if no symbols passed, default is undefined
**Kind**: instance\
**Returns**: object - a dictionary of [borrow rate structures](/docs/manual#borrow-rate-structure) indexed by the market symbol
| Param | Type | Required | Description |
| ----------------- | --------------------------------------------------- | -------- | ---------------------------------------------------------------- |
| codes | Array\, undefined | Yes | list of unified currency codes, default is undefined |
| since | int | No | timestamp in ms of the earliest borrowRate, default is undefined |
| limit | int | No | max number of borrow rate prices to return, default is undefined |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.marginMode | string | No | 'cross' or 'isolated' default is 'cross' |
| params.until | int | No | the latest time in ms to fetch entries for |
##### Supported exchanges [#supported-exchanges-64]
* [kucoin](/docs/exchanges/kucoin#fetchborrowratehistories)
* [okx](/docs/exchanges/okx#fetchborrowratehistories)
***
## fetchBorrowRateHistory [#fetchborrowratehistory]
retrieves a history of a currencies borrow interest rate at specific time slots
**Kind**: instance\
**Returns**: Array\ - an array of [borrow rate structures](/docs/manual#borrow-rate-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ---------------------------------------------------------------------------------------------- |
| code | string | Yes | unified currency code |
| since | int | No | timestamp for the earliest borrow rate |
| limit | int | No | the maximum number of [borrow rate structures](/docs/manual#borrow-rate-structure) to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-65]
* [binance](/docs/exchanges/binance#fetchborrowratehistory)
* [bullish](/docs/exchanges/bullish#fetchborrowratehistory)
* [bybit](/docs/exchanges/bybit#fetchborrowratehistory)
* [kucoin](/docs/exchanges/kucoin#fetchborrowratehistory)
* [okx](/docs/exchanges/okx#fetchborrowratehistory)
***
## fetchCanceledAndClosedOrders [#fetchcanceledandclosedorders]
fetches information on multiple canceled orders made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ---------------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | No | unified market symbol of the market the orders were made in |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](/docs/manual#pagination-params) |
| params.portfolioMargin | boolean | No | set to true if you would like to fetch orders in a portfolio margin account |
| params.trigger | boolean | No | set to true if you would like to fetch portfolio margin account trigger or conditional orders |
| params.stock | boolean | No | set to true if you would like to fetch tokenized stock orders |
##### Supported exchanges [#supported-exchanges-66]
* [binance](/docs/exchanges/binance#fetchcanceledandclosedorders)
* [bingx](/docs/exchanges/bingx#fetchcanceledandclosedorders)
* [bitget](/docs/exchanges/bitget#fetchcanceledandclosedorders)
* [bullish](/docs/exchanges/bullish#fetchcanceledandclosedorders)
* [bybit](/docs/exchanges/bybit#fetchcanceledandclosedorders)
* [bydfi](/docs/exchanges/bydfi#fetchcanceledandclosedorders)
* [deepcoin](/docs/exchanges/deepcoin#fetchcanceledandclosedorders)
* [hashkey](/docs/exchanges/hashkey#fetchcanceledandclosedorders)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchcanceledandclosedorders)
* [nado](/docs/exchanges/nado#fetchcanceledandclosedorders)
* [pacifica](/docs/exchanges/pacifica#fetchcanceledandclosedorders)
* [weex](/docs/exchanges/weex#fetchcanceledandclosedorders)
***
## fetchCanceledOrders [#fetchcanceledorders]
fetches information on multiple canceled orders made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ---------------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | No | unified market symbol of the market the orders were made in |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](/docs/manual#pagination-params) |
| params.portfolioMargin | boolean | No | set to true if you would like to fetch orders in a portfolio margin account |
| params.trigger | boolean | No | set to true if you would like to fetch portfolio margin account trigger or conditional orders |
| params.stock | boolean | No | set to true if you would like to fetch tokenized stock orders |
##### Supported exchanges [#supported-exchanges-67]
* [binance](/docs/exchanges/binance#fetchcanceledorders)
* [bingx](/docs/exchanges/bingx#fetchcanceledorders)
* [bitget](/docs/exchanges/bitget#fetchcanceledorders)
* [bithumb](/docs/exchanges/bithumb#fetchcanceledorders)
* [bitteam](/docs/exchanges/bitteam#fetchcanceledorders)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchcanceledorders)
* [bullish](/docs/exchanges/bullish#fetchcanceledorders)
* [bybit](/docs/exchanges/bybit#fetchcanceledorders)
* [coinbase](/docs/exchanges/coinbase#fetchcanceledorders)
* [deepcoin](/docs/exchanges/deepcoin#fetchcanceledorders)
* [derive](/docs/exchanges/derive#fetchcanceledorders)
* [extended](/docs/exchanges/extended#fetchcanceledorders)
* [hibachi](/docs/exchanges/hibachi#fetchcanceledorders)
* [htx](/docs/exchanges/htx#fetchcanceledorders)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchcanceledorders)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchcanceledorders)
* [mexc](/docs/exchanges/mexc#fetchcanceledorders)
* [nado](/docs/exchanges/nado#fetchcanceledorders)
* [okx](/docs/exchanges/okx#fetchcanceledorders)
* [pacifica](/docs/exchanges/pacifica#fetchcanceledorders)
* [upbit](/docs/exchanges/upbit#fetchcanceledorders)
* [weex](/docs/exchanges/weex#fetchcanceledorders)
* [xt](/docs/exchanges/xt#fetchcanceledorders)
***
## fetchClosedOrder [#fetchclosedorder]
fetch an open order by it's id
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| symbol | string | Yes | unified market symbol, default is undefined |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-68]
* [bitfinex](/docs/exchanges/bitfinex#fetchclosedorder)
* [bybit](/docs/exchanges/bybit#fetchclosedorder)
* [cex](/docs/exchanges/cex#fetchclosedorder)
* [deepcoin](/docs/exchanges/deepcoin#fetchclosedorder)
***
## fetchClosedOrders [#fetchclosedorders]
fetches information on multiple closed orders made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market orders were made in |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | the latest time in ms to fetch orders for |
##### Supported exchanges [#supported-exchanges-69]
* [alpaca](/docs/exchanges/alpaca#fetchclosedorders)
* [bigone](/docs/exchanges/bigone#fetchclosedorders)
* [binance](/docs/exchanges/binance#fetchclosedorders)
* [bingx](/docs/exchanges/bingx#fetchclosedorders)
* [bitfinex](/docs/exchanges/bitfinex#fetchclosedorders)
* [bitflyer](/docs/exchanges/bitflyer#fetchclosedorders)
* [bitget](/docs/exchanges/bitget#fetchclosedorders)
* [bithumb](/docs/exchanges/bithumb#fetchclosedorders)
* [bitmex](/docs/exchanges/bitmex#fetchclosedorders)
* [bitopro](/docs/exchanges/bitopro#fetchclosedorders)
* [bitrue](/docs/exchanges/bitrue#fetchclosedorders)
* [bitteam](/docs/exchanges/bitteam#fetchclosedorders)
* [bittrade](/docs/exchanges/bittrade#fetchclosedorders)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchclosedorders)
* [blofin](/docs/exchanges/blofin#fetchclosedorders)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchclosedorders)
* [bullish](/docs/exchanges/bullish#fetchclosedorders)
* [bybit](/docs/exchanges/bybit#fetchclosedorders)
* [cex](/docs/exchanges/cex#fetchclosedorders)
* [coinbase](/docs/exchanges/coinbase#fetchclosedorders)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchclosedorders)
* [coinex](/docs/exchanges/coinex#fetchclosedorders)
* [coinsph](/docs/exchanges/coinsph#fetchclosedorders)
* [deepcoin](/docs/exchanges/deepcoin#fetchclosedorders)
* [delta](/docs/exchanges/delta#fetchclosedorders)
* [deribit](/docs/exchanges/deribit#fetchclosedorders)
* [derive](/docs/exchanges/derive#fetchclosedorders)
* [dydx](/docs/exchanges/dydx#fetchclosedorders)
* [extended](/docs/exchanges/extended#fetchclosedorders)
* [foxbit](/docs/exchanges/foxbit#fetchclosedorders)
* [gate](/docs/exchanges/gate#fetchclosedorders)
* [hibachi](/docs/exchanges/hibachi#fetchclosedorders)
* [hitbtc](/docs/exchanges/hitbtc#fetchclosedorders)
* [hollaex](/docs/exchanges/hollaex#fetchclosedorders)
* [htx](/docs/exchanges/htx#fetchclosedorders)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchclosedorders)
* [independentreserve](/docs/exchanges/independentreserve#fetchclosedorders)
* [indodax](/docs/exchanges/indodax#fetchclosedorders)
* [kraken](/docs/exchanges/kraken#fetchclosedorders)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchclosedorders)
* [kucoin](/docs/exchanges/kucoin#fetchclosedorders)
* [lighter](/docs/exchanges/lighter#fetchclosedorders)
* [luno](/docs/exchanges/luno#fetchclosedorders)
* [mexc](/docs/exchanges/mexc#fetchclosedorders)
* [modetrade](/docs/exchanges/modetrade#fetchclosedorders)
* [mudrex](/docs/exchanges/mudrex#fetchclosedorders)
* [nado](/docs/exchanges/nado#fetchclosedorders)
* [okx](/docs/exchanges/okx#fetchclosedorders)
* [onetrading](/docs/exchanges/onetrading#fetchclosedorders)
* [p2b](/docs/exchanges/p2b#fetchclosedorders)
* [pacifica](/docs/exchanges/pacifica#fetchclosedorders)
* [phemex](/docs/exchanges/phemex#fetchclosedorders)
* [poloniex](/docs/exchanges/poloniex#fetchclosedorders)
* [revolutx](/docs/exchanges/revolutx#fetchclosedorders)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchclosedorders)
* [toobit](/docs/exchanges/toobit#fetchclosedorders)
* [upbit](/docs/exchanges/upbit#fetchclosedorders)
* [weex](/docs/exchanges/weex#fetchclosedorders)
* [whitebit](/docs/exchanges/whitebit#fetchclosedorders)
* [woo](/docs/exchanges/woo#fetchclosedorders)
* [woofipro](/docs/exchanges/woofipro#fetchclosedorders)
* [xt](/docs/exchanges/xt#fetchclosedorders)
* [zaif](/docs/exchanges/zaif#fetchclosedorders)
***
## fetchClosedOrdersWs [#fetchclosedordersws]
fetch closed orders
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | -------------------------------------------------------- |
| symbol | string | Yes | unified market symbol |
| since | int | No | the earliest time in ms to fetch open orders for |
| limit | int | No | the maximum number of open orders structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-70]
* [binance](/docs/exchanges/binance#fetchclosedordersws)
* [gate](/docs/exchanges/gate#fetchclosedordersws)
***
## fetchContractBalance [#fetchcontractbalance]
query for balance and get the amount of funds available for trading or funds locked in orders
**Kind**: instance\
**Returns**: object - a [balance structure](/docs/manual#balance-structure)
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.code | object | No | the unified currency code to fetch the balance for, if not provided, the default .options\['fetchBalance']\['code'] will be used |
##### Supported exchanges [#supported-exchanges-71]
* [kucoin](/docs/exchanges/kucoin#fetchcontractbalance)
***
## fetchContractDepositAddress [#fetchcontractdepositaddress]
fetch the deposit address for a currency associated with this account
**Kind**: instance\
**Returns**: object - an [address structure](/docs/manual#address-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-72]
* [kucoin](/docs/exchanges/kucoin#fetchcontractdepositaddress)
***
## fetchContractDeposits [#fetchcontractdeposits]
helper method for fetching deposits for futures accounts
**Kind**: instance\
**Returns**: Array\ - a list of [transaction structures](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| since | int | No | the earliest time in ms to fetch deposits for |
| limit | int | No | the maximum number of deposits structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-73]
* [kucoin](/docs/exchanges/kucoin#fetchcontractdeposits)
***
## fetchContractOrder [#fetchcontractorder]
fetc contract order
**Kind**: instance\
**Returns**: object - An [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| symbol | string | Yes | unified symbol of the market the order was made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-74]
* [kucoin](/docs/exchanges/kucoin#fetchcontractorder)
***
## fetchContractOrdersByStatus [#fetchcontractordersbystatus]
fetches a list of contract orders placed on the exchange
**Kind**: instance\
**Returns**: An [array of order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| --------------- | -------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| status | string | Yes | 'active' or 'closed', only 'active' is valid for stop orders |
| symbol | string | Yes | unified symbol for the market to retrieve orders from |
| since | int | No | timestamp in ms of the earliest order to retrieve |
| limit | int | No | The maximum number of orders to retrieve |
| params | object | No | exchange specific parameters |
| params.trigger | bool | No | set to true to retrieve untriggered stop orders |
| params.until | int | No | End time in ms |
| params.side | string | No | buy or sell |
| params.type | string | No | limit or market |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](/docs/manual#pagination-params) |
##### Supported exchanges [#supported-exchanges-75]
* [kucoin](/docs/exchanges/kucoin#fetchcontractordersbystatus)
***
## fetchContractWithdrawals [#fetchcontractwithdrawals]
helper method for fetching withdrawals for futures accounts
**Kind**: instance\
**Returns**: Array\ - a list of [transaction structures](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | -------------------------------------------------------- |
| code | string | Yes | unified currency code |
| since | int | No | the earliest time in ms to fetch withdrawals for |
| limit | int | No | the maximum number of withdrawals structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-76]
* [kucoin](/docs/exchanges/kucoin#fetchcontractwithdrawals)
***
## fetchConvertCurrencies [#fetchconvertcurrencies]
fetches all available currencies that can be converted
**Kind**: instance\
**Returns**: object - an associative dictionary of currencies
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-77]
* [binance](/docs/exchanges/binance#fetchconvertcurrencies)
* [bitget](/docs/exchanges/bitget#fetchconvertcurrencies)
* [bybit](/docs/exchanges/bybit#fetchconvertcurrencies)
* [okx](/docs/exchanges/okx#fetchconvertcurrencies)
* [woo](/docs/exchanges/woo#fetchconvertcurrencies)
***
## fetchConvertQuote [#fetchconvertquote]
fetch a quote for converting from one currency to another
**Kind**: instance\
**Returns**: object - a [conversion structure](/docs/manual#conversion-structure)
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | -------------------------------------------------------- |
| fromCode | string | Yes | the currency that you want to sell and convert from |
| toCode | string | Yes | the currency that you want to buy and convert into |
| amount | float | Yes | how much you want to trade in units of the from currency |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.walletType | string | No | either 'SPOT' or 'FUNDING', the default is 'SPOT' |
##### Supported exchanges [#supported-exchanges-78]
* [binance](/docs/exchanges/binance#fetchconvertquote)
* [bitget](/docs/exchanges/bitget#fetchconvertquote)
* [bybit](/docs/exchanges/bybit#fetchconvertquote)
* [coinbase](/docs/exchanges/coinbase#fetchconvertquote)
* [okx](/docs/exchanges/okx#fetchconvertquote)
* [phemex](/docs/exchanges/phemex#fetchconvertquote)
* [whitebit](/docs/exchanges/whitebit#fetchconvertquote)
* [woo](/docs/exchanges/woo#fetchconvertquote)
***
## fetchConvertTrade [#fetchconverttrade]
fetch the data for a conversion trade
**Kind**: instance\
**Returns**: object - a [conversion structure](/docs/manual#conversion-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the id of the trade that you want to fetch |
| code | string | No | the unified currency code of the conversion trade |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-79]
* [binance](/docs/exchanges/binance#fetchconverttrade)
* [bybit](/docs/exchanges/bybit#fetchconverttrade)
* [coinbase](/docs/exchanges/coinbase#fetchconverttrade)
* [okx](/docs/exchanges/okx#fetchconverttrade)
* [woo](/docs/exchanges/woo#fetchconverttrade)
***
## fetchConvertTradeHistory [#fetchconverttradehistory]
fetch the users history of conversion trades
**Kind**: instance\
**Returns**: Array\ - a list of [conversion structures](/docs/manual#conversion-structure)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------- |
| code | string | No | the unified currency code |
| since | int | No | the earliest time in ms to fetch conversions for |
| limit | int | No | the maximum number of conversion structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | timestamp in ms of the latest conversion to fetch |
##### Supported exchanges [#supported-exchanges-80]
* [binance](/docs/exchanges/binance#fetchconverttradehistory)
* [bitget](/docs/exchanges/bitget#fetchconverttradehistory)
* [bybit](/docs/exchanges/bybit#fetchconverttradehistory)
* [okx](/docs/exchanges/okx#fetchconverttradehistory)
* [phemex](/docs/exchanges/phemex#fetchconverttradehistory)
* [whitebit](/docs/exchanges/whitebit#fetchconverttradehistory)
* [woo](/docs/exchanges/woo#fetchconverttradehistory)
***
## fetchCrossBorrowRate [#fetchcrossborrowrate]
fetch the rate of interest to borrow a currency for margin trading
**Kind**: instance\
**Returns**: object - a [borrow rate structure](/docs/manual#borrow-rate-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-81]
* [binance](/docs/exchanges/binance#fetchcrossborrowrate)
* [bitget](/docs/exchanges/bitget#fetchcrossborrowrate)
* [bybit](/docs/exchanges/bybit#fetchcrossborrowrate)
* [digifinex](/docs/exchanges/digifinex#fetchcrossborrowrate)
* [kucoin](/docs/exchanges/kucoin#fetchcrossborrowrate)
* [okx](/docs/exchanges/okx#fetchcrossborrowrate)
***
## fetchCrossBorrowRates [#fetchcrossborrowrates]
fetch the borrow interest rates of all currencies
**Kind**: instance\
**Returns**: object - a list of [borrow rate structures](/docs/manual#borrow-rate-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-82]
* [digifinex](/docs/exchanges/digifinex#fetchcrossborrowrates)
* [okx](/docs/exchanges/okx#fetchcrossborrowrates)
***
## fetchCurrencies [#fetchcurrencies]
fetches all available currencies on an exchange
**Kind**: instance\
**Returns**: object - an associative dictionary of currencies
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-83]
* [apex](/docs/exchanges/apex#fetchcurrencies)
* [aster](/docs/exchanges/aster#fetchcurrencies)
* [backpack](/docs/exchanges/backpack#fetchcurrencies)
* [bigone](/docs/exchanges/bigone#fetchcurrencies)
* [binance](/docs/exchanges/binance#fetchcurrencies)
* [bingx](/docs/exchanges/bingx#fetchcurrencies)
* [bitfinex](/docs/exchanges/bitfinex#fetchcurrencies)
* [bitget](/docs/exchanges/bitget#fetchcurrencies)
* [bitmex](/docs/exchanges/bitmex#fetchcurrencies)
* [bitopro](/docs/exchanges/bitopro#fetchcurrencies)
* [bitrue](/docs/exchanges/bitrue#fetchcurrencies)
* [bitso](/docs/exchanges/bitso#fetchcurrencies)
* [bitstamp](/docs/exchanges/bitstamp#fetchcurrencies)
* [bitteam](/docs/exchanges/bitteam#fetchcurrencies)
* [bittrade](/docs/exchanges/bittrade#fetchcurrencies)
* [bitvavo](/docs/exchanges/bitvavo#fetchcurrencies)
* [bullish](/docs/exchanges/bullish#fetchcurrencies)
* [bybit](/docs/exchanges/bybit#fetchcurrencies)
* [cex](/docs/exchanges/cex#fetchcurrencies)
* [coinbase](/docs/exchanges/coinbase#fetchcurrencies)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchcurrencies)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchcurrencies)
* [coinex](/docs/exchanges/coinex#fetchcurrencies)
* [coinone](/docs/exchanges/coinone#fetchcurrencies)
* [coinsph](/docs/exchanges/coinsph#fetchcurrencies)
* [cryptocom](/docs/exchanges/cryptocom#fetchcurrencies)
* [cryptomus](/docs/exchanges/cryptomus#fetchcurrencies)
* [delta](/docs/exchanges/delta#fetchcurrencies)
* [deribit](/docs/exchanges/deribit#fetchcurrencies)
* [derive](/docs/exchanges/derive#fetchcurrencies)
* [digifinex](/docs/exchanges/digifinex#fetchcurrencies)
* [extended](/docs/exchanges/extended#fetchcurrencies)
* [gate](/docs/exchanges/gate#fetchcurrencies)
* [gemini](/docs/exchanges/gemini#fetchcurrencies)
* [grvt](/docs/exchanges/grvt#fetchcurrencies)
* [hashkey](/docs/exchanges/hashkey#fetchcurrencies)
* [hitbtc](/docs/exchanges/hitbtc#fetchcurrencies)
* [hollaex](/docs/exchanges/hollaex#fetchcurrencies)
* [htx](/docs/exchanges/htx#fetchcurrencies)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchcurrencies)
* [kraken](/docs/exchanges/kraken#fetchcurrencies)
* [kucoin](/docs/exchanges/kucoin#fetchcurrencies)
* [latoken](/docs/exchanges/latoken#fetchcurrencies)
* [lbank](/docs/exchanges/lbank#fetchcurrencies)
* [lighter](/docs/exchanges/lighter#fetchcurrencies)
* [luno](/docs/exchanges/luno#fetchcurrencies)
* [mexc](/docs/exchanges/mexc#fetchcurrencies)
* [modetrade](/docs/exchanges/modetrade#fetchcurrencies)
* [nado](/docs/exchanges/nado#fetchcurrencies)
* [ndax](/docs/exchanges/ndax#fetchcurrencies)
* [okx](/docs/exchanges/okx#fetchcurrencies)
* [onetrading](/docs/exchanges/onetrading#fetchcurrencies)
* [phemex](/docs/exchanges/phemex#fetchcurrencies)
* [poloniex](/docs/exchanges/poloniex#fetchcurrencies)
* [revolutx](/docs/exchanges/revolutx#fetchcurrencies)
* [toobit](/docs/exchanges/toobit#fetchcurrencies)
* [weex](/docs/exchanges/weex#fetchcurrencies)
* [whitebit](/docs/exchanges/whitebit#fetchcurrencies)
* [woo](/docs/exchanges/woo#fetchcurrencies)
* [woofipro](/docs/exchanges/woofipro#fetchcurrencies)
* [xt](/docs/exchanges/xt#fetchcurrencies)
* [zebpay](/docs/exchanges/zebpay#fetchcurrencies)
***
## fetchCurrenciesWs [#fetchcurrenciesws]
fetches all available currencies on an exchange
**Kind**: instance\
**Returns**: object - an associative dictionary of currencies
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-84]
* [bitvavo](/docs/exchanges/bitvavo#fetchcurrenciesws)
***
## fetchDeposit [#fetchdeposit]
fetch information on a deposit
**Kind**: instance\
**Returns**: object - a [transaction structure](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------- |
| id | string | Yes | deposit id |
| code | string | Yes | unified currency code |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.txid | string | No | the transaction id for the deposit |
| params.generation | int | No | *only generation 2 is supported* if you want to use the API generation 1 or 2, default is 2 |
##### Supported exchanges [#supported-exchanges-85]
* [bithumb](/docs/exchanges/bithumb#fetchdeposit)
* [bitso](/docs/exchanges/bitso#fetchdeposit)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchdeposit)
* [coinbase](/docs/exchanges/coinbase#fetchdeposit)
* [okx](/docs/exchanges/okx#fetchdeposit)
* [upbit](/docs/exchanges/upbit#fetchdeposit)
* [whitebit](/docs/exchanges/whitebit#fetchdeposit)
***
## fetchDepositAddress [#fetchdepositaddress]
fetch the deposit address for a currency associated with this account
**Kind**: instance\
**Returns**: object - an [address structure](/docs/manual#address-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-86]
* [alpaca](/docs/exchanges/alpaca#fetchdepositaddress)
* [backpack](/docs/exchanges/backpack#fetchdepositaddress)
* [bigone](/docs/exchanges/bigone#fetchdepositaddress)
* [binance](/docs/exchanges/binance#fetchdepositaddress)
* [bingx](/docs/exchanges/bingx#fetchdepositaddress)
* [bit2c](/docs/exchanges/bit2c#fetchdepositaddress)
* [bitbank](/docs/exchanges/bitbank#fetchdepositaddress)
* [bitbns](/docs/exchanges/bitbns#fetchdepositaddress)
* [bitfinex](/docs/exchanges/bitfinex#fetchdepositaddress)
* [bitget](/docs/exchanges/bitget#fetchdepositaddress)
* [bithumb](/docs/exchanges/bithumb#fetchdepositaddress)
* [bitmex](/docs/exchanges/bitmex#fetchdepositaddress)
* [bitso](/docs/exchanges/bitso#fetchdepositaddress)
* [bitstamp](/docs/exchanges/bitstamp#fetchdepositaddress)
* [bitvavo](/docs/exchanges/bitvavo#fetchdepositaddress)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchdepositaddress)
* [bullish](/docs/exchanges/bullish#fetchdepositaddress)
* [bybit](/docs/exchanges/bybit#fetchdepositaddress)
* [cex](/docs/exchanges/cex#fetchdepositaddress)
* [coinbase](/docs/exchanges/coinbase#fetchdepositaddress)
* [coinex](/docs/exchanges/coinex#fetchdepositaddress)
* [coinsph](/docs/exchanges/coinsph#fetchdepositaddress)
* [cryptocom](/docs/exchanges/cryptocom#fetchdepositaddress)
* [deepcoin](/docs/exchanges/deepcoin#fetchdepositaddress)
* [delta](/docs/exchanges/delta#fetchdepositaddress)
* [deribit](/docs/exchanges/deribit#fetchdepositaddress)
* [digifinex](/docs/exchanges/digifinex#fetchdepositaddress)
* [foxbit](/docs/exchanges/foxbit#fetchdepositaddress)
* [gate](/docs/exchanges/gate#fetchdepositaddress)
* [gemini](/docs/exchanges/gemini#fetchdepositaddress)
* [hashkey](/docs/exchanges/hashkey#fetchdepositaddress)
* [hibachi](/docs/exchanges/hibachi#fetchdepositaddress)
* [hitbtc](/docs/exchanges/hitbtc#fetchdepositaddress)
* [htx](/docs/exchanges/htx#fetchdepositaddress)
* [independentreserve](/docs/exchanges/independentreserve#fetchdepositaddress)
* [kraken](/docs/exchanges/kraken#fetchdepositaddress)
* [kucoin](/docs/exchanges/kucoin#fetchdepositaddress)
* [lbank](/docs/exchanges/lbank#fetchdepositaddress)
* [luno](/docs/exchanges/luno#fetchdepositaddress)
* [mexc](/docs/exchanges/mexc#fetchdepositaddress)
* [ndax](/docs/exchanges/ndax#fetchdepositaddress)
* [okx](/docs/exchanges/okx#fetchdepositaddress)
* [paymium](/docs/exchanges/paymium#fetchdepositaddress)
* [phemex](/docs/exchanges/phemex#fetchdepositaddress)
* [poloniex](/docs/exchanges/poloniex#fetchdepositaddress)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchdepositaddress)
* [toobit](/docs/exchanges/toobit#fetchdepositaddress)
* [upbit](/docs/exchanges/upbit#fetchdepositaddress)
* [whitebit](/docs/exchanges/whitebit#fetchdepositaddress)
* [woo](/docs/exchanges/woo#fetchdepositaddress)
* [xt](/docs/exchanges/xt#fetchdepositaddress)
***
## fetchDepositAddresses [#fetchdepositaddresses]
fetch deposit addresses for multiple currencies (when available)
**Kind**: instance\
**Returns**: object - a dictionary of [address structures](/docs/manual#address-structure) indexed by currency code
| Param | Type | Required | Description |
| ----------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------- |
| codes | Array\ | No | list of unified currency codes, default is undefined (all currencies) |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.generation | int | No | *only generation 2 is supported* if you want to use the API generation 1 or 2, default is 2 |
##### Supported exchanges [#supported-exchanges-87]
* [bithumb](/docs/exchanges/bithumb#fetchdepositaddresses)
* [coinbase](/docs/exchanges/coinbase#fetchdepositaddresses)
* [coinone](/docs/exchanges/coinone#fetchdepositaddresses)
* [deepcoin](/docs/exchanges/deepcoin#fetchdepositaddresses)
* [hollaex](/docs/exchanges/hollaex#fetchdepositaddresses)
* [indodax](/docs/exchanges/indodax#fetchdepositaddresses)
* [paymium](/docs/exchanges/paymium#fetchdepositaddresses)
* [upbit](/docs/exchanges/upbit#fetchdepositaddresses)
***
## fetchDepositAddressesByNetwork [#fetchdepositaddressesbynetwork]
fetch the deposit addresses for a currency associated with this account
**Kind**: instance\
**Returns**: object - a dictionary [address structures](/docs/manual#address-structure), indexed by the network
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-88]
* [bingx](/docs/exchanges/bingx#fetchdepositaddressesbynetwork)
* [bybit](/docs/exchanges/bybit#fetchdepositaddressesbynetwork)
* [cryptocom](/docs/exchanges/cryptocom#fetchdepositaddressesbynetwork)
* [gate](/docs/exchanges/gate#fetchdepositaddressesbynetwork)
* [gemini](/docs/exchanges/gemini#fetchdepositaddressesbynetwork)
* [htx](/docs/exchanges/htx#fetchdepositaddressesbynetwork)
* [kucoin](/docs/exchanges/kucoin#fetchdepositaddressesbynetwork)
* [mexc](/docs/exchanges/mexc#fetchdepositaddressesbynetwork)
* [okx](/docs/exchanges/okx#fetchdepositaddressesbynetwork)
***
## fetchDepositMethodId [#fetchdepositmethodid]
fetch the deposit id for a fiat currency associated with this account
**Kind**: instance\
**Returns**: object - a [deposit id structure](/docs/manual#deposit-id-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the deposit payment method id |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-89]
* [coinbase](/docs/exchanges/coinbase#fetchdepositmethodid)
***
## fetchDepositMethodIds [#fetchdepositmethodids]
fetch the deposit id for a fiat currency associated with this account
**Kind**: instance\
**Returns**: object - an array of [deposit id structures](/docs/manual#deposit-id-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-90]
* [coinbase](/docs/exchanges/coinbase#fetchdepositmethodids)
***
## fetchDepositMethods [#fetchdepositmethods]
fetch deposit methods for a currency associated with this account
**Kind**: instance\
**Returns**: object - of deposit methods
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-91]
* [kraken](/docs/exchanges/kraken#fetchdepositmethods)
***
## fetchDepositWithdrawFee [#fetchdepositwithdrawfee]
fetch the fee for deposits and withdrawals
**Kind**: instance\
**Returns**: object - a [fee structure](/docs/manual#fee-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-92]
* [coinex](/docs/exchanges/coinex#fetchdepositwithdrawfee)
* [indodax](/docs/exchanges/indodax#fetchdepositwithdrawfee)
* [kucoin](/docs/exchanges/kucoin#fetchdepositwithdrawfee)
* [luno](/docs/exchanges/luno#fetchdepositwithdrawfee)
***
## fetchDepositWithdrawFees [#fetchdepositwithdrawfees]
fetch deposit and withdraw fees
**Kind**: instance\
**Returns**: Array\ - a list of [fee structures](/docs/manual#fee-structure)
| Param | Type | Required | Description |
| ------ | --------------------------------------------------- | -------- | ------------------------------------------------------ |
| codes | Array\, undefined | Yes | not used by fetchDepositWithdrawFees () |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-93]
* [binance](/docs/exchanges/binance#fetchdepositwithdrawfees)
* [bingx](/docs/exchanges/bingx#fetchdepositwithdrawfees)
* [bitget](/docs/exchanges/bitget#fetchdepositwithdrawfees)
* [bitmex](/docs/exchanges/bitmex#fetchdepositwithdrawfees)
* [bitopro](/docs/exchanges/bitopro#fetchdepositwithdrawfees)
* [bitrue](/docs/exchanges/bitrue#fetchdepositwithdrawfees)
* [bitso](/docs/exchanges/bitso#fetchdepositwithdrawfees)
* [bitstamp](/docs/exchanges/bitstamp#fetchdepositwithdrawfees)
* [bitvavo](/docs/exchanges/bitvavo#fetchdepositwithdrawfees)
* [bybit](/docs/exchanges/bybit#fetchdepositwithdrawfees)
* [coinex](/docs/exchanges/coinex#fetchdepositwithdrawfees)
* [cryptocom](/docs/exchanges/cryptocom#fetchdepositwithdrawfees)
* [deribit](/docs/exchanges/deribit#fetchdepositwithdrawfees)
* [digifinex](/docs/exchanges/digifinex#fetchdepositwithdrawfees)
* [gate](/docs/exchanges/gate#fetchdepositwithdrawfees)
* [hitbtc](/docs/exchanges/hitbtc#fetchdepositwithdrawfees)
* [hollaex](/docs/exchanges/hollaex#fetchdepositwithdrawfees)
* [htx](/docs/exchanges/htx#fetchdepositwithdrawfees)
* [kucoin](/docs/exchanges/kucoin#fetchdepositwithdrawfees)
* [lbank](/docs/exchanges/lbank#fetchdepositwithdrawfees)
* [mexc](/docs/exchanges/mexc#fetchdepositwithdrawfees)
* [okx](/docs/exchanges/okx#fetchdepositwithdrawfees)
* [poloniex](/docs/exchanges/poloniex#fetchdepositwithdrawfees)
* [whitebit](/docs/exchanges/whitebit#fetchdepositwithdrawfees)
***
## fetchDeposits [#fetchdeposits]
fetch all deposits made to an account
**Kind**: instance\
**Returns**: Array\ - a list of [transaction structures](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | No | unified currency code |
| since | int | No | the earliest time in ms to fetch deposits for |
| limit | int | No | the maximum number of deposit structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-94]
* [alpaca](/docs/exchanges/alpaca#fetchdeposits)
* [backpack](/docs/exchanges/backpack#fetchdeposits)
* [bigone](/docs/exchanges/bigone#fetchdeposits)
* [binance](/docs/exchanges/binance#fetchdeposits)
* [bingx](/docs/exchanges/bingx#fetchdeposits)
* [bitbns](/docs/exchanges/bitbns#fetchdeposits)
* [bitflyer](/docs/exchanges/bitflyer#fetchdeposits)
* [bitget](/docs/exchanges/bitget#fetchdeposits)
* [bithumb](/docs/exchanges/bithumb#fetchdeposits)
* [bitopro](/docs/exchanges/bitopro#fetchdeposits)
* [bitrue](/docs/exchanges/bitrue#fetchdeposits)
* [bitso](/docs/exchanges/bitso#fetchdeposits)
* [bittrade](/docs/exchanges/bittrade#fetchdeposits)
* [bitvavo](/docs/exchanges/bitvavo#fetchdeposits)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchdeposits)
* [blofin](/docs/exchanges/blofin#fetchdeposits)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchdeposits)
* [btse](/docs/exchanges/btse#fetchdeposits)
* [bybit](/docs/exchanges/bybit#fetchdeposits)
* [bydfi](/docs/exchanges/bydfi#fetchdeposits)
* [coinbase](/docs/exchanges/coinbase#fetchdeposits)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchdeposits)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchdeposits)
* [coincheck](/docs/exchanges/coincheck#fetchdeposits)
* [coinex](/docs/exchanges/coinex#fetchdeposits)
* [coinsph](/docs/exchanges/coinsph#fetchdeposits)
* [cryptocom](/docs/exchanges/cryptocom#fetchdeposits)
* [deepcoin](/docs/exchanges/deepcoin#fetchdeposits)
* [deribit](/docs/exchanges/deribit#fetchdeposits)
* [derive](/docs/exchanges/derive#fetchdeposits)
* [digifinex](/docs/exchanges/digifinex#fetchdeposits)
* [dydx](/docs/exchanges/dydx#fetchdeposits)
* [extended](/docs/exchanges/extended#fetchdeposits)
* [foxbit](/docs/exchanges/foxbit#fetchdeposits)
* [gate](/docs/exchanges/gate#fetchdeposits)
* [grvt](/docs/exchanges/grvt#fetchdeposits)
* [hashkey](/docs/exchanges/hashkey#fetchdeposits)
* [hibachi](/docs/exchanges/hibachi#fetchdeposits)
* [hitbtc](/docs/exchanges/hitbtc#fetchdeposits)
* [hollaex](/docs/exchanges/hollaex#fetchdeposits)
* [htx](/docs/exchanges/htx#fetchdeposits)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchdeposits)
* [kraken](/docs/exchanges/kraken#fetchdeposits)
* [kucoin](/docs/exchanges/kucoin#fetchdeposits)
* [lbank](/docs/exchanges/lbank#fetchdeposits)
* [lighter](/docs/exchanges/lighter#fetchdeposits)
* [mexc](/docs/exchanges/mexc#fetchdeposits)
* [modetrade](/docs/exchanges/modetrade#fetchdeposits)
* [nado](/docs/exchanges/nado#fetchdeposits)
* [ndax](/docs/exchanges/ndax#fetchdeposits)
* [okx](/docs/exchanges/okx#fetchdeposits)
* [paradex](/docs/exchanges/paradex#fetchdeposits)
* [phemex](/docs/exchanges/phemex#fetchdeposits)
* [poloniex](/docs/exchanges/poloniex#fetchdeposits)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchdeposits)
* [toobit](/docs/exchanges/toobit#fetchdeposits)
* [upbit](/docs/exchanges/upbit#fetchdeposits)
* [whitebit](/docs/exchanges/whitebit#fetchdeposits)
* [woo](/docs/exchanges/woo#fetchdeposits)
* [woofipro](/docs/exchanges/woofipro#fetchdeposits)
* [xt](/docs/exchanges/xt#fetchdeposits)
***
## fetchDepositsWithdrawals [#fetchdepositswithdrawals]
fetch history of deposits and withdrawals
**Kind**: instance\
**Returns**: object - a list of [transaction structure](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | --------------------------------------------------------------------------------------- |
| code | string | No | unified currency code for the currency of the deposit/withdrawals, default is undefined |
| since | int | No | timestamp in ms of the earliest deposit/withdrawal, default is undefined |
| limit | int | No | max number of deposit/withdrawals to return, default is undefined |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-95]
* [alpaca](/docs/exchanges/alpaca#fetchdepositswithdrawals)
* [bitfinex](/docs/exchanges/bitfinex#fetchdepositswithdrawals)
* [bitmex](/docs/exchanges/bitmex#fetchdepositswithdrawals)
* [bitstamp](/docs/exchanges/bitstamp#fetchdepositswithdrawals)
* [bitteam](/docs/exchanges/bitteam#fetchdepositswithdrawals)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchdepositswithdrawals)
* [btse](/docs/exchanges/btse#fetchdepositswithdrawals)
* [bullish](/docs/exchanges/bullish#fetchdepositswithdrawals)
* [cex](/docs/exchanges/cex#fetchdepositswithdrawals)
* [coinbase](/docs/exchanges/coinbase#fetchdepositswithdrawals)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchdepositswithdrawals)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchdepositswithdrawals)
* [coinmate](/docs/exchanges/coinmate#fetchdepositswithdrawals)
* [dydx](/docs/exchanges/dydx#fetchdepositswithdrawals)
* [gemini](/docs/exchanges/gemini#fetchdepositswithdrawals)
* [hibachi](/docs/exchanges/hibachi#fetchdepositswithdrawals)
* [hitbtc](/docs/exchanges/hitbtc#fetchdepositswithdrawals)
* [indodax](/docs/exchanges/indodax#fetchdepositswithdrawals)
* [modetrade](/docs/exchanges/modetrade#fetchdepositswithdrawals)
* [poloniex](/docs/exchanges/poloniex#fetchdepositswithdrawals)
* [whitebit](/docs/exchanges/whitebit#fetchdepositswithdrawals)
* [woo](/docs/exchanges/woo#fetchdepositswithdrawals)
* [woofipro](/docs/exchanges/woofipro#fetchdepositswithdrawals)
***
## fetchDepositsWs [#fetchdepositsws]
fetch all deposits made to an account
**Kind**: instance\
**Returns**: Array\ - a list of [transaction structures](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| since | int | No | the earliest time in ms to fetch deposits for |
| limit | int | No | the maximum number of deposits structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-96]
* [bitvavo](/docs/exchanges/bitvavo#fetchdepositsws)
***
## fetchFundingHistory [#fetchfundinghistory]
fetches information on multiple orders made by the user *classic accounts only*
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#funding-history-structure)
| Param | Type | Required | Description |
| ------------ | -------------------- | -------- | --------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market orders were made in |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve, default 100 |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | object | No | end time, ms |
| params.side | boolean | No | BUY or SELL |
| params.page | boolean | No | Page numbers start from 0 |
##### Supported exchanges [#supported-exchanges-97]
* [apex](/docs/exchanges/apex#fetchfundinghistory)
* [aster](/docs/exchanges/aster#fetchfundinghistory)
* [backpack](/docs/exchanges/backpack#fetchfundinghistory)
* [binance](/docs/exchanges/binance#fetchfundinghistory)
* [bingx](/docs/exchanges/bingx#fetchfundinghistory)
* [bitget](/docs/exchanges/bitget#fetchfundinghistory)
* [bybit](/docs/exchanges/bybit#fetchfundinghistory)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchfundinghistory)
* [coinex](/docs/exchanges/coinex#fetchfundinghistory)
* [derive](/docs/exchanges/derive#fetchfundinghistory)
* [digifinex](/docs/exchanges/digifinex#fetchfundinghistory)
* [extended](/docs/exchanges/extended#fetchfundinghistory)
* [gate](/docs/exchanges/gate#fetchfundinghistory)
* [grvt](/docs/exchanges/grvt#fetchfundinghistory)
* [htx](/docs/exchanges/htx#fetchfundinghistory)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchfundinghistory)
* [kucoin](/docs/exchanges/kucoin#fetchfundinghistory)
* [mexc](/docs/exchanges/mexc#fetchfundinghistory)
* [modetrade](/docs/exchanges/modetrade#fetchfundinghistory)
* [nado](/docs/exchanges/nado#fetchfundinghistory)
* [okx](/docs/exchanges/okx#fetchfundinghistory)
* [pacifica](/docs/exchanges/pacifica#fetchfundinghistory)
* [paradex](/docs/exchanges/paradex#fetchfundinghistory)
* [phemex](/docs/exchanges/phemex#fetchfundinghistory)
* [whitebit](/docs/exchanges/whitebit#fetchfundinghistory)
* [woo](/docs/exchanges/woo#fetchfundinghistory)
* [woofipro](/docs/exchanges/woofipro#fetchfundinghistory)
* [xt](/docs/exchanges/xt#fetchfundinghistory)
***
## fetchFundingInterval [#fetchfundinginterval]
fetch the current funding rate interval
**Kind**: instance\
**Returns**: object - a [funding rate structure](/docs/manual#funding-rate-structure)
| Param | Type | Required | Description |
| ---------- | -------------------- | -------- | -------------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.uta | boolean | No | set to true for the unified trading account (uta), defaults to false |
##### Supported exchanges [#supported-exchanges-98]
* [bitget](/docs/exchanges/bitget#fetchfundinginterval)
* [coinex](/docs/exchanges/coinex#fetchfundinginterval)
* [digifinex](/docs/exchanges/digifinex#fetchfundinginterval)
* [kucoin](/docs/exchanges/kucoin#fetchfundinginterval)
* [mexc](/docs/exchanges/mexc#fetchfundinginterval)
* [modetrade](/docs/exchanges/modetrade#fetchfundinginterval)
* [okx](/docs/exchanges/okx#fetchfundinginterval)
* [woo](/docs/exchanges/woo#fetchfundinginterval)
* [woofipro](/docs/exchanges/woofipro#fetchfundinginterval)
* [xt](/docs/exchanges/xt#fetchfundinginterval)
***
## fetchFundingIntervals [#fetchfundingintervals]
fetch the funding rate interval for multiple markets
**Kind**: instance\
**Returns**: Array\ - a list of [funding rate structures](/docs/manual#funding-rate-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | No | list of unified market symbols |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-99]
* [aster](/docs/exchanges/aster#fetchfundingintervals)
* [binance](/docs/exchanges/binance#fetchfundingintervals)
* [bitget](/docs/exchanges/bitget#fetchfundingintervals)
***
## fetchFundingLimits [#fetchfundinglimits]
fetch the deposit and withdrawal limits for a currency
**Kind**: instance\
**Returns**: object - a [funding limits structure](/docs/manual#funding-limits-structure)
| Param | Type | Required | Description |
| ------ | --------------------------------------------------- | -------- | ------------------------------------------------------ |
| codes | Array\, undefined | Yes | unified currency codes |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-100]
* [whitebit](/docs/exchanges/whitebit#fetchfundinglimits)
***
## fetchFundingRate [#fetchfundingrate]
fetch the current funding rate
**Kind**: instance\
**Returns**: object - a [funding rate structure](/docs/manual#funding-rate-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-101]
* [aster](/docs/exchanges/aster#fetchfundingrate)
* [backpack](/docs/exchanges/backpack#fetchfundingrate)
* [binance](/docs/exchanges/binance#fetchfundingrate)
* [bingx](/docs/exchanges/bingx#fetchfundingrate)
* [bitflyer](/docs/exchanges/bitflyer#fetchfundingrate)
* [bitget](/docs/exchanges/bitget#fetchfundingrate)
* [bitstamp](/docs/exchanges/bitstamp#fetchfundingrate)
* [blofin](/docs/exchanges/blofin#fetchfundingrate)
* [btse](/docs/exchanges/btse#fetchfundingrate)
* [bydfi](/docs/exchanges/bydfi#fetchfundingrate)
* [coinex](/docs/exchanges/coinex#fetchfundingrate)
* [cryptocom](/docs/exchanges/cryptocom#fetchfundingrate)
* [deepcoin](/docs/exchanges/deepcoin#fetchfundingrate)
* [delta](/docs/exchanges/delta#fetchfundingrate)
* [deribit](/docs/exchanges/deribit#fetchfundingrate)
* [derive](/docs/exchanges/derive#fetchfundingrate)
* [digifinex](/docs/exchanges/digifinex#fetchfundingrate)
* [gate](/docs/exchanges/gate#fetchfundingrate)
* [hashkey](/docs/exchanges/hashkey#fetchfundingrate)
* [hibachi](/docs/exchanges/hibachi#fetchfundingrate)
* [hitbtc](/docs/exchanges/hitbtc#fetchfundingrate)
* [htx](/docs/exchanges/htx#fetchfundingrate)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchfundingrate)
* [kucoin](/docs/exchanges/kucoin#fetchfundingrate)
* [lbank](/docs/exchanges/lbank#fetchfundingrate)
* [mexc](/docs/exchanges/mexc#fetchfundingrate)
* [modetrade](/docs/exchanges/modetrade#fetchfundingrate)
* [nado](/docs/exchanges/nado#fetchfundingrate)
* [okx](/docs/exchanges/okx#fetchfundingrate)
* [paradex](/docs/exchanges/paradex#fetchfundingrate)
* [phemex](/docs/exchanges/phemex#fetchfundingrate)
* [whitebit](/docs/exchanges/whitebit#fetchfundingrate)
* [woo](/docs/exchanges/woo#fetchfundingrate)
* [woofipro](/docs/exchanges/woofipro#fetchfundingrate)
* [xt](/docs/exchanges/xt#fetchfundingrate)
***
## fetchFundingRateHistory [#fetchfundingratehistory]
fetches historical funding rate prices
**Kind**: instance\
**Returns**: Array\ - a list of [funding rate structures](/docs/manual#funding-rate-history-structure)
| Param | Type | Required | Description |
| --------------- | -------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to fetch the funding rate history for |
| since | int | No | timestamp in ms of the earliest funding rate to fetch |
| limit | int | No | the maximum amount of [funding rate structures](/docs/manual#funding-rate-history-structure) to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | timestamp in ms of the latest funding rate |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](/docs/manual#pagination-params) |
##### Supported exchanges [#supported-exchanges-102]
* [apex](/docs/exchanges/apex#fetchfundingratehistory)
* [aster](/docs/exchanges/aster#fetchfundingratehistory)
* [backpack](/docs/exchanges/backpack#fetchfundingratehistory)
* [binance](/docs/exchanges/binance#fetchfundingratehistory)
* [bingx](/docs/exchanges/bingx#fetchfundingratehistory)
* [bitfinex](/docs/exchanges/bitfinex#fetchfundingratehistory)
* [bitget](/docs/exchanges/bitget#fetchfundingratehistory)
* [bitmex](/docs/exchanges/bitmex#fetchfundingratehistory)
* [bitstamp](/docs/exchanges/bitstamp#fetchfundingratehistory)
* [blofin](/docs/exchanges/blofin#fetchfundingratehistory)
* [btse](/docs/exchanges/btse#fetchfundingratehistory)
* [bullish](/docs/exchanges/bullish#fetchfundingratehistory)
* [bybit](/docs/exchanges/bybit#fetchfundingratehistory)
* [bydfi](/docs/exchanges/bydfi#fetchfundingratehistory)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchfundingratehistory)
* [coinex](/docs/exchanges/coinex#fetchfundingratehistory)
* [cryptocom](/docs/exchanges/cryptocom#fetchfundingratehistory)
* [deepcoin](/docs/exchanges/deepcoin#fetchfundingratehistory)
* [deribit](/docs/exchanges/deribit#fetchfundingratehistory)
* [derive](/docs/exchanges/derive#fetchfundingratehistory)
* [digifinex](/docs/exchanges/digifinex#fetchfundingratehistory)
* [dydx](/docs/exchanges/dydx#fetchfundingratehistory)
* [extended](/docs/exchanges/extended#fetchfundingratehistory)
* [gate](/docs/exchanges/gate#fetchfundingratehistory)
* [grvt](/docs/exchanges/grvt#fetchfundingratehistory)
* [hashkey](/docs/exchanges/hashkey#fetchfundingratehistory)
* [hibachi](/docs/exchanges/hibachi#fetchfundingratehistory)
* [hitbtc](/docs/exchanges/hitbtc#fetchfundingratehistory)
* [htx](/docs/exchanges/htx#fetchfundingratehistory)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchfundingratehistory)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchfundingratehistory)
* [kucoin](/docs/exchanges/kucoin#fetchfundingratehistory)
* [mexc](/docs/exchanges/mexc#fetchfundingratehistory)
* [modetrade](/docs/exchanges/modetrade#fetchfundingratehistory)
* [okx](/docs/exchanges/okx#fetchfundingratehistory)
* [pacifica](/docs/exchanges/pacifica#fetchfundingratehistory)
* [paradex](/docs/exchanges/paradex#fetchfundingratehistory)
* [phemex](/docs/exchanges/phemex#fetchfundingratehistory)
* [toobit](/docs/exchanges/toobit#fetchfundingratehistory)
* [weex](/docs/exchanges/weex#fetchfundingratehistory)
* [whitebit](/docs/exchanges/whitebit#fetchfundingratehistory)
* [woo](/docs/exchanges/woo#fetchfundingratehistory)
* [woofipro](/docs/exchanges/woofipro#fetchfundingratehistory)
* [xt](/docs/exchanges/xt#fetchfundingratehistory)
***
## fetchFundingRates [#fetchfundingrates]
fetch the current funding rate for multiple symbols
**Kind**: instance\
**Returns**: Array\ - a list of [funding rate structures](/docs/manual#funding-rate-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | No | list of unified market symbols |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-103]
* [aster](/docs/exchanges/aster#fetchfundingrates)
* [binance](/docs/exchanges/binance#fetchfundingrates)
* [bingx](/docs/exchanges/bingx#fetchfundingrates)
* [bitfinex](/docs/exchanges/bitfinex#fetchfundingrates)
* [bitget](/docs/exchanges/bitget#fetchfundingrates)
* [bitmex](/docs/exchanges/bitmex#fetchfundingrates)
* [btse](/docs/exchanges/btse#fetchfundingrates)
* [bybit](/docs/exchanges/bybit#fetchfundingrates)
* [coinex](/docs/exchanges/coinex#fetchfundingrates)
* [deepcoin](/docs/exchanges/deepcoin#fetchfundingrates)
* [delta](/docs/exchanges/delta#fetchfundingrates)
* [gate](/docs/exchanges/gate#fetchfundingrates)
* [hashkey](/docs/exchanges/hashkey#fetchfundingrates)
* [hitbtc](/docs/exchanges/hitbtc#fetchfundingrates)
* [htx](/docs/exchanges/htx#fetchfundingrates)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchfundingrates)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchfundingrates)
* [lbank](/docs/exchanges/lbank#fetchfundingrates)
* [lighter](/docs/exchanges/lighter#fetchfundingrates)
* [modetrade](/docs/exchanges/modetrade#fetchfundingrates)
* [nado](/docs/exchanges/nado#fetchfundingrates)
* [okx](/docs/exchanges/okx#fetchfundingrates)
* [pacifica](/docs/exchanges/pacifica#fetchfundingrates)
* [paradex](/docs/exchanges/paradex#fetchfundingrates)
* [toobit](/docs/exchanges/toobit#fetchfundingrates)
* [weex](/docs/exchanges/weex#fetchfundingrates)
* [whitebit](/docs/exchanges/whitebit#fetchfundingrates)
* [woo](/docs/exchanges/woo#fetchfundingrates)
* [woofipro](/docs/exchanges/woofipro#fetchfundingrates)
***
## fetchGreeks [#fetchgreeks]
fetches an option contracts greeks, financial metrics used to measure the factors that affect the price of an options contract
**Kind**: instance\
**Returns**: object - a [greeks structure](/docs/manual#greeks-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market to fetch greeks for |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-104]
* [binance](/docs/exchanges/binance#fetchgreeks)
* [bybit](/docs/exchanges/bybit#fetchgreeks)
* [delta](/docs/exchanges/delta#fetchgreeks)
* [deribit](/docs/exchanges/deribit#fetchgreeks)
* [gate](/docs/exchanges/gate#fetchgreeks)
* [okx](/docs/exchanges/okx#fetchgreeks)
* [paradex](/docs/exchanges/paradex#fetchgreeks)
***
## fetchHip3Markets [#fetchhip3markets]
retrieves data on all hip3 markets for hyperliquid
**Kind**: instance\
**Returns**: Array\ - an array of objects representing market data
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-105]
* [hyperliquid](/docs/exchanges/hyperliquid#fetchhip3markets)
***
## fetchIsolatedBorrowRate [#fetchisolatedborrowrate]
fetch the rate of interest to borrow a currency for margin trading
**Kind**: instance\
**Returns**: object - an [isolated borrow rate structure](/docs/manual#isolated-borrow-rate-structure)
| Param | Type | Required | Description |
| --------------- | ------------------- | -------- | ----------------------------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint EXCHANGE SPECIFIC PARAMETERS |
| params.vipLevel | object | No | user's current specific margin data will be returned if viplevel is omitted |
##### Supported exchanges [#supported-exchanges-106]
* [binance](/docs/exchanges/binance#fetchisolatedborrowrate)
* [bitget](/docs/exchanges/bitget#fetchisolatedborrowrate)
* [coinex](/docs/exchanges/coinex#fetchisolatedborrowrate)
***
## fetchIsolatedBorrowRates [#fetchisolatedborrowrates]
fetch the borrow interest rates of all currencies
**Kind**: instance\
**Returns**: object - a [borrow rate structure](/docs/manual#borrow-rate-structure)
| Param | Type | Required | Description |
| --------------- | ------------------- | -------- | --------------------------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.symbol | object | No | unified market symbol EXCHANGE SPECIFIC PARAMETERS |
| params.vipLevel | object | No | user's current specific margin data will be returned if viplevel is omitted |
##### Supported exchanges [#supported-exchanges-107]
* [binance](/docs/exchanges/binance#fetchisolatedborrowrates)
* [htx](/docs/exchanges/htx#fetchisolatedborrowrates)
***
## fetchL3OrderBook [#fetchl3orderbook]
fetches level 3 information on open orders with bid (buy) and ask (sell) prices, volumes and other data
**Kind**: instance\
**Returns**: object - an [order book structure](/docs/manual#order-book-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol |
| limit | int | No | max number of orders to return, default is undefined |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-108]
* [blockchaincom](/docs/exchanges/blockchaincom#fetchl3orderbook)
***
## fetchLastPrices [#fetchlastprices]
fetches the last price for multiple markets
**Kind**: instance\
**Returns**: object - a dictionary of lastprices structures
| Param | Type | Required | Description |
| -------------- | --------------------------------------------------- | -------- | ------------------------------------------------------- |
| symbols | Array\, undefined | Yes | unified symbols of the markets to fetch the last prices |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.subType | string | No | "linear" or "inverse" |
##### Supported exchanges [#supported-exchanges-109]
* [aster](/docs/exchanges/aster#fetchlastprices)
* [binance](/docs/exchanges/binance#fetchlastprices)
* [hashkey](/docs/exchanges/hashkey#fetchlastprices)
* [htx](/docs/exchanges/htx#fetchlastprices)
* [toobit](/docs/exchanges/toobit#fetchlastprices)
* [weex](/docs/exchanges/weex#fetchlastprices)
***
## fetchLedger [#fetchledger]
fetch the history of changes, actions done by the user or operations that altered the balance of the user
**Kind**: instance\
**Returns**: object - a [ledger structure](/docs/manual#ledger)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | No | unified currency code |
| since | int | No | timestamp in ms of the earliest ledger entry |
| limit | int | No | max number of ledger entries to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | timestamp in ms of the latest ledger entry |
##### Supported exchanges [#supported-exchanges-110]
* [aster](/docs/exchanges/aster#fetchledger)
* [binance](/docs/exchanges/binance#fetchledger)
* [bitfinex](/docs/exchanges/bitfinex#fetchledger)
* [bitget](/docs/exchanges/bitget#fetchledger)
* [bitmex](/docs/exchanges/bitmex#fetchledger)
* [bitso](/docs/exchanges/bitso#fetchledger)
* [bitstamp](/docs/exchanges/bitstamp#fetchledger)
* [bitvavo](/docs/exchanges/bitvavo#fetchledger)
* [blofin](/docs/exchanges/blofin#fetchledger)
* [btse](/docs/exchanges/btse#fetchledger)
* [bybit](/docs/exchanges/bybit#fetchledger)
* [cex](/docs/exchanges/cex#fetchledger)
* [coinbase](/docs/exchanges/coinbase#fetchledger)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchledger)
* [cryptocom](/docs/exchanges/cryptocom#fetchledger)
* [deepcoin](/docs/exchanges/deepcoin#fetchledger)
* [delta](/docs/exchanges/delta#fetchledger)
* [digifinex](/docs/exchanges/digifinex#fetchledger)
* [dydx](/docs/exchanges/dydx#fetchledger)
* [extended](/docs/exchanges/extended#fetchledger)
* [foxbit](/docs/exchanges/foxbit#fetchledger)
* [gate](/docs/exchanges/gate#fetchledger)
* [hashkey](/docs/exchanges/hashkey#fetchledger)
* [hibachi](/docs/exchanges/hibachi#fetchledger)
* [htx](/docs/exchanges/htx#fetchledger)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchledger)
* [kraken](/docs/exchanges/kraken#fetchledger)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchledger)
* [kucoin](/docs/exchanges/kucoin#fetchledger)
* [luno](/docs/exchanges/luno#fetchledger)
* [modetrade](/docs/exchanges/modetrade#fetchledger)
* [ndax](/docs/exchanges/ndax#fetchledger)
* [okx](/docs/exchanges/okx#fetchledger)
* [pacifica](/docs/exchanges/pacifica#fetchledger)
* [toobit](/docs/exchanges/toobit#fetchledger)
* [weex](/docs/exchanges/weex#fetchledger)
* [woo](/docs/exchanges/woo#fetchledger)
* [woofipro](/docs/exchanges/woofipro#fetchledger)
* [xt](/docs/exchanges/xt#fetchledger)
***
## fetchLedgerEntry [#fetchledgerentry]
fetch the history of changes, actions done by the user or operations that altered the balance of the user
**Kind**: instance\
**Returns**: object - a [ledger structure](/docs/manual#ledger-entry-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the identification number of the ledger entry |
| code | string | Yes | unified currency code |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-111]
* [binance](/docs/exchanges/binance#fetchledgerentry)
***
## fetchLeverage [#fetchleverage]
fetch the set leverage for a market
**Kind**: instance\
**Returns**: object - a [leverage structure](/docs/manual#leverage-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-112]
* [bingx](/docs/exchanges/bingx#fetchleverage)
* [bitget](/docs/exchanges/bitget#fetchleverage)
* [blofin](/docs/exchanges/blofin#fetchleverage)
* [btse](/docs/exchanges/btse#fetchleverage)
* [bybit](/docs/exchanges/bybit#fetchleverage)
* [bydfi](/docs/exchanges/bydfi#fetchleverage)
* [coinex](/docs/exchanges/coinex#fetchleverage)
* [delta](/docs/exchanges/delta#fetchleverage)
* [extended](/docs/exchanges/extended#fetchleverage)
* [gate](/docs/exchanges/gate#fetchleverage)
* [hashkey](/docs/exchanges/hashkey#fetchleverage)
* [hitbtc](/docs/exchanges/hitbtc#fetchleverage)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchleverage)
* [kucoin](/docs/exchanges/kucoin#fetchleverage)
* [mexc](/docs/exchanges/mexc#fetchleverage)
* [modetrade](/docs/exchanges/modetrade#fetchleverage)
* [mudrex](/docs/exchanges/mudrex#fetchleverage)
* [okx](/docs/exchanges/okx#fetchleverage)
* [pacifica](/docs/exchanges/pacifica#fetchleverage)
* [paradex](/docs/exchanges/paradex#fetchleverage)
* [poloniex](/docs/exchanges/poloniex#fetchleverage)
* [toobit](/docs/exchanges/toobit#fetchleverage)
* [weex](/docs/exchanges/weex#fetchleverage)
* [woo](/docs/exchanges/woo#fetchleverage)
* [woofipro](/docs/exchanges/woofipro#fetchleverage)
* [zebpay](/docs/exchanges/zebpay#fetchleverage)
***
## fetchLeverageTiers [#fetchleveragetiers]
retrieve information on the maximum leverage, and maintenance margin for trades of varying trade sizes
**Kind**: instance\
**Returns**: object - a dictionary of [leverage tiers structures](/docs/manual#leverage-tiers-structure), indexed by market symbols
| Param | Type | Required | Description |
| ---------------------- | --------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------- |
| symbols | Array\, undefined | Yes | list of unified market symbols |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.portfolioMargin | boolean | No | set to true if you would like to fetch the leverage tiers for a portfolio margin account |
| params.subType | string | No | "linear" or "inverse" |
##### Supported exchanges [#supported-exchanges-113]
* [binance](/docs/exchanges/binance#fetchleveragetiers)
* [btse](/docs/exchanges/btse#fetchleveragetiers)
* [bybit](/docs/exchanges/bybit#fetchleveragetiers)
* [coinex](/docs/exchanges/coinex#fetchleveragetiers)
* [digifinex](/docs/exchanges/digifinex#fetchleveragetiers)
* [gate](/docs/exchanges/gate#fetchleveragetiers)
* [hashkey](/docs/exchanges/hashkey#fetchleveragetiers)
* [htx](/docs/exchanges/htx#fetchleveragetiers)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchleveragetiers)
* [kucoin](/docs/exchanges/kucoin#fetchleveragetiers)
* [mexc](/docs/exchanges/mexc#fetchleveragetiers)
* [phemex](/docs/exchanges/phemex#fetchleveragetiers)
* [xt](/docs/exchanges/xt#fetchleveragetiers)
***
## fetchLeverages [#fetchleverages]
fetch the set leverage for all markets
**Kind**: instance\
**Returns**: object - a list of [leverage structures](/docs/manual#leverage-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | No | a list of unified market symbols |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-114]
* [aster](/docs/exchanges/aster#fetchleverages)
* [binance](/docs/exchanges/binance#fetchleverages)
* [bitmex](/docs/exchanges/bitmex#fetchleverages)
* [blofin](/docs/exchanges/blofin#fetchleverages)
* [gate](/docs/exchanges/gate#fetchleverages)
* [grvt](/docs/exchanges/grvt#fetchleverages)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchleverages)
* [weex](/docs/exchanges/weex#fetchleverages)
* [zebpay](/docs/exchanges/zebpay#fetchleverages)
***
## fetchLiquidations [#fetchliquidations]
retrieves the public liquidations of a trading pair
**Kind**: instance\
**Returns**: object - an array of [liquidation structures](/docs/manual#liquidation-structure)
| Param | Type | Required | Description |
| --------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified CCXT market symbol |
| since | int | No | the earliest time in ms to fetch liquidations for |
| limit | int | No | the maximum number of liquidation structures to retrieve |
| params | object | No | exchange specific parameters |
| params.until | int | No | timestamp in ms of the latest liquidation |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](/docs/manual#pagination-params) |
##### Supported exchanges [#supported-exchanges-115]
* [bitfinex](/docs/exchanges/bitfinex#fetchliquidations)
* [bitmex](/docs/exchanges/bitmex#fetchliquidations)
* [deribit](/docs/exchanges/deribit#fetchliquidations)
* [gate](/docs/exchanges/gate#fetchliquidations)
* [htx](/docs/exchanges/htx#fetchliquidations)
***
## fetchLongShortRatioHistory [#fetchlongshortratiohistory]
fetches the long short ratio history for a unified market symbol
**Kind**: instance\
**Returns**: Array\ - an array of [long short ratio structures](/docs/manual#long-short-ratio-structure)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | -------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to fetch the long short ratio for |
| timeframe | string | No | the period for the ratio, default is 24 hours |
| since | int | No | the earliest time in ms to fetch ratios for |
| limit | int | No | the maximum number of long short ratio structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | timestamp in ms of the latest ratio to fetch |
##### Supported exchanges [#supported-exchanges-116]
* [binance](/docs/exchanges/binance#fetchlongshortratiohistory)
* [bitget](/docs/exchanges/bitget#fetchlongshortratiohistory)
* [bybit](/docs/exchanges/bybit#fetchlongshortratiohistory)
* [okx](/docs/exchanges/okx#fetchlongshortratiohistory)
***
## fetchMarginAdjustmentHistory [#fetchmarginadjustmenthistory]
fetches the history of margin added or reduced from contract isolated positions
**Kind**: instance\
**Returns**: Array\ - a list of [margin structures](/docs/manual#margin-loan-structure)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol |
| type | string | No | "add" or "reduce" |
| since | int | No | timestamp in ms of the earliest change to fetch |
| limit | int | No | the maximum amount of changes to fetch |
| params | object | Yes | extra parameters specific to the exchange API endpoint |
| params.until | int | No | timestamp in ms of the latest change to fetch |
##### Supported exchanges [#supported-exchanges-117]
* [aster](/docs/exchanges/aster#fetchmarginadjustmenthistory)
* [binance](/docs/exchanges/binance#fetchmarginadjustmenthistory)
* [coinex](/docs/exchanges/coinex#fetchmarginadjustmenthistory)
* [okx](/docs/exchanges/okx#fetchmarginadjustmenthistory)
***
## fetchMarginMode [#fetchmarginmode]
fetches the margin mode of a specific symbol
**Kind**: instance\
**Returns**: object - a [margin mode structure](/docs/manual#margin-mode-structure)
| Param | Type | Required | Description |
| -------------- | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market the order was made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.subType | string | No | "linear" or "inverse" |
##### Supported exchanges [#supported-exchanges-118]
* [binance](/docs/exchanges/binance#fetchmarginmode)
* [bingx](/docs/exchanges/bingx#fetchmarginmode)
* [bitget](/docs/exchanges/bitget#fetchmarginmode)
* [blofin](/docs/exchanges/blofin#fetchmarginmode)
* [btse](/docs/exchanges/btse#fetchmarginmode)
* [bybit](/docs/exchanges/bybit#fetchmarginmode)
* [bydfi](/docs/exchanges/bydfi#fetchmarginmode)
* [delta](/docs/exchanges/delta#fetchmarginmode)
* [kucoin](/docs/exchanges/kucoin#fetchmarginmode)
* [pacifica](/docs/exchanges/pacifica#fetchmarginmode)
* [paradex](/docs/exchanges/paradex#fetchmarginmode)
* [weex](/docs/exchanges/weex#fetchmarginmode)
* [woofipro](/docs/exchanges/woofipro#fetchmarginmode)
***
## fetchMarginModes [#fetchmarginmodes]
fetches margin mode of the user
**Kind**: instance\
**Returns**: object - a list of [margin mode structures](/docs/manual#margin-mode-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | Yes | unified market symbols |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-119]
* [aster](/docs/exchanges/aster#fetchmarginmodes)
* [binance](/docs/exchanges/binance#fetchmarginmodes)
* [grvt](/docs/exchanges/grvt#fetchmarginmodes)
* [hitbtc](/docs/exchanges/hitbtc#fetchmarginmodes)
* [weex](/docs/exchanges/weex#fetchmarginmodes)
* [woofipro](/docs/exchanges/woofipro#fetchmarginmodes)
***
## fetchMarkOHLCV [#fetchmarkohlcv]
fetches historical mark price candlestick data containing the open, high, low, and close price of a market
**Kind**: instance\
**Returns**: Array\> - A list of candles ordered as timestamp, open, high, low, close, volume
| Param | Type | Required | Description |
| --------- | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market to fetch OHLCV data for |
| timeframe | string | Yes | the length of time each candle represents |
| since | int | No | timestamp in ms of the earliest candle to fetch |
| limit | int | No | the maximum amount of candles to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-120]
* [mudrex](/docs/exchanges/mudrex#fetchmarkohlcv)
***
## fetchMarkPrice [#fetchmarkprice]
fetches mark price for the market
**Kind**: instance\
**Returns**: object - a dictionary of [ticker structures](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| -------------- | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.subType | string | No | "linear" or "inverse" |
##### Supported exchanges [#supported-exchanges-121]
* [binance](/docs/exchanges/binance#fetchmarkprice)
* [bingx](/docs/exchanges/bingx#fetchmarkprice)
* [bitget](/docs/exchanges/bitget#fetchmarkprice)
* [blofin](/docs/exchanges/blofin#fetchmarkprice)
* [kucoin](/docs/exchanges/kucoin#fetchmarkprice)
* [okx](/docs/exchanges/okx#fetchmarkprice)
* [weex](/docs/exchanges/weex#fetchmarkprice)
***
## fetchMarkPrices [#fetchmarkprices]
fetches mark prices for multiple markets
**Kind**: instance\
**Returns**: object - a dictionary of [ticker structures](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| -------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------- |
| symbols | Array\ | No | unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.subType | string | No | "linear" or "inverse" |
##### Supported exchanges [#supported-exchanges-122]
* [binance](/docs/exchanges/binance#fetchmarkprices)
* [bingx](/docs/exchanges/bingx#fetchmarkprices)
* [kucoin](/docs/exchanges/kucoin#fetchmarkprices)
* [okx](/docs/exchanges/okx#fetchmarkprices)
* [weex](/docs/exchanges/weex#fetchmarkprices)
***
## fetchMarketLeverageTiers [#fetchmarketleveragetiers]
retrieve information on the maximum leverage, for different trade sizes for a single market
**Kind**: instance\
**Returns**: object - a [leverage tiers structure](/docs/manual#leverage-tiers-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ----------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol, inverse (Coin-M) markets are not supported |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-123]
* [bingx](/docs/exchanges/bingx#fetchmarketleveragetiers)
* [bitget](/docs/exchanges/bitget#fetchmarketleveragetiers)
* [btse](/docs/exchanges/btse#fetchmarketleveragetiers)
* [bybit](/docs/exchanges/bybit#fetchmarketleveragetiers)
* [digifinex](/docs/exchanges/digifinex#fetchmarketleveragetiers)
* [gate](/docs/exchanges/gate#fetchmarketleveragetiers)
* [kucoin](/docs/exchanges/kucoin#fetchmarketleveragetiers)
* [okx](/docs/exchanges/okx#fetchmarketleveragetiers)
* [xt](/docs/exchanges/xt#fetchmarketleveragetiers)
***
## fetchMarkets [#fetchmarkets]
retrieves data on all markets for alpaca
**Kind**: instance\
**Returns**: Array\ - an array of objects representing market data
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-124]
* [alpaca](/docs/exchanges/alpaca#fetchmarkets)
* [apex](/docs/exchanges/apex#fetchmarkets)
* [aster](/docs/exchanges/aster#fetchmarkets)
* [backpack](/docs/exchanges/backpack#fetchmarkets)
* [bigone](/docs/exchanges/bigone#fetchmarkets)
* [binance](/docs/exchanges/binance#fetchmarkets)
* [bingx](/docs/exchanges/bingx#fetchmarkets)
* [bitbank](/docs/exchanges/bitbank#fetchmarkets)
* [bitbns](/docs/exchanges/bitbns#fetchmarkets)
* [bitfinex](/docs/exchanges/bitfinex#fetchmarkets)
* [bitflyer](/docs/exchanges/bitflyer#fetchmarkets)
* [bitget](/docs/exchanges/bitget#fetchmarkets)
* [bithumb](/docs/exchanges/bithumb#fetchmarkets)
* [bitmex](/docs/exchanges/bitmex#fetchmarkets)
* [bitopro](/docs/exchanges/bitopro#fetchmarkets)
* [bitrue](/docs/exchanges/bitrue#fetchmarkets)
* [bitso](/docs/exchanges/bitso#fetchmarkets)
* [bitstamp](/docs/exchanges/bitstamp#fetchmarkets)
* [bitteam](/docs/exchanges/bitteam#fetchmarkets)
* [bittrade](/docs/exchanges/bittrade#fetchmarkets)
* [bitvavo](/docs/exchanges/bitvavo#fetchmarkets)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchmarkets)
* [blofin](/docs/exchanges/blofin#fetchmarkets)
* [btcbox](/docs/exchanges/btcbox#fetchmarkets)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchmarkets)
* [btcturk](/docs/exchanges/btcturk#fetchmarkets)
* [btse](/docs/exchanges/btse#fetchmarkets)
* [bullish](/docs/exchanges/bullish#fetchmarkets)
* [bybit](/docs/exchanges/bybit#fetchmarkets)
* [bydfi](/docs/exchanges/bydfi#fetchmarkets)
* [cex](/docs/exchanges/cex#fetchmarkets)
* [coinbase](/docs/exchanges/coinbase#fetchmarkets)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchmarkets)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchmarkets)
* [coinex](/docs/exchanges/coinex#fetchmarkets)
* [coinmate](/docs/exchanges/coinmate#fetchmarkets)
* [coinone](/docs/exchanges/coinone#fetchmarkets)
* [coinsph](/docs/exchanges/coinsph#fetchmarkets)
* [cryptocom](/docs/exchanges/cryptocom#fetchmarkets)
* [cryptomus](/docs/exchanges/cryptomus#fetchmarkets)
* [deepcoin](/docs/exchanges/deepcoin#fetchmarkets)
* [delta](/docs/exchanges/delta#fetchmarkets)
* [deribit](/docs/exchanges/deribit#fetchmarkets)
* [derive](/docs/exchanges/derive#fetchmarkets)
* [digifinex](/docs/exchanges/digifinex#fetchmarkets)
* [dydx](/docs/exchanges/dydx#fetchmarkets)
* [extended](/docs/exchanges/extended#fetchmarkets)
* [foxbit](/docs/exchanges/foxbit#fetchmarkets)
* [gate](/docs/exchanges/gate#fetchmarkets)
* [gemini](/docs/exchanges/gemini#fetchmarkets)
* [grvt](/docs/exchanges/grvt#fetchmarkets)
* [hashkey](/docs/exchanges/hashkey#fetchmarkets)
* [hibachi](/docs/exchanges/hibachi#fetchmarkets)
* [hitbtc](/docs/exchanges/hitbtc#fetchmarkets)
* [hollaex](/docs/exchanges/hollaex#fetchmarkets)
* [htx](/docs/exchanges/htx#fetchmarkets)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchmarkets)
* [independentreserve](/docs/exchanges/independentreserve#fetchmarkets)
* [indodax](/docs/exchanges/indodax#fetchmarkets)
* [kraken](/docs/exchanges/kraken#fetchmarkets)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchmarkets)
* [kucoin](/docs/exchanges/kucoin#fetchmarkets)
* [latoken](/docs/exchanges/latoken#fetchmarkets)
* [lbank](/docs/exchanges/lbank#fetchmarkets)
* [lighter](/docs/exchanges/lighter#fetchmarkets)
* [luno](/docs/exchanges/luno#fetchmarkets)
* [mercado](/docs/exchanges/mercado#fetchmarkets)
* [mexc](/docs/exchanges/mexc#fetchmarkets)
* [modetrade](/docs/exchanges/modetrade#fetchmarkets)
* [mudrex](/docs/exchanges/mudrex#fetchmarkets)
* [nado](/docs/exchanges/nado#fetchmarkets)
* [ndax](/docs/exchanges/ndax#fetchmarkets)
* [okx](/docs/exchanges/okx#fetchmarkets)
* [onetrading](/docs/exchanges/onetrading#fetchmarkets)
* [p2b](/docs/exchanges/p2b#fetchmarkets)
* [pacifica](/docs/exchanges/pacifica#fetchmarkets)
* [paradex](/docs/exchanges/paradex#fetchmarkets)
* [phemex](/docs/exchanges/phemex#fetchmarkets)
* [poloniex](/docs/exchanges/poloniex#fetchmarkets)
* [revolutx](/docs/exchanges/revolutx#fetchmarkets)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchmarkets)
* [toobit](/docs/exchanges/toobit#fetchmarkets)
* [upbit](/docs/exchanges/upbit#fetchmarkets)
* [weex](/docs/exchanges/weex#fetchmarkets)
* [whitebit](/docs/exchanges/whitebit#fetchmarkets)
* [woo](/docs/exchanges/woo#fetchmarkets)
* [woofipro](/docs/exchanges/woofipro#fetchmarkets)
* [xt](/docs/exchanges/xt#fetchmarkets)
* [zaif](/docs/exchanges/zaif#fetchmarkets)
* [zebpay](/docs/exchanges/zebpay#fetchmarkets)
***
## fetchMarketsWs [#fetchmarketsws]
retrieves data on all markets for bitvavo
**Kind**: instance\
**Returns**: Array\ - an array of objects representing market data
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-125]
* [bitvavo](/docs/exchanges/bitvavo#fetchmarketsws)
***
## fetchMyContractTrades [#fetchmycontracttrades]
fetch all contract trades made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#trade-structure)
| Param | Type | Required | Description |
| --------------- | -------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol |
| since | int | No | the earliest time in ms to fetch trades for |
| limit | int | No | the maximum number of trades structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | End time in ms |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](/docs/manual#pagination-params) |
##### Supported exchanges [#supported-exchanges-126]
* [kucoin](/docs/exchanges/kucoin#fetchmycontracttrades)
***
## fetchMyDustTrades [#fetchmydusttrades]
fetch all dust trades made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#trade-structure)
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | not used by fetchMyDustTrades () |
| since | int | No | the earliest time in ms to fetch my dust trades for |
| limit | int | No | the maximum number of dust trades to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.type | string | No | 'spot' or 'margin', default spot |
##### Supported exchanges [#supported-exchanges-127]
* [binance](/docs/exchanges/binance#fetchmydusttrades)
***
## fetchMyLiquidations [#fetchmyliquidations]
retrieves the users liquidated positions
**Kind**: instance\
**Returns**: object - an array of [liquidation structures](/docs/manual#liquidation-structure)
| Param | Type | Required | Description |
| ---------------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | No | unified CCXT market symbol |
| since | int | No | the earliest time in ms to fetch liquidations for |
| limit | int | No | the maximum number of liquidation structures to retrieve |
| params | object | No | exchange specific parameters for the binance api endpoint |
| params.until | int | No | timestamp in ms of the latest liquidation |
| params.paginate | boolean | No | *spot only* default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](/docs/manual#pagination-params) |
| params.portfolioMargin | boolean | No | set to true if you would like to fetch liquidations in a portfolio margin account |
| params.type | string | No | "spot" |
| params.subType | string | No | "linear" or "inverse" |
##### Supported exchanges [#supported-exchanges-128]
* [binance](/docs/exchanges/binance#fetchmyliquidations)
* [bingx](/docs/exchanges/bingx#fetchmyliquidations)
* [bitget](/docs/exchanges/bitget#fetchmyliquidations)
* [bybit](/docs/exchanges/bybit#fetchmyliquidations)
* [deribit](/docs/exchanges/deribit#fetchmyliquidations)
* [gate](/docs/exchanges/gate#fetchmyliquidations)
* [paradex](/docs/exchanges/paradex#fetchmyliquidations)
***
## fetchMySettlementHistory [#fetchmysettlementhistory]
fetches historical settlement records of the user
**Kind**: instance\
**Returns**: Array\ - a list of \[settlement history objects]
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ----------------------------------------------- |
| symbol | string | Yes | unified market symbol of the settlement history |
| since | int | No | timestamp in ms |
| limit | int | No | number of records |
| params | object | No | exchange specific params |
##### Supported exchanges [#supported-exchanges-129]
* [binance](/docs/exchanges/binance#fetchmysettlementhistory)
* [bybit](/docs/exchanges/bybit#fetchmysettlementhistory)
* [gate](/docs/exchanges/gate#fetchmysettlementhistory)
* [hibachi](/docs/exchanges/hibachi#fetchmysettlementhistory)
***
## fetchMySpotTrades [#fetchmyspottrades]
fetch all spot trades made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#trade-structure)
| Param | Type | Required | Description |
| ----------------- | -------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol |
| since | int | No | the earliest time in ms to fetch trades for |
| limit | int | No | the maximum number of trades structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | the latest time in ms to fetch entries for |
| params.hf | bool | No | false, // true for hf order |
| params.marginMode | string | No | 'cross' or 'isolated', only for margin trades |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](/docs/manual#pagination-params) |
##### Supported exchanges [#supported-exchanges-130]
* [kucoin](/docs/exchanges/kucoin#fetchmyspottrades)
***
## fetchMyTrades [#fetchmytrades]
fetch all trades made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#trade-structure)
| Param | Type | Required | Description |
| ------------------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | No | unified market symbol |
| since | int | No | the earliest time in ms to fetch trades for |
| limit | int | No | the maximum number of trade structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | the latest time in ms to fetch trades for |
| params.page\_token | string | No | page\_token - used for paging |
##### Supported exchanges [#supported-exchanges-131]
* [alpaca](/docs/exchanges/alpaca#fetchmytrades)
* [apex](/docs/exchanges/apex#fetchmytrades)
* [aster](/docs/exchanges/aster#fetchmytrades)
* [backpack](/docs/exchanges/backpack#fetchmytrades)
* [bigone](/docs/exchanges/bigone#fetchmytrades)
* [binance](/docs/exchanges/binance#fetchmytrades)
* [bingx](/docs/exchanges/bingx#fetchmytrades)
* [bit2c](/docs/exchanges/bit2c#fetchmytrades)
* [bitbank](/docs/exchanges/bitbank#fetchmytrades)
* [bitbns](/docs/exchanges/bitbns#fetchmytrades)
* [bitfinex](/docs/exchanges/bitfinex#fetchmytrades)
* [bitflyer](/docs/exchanges/bitflyer#fetchmytrades)
* [bitget](/docs/exchanges/bitget#fetchmytrades)
* [bitmex](/docs/exchanges/bitmex#fetchmytrades)
* [bitopro](/docs/exchanges/bitopro#fetchmytrades)
* [bitrue](/docs/exchanges/bitrue#fetchmytrades)
* [bitso](/docs/exchanges/bitso#fetchmytrades)
* [bitstamp](/docs/exchanges/bitstamp#fetchmytrades)
* [bitteam](/docs/exchanges/bitteam#fetchmytrades)
* [bittrade](/docs/exchanges/bittrade#fetchmytrades)
* [bitvavo](/docs/exchanges/bitvavo#fetchmytrades)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchmytrades)
* [blofin](/docs/exchanges/blofin#fetchmytrades)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchmytrades)
* [btcturk](/docs/exchanges/btcturk#fetchmytrades)
* [btse](/docs/exchanges/btse#fetchmytrades)
* [bullish](/docs/exchanges/bullish#fetchmytrades)
* [bybit](/docs/exchanges/bybit#fetchmytrades)
* [bydfi](/docs/exchanges/bydfi#fetchmytrades)
* [coinbase](/docs/exchanges/coinbase#fetchmytrades)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchmytrades)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchmytrades)
* [coincheck](/docs/exchanges/coincheck#fetchmytrades)
* [coinex](/docs/exchanges/coinex#fetchmytrades)
* [coinmate](/docs/exchanges/coinmate#fetchmytrades)
* [coinone](/docs/exchanges/coinone#fetchmytrades)
* [coinsph](/docs/exchanges/coinsph#fetchmytrades)
* [coinspot](/docs/exchanges/coinspot#fetchmytrades)
* [cryptocom](/docs/exchanges/cryptocom#fetchmytrades)
* [deepcoin](/docs/exchanges/deepcoin#fetchmytrades)
* [delta](/docs/exchanges/delta#fetchmytrades)
* [deribit](/docs/exchanges/deribit#fetchmytrades)
* [derive](/docs/exchanges/derive#fetchmytrades)
* [digifinex](/docs/exchanges/digifinex#fetchmytrades)
* [extended](/docs/exchanges/extended#fetchmytrades)
* [foxbit](/docs/exchanges/foxbit#fetchmytrades)
* [gate](/docs/exchanges/gate#fetchmytrades)
* [gemini](/docs/exchanges/gemini#fetchmytrades)
* [grvt](/docs/exchanges/grvt#fetchmytrades)
* [hashkey](/docs/exchanges/hashkey#fetchmytrades)
* [hibachi](/docs/exchanges/hibachi#fetchmytrades)
* [hitbtc](/docs/exchanges/hitbtc#fetchmytrades)
* [hollaex](/docs/exchanges/hollaex#fetchmytrades)
* [htx](/docs/exchanges/htx#fetchmytrades)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchmytrades)
* [independentreserve](/docs/exchanges/independentreserve#fetchmytrades)
* [kraken](/docs/exchanges/kraken#fetchmytrades)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchmytrades)
* [kucoin](/docs/exchanges/kucoin#fetchmytrades)
* [latoken](/docs/exchanges/latoken#fetchmytrades)
* [lbank](/docs/exchanges/lbank#fetchmytrades)
* [lighter](/docs/exchanges/lighter#fetchmytrades)
* [luno](/docs/exchanges/luno#fetchmytrades)
* [mercado](/docs/exchanges/mercado#fetchmytrades)
* [mexc](/docs/exchanges/mexc#fetchmytrades)
* [modetrade](/docs/exchanges/modetrade#fetchmytrades)
* [mudrex](/docs/exchanges/mudrex#fetchmytrades)
* [nado](/docs/exchanges/nado#fetchmytrades)
* [ndax](/docs/exchanges/ndax#fetchmytrades)
* [okx](/docs/exchanges/okx#fetchmytrades)
* [onetrading](/docs/exchanges/onetrading#fetchmytrades)
* [p2b](/docs/exchanges/p2b#fetchmytrades)
* [pacifica](/docs/exchanges/pacifica#fetchmytrades)
* [paradex](/docs/exchanges/paradex#fetchmytrades)
* [phemex](/docs/exchanges/phemex#fetchmytrades)
* [poloniex](/docs/exchanges/poloniex#fetchmytrades)
* [revolutx](/docs/exchanges/revolutx#fetchmytrades)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchmytrades)
* [toobit](/docs/exchanges/toobit#fetchmytrades)
* [weex](/docs/exchanges/weex#fetchmytrades)
* [whitebit](/docs/exchanges/whitebit#fetchmytrades)
* [woo](/docs/exchanges/woo#fetchmytrades)
* [woofipro](/docs/exchanges/woofipro#fetchmytrades)
* [xt](/docs/exchanges/xt#fetchmytrades)
* [zebpay](/docs/exchanges/zebpay#fetchmytrades)
***
## fetchMyTradesWs [#fetchmytradesws]
fetch all trades made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#trade-structure)
| Param | Type | Required | Description |
| -------------- | ---------------------------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol |
| since | int, undefined | No | the earliest time in ms to fetch trades for |
| limit | int, undefined | No | the maximum number of trades structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.endTime | int | No | the latest time in ms to fetch trades for |
| params.fromId | int | No | first trade Id to fetch |
##### Supported exchanges [#supported-exchanges-132]
* [binance](/docs/exchanges/binance#fetchmytradesws)
* [bitvavo](/docs/exchanges/bitvavo#fetchmytradesws)
***
## fetchMyUtaTrades [#fetchmyutatrades]
fetch all trades made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#trade-structure)
| Param | Type | Required | Description |
| ------------------ | -------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol |
| since | int | No | the earliest time in ms to fetch trades for |
| limit | int | No | the maximum number of trades structures to retrieve (default is 50, max is 200) |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | the latest time in ms to fetch entries for |
| params.accountMode | string | No | 'unified' or 'classic', defaults to 'unified' |
| params.marginMode | string | No | 'cross' or 'isolated', only for margin trades (unified accountMode support only cross margin) |
| params.side | string | No | 'BUY' or 'SELL' (both if not provided) |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](/docs/manual#pagination-params) |
##### Supported exchanges [#supported-exchanges-133]
* [kucoin](/docs/exchanges/kucoin#fetchmyutatrades)
***
## fetchOHLCV [#fetchohlcv]
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
**Kind**: instance\
**Returns**: Array\> - A list of candles ordered as timestamp, open, high, low, close, volume
| Param | Type | Required | Description |
| ---------------------- | -------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to fetch OHLCV data for |
| timeframe | string | Yes | the length of time each candle represents |
| since | int | No | timestamp in ms of the earliest candle to fetch |
| limit | int | No | the maximum amount of candles to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | timestamp in ms of the latest candle to fetch |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](/docs/manual#pagination-params) |
| params.paginationCalls | int | No | the maximum number of requests while following next\_page\_token, default 10 — when the cap is reached the result is silently truncated to the pages already fetched, so raise it for long ranges, 10 requests cover roughly 30 days of 1h candles |
| params.loc | string | No | crypto location, default: us |
| params.method | string | No | method, default: marketPublicGetV1beta3CryptoLocBars |
##### Supported exchanges [#supported-exchanges-134]
* [alpaca](/docs/exchanges/alpaca#fetchohlcv)
* [apex](/docs/exchanges/apex#fetchohlcv)
* [aster](/docs/exchanges/aster#fetchohlcv)
* [backpack](/docs/exchanges/backpack#fetchohlcv)
* [bigone](/docs/exchanges/bigone#fetchohlcv)
* [binance](/docs/exchanges/binance#fetchohlcv)
* [bingx](/docs/exchanges/bingx#fetchohlcv)
* [bitbank](/docs/exchanges/bitbank#fetchohlcv)
* [bitfinex](/docs/exchanges/bitfinex#fetchohlcv)
* [bitget](/docs/exchanges/bitget#fetchohlcv)
* [bithumb](/docs/exchanges/bithumb#fetchohlcv)
* [bitmex](/docs/exchanges/bitmex#fetchohlcv)
* [bitopro](/docs/exchanges/bitopro#fetchohlcv)
* [bitrue](/docs/exchanges/bitrue#fetchohlcv)
* [bitso](/docs/exchanges/bitso#fetchohlcv)
* [bitstamp](/docs/exchanges/bitstamp#fetchohlcv)
* [bitteam](/docs/exchanges/bitteam#fetchohlcv)
* [bittrade](/docs/exchanges/bittrade#fetchohlcv)
* [bitvavo](/docs/exchanges/bitvavo#fetchohlcv)
* [blofin](/docs/exchanges/blofin#fetchohlcv)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchohlcv)
* [btcturk](/docs/exchanges/btcturk#fetchohlcv)
* [btse](/docs/exchanges/btse#fetchohlcv)
* [bullish](/docs/exchanges/bullish#fetchohlcv)
* [bybit](/docs/exchanges/bybit#fetchohlcv)
* [bydfi](/docs/exchanges/bydfi#fetchohlcv)
* [cex](/docs/exchanges/cex#fetchohlcv)
* [coinbase](/docs/exchanges/coinbase#fetchohlcv)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchohlcv)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchohlcv)
* [coinex](/docs/exchanges/coinex#fetchohlcv)
* [coinsph](/docs/exchanges/coinsph#fetchohlcv)
* [cryptocom](/docs/exchanges/cryptocom#fetchohlcv)
* [deepcoin](/docs/exchanges/deepcoin#fetchohlcv)
* [delta](/docs/exchanges/delta#fetchohlcv)
* [deribit](/docs/exchanges/deribit#fetchohlcv)
* [digifinex](/docs/exchanges/digifinex#fetchohlcv)
* [dydx](/docs/exchanges/dydx#fetchohlcv)
* [extended](/docs/exchanges/extended#fetchohlcv)
* [foxbit](/docs/exchanges/foxbit#fetchohlcv)
* [gate](/docs/exchanges/gate#fetchohlcv)
* [gemini](/docs/exchanges/gemini#fetchohlcv)
* [grvt](/docs/exchanges/grvt#fetchohlcv)
* [hashkey](/docs/exchanges/hashkey#fetchohlcv)
* [hibachi](/docs/exchanges/hibachi#fetchohlcv)
* [hitbtc](/docs/exchanges/hitbtc#fetchohlcv)
* [hollaex](/docs/exchanges/hollaex#fetchohlcv)
* [htx](/docs/exchanges/htx#fetchohlcv)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchohlcv)
* [indodax](/docs/exchanges/indodax#fetchohlcv)
* [kraken](/docs/exchanges/kraken#fetchohlcv)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchohlcv)
* [kucoin](/docs/exchanges/kucoin#fetchohlcv)
* [lbank](/docs/exchanges/lbank#fetchohlcv)
* [lighter](/docs/exchanges/lighter#fetchohlcv)
* [luno](/docs/exchanges/luno#fetchohlcv)
* [mercado](/docs/exchanges/mercado#fetchohlcv)
* [mexc](/docs/exchanges/mexc#fetchohlcv)
* [modetrade](/docs/exchanges/modetrade#fetchohlcv)
* [mudrex](/docs/exchanges/mudrex#fetchohlcv)
* [nado](/docs/exchanges/nado#fetchohlcv)
* [ndax](/docs/exchanges/ndax#fetchohlcv)
* [okx](/docs/exchanges/okx#fetchohlcv)
* [onetrading](/docs/exchanges/onetrading#fetchohlcv)
* [p2b](/docs/exchanges/p2b#fetchohlcv)
* [pacifica](/docs/exchanges/pacifica#fetchohlcv)
* [paradex](/docs/exchanges/paradex#fetchohlcv)
* [phemex](/docs/exchanges/phemex#fetchohlcv)
* [poloniex](/docs/exchanges/poloniex#fetchohlcv)
* [revolutx](/docs/exchanges/revolutx#fetchohlcv)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchohlcv)
* [toobit](/docs/exchanges/toobit#fetchohlcv)
* [upbit](/docs/exchanges/upbit#fetchohlcv)
* [weex](/docs/exchanges/weex#fetchohlcv)
* [whitebit](/docs/exchanges/whitebit#fetchohlcv)
* [woo](/docs/exchanges/woo#fetchohlcv)
* [woofipro](/docs/exchanges/woofipro#fetchohlcv)
* [xt](/docs/exchanges/xt#fetchohlcv)
* [zebpay](/docs/exchanges/zebpay#fetchohlcv)
***
## fetchOHLCVWs [#fetchohlcvws]
query historical candlestick data containing the open, high, low, and close price, and the volume of a market
**Kind**: instance\
**Returns**: Array\> - A list of candles ordered as timestamp, open, high, low, close, volume
| Param | Type | Description |
| --------------- | ------------------- | ---------------------------------------------------------------------------- |
| symbol | string | unified symbol of the market to query OHLCV data for |
| timeframe | string | the length of time each candle represents |
| since | int | timestamp in ms of the earliest candle to fetch |
| limit | int | the maximum amount of candles to fetch |
| params | object | extra parameters specific to the exchange API endpoint |
| params.until | int | timestamp in ms of the earliest candle to fetch EXCHANGE SPECIFIC PARAMETERS |
| params.timeZone | string | default=0 (UTC) |
##### Supported exchanges [#supported-exchanges-135]
* [binance](/docs/exchanges/binance#fetchohlcvws)
* [bitvavo](/docs/exchanges/bitvavo#fetchohlcvws)
* [lbank](/docs/exchanges/lbank#fetchohlcvws)
***
## fetchOpenInterest [#fetchopeninterest]
retrieves the open interest of a contract trading pair
**Kind**: instance\
**Returns**: object - an open interest structure[/docs/manual#open-interest-structure](/docs/manual#open-interest-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ---------------------------- |
| symbol | string | Yes | unified CCXT market symbol |
| params | object | No | exchange specific parameters |
##### Supported exchanges [#supported-exchanges-136]
* [apex](/docs/exchanges/apex#fetchopeninterest)
* [backpack](/docs/exchanges/backpack#fetchopeninterest)
* [binance](/docs/exchanges/binance#fetchopeninterest)
* [bingx](/docs/exchanges/bingx#fetchopeninterest)
* [bitfinex](/docs/exchanges/bitfinex#fetchopeninterest)
* [bitget](/docs/exchanges/bitget#fetchopeninterest)
* [btse](/docs/exchanges/btse#fetchopeninterest)
* [bullish](/docs/exchanges/bullish#fetchopeninterest)
* [bybit](/docs/exchanges/bybit#fetchopeninterest)
* [delta](/docs/exchanges/delta#fetchopeninterest)
* [deribit](/docs/exchanges/deribit#fetchopeninterest)
* [gate](/docs/exchanges/gate#fetchopeninterest)
* [gemini](/docs/exchanges/gemini#fetchopeninterest)
* [hibachi](/docs/exchanges/hibachi#fetchopeninterest)
* [hitbtc](/docs/exchanges/hitbtc#fetchopeninterest)
* [htx](/docs/exchanges/htx#fetchopeninterest)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchopeninterest)
* [nado](/docs/exchanges/nado#fetchopeninterest)
* [okx](/docs/exchanges/okx#fetchopeninterest)
* [pacifica](/docs/exchanges/pacifica#fetchopeninterest)
* [paradex](/docs/exchanges/paradex#fetchopeninterest)
* [phemex](/docs/exchanges/phemex#fetchopeninterest)
* [weex](/docs/exchanges/weex#fetchopeninterest)
* [woofipro](/docs/exchanges/woofipro#fetchopeninterest)
* [xt](/docs/exchanges/xt#fetchopeninterest)
***
## fetchOpenInterestHistory [#fetchopeninteresthistory]
Retrieves the open interest history of a currency
**Kind**: instance\
**Returns**: object - an array of [open interest structure](/docs/manual#open-interest-structure)
| Param | Type | Required | Description |
| --------------- | -------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | Unified CCXT market symbol |
| timeframe | string | Yes | "5m","15m","30m","1h","2h","4h","6h","12h", or "1d" |
| since | int | No | the time(ms) of the earliest record to retrieve as a unix timestamp |
| limit | int | No | default 30, max 500 |
| params | object | No | exchange specific parameters |
| params.until | int | No | the time(ms) of the latest record to retrieve as a unix timestamp |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](/docs/manual#pagination-params) |
##### Supported exchanges [#supported-exchanges-137]
* [binance](/docs/exchanges/binance#fetchopeninteresthistory)
* [bitfinex](/docs/exchanges/bitfinex#fetchopeninteresthistory)
* [bybit](/docs/exchanges/bybit#fetchopeninteresthistory)
* [extended](/docs/exchanges/extended#fetchopeninteresthistory)
* [htx](/docs/exchanges/htx#fetchopeninteresthistory)
* [kucoin](/docs/exchanges/kucoin#fetchopeninteresthistory)
* [okx](/docs/exchanges/okx#fetchopeninteresthistory)
***
## fetchOpenInterests [#fetchopeninterests]
Retrieves the open interest for a list of symbols
**Kind**: instance\
**Returns**: Array\ - a list of [open interest structures](/docs/manual#open-interest-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------- |
| symbols | Array\ | No | a list of unified CCXT market symbols |
| params | object | No | exchange specific parameters |
##### Supported exchanges [#supported-exchanges-138]
* [bitfinex](/docs/exchanges/bitfinex#fetchopeninterests)
* [bitmex](/docs/exchanges/bitmex#fetchopeninterests)
* [btse](/docs/exchanges/btse#fetchopeninterests)
* [hitbtc](/docs/exchanges/hitbtc#fetchopeninterests)
* [htx](/docs/exchanges/htx#fetchopeninterests)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchopeninterests)
* [kucoin](/docs/exchanges/kucoin#fetchopeninterests)
* [nado](/docs/exchanges/nado#fetchopeninterests)
* [okx](/docs/exchanges/okx#fetchopeninterests)
* [pacifica](/docs/exchanges/pacifica#fetchopeninterests)
* [woofipro](/docs/exchanges/woofipro#fetchopeninterests)
***
## fetchOpenOrder [#fetchopenorder]
fetch an open order by the id
**Kind**: instance\
**Returns**: object - an [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-139]
* [aster](/docs/exchanges/aster#fetchopenorder)
* [backpack](/docs/exchanges/backpack#fetchopenorder)
* [binance](/docs/exchanges/binance#fetchopenorder)
* [bitfinex](/docs/exchanges/bitfinex#fetchopenorder)
* [btse](/docs/exchanges/btse#fetchopenorder)
* [bybit](/docs/exchanges/bybit#fetchopenorder)
* [bydfi](/docs/exchanges/bydfi#fetchopenorder)
* [cex](/docs/exchanges/cex#fetchopenorder)
* [deepcoin](/docs/exchanges/deepcoin#fetchopenorder)
* [hitbtc](/docs/exchanges/hitbtc#fetchopenorder)
* [hollaex](/docs/exchanges/hollaex#fetchopenorder)
***
## fetchOpenOrders [#fetchopenorders]
fetch all unfilled currently open orders
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market orders were made in |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | the latest time in ms to fetch orders for |
##### Supported exchanges [#supported-exchanges-140]
* [alpaca](/docs/exchanges/alpaca#fetchopenorders)
* [apex](/docs/exchanges/apex#fetchopenorders)
* [aster](/docs/exchanges/aster#fetchopenorders)
* [backpack](/docs/exchanges/backpack#fetchopenorders)
* [bigone](/docs/exchanges/bigone#fetchopenorders)
* [binance](/docs/exchanges/binance#fetchopenorders)
* [bingx](/docs/exchanges/bingx#fetchopenorders)
* [bit2c](/docs/exchanges/bit2c#fetchopenorders)
* [bitbank](/docs/exchanges/bitbank#fetchopenorders)
* [bitbns](/docs/exchanges/bitbns#fetchopenorders)
* [bitfinex](/docs/exchanges/bitfinex#fetchopenorders)
* [bitflyer](/docs/exchanges/bitflyer#fetchopenorders)
* [bitget](/docs/exchanges/bitget#fetchopenorders)
* [bithumb](/docs/exchanges/bithumb#fetchopenorders)
* [bitmex](/docs/exchanges/bitmex#fetchopenorders)
* [bitopro](/docs/exchanges/bitopro#fetchopenorders)
* [bitrue](/docs/exchanges/bitrue#fetchopenorders)
* [bitso](/docs/exchanges/bitso#fetchopenorders)
* [bitstamp](/docs/exchanges/bitstamp#fetchopenorders)
* [bitteam](/docs/exchanges/bitteam#fetchopenorders)
* [bittrade](/docs/exchanges/bittrade#fetchopenorders)
* [bitvavo](/docs/exchanges/bitvavo#fetchopenorders)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchopenorders)
* [blofin](/docs/exchanges/blofin#fetchopenorders)
* [btcbox](/docs/exchanges/btcbox#fetchopenorders)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchopenorders)
* [btcturk](/docs/exchanges/btcturk#fetchopenorders)
* [btse](/docs/exchanges/btse#fetchopenorders)
* [bullish](/docs/exchanges/bullish#fetchopenorders)
* [bybit](/docs/exchanges/bybit#fetchopenorders)
* [bydfi](/docs/exchanges/bydfi#fetchopenorders)
* [cex](/docs/exchanges/cex#fetchopenorders)
* [coinbase](/docs/exchanges/coinbase#fetchopenorders)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchopenorders)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchopenorders)
* [coincheck](/docs/exchanges/coincheck#fetchopenorders)
* [coinex](/docs/exchanges/coinex#fetchopenorders)
* [coinmate](/docs/exchanges/coinmate#fetchopenorders)
* [coinone](/docs/exchanges/coinone#fetchopenorders)
* [coinsph](/docs/exchanges/coinsph#fetchopenorders)
* [cryptocom](/docs/exchanges/cryptocom#fetchopenorders)
* [cryptomus](/docs/exchanges/cryptomus#fetchopenorders)
* [deepcoin](/docs/exchanges/deepcoin#fetchopenorders)
* [delta](/docs/exchanges/delta#fetchopenorders)
* [deribit](/docs/exchanges/deribit#fetchopenorders)
* [derive](/docs/exchanges/derive#fetchopenorders)
* [digifinex](/docs/exchanges/digifinex#fetchopenorders)
* [dydx](/docs/exchanges/dydx#fetchopenorders)
* [extended](/docs/exchanges/extended#fetchopenorders)
* [foxbit](/docs/exchanges/foxbit#fetchopenorders)
* [gate](/docs/exchanges/gate#fetchopenorders)
* [gemini](/docs/exchanges/gemini#fetchopenorders)
* [grvt](/docs/exchanges/grvt#fetchopenorders)
* [hashkey](/docs/exchanges/hashkey#fetchopenorders)
* [hibachi](/docs/exchanges/hibachi#fetchopenorders)
* [hitbtc](/docs/exchanges/hitbtc#fetchopenorders)
* [hollaex](/docs/exchanges/hollaex#fetchopenorders)
* [htx](/docs/exchanges/htx#fetchopenorders)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchopenorders)
* [independentreserve](/docs/exchanges/independentreserve#fetchopenorders)
* [indodax](/docs/exchanges/indodax#fetchopenorders)
* [kraken](/docs/exchanges/kraken#fetchopenorders)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchopenorders)
* [kucoin](/docs/exchanges/kucoin#fetchopenorders)
* [latoken](/docs/exchanges/latoken#fetchopenorders)
* [lbank](/docs/exchanges/lbank#fetchopenorders)
* [lighter](/docs/exchanges/lighter#fetchopenorders)
* [luno](/docs/exchanges/luno#fetchopenorders)
* [mercado](/docs/exchanges/mercado#fetchopenorders)
* [mexc](/docs/exchanges/mexc#fetchopenorders)
* [modetrade](/docs/exchanges/modetrade#fetchopenorders)
* [mudrex](/docs/exchanges/mudrex#fetchopenorders)
* [nado](/docs/exchanges/nado#fetchopenorders)
* [ndax](/docs/exchanges/ndax#fetchopenorders)
* [okx](/docs/exchanges/okx#fetchopenorders)
* [onetrading](/docs/exchanges/onetrading#fetchopenorders)
* [p2b](/docs/exchanges/p2b#fetchopenorders)
* [pacifica](/docs/exchanges/pacifica#fetchopenorders)
* [paradex](/docs/exchanges/paradex#fetchopenorders)
* [phemex](/docs/exchanges/phemex#fetchopenorders)
* [poloniex](/docs/exchanges/poloniex#fetchopenorders)
* [revolutx](/docs/exchanges/revolutx#fetchopenorders)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchopenorders)
* [toobit](/docs/exchanges/toobit#fetchopenorders)
* [upbit](/docs/exchanges/upbit#fetchopenorders)
* [weex](/docs/exchanges/weex#fetchopenorders)
* [whitebit](/docs/exchanges/whitebit#fetchopenorders)
* [woo](/docs/exchanges/woo#fetchopenorders)
* [woofipro](/docs/exchanges/woofipro#fetchopenorders)
* [xt](/docs/exchanges/xt#fetchopenorders)
* [zaif](/docs/exchanges/zaif#fetchopenorders)
* [zebpay](/docs/exchanges/zebpay#fetchopenorders)
***
## fetchOpenOrdersWs [#fetchopenordersws]
fetch all unfilled currently open orders
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ---------------------------------------- | -------- | -------------------------------------------------------- |
| symbol | string | Yes | unified market symbol |
| since | int, undefined | No | the earliest time in ms to fetch open orders for |
| limit | int, undefined | No | the maximum number of open orders structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-141]
* [binance](/docs/exchanges/binance#fetchopenordersws)
* [bitvavo](/docs/exchanges/bitvavo#fetchopenordersws)
* [cex](/docs/exchanges/cex#fetchopenordersws)
* [gate](/docs/exchanges/gate#fetchopenordersws)
***
## fetchOption [#fetchoption]
fetches option data that is commonly found in an option chain
**Kind**: instance\
**Returns**: object - an [option chain structure](/docs/manual#option-chain-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-142]
* [binance](/docs/exchanges/binance#fetchoption)
* [bybit](/docs/exchanges/bybit#fetchoption)
* [delta](/docs/exchanges/delta#fetchoption)
* [deribit](/docs/exchanges/deribit#fetchoption)
* [gate](/docs/exchanges/gate#fetchoption)
* [okx](/docs/exchanges/okx#fetchoption)
***
## fetchOptionChain [#fetchoptionchain]
fetches data for an underlying asset that is commonly found in an option chain
**Kind**: instance\
**Returns**: object - a list of [option chain structures](/docs/manual#option-chain-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | base currency to fetch an option chain for |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-143]
* [bybit](/docs/exchanges/bybit#fetchoptionchain)
* [deribit](/docs/exchanges/deribit#fetchoptionchain)
* [gate](/docs/exchanges/gate#fetchoptionchain)
* [okx](/docs/exchanges/okx#fetchoptionchain)
***
## fetchOptionPositions [#fetchoptionpositions]
fetch data on open options positions
**Kind**: instance\
**Returns**: Array\ - a list of [position structures](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ------- | --------------------------------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\, undefined | Yes | list of unified market symbols |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-144]
* [binance](/docs/exchanges/binance#fetchoptionpositions)
***
## fetchOrder [#fetchorder]
fetches information on an order made by the user
**Kind**: instance\
**Returns**: object - An [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the order id |
| symbol | string | Yes | unified symbol of the market the order was made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-145]
* [alpaca](/docs/exchanges/alpaca#fetchorder)
* [apex](/docs/exchanges/apex#fetchorder)
* [aster](/docs/exchanges/aster#fetchorder)
* [bigone](/docs/exchanges/bigone#fetchorder)
* [binance](/docs/exchanges/binance#fetchorder)
* [bingx](/docs/exchanges/bingx#fetchorder)
* [bit2c](/docs/exchanges/bit2c#fetchorder)
* [bitbank](/docs/exchanges/bitbank#fetchorder)
* [bitbns](/docs/exchanges/bitbns#fetchorder)
* [bitfinex](/docs/exchanges/bitfinex#fetchorder)
* [bitflyer](/docs/exchanges/bitflyer#fetchorder)
* [bitget](/docs/exchanges/bitget#fetchorder)
* [bithumb](/docs/exchanges/bithumb#fetchorder)
* [bitmex](/docs/exchanges/bitmex#fetchorder)
* [bitopro](/docs/exchanges/bitopro#fetchorder)
* [bitrue](/docs/exchanges/bitrue#fetchorder)
* [bitso](/docs/exchanges/bitso#fetchorder)
* [bitstamp](/docs/exchanges/bitstamp#fetchorder)
* [bitteam](/docs/exchanges/bitteam#fetchorder)
* [bittrade](/docs/exchanges/bittrade#fetchorder)
* [bitvavo](/docs/exchanges/bitvavo#fetchorder)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchorder)
* [btcbox](/docs/exchanges/btcbox#fetchorder)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchorder)
* [bullish](/docs/exchanges/bullish#fetchorder)
* [bybit](/docs/exchanges/bybit#fetchorder)
* [coinbase](/docs/exchanges/coinbase#fetchorder)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchorder)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchorder)
* [coinex](/docs/exchanges/coinex#fetchorder)
* [coinmate](/docs/exchanges/coinmate#fetchorder)
* [coinone](/docs/exchanges/coinone#fetchorder)
* [coinsph](/docs/exchanges/coinsph#fetchorder)
* [cryptocom](/docs/exchanges/cryptocom#fetchorder)
* [delta](/docs/exchanges/delta#fetchorder)
* [deribit](/docs/exchanges/deribit#fetchorder)
* [digifinex](/docs/exchanges/digifinex#fetchorder)
* [dydx](/docs/exchanges/dydx#fetchorder)
* [extended](/docs/exchanges/extended#fetchorder)
* [foxbit](/docs/exchanges/foxbit#fetchorder)
* [gate](/docs/exchanges/gate#fetchorder)
* [gemini](/docs/exchanges/gemini#fetchorder)
* [grvt](/docs/exchanges/grvt#fetchorder)
* [hashkey](/docs/exchanges/hashkey#fetchorder)
* [hibachi](/docs/exchanges/hibachi#fetchorder)
* [hitbtc](/docs/exchanges/hitbtc#fetchorder)
* [hollaex](/docs/exchanges/hollaex#fetchorder)
* [htx](/docs/exchanges/htx#fetchorder)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchorder)
* [independentreserve](/docs/exchanges/independentreserve#fetchorder)
* [indodax](/docs/exchanges/indodax#fetchorder)
* [kraken](/docs/exchanges/kraken#fetchorder)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchorder)
* [kucoin](/docs/exchanges/kucoin#fetchorder)
* [latoken](/docs/exchanges/latoken#fetchorder)
* [lbank](/docs/exchanges/lbank#fetchorder)
* [luno](/docs/exchanges/luno#fetchorder)
* [mercado](/docs/exchanges/mercado#fetchorder)
* [mexc](/docs/exchanges/mexc#fetchorder)
* [modetrade](/docs/exchanges/modetrade#fetchorder)
* [mudrex](/docs/exchanges/mudrex#fetchorder)
* [nado](/docs/exchanges/nado#fetchorder)
* [ndax](/docs/exchanges/ndax#fetchorder)
* [okx](/docs/exchanges/okx#fetchorder)
* [onetrading](/docs/exchanges/onetrading#fetchorder)
* [pacifica](/docs/exchanges/pacifica#fetchorder)
* [paradex](/docs/exchanges/paradex#fetchorder)
* [phemex](/docs/exchanges/phemex#fetchorder)
* [poloniex](/docs/exchanges/poloniex#fetchorder)
* [revolutx](/docs/exchanges/revolutx#fetchorder)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchorder)
* [toobit](/docs/exchanges/toobit#fetchorder)
* [upbit](/docs/exchanges/upbit#fetchorder)
* [weex](/docs/exchanges/weex#fetchorder)
* [whitebit](/docs/exchanges/whitebit#fetchorder)
* [woo](/docs/exchanges/woo#fetchorder)
* [woofipro](/docs/exchanges/woofipro#fetchorder)
* [xt](/docs/exchanges/xt#fetchorder)
* [zebpay](/docs/exchanges/zebpay#fetchorder)
***
## fetchOrderBook [#fetchorderbook]
fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
**Kind**: instance\
**Returns**: object - an [order book structure](/docs/manual#order-book-structure)
| Param | Type | Required | Description |
| ---------- | ------------------- | -------- | -------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to fetch the order book for |
| limit | int | No | the maximum amount of order book entries to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.loc | string | No | crypto location, default: us |
##### Supported exchanges [#supported-exchanges-146]
* [alpaca](/docs/exchanges/alpaca#fetchorderbook)
* [apex](/docs/exchanges/apex#fetchorderbook)
* [aster](/docs/exchanges/aster#fetchorderbook)
* [backpack](/docs/exchanges/backpack#fetchorderbook)
* [bigone](/docs/exchanges/bigone#fetchorderbook)
* [binance](/docs/exchanges/binance#fetchorderbook)
* [bingx](/docs/exchanges/bingx#fetchorderbook)
* [bit2c](/docs/exchanges/bit2c#fetchorderbook)
* [bitbank](/docs/exchanges/bitbank#fetchorderbook)
* [bitbns](/docs/exchanges/bitbns#fetchorderbook)
* [bitfinex](/docs/exchanges/bitfinex#fetchorderbook)
* [bitflyer](/docs/exchanges/bitflyer#fetchorderbook)
* [bitget](/docs/exchanges/bitget#fetchorderbook)
* [bithumb](/docs/exchanges/bithumb#fetchorderbook)
* [bitmex](/docs/exchanges/bitmex#fetchorderbook)
* [bitopro](/docs/exchanges/bitopro#fetchorderbook)
* [bitrue](/docs/exchanges/bitrue#fetchorderbook)
* [bitso](/docs/exchanges/bitso#fetchorderbook)
* [bitstamp](/docs/exchanges/bitstamp#fetchorderbook)
* [bitteam](/docs/exchanges/bitteam#fetchorderbook)
* [bittrade](/docs/exchanges/bittrade#fetchorderbook)
* [bitvavo](/docs/exchanges/bitvavo#fetchorderbook)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchorderbook)
* [blofin](/docs/exchanges/blofin#fetchorderbook)
* [btcbox](/docs/exchanges/btcbox#fetchorderbook)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchorderbook)
* [btcturk](/docs/exchanges/btcturk#fetchorderbook)
* [btse](/docs/exchanges/btse#fetchorderbook)
* [bullish](/docs/exchanges/bullish#fetchorderbook)
* [bybit](/docs/exchanges/bybit#fetchorderbook)
* [bydfi](/docs/exchanges/bydfi#fetchorderbook)
* [cex](/docs/exchanges/cex#fetchorderbook)
* [coinbase](/docs/exchanges/coinbase#fetchorderbook)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchorderbook)
* [coincheck](/docs/exchanges/coincheck#fetchorderbook)
* [coinex](/docs/exchanges/coinex#fetchorderbook)
* [coinmate](/docs/exchanges/coinmate#fetchorderbook)
* [coinone](/docs/exchanges/coinone#fetchorderbook)
* [coinsph](/docs/exchanges/coinsph#fetchorderbook)
* [coinspot](/docs/exchanges/coinspot#fetchorderbook)
* [cryptocom](/docs/exchanges/cryptocom#fetchorderbook)
* [cryptomus](/docs/exchanges/cryptomus#fetchorderbook)
* [deepcoin](/docs/exchanges/deepcoin#fetchorderbook)
* [delta](/docs/exchanges/delta#fetchorderbook)
* [deribit](/docs/exchanges/deribit#fetchorderbook)
* [digifinex](/docs/exchanges/digifinex#fetchorderbook)
* [dydx](/docs/exchanges/dydx#fetchorderbook)
* [extended](/docs/exchanges/extended#fetchorderbook)
* [foxbit](/docs/exchanges/foxbit#fetchorderbook)
* [gate](/docs/exchanges/gate#fetchorderbook)
* [gemini](/docs/exchanges/gemini#fetchorderbook)
* [grvt](/docs/exchanges/grvt#fetchorderbook)
* [hashkey](/docs/exchanges/hashkey#fetchorderbook)
* [hibachi](/docs/exchanges/hibachi#fetchorderbook)
* [hitbtc](/docs/exchanges/hitbtc#fetchorderbook)
* [hollaex](/docs/exchanges/hollaex#fetchorderbook)
* [htx](/docs/exchanges/htx#fetchorderbook)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchorderbook)
* [independentreserve](/docs/exchanges/independentreserve#fetchorderbook)
* [indodax](/docs/exchanges/indodax#fetchorderbook)
* [kraken](/docs/exchanges/kraken#fetchorderbook)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchorderbook)
* [kucoin](/docs/exchanges/kucoin#fetchorderbook)
* [latoken](/docs/exchanges/latoken#fetchorderbook)
* [lbank](/docs/exchanges/lbank#fetchorderbook)
* [lighter](/docs/exchanges/lighter#fetchorderbook)
* [luno](/docs/exchanges/luno#fetchorderbook)
* [mercado](/docs/exchanges/mercado#fetchorderbook)
* [mexc](/docs/exchanges/mexc#fetchorderbook)
* [modetrade](/docs/exchanges/modetrade#fetchorderbook)
* [nado](/docs/exchanges/nado#fetchorderbook)
* [ndax](/docs/exchanges/ndax#fetchorderbook)
* [okx](/docs/exchanges/okx#fetchorderbook)
* [onetrading](/docs/exchanges/onetrading#fetchorderbook)
* [p2b](/docs/exchanges/p2b#fetchorderbook)
* [pacifica](/docs/exchanges/pacifica#fetchorderbook)
* [paradex](/docs/exchanges/paradex#fetchorderbook)
* [paymium](/docs/exchanges/paymium#fetchorderbook)
* [phemex](/docs/exchanges/phemex#fetchorderbook)
* [poloniex](/docs/exchanges/poloniex#fetchorderbook)
* [revolutx](/docs/exchanges/revolutx#fetchorderbook)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchorderbook)
* [toobit](/docs/exchanges/toobit#fetchorderbook)
* [upbit](/docs/exchanges/upbit#fetchorderbook)
* [weex](/docs/exchanges/weex#fetchorderbook)
* [whitebit](/docs/exchanges/whitebit#fetchorderbook)
* [woo](/docs/exchanges/woo#fetchorderbook)
* [woofipro](/docs/exchanges/woofipro#fetchorderbook)
* [xt](/docs/exchanges/xt#fetchorderbook)
* [zaif](/docs/exchanges/zaif#fetchorderbook)
* [zebpay](/docs/exchanges/zebpay#fetchorderbook)
***
## fetchOrderBookWs [#fetchorderbookws]
fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
**Kind**: instance\
**Returns**: object - A dictionary of [order book structures](/docs/manual#order-book-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | -------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to fetch the order book for |
| limit | int | No | the maximum amount of order book entries to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-147]
* [binance](/docs/exchanges/binance#fetchorderbookws)
* [lbank](/docs/exchanges/lbank#fetchorderbookws)
***
## fetchOrderBooks [#fetchorderbooks]
fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data for multiple markets
**Kind**: instance\
**Returns**: object - a dictionary of [order book structures](/docs/manual#order-book-structure) indexed by market symbol
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | -------------------------------------------------------------------------------------- |
| symbols | Array\ | No | list of unified market symbols, all symbols fetched if undefined, default is undefined |
| limit | int | No | max number of entries per orderbook to return, default is undefined |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-148]
* [hitbtc](/docs/exchanges/hitbtc#fetchorderbooks)
* [hollaex](/docs/exchanges/hollaex#fetchorderbooks)
* [upbit](/docs/exchanges/upbit#fetchorderbooks)
***
## fetchOrderClassic [#fetchorderclassic]
fetches information on an order made by the user *classic accounts only*
**Kind**: instance\
**Returns**: object - An [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the order id |
| symbol | string | Yes | unified symbol of the market the order was made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-149]
* [bybit](/docs/exchanges/bybit#fetchorderclassic)
***
## fetchOrderTrades [#fetchordertrades]
fetch all the trades made from a single order
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#trade-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| symbol | string | Yes | unified market symbol |
| since | int | No | the earliest time in ms to fetch trades for |
| limit | int | No | the maximum number of trades to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-150]
* [apex](/docs/exchanges/apex#fetchordertrades)
* [binance](/docs/exchanges/binance#fetchordertrades)
* [bitfinex](/docs/exchanges/bitfinex#fetchordertrades)
* [bitso](/docs/exchanges/bitso#fetchordertrades)
* [bittrade](/docs/exchanges/bittrade#fetchordertrades)
* [btse](/docs/exchanges/btse#fetchordertrades)
* [bullish](/docs/exchanges/bullish#fetchordertrades)
* [bybit](/docs/exchanges/bybit#fetchordertrades)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchordertrades)
* [coinsph](/docs/exchanges/coinsph#fetchordertrades)
* [deepcoin](/docs/exchanges/deepcoin#fetchordertrades)
* [deribit](/docs/exchanges/deribit#fetchordertrades)
* [derive](/docs/exchanges/derive#fetchordertrades)
* [gate](/docs/exchanges/gate#fetchordertrades)
* [hitbtc](/docs/exchanges/hitbtc#fetchordertrades)
* [htx](/docs/exchanges/htx#fetchordertrades)
* [kraken](/docs/exchanges/kraken#fetchordertrades)
* [kucoin](/docs/exchanges/kucoin#fetchordertrades)
* [mexc](/docs/exchanges/mexc#fetchordertrades)
* [modetrade](/docs/exchanges/modetrade#fetchordertrades)
* [ndax](/docs/exchanges/ndax#fetchordertrades)
* [okx](/docs/exchanges/okx#fetchordertrades)
* [onetrading](/docs/exchanges/onetrading#fetchordertrades)
* [p2b](/docs/exchanges/p2b#fetchordertrades)
* [poloniex](/docs/exchanges/poloniex#fetchordertrades)
* [weex](/docs/exchanges/weex#fetchordertrades)
* [whitebit](/docs/exchanges/whitebit#fetchordertrades)
* [woo](/docs/exchanges/woo#fetchordertrades)
* [woofipro](/docs/exchanges/woofipro#fetchordertrades)
* [zebpatspot](/docs/exchanges/zebpatspot#fetchordertrades)
***
## fetchOrderWs [#fetchorderws]
fetches information on an order made by the user
**Kind**: instance\
**Returns**: object - An [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| symbol | string | No | unified symbol of the market the order was made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-151]
* [binance](/docs/exchanges/binance#fetchorderws)
* [bitvavo](/docs/exchanges/bitvavo#fetchorderws)
* [cex](/docs/exchanges/cex#fetchorderws)
* [gate](/docs/exchanges/gate#fetchorderws)
***
## fetchOrders [#fetchorders]
fetches information on multiple orders made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market orders were made in |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | the latest time in ms to fetch orders for |
##### Supported exchanges [#supported-exchanges-152]
* [alpaca](/docs/exchanges/alpaca#fetchorders)
* [apex](/docs/exchanges/apex#fetchorders)
* [aster](/docs/exchanges/aster#fetchorders)
* [backpack](/docs/exchanges/backpack#fetchorders)
* [bigone](/docs/exchanges/bigone#fetchorders)
* [binance](/docs/exchanges/binance#fetchorders)
* [bingx](/docs/exchanges/bingx#fetchorders)
* [bitflyer](/docs/exchanges/bitflyer#fetchorders)
* [bithumb](/docs/exchanges/bithumb#fetchorders)
* [bitmex](/docs/exchanges/bitmex#fetchorders)
* [bitopro](/docs/exchanges/bitopro#fetchorders)
* [bitteam](/docs/exchanges/bitteam#fetchorders)
* [bittrade](/docs/exchanges/bittrade#fetchorders)
* [bitvavo](/docs/exchanges/bitvavo#fetchorders)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchorders)
* [btcbox](/docs/exchanges/btcbox#fetchorders)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchorders)
* [btcturk](/docs/exchanges/btcturk#fetchorders)
* [bullish](/docs/exchanges/bullish#fetchorders)
* [cex](/docs/exchanges/cex#fetchorders)
* [coinbase](/docs/exchanges/coinbase#fetchorders)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchorders)
* [coinmate](/docs/exchanges/coinmate#fetchorders)
* [cryptocom](/docs/exchanges/cryptocom#fetchorders)
* [cryptomus](/docs/exchanges/cryptomus#fetchorders)
* [derive](/docs/exchanges/derive#fetchorders)
* [digifinex](/docs/exchanges/digifinex#fetchorders)
* [dydx](/docs/exchanges/dydx#fetchorders)
* [extended](/docs/exchanges/extended#fetchorders)
* [foxbit](/docs/exchanges/foxbit#fetchorders)
* [gemini](/docs/exchanges/gemini#fetchorders)
* [grvt](/docs/exchanges/grvt#fetchorders)
* [hollaex](/docs/exchanges/hollaex#fetchorders)
* [htx](/docs/exchanges/htx#fetchorders)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchorders)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchorders)
* [latoken](/docs/exchanges/latoken#fetchorders)
* [lbank](/docs/exchanges/lbank#fetchorders)
* [luno](/docs/exchanges/luno#fetchorders)
* [mercado](/docs/exchanges/mercado#fetchorders)
* [mexc](/docs/exchanges/mexc#fetchorders)
* [modetrade](/docs/exchanges/modetrade#fetchorders)
* [mudrex](/docs/exchanges/mudrex#fetchorders)
* [nado](/docs/exchanges/nado#fetchorders)
* [ndax](/docs/exchanges/ndax#fetchorders)
* [pacifica](/docs/exchanges/pacifica#fetchorders)
* [paradex](/docs/exchanges/paradex#fetchorders)
* [phemex](/docs/exchanges/phemex#fetchorders)
* [revolutx](/docs/exchanges/revolutx#fetchorders)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchorders)
* [toobit](/docs/exchanges/toobit#fetchorders)
* [weex](/docs/exchanges/weex#fetchorders)
* [whitebit](/docs/exchanges/whitebit#fetchorders)
* [woo](/docs/exchanges/woo#fetchorders)
* [woofipro](/docs/exchanges/woofipro#fetchorders)
* [xt](/docs/exchanges/xt#fetchorders)
***
## fetchOrdersByIds [#fetchordersbyids]
fetch orders by the list of order id
**Kind**: instance\
**Returns**: Array\ - a list of [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | --------------------------- | -------- | ------------------------------------------------------ |
| ids | Array\ | No | list of order id |
| symbol | string | No | unified ccxt market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-153]
* [kraken](/docs/exchanges/kraken#fetchordersbyids)
***
## fetchOrdersByStatus [#fetchordersbystatus]
fetch a list of orders
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ----------------- | -------------------- | -------- | ------------------------------------------------------- |
| status | string | Yes | order status to fetch for |
| symbol | string | Yes | unified market symbol of the market orders were made in |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.trigger | boolean | No | set to true for fetching trigger orders |
| params.marginMode | string | No | 'cross' or 'isolated' for fetching spot margin orders |
##### Supported exchanges [#supported-exchanges-154]
* [coinex](/docs/exchanges/coinex#fetchordersbystatus)
* [kucoin](/docs/exchanges/kucoin#fetchordersbystatus)
***
## fetchOrdersClassic [#fetchordersclassic]
fetches information on multiple orders made by the user *classic accounts only*
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------------------ | -------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market orders were made in |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.trigger | boolean | No | true if trigger order |
| params.stop | boolean | No | alias for trigger |
| params.type | string | No | market type, \['swap', 'option', 'spot'] |
| params.subType | string | No | market subType, \['linear', 'inverse'] |
| params.orderFilter | string | No | 'Order' or 'StopOrder' or 'tpslOrder' |
| params.until | int | No | the latest time in ms to fetch entries for |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](/docs/manual#pagination-params) |
##### Supported exchanges [#supported-exchanges-155]
* [bybit](/docs/exchanges/bybit#fetchordersclassic)
***
## fetchOrdersWs [#fetchordersws]
fetches information on multiple orders made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ---------------- | ---------------------------------------- | -------- | ------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market orders were made in |
| since | int, undefined | No | the earliest time in ms to fetch orders for |
| limit | int, undefined | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.orderId | int | No | order id to begin at |
| params.startTime | int | No | earliest time in ms to retrieve orders for |
| params.endTime | int | No | latest time in ms to retrieve orders for |
| params.limit | int | No | the maximum number of order structures to retrieve |
##### Supported exchanges [#supported-exchanges-156]
* [binance](/docs/exchanges/binance#fetchordersws)
* [bitvavo](/docs/exchanges/bitvavo#fetchordersws)
* [gate](/docs/exchanges/gate#fetchordersws)
***
## fetchPortfolioDetails [#fetchportfoliodetails]
Fetch details for a specific portfolio by UUID
**Kind**: instance\
**Returns**: Array\ - An account structure \
| Param | Type | Required | Description |
| ------------- | ------------------- | -------- | ------------------------------------------------------ |
| portfolioUuid | string | Yes | The unique identifier of the portfolio to fetch |
| params | Dict | No | Extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-157]
* [coinbase](/docs/exchanges/coinbase#fetchportfoliodetails)
***
## fetchPortfolios [#fetchportfolios]
fetch all the portfolios
**Kind**: instance\
**Returns**: object - a dictionary of [account structures](/docs/manual#account-structure) indexed by the account type
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-158]
* [coinbase](/docs/exchanges/coinbase#fetchportfolios)
***
## fetchPosition [#fetchposition]
fetch data on an open position
**Kind**: instance\
**Returns**: object - a [position structure](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ----------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market the position is held in |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-159]
* [binance](/docs/exchanges/binance#fetchposition)
* [bingx](/docs/exchanges/bingx#fetchposition)
* [bitget](/docs/exchanges/bitget#fetchposition)
* [blofin](/docs/exchanges/blofin#fetchposition)
* [bybit](/docs/exchanges/bybit#fetchposition)
* [coinbase](/docs/exchanges/coinbase#fetchposition)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchposition)
* [coinex](/docs/exchanges/coinex#fetchposition)
* [cryptocom](/docs/exchanges/cryptocom#fetchposition)
* [delta](/docs/exchanges/delta#fetchposition)
* [deribit](/docs/exchanges/deribit#fetchposition)
* [digifinex](/docs/exchanges/digifinex#fetchposition)
* [dydx](/docs/exchanges/dydx#fetchposition)
* [extended](/docs/exchanges/extended#fetchposition)
* [gate](/docs/exchanges/gate#fetchposition)
* [hitbtc](/docs/exchanges/hitbtc#fetchposition)
* [htx](/docs/exchanges/htx#fetchposition)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchposition)
* [kucoin](/docs/exchanges/kucoin#fetchposition)
* [lighter](/docs/exchanges/lighter#fetchposition)
* [mexc](/docs/exchanges/mexc#fetchposition)
* [modetrade](/docs/exchanges/modetrade#fetchposition)
* [okx](/docs/exchanges/okx#fetchposition)
* [pacifica](/docs/exchanges/pacifica#fetchposition)
* [paradex](/docs/exchanges/paradex#fetchposition)
* [weex](/docs/exchanges/weex#fetchposition)
* [whitebit](/docs/exchanges/whitebit#fetchposition)
* [woo](/docs/exchanges/woo#fetchposition)
* [woofipro](/docs/exchanges/woofipro#fetchposition)
* [xt](/docs/exchanges/xt#fetchposition)
***
## fetchPositionHistory [#fetchpositionhistory]
fetches historical positions
**Kind**: instance\
**Returns**: Array\ - a list of [position structures](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified contract symbol |
| since | int | No | the earliest time in ms to fetch positions for |
| limit | int | No | the maximum amount of records to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | the latest time in ms to fetch positions for |
##### Supported exchanges [#supported-exchanges-160]
* [bingx](/docs/exchanges/bingx#fetchpositionhistory)
* [bydfi](/docs/exchanges/bydfi#fetchpositionhistory)
* [coinex](/docs/exchanges/coinex#fetchpositionhistory)
* [phemex](/docs/exchanges/phemex#fetchpositionhistory)
* [whitebit](/docs/exchanges/whitebit#fetchpositionhistory)
***
## fetchPositionMode [#fetchpositionmode]
fetchs the position mode, hedged or one way, hedged for aster is set identically for all linear markets or all inverse markets
**Kind**: instance\
**Returns**: object - an object detailing whether the market is in hedged or one-way mode
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | -------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to fetch the order book for |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-161]
* [aster](/docs/exchanges/aster#fetchpositionmode)
* [binance](/docs/exchanges/binance#fetchpositionmode)
* [bingx](/docs/exchanges/bingx#fetchpositionmode)
* [blofin](/docs/exchanges/blofin#fetchpositionmode)
* [btse](/docs/exchanges/btse#fetchpositionmode)
* [bydfi](/docs/exchanges/bydfi#fetchpositionmode)
* [kucoin](/docs/exchanges/kucoin#fetchpositionmode)
* [mexc](/docs/exchanges/mexc#fetchpositionmode)
* [okx](/docs/exchanges/okx#fetchpositionmode)
* [poloniex](/docs/exchanges/poloniex#fetchpositionmode)
* [weex](/docs/exchanges/weex#fetchpositionmode)
***
## fetchPositionWs [#fetchpositionws]
fetch data on an open position
**Kind**: instance\
**Returns**: object - a [position structure](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ----------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market the position is held in |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-162]
* [binance](/docs/exchanges/binance#fetchpositionws)
***
## fetchPositions [#fetchpositions]
fetch all open positions
**Kind**: instance\
**Returns**: Array\ - a list of [position structure](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | No | list of unified market symbols |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-163]
* [apex](/docs/exchanges/apex#fetchpositions)
* [aster](/docs/exchanges/aster#fetchpositions)
* [backpack](/docs/exchanges/backpack#fetchpositions)
* [binance](/docs/exchanges/binance#fetchpositions)
* [bingx](/docs/exchanges/bingx#fetchpositions)
* [bitfinex](/docs/exchanges/bitfinex#fetchpositions)
* [bitflyer](/docs/exchanges/bitflyer#fetchpositions)
* [bitget](/docs/exchanges/bitget#fetchpositions)
* [bitmex](/docs/exchanges/bitmex#fetchpositions)
* [blofin](/docs/exchanges/blofin#fetchpositions)
* [btse](/docs/exchanges/btse#fetchpositions)
* [bullish](/docs/exchanges/bullish#fetchpositions)
* [bybit](/docs/exchanges/bybit#fetchpositions)
* [bydfi](/docs/exchanges/bydfi#fetchpositions)
* [coinbase](/docs/exchanges/coinbase#fetchpositions)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchpositions)
* [coinex](/docs/exchanges/coinex#fetchpositions)
* [cryptocom](/docs/exchanges/cryptocom#fetchpositions)
* [deepcoin](/docs/exchanges/deepcoin#fetchpositions)
* [delta](/docs/exchanges/delta#fetchpositions)
* [deribit](/docs/exchanges/deribit#fetchpositions)
* [derive](/docs/exchanges/derive#fetchpositions)
* [digifinex](/docs/exchanges/digifinex#fetchpositions)
* [dydx](/docs/exchanges/dydx#fetchpositions)
* [extended](/docs/exchanges/extended#fetchpositions)
* [gate](/docs/exchanges/gate#fetchpositions)
* [grvt](/docs/exchanges/grvt#fetchpositions)
* [hashkey](/docs/exchanges/hashkey#fetchpositions)
* [hibachi](/docs/exchanges/hibachi#fetchpositions)
* [hitbtc](/docs/exchanges/hitbtc#fetchpositions)
* [htx](/docs/exchanges/htx#fetchpositions)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchpositions)
* [kraken](/docs/exchanges/kraken#fetchpositions)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchpositions)
* [kucoin](/docs/exchanges/kucoin#fetchpositions)
* [lighter](/docs/exchanges/lighter#fetchpositions)
* [mexc](/docs/exchanges/mexc#fetchpositions)
* [modetrade](/docs/exchanges/modetrade#fetchpositions)
* [mudrex](/docs/exchanges/mudrex#fetchpositions)
* [nado](/docs/exchanges/nado#fetchpositions)
* [okx](/docs/exchanges/okx#fetchpositions)
* [pacifica](/docs/exchanges/pacifica#fetchpositions)
* [paradex](/docs/exchanges/paradex#fetchpositions)
* [phemex](/docs/exchanges/phemex#fetchpositions)
* [poloniex](/docs/exchanges/poloniex#fetchpositions)
* [toobit](/docs/exchanges/toobit#fetchpositions)
* [weex](/docs/exchanges/weex#fetchpositions)
* [whitebit](/docs/exchanges/whitebit#fetchpositions)
* [woo](/docs/exchanges/woo#fetchpositions)
* [woofipro](/docs/exchanges/woofipro#fetchpositions)
* [xt](/docs/exchanges/xt#fetchpositions)
* [zebpay](/docs/exchanges/zebpay#fetchpositions)
***
## fetchPositionsADLRank [#fetchpositionsadlrank]
fetches the auto deleveraging rank and risk percentage for a list of symbols that have open positions
**Kind**: instance\
**Returns**: Array\ - an array of [auto de leverage structure](/docs/manual#auto-de-leverage-structure)
| Param | Type | Required | Description |
| ---------------------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | No | list of unified market symbols |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.portfolioMargin | boolean | No | set to true for the portfolio margin account |
##### Supported exchanges [#supported-exchanges-164]
* [binance](/docs/exchanges/binance#fetchpositionsadlrank)
* [bitmex](/docs/exchanges/bitmex#fetchpositionsadlrank)
* [blofin](/docs/exchanges/blofin#fetchpositionsadlrank)
* [bybit](/docs/exchanges/bybit#fetchpositionsadlrank)
* [delta](/docs/exchanges/delta#fetchpositionsadlrank)
* [htx](/docs/exchanges/htx#fetchpositionsadlrank)
* [kucoin](/docs/exchanges/kucoin#fetchpositionsadlrank)
* [phemex](/docs/exchanges/phemex#fetchpositionsadlrank)
* [woo](/docs/exchanges/woo#fetchpositionsadlrank)
***
## fetchPositionsForSymbol [#fetchpositionsforsymbol]
fetch all open positions for specific symbol
**Kind**: instance\
**Returns**: Array\ - a list of [position structure](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-165]
* [btse](/docs/exchanges/btse#fetchpositionsforsymbol)
* [bydfi](/docs/exchanges/bydfi#fetchpositionsforsymbol)
* [deepcoin](/docs/exchanges/deepcoin#fetchpositionsforsymbol)
* [hashkey](/docs/exchanges/hashkey#fetchpositionsforsymbol)
* [okx](/docs/exchanges/okx#fetchpositionsforsymbol)
* [weex](/docs/exchanges/weex#fetchpositionsforsymbol)
***
## fetchPositionsHistory [#fetchpositionshistory]
fetches historical positions
**Kind**: instance\
**Returns**: Array\ - a list of [position structures](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ------------------ | --------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------- |
| symbols | Array\ | No | unified contract symbols |
| since | int | No | timestamp in ms of the earliest position to fetch, default=3 months ago, max range for params\["until"] - since is 3 months |
| limit | int | No | the maximum amount of records to fetch, default=20, max=100 |
| params | object | Yes | extra parameters specific to the exchange API endpoint |
| params.until | int | No | timestamp in ms of the latest position to fetch, max range for params\["until"] - since is 3 months |
| params.productType | string | No | USDT-FUTURES (default), COIN-FUTURES, USDC-FUTURES, SUSDT-FUTURES, SCOIN-FUTURES, or SUSDC-FUTURES |
| params.uta | boolean | No | set to true for the unified trading account (uta), defaults to false |
##### Supported exchanges [#supported-exchanges-166]
* [bitget](/docs/exchanges/bitget#fetchpositionshistory)
* [blofin](/docs/exchanges/blofin#fetchpositionshistory)
* [bybit](/docs/exchanges/bybit#fetchpositionshistory)
* [bydfi](/docs/exchanges/bydfi#fetchpositionshistory)
* [extended](/docs/exchanges/extended#fetchpositionshistory)
* [gate](/docs/exchanges/gate#fetchpositionshistory)
* [kucoin](/docs/exchanges/kucoin#fetchpositionshistory)
* [mexc](/docs/exchanges/mexc#fetchpositionshistory)
* [mudrex](/docs/exchanges/mudrex#fetchpositionshistory)
* [okx](/docs/exchanges/okx#fetchpositionshistory)
* [xt](/docs/exchanges/xt#fetchpositionshistory)
***
## fetchPositionsRisk [#fetchpositionsrisk]
fetch positions risk
**Kind**: instance\
**Returns**: object - data on the positions risk
| Param | Type | Required | Description |
| ------- | --------------------------------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\, undefined | Yes | list of unified market symbols |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-167]
* [aster](/docs/exchanges/aster#fetchpositionsrisk)
***
## fetchPositionsWs [#fetchpositionsws]
fetch all open positions
**Kind**: instance\
**Returns**: Array\ - a list of [position structure](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ----------------------- | ------------------------------------------- | -------- | ----------------------------------------------------------------- |
| symbols | Array\ | No | list of unified market symbols |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.returnRateLimits | boolean | No | set to true to return rate limit informations, defaults to false. |
| params.method | string, undefined | No | method to use. Can be account.position or v2/account.position |
##### Supported exchanges [#supported-exchanges-168]
* [binance](/docs/exchanges/binance#fetchpositionsws)
***
## fetchSettlementHistory [#fetchsettlementhistory]
fetches historical settlement records
**Kind**: instance\
**Returns**: Array\ - a list of [settlement history objects](/docs/manual#settlement-history-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ----------------------------------------------- |
| symbol | string | Yes | unified market symbol of the settlement history |
| since | int | No | timestamp in ms |
| limit | int | No | number of records, default 100, max 100 |
| params | object | No | exchange specific params |
##### Supported exchanges [#supported-exchanges-169]
* [binance](/docs/exchanges/binance#fetchsettlementhistory)
* [bitmex](/docs/exchanges/bitmex#fetchsettlementhistory)
* [bybit](/docs/exchanges/bybit#fetchsettlementhistory)
* [cryptocom](/docs/exchanges/cryptocom#fetchsettlementhistory)
* [delta](/docs/exchanges/delta#fetchsettlementhistory)
* [gate](/docs/exchanges/gate#fetchsettlementhistory)
* [htx](/docs/exchanges/htx#fetchsettlementhistory)
* [okx](/docs/exchanges/okx#fetchsettlementhistory)
***
## fetchSpotMarkets [#fetchspotmarkets]
retrieves data on all spot markets for hyperliquid
**Kind**: instance\
**Returns**: Array\ - an array of objects representing market data
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-170]
* [hyperliquid](/docs/exchanges/hyperliquid#fetchspotmarkets)
***
## fetchSpotOrder [#fetchspotorder]
fetch a spot order
**Kind**: instance\
**Returns**: An [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | ---------------------------------------------------------------------------------------------------- |
| id | string | Yes | Order id |
| symbol | string | Yes | not sent to exchange except for trigger orders with clientOid, but used internally by CCXT to filter |
| params | object | No | exchange specific parameters |
| params.trigger | bool | No | true if fetching a trigger order |
| params.hf | bool | No | false, // true for hf order |
| params.clientOid | bool | No | unique order id created by users to identify their orders |
| params.marginMode | object | No | 'cross' or 'isolated' |
##### Supported exchanges [#supported-exchanges-171]
* [kucoin](/docs/exchanges/kucoin#fetchspotorder)
***
## fetchSpotOrdersByStatus [#fetchspotordersbystatus]
fetch a list of spot orders
**Kind**: instance\
**Returns**: An [array of order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------------------ | ------------------- | -------- | ----------------------------------------------------------------------------------- |
| status | string | Yes | *not used for stop orders* 'open' or 'closed' |
| symbol | string | Yes | unified market symbol |
| since | int | No | timestamp in ms of the earliest order |
| limit | int | No | max number of orders to return |
| params | object | No | exchange specific params |
| params.until | int | No | end time in ms |
| params.side | string | No | buy or sell |
| params.type | string | No | limit, market, limit\_stop or market\_stop |
| params.tradeType | string | No | TRADE for spot trading, MARGIN\_TRADE or MARGIN\_ISOLATED\_TRADE for Margin Trading |
| params.currentPage | int | No | *trigger orders only* current page |
| params.orderIds | string | No | *trigger orders only* comma separated order ID list |
| params.trigger | bool | No | True if fetching a trigger order |
| params.hf | bool | No | false, // true for hf order |
| params.marginMode | string | No | 'cross' or 'isolated', only for margin orders |
##### Supported exchanges [#supported-exchanges-172]
* [kucoin](/docs/exchanges/kucoin#fetchspotordersbystatus)
***
## fetchStatus [#fetchstatus]
the latest known information on the availability of the exchange API
**Kind**: instance\
**Returns**: object - a [status structure](/docs/manual#exchange-status-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-173]
* [backpack](/docs/exchanges/backpack#fetchstatus)
* [binance](/docs/exchanges/binance#fetchstatus)
* [bitbns](/docs/exchanges/bitbns#fetchstatus)
* [bitfinex](/docs/exchanges/bitfinex#fetchstatus)
* [bitrue](/docs/exchanges/bitrue#fetchstatus)
* [bybit](/docs/exchanges/bybit#fetchstatus)
* [coincheck](/docs/exchanges/coincheck#fetchstatus)
* [coinsph](/docs/exchanges/coinsph#fetchstatus)
* [delta](/docs/exchanges/delta#fetchstatus)
* [deribit](/docs/exchanges/deribit#fetchstatus)
* [digifinex](/docs/exchanges/digifinex#fetchstatus)
* [foxbit](/docs/exchanges/foxbit#fetchstatus)
* [hashkey](/docs/exchanges/hashkey#fetchstatus)
* [htx](/docs/exchanges/htx#fetchstatus)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchstatus)
* [kraken](/docs/exchanges/kraken#fetchstatus)
* [kucoin](/docs/exchanges/kucoin#fetchstatus)
* [lighter](/docs/exchanges/lighter#fetchstatus)
* [mexc](/docs/exchanges/mexc#fetchstatus)
* [modetrade](/docs/exchanges/modetrade#fetchstatus)
* [nado](/docs/exchanges/nado#fetchstatus)
* [ndax](/docs/exchanges/ndax#fetchstatus)
* [okx](/docs/exchanges/okx#fetchstatus)
* [paradex](/docs/exchanges/paradex#fetchstatus)
* [toobit](/docs/exchanges/toobit#fetchstatus)
* [weex](/docs/exchanges/weex#fetchstatus)
* [whitebit](/docs/exchanges/whitebit#fetchstatus)
* [woo](/docs/exchanges/woo#fetchstatus)
* [woofipro](/docs/exchanges/woofipro#fetchstatus)
* [zebpay](/docs/exchanges/zebpay#fetchstatus)
***
## fetchSwapMarkets [#fetchswapmarkets]
retrieves data on all swap markets for hyperliquid
**Kind**: instance\
**Returns**: Array\ - an array of objects representing market data
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-174]
* [hyperliquid](/docs/exchanges/hyperliquid#fetchswapmarkets)
* [pacifica](/docs/exchanges/pacifica#fetchswapmarkets)
***
## fetchTicker [#fetchticker]
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ---------- | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.loc | string | No | crypto location, default: us |
##### Supported exchanges [#supported-exchanges-175]
* [alpaca](/docs/exchanges/alpaca#fetchticker)
* [apex](/docs/exchanges/apex#fetchticker)
* [aster](/docs/exchanges/aster#fetchticker)
* [backpack](/docs/exchanges/backpack#fetchticker)
* [bigone](/docs/exchanges/bigone#fetchticker)
* [binance](/docs/exchanges/binance#fetchticker)
* [bingx](/docs/exchanges/bingx#fetchticker)
* [bit2c](/docs/exchanges/bit2c#fetchticker)
* [bitbank](/docs/exchanges/bitbank#fetchticker)
* [bitfinex](/docs/exchanges/bitfinex#fetchticker)
* [bitflyer](/docs/exchanges/bitflyer#fetchticker)
* [bitget](/docs/exchanges/bitget#fetchticker)
* [bithumb](/docs/exchanges/bithumb#fetchticker)
* [bitmex](/docs/exchanges/bitmex#fetchticker)
* [bitopro](/docs/exchanges/bitopro#fetchticker)
* [bitrue](/docs/exchanges/bitrue#fetchticker)
* [bitso](/docs/exchanges/bitso#fetchticker)
* [bitstamp](/docs/exchanges/bitstamp#fetchticker)
* [bitteam](/docs/exchanges/bitteam#fetchticker)
* [bittrade](/docs/exchanges/bittrade#fetchticker)
* [bitvavo](/docs/exchanges/bitvavo#fetchticker)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchticker)
* [blofin](/docs/exchanges/blofin#fetchticker)
* [btcbox](/docs/exchanges/btcbox#fetchticker)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchticker)
* [btcturk](/docs/exchanges/btcturk#fetchticker)
* [btse](/docs/exchanges/btse#fetchticker)
* [bullish](/docs/exchanges/bullish#fetchticker)
* [bybit](/docs/exchanges/bybit#fetchticker)
* [bydfi](/docs/exchanges/bydfi#fetchticker)
* [cex](/docs/exchanges/cex#fetchticker)
* [coinbase](/docs/exchanges/coinbase#fetchticker)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchticker)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchticker)
* [coincheck](/docs/exchanges/coincheck#fetchticker)
* [coinex](/docs/exchanges/coinex#fetchticker)
* [coinmate](/docs/exchanges/coinmate#fetchticker)
* [coinone](/docs/exchanges/coinone#fetchticker)
* [coinsph](/docs/exchanges/coinsph#fetchticker)
* [coinspot](/docs/exchanges/coinspot#fetchticker)
* [cryptocom](/docs/exchanges/cryptocom#fetchticker)
* [delta](/docs/exchanges/delta#fetchticker)
* [deribit](/docs/exchanges/deribit#fetchticker)
* [derive](/docs/exchanges/derive#fetchticker)
* [digifinex](/docs/exchanges/digifinex#fetchticker)
* [extended](/docs/exchanges/extended#fetchticker)
* [foxbit](/docs/exchanges/foxbit#fetchticker)
* [gate](/docs/exchanges/gate#fetchticker)
* [gemini](/docs/exchanges/gemini#fetchticker)
* [grvt](/docs/exchanges/grvt#fetchticker)
* [hashkey](/docs/exchanges/hashkey#fetchticker)
* [hibachi](/docs/exchanges/hibachi#fetchticker)
* [hitbtc](/docs/exchanges/hitbtc#fetchticker)
* [hollaex](/docs/exchanges/hollaex#fetchticker)
* [htx](/docs/exchanges/htx#fetchticker)
* [independentreserve](/docs/exchanges/independentreserve#fetchticker)
* [indodax](/docs/exchanges/indodax#fetchticker)
* [kraken](/docs/exchanges/kraken#fetchticker)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchticker)
* [kucoin](/docs/exchanges/kucoin#fetchticker)
* [latoken](/docs/exchanges/latoken#fetchticker)
* [lbank](/docs/exchanges/lbank#fetchticker)
* [lighter](/docs/exchanges/lighter#fetchticker)
* [luno](/docs/exchanges/luno#fetchticker)
* [mercado](/docs/exchanges/mercado#fetchticker)
* [mexc](/docs/exchanges/mexc#fetchticker)
* [mudrex](/docs/exchanges/mudrex#fetchticker)
* [nado](/docs/exchanges/nado#fetchticker)
* [ndax](/docs/exchanges/ndax#fetchticker)
* [okx](/docs/exchanges/okx#fetchticker)
* [onetrading](/docs/exchanges/onetrading#fetchticker)
* [p2b](/docs/exchanges/p2b#fetchticker)
* [paradex](/docs/exchanges/paradex#fetchticker)
* [paymium](/docs/exchanges/paymium#fetchticker)
* [phemex](/docs/exchanges/phemex#fetchticker)
* [poloniex](/docs/exchanges/poloniex#fetchticker)
* [revolutx](/docs/exchanges/revolutx#fetchticker)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchticker)
* [upbit](/docs/exchanges/upbit#fetchticker)
* [whitebit](/docs/exchanges/whitebit#fetchticker)
* [woofipro](/docs/exchanges/woofipro#fetchticker)
* [xt](/docs/exchanges/xt#fetchticker)
* [zaif](/docs/exchanges/zaif#fetchticker)
* [zebpay](/docs/exchanges/zebpay#fetchticker)
***
## fetchTickerWs [#fetchtickerws]
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ----------------------- | -------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.method | string | No | method to use can be ticker.price or ticker.book |
| params.returnRateLimits | boolean | No | return the rate limits for the exchange |
##### Supported exchanges [#supported-exchanges-176]
* [binance](/docs/exchanges/binance#fetchtickerws)
* [cex](/docs/exchanges/cex#fetchtickerws)
* [lbank](/docs/exchanges/lbank#fetchtickerws)
***
## fetchTickers [#fetchtickers]
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
**Kind**: instance\
**Returns**: object - a dictionary of [ticker structures](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ---------- | --------------------------- | -------- | ---------------------------------------------------------------------------- |
| symbols | Array\ | No | unified symbols of the markets to fetch tickers for, defaults to all markets |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.loc | string | No | crypto location, default: us |
##### Supported exchanges [#supported-exchanges-177]
* [alpaca](/docs/exchanges/alpaca#fetchtickers)
* [apex](/docs/exchanges/apex#fetchtickers)
* [aster](/docs/exchanges/aster#fetchtickers)
* [backpack](/docs/exchanges/backpack#fetchtickers)
* [bigone](/docs/exchanges/bigone#fetchtickers)
* [binance](/docs/exchanges/binance#fetchtickers)
* [bingx](/docs/exchanges/bingx#fetchtickers)
* [bitbns](/docs/exchanges/bitbns#fetchtickers)
* [bitfinex](/docs/exchanges/bitfinex#fetchtickers)
* [bitget](/docs/exchanges/bitget#fetchtickers)
* [bithumb](/docs/exchanges/bithumb#fetchtickers)
* [bitmex](/docs/exchanges/bitmex#fetchtickers)
* [bitopro](/docs/exchanges/bitopro#fetchtickers)
* [bitrue](/docs/exchanges/bitrue#fetchtickers)
* [bitstamp](/docs/exchanges/bitstamp#fetchtickers)
* [bitteam](/docs/exchanges/bitteam#fetchtickers)
* [bittrade](/docs/exchanges/bittrade#fetchtickers)
* [bitvavo](/docs/exchanges/bitvavo#fetchtickers)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchtickers)
* [blofin](/docs/exchanges/blofin#fetchtickers)
* [btcbox](/docs/exchanges/btcbox#fetchtickers)
* [btcturk](/docs/exchanges/btcturk#fetchtickers)
* [btse](/docs/exchanges/btse#fetchtickers)
* [bybit](/docs/exchanges/bybit#fetchtickers)
* [bydfi](/docs/exchanges/bydfi#fetchtickers)
* [cex](/docs/exchanges/cex#fetchtickers)
* [coinbase](/docs/exchanges/coinbase#fetchtickers)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchtickers)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchtickers)
* [coinex](/docs/exchanges/coinex#fetchtickers)
* [coinmate](/docs/exchanges/coinmate#fetchtickers)
* [coinone](/docs/exchanges/coinone#fetchtickers)
* [coinsph](/docs/exchanges/coinsph#fetchtickers)
* [coinspot](/docs/exchanges/coinspot#fetchtickers)
* [cryptocom](/docs/exchanges/cryptocom#fetchtickers)
* [cryptomus](/docs/exchanges/cryptomus#fetchtickers)
* [deepcoin](/docs/exchanges/deepcoin#fetchtickers)
* [delta](/docs/exchanges/delta#fetchtickers)
* [deribit](/docs/exchanges/deribit#fetchtickers)
* [digifinex](/docs/exchanges/digifinex#fetchtickers)
* [extended](/docs/exchanges/extended#fetchtickers)
* [foxbit](/docs/exchanges/foxbit#fetchtickers)
* [gate](/docs/exchanges/gate#fetchtickers)
* [gemini](/docs/exchanges/gemini#fetchtickers)
* [hashkey](/docs/exchanges/hashkey#fetchtickers)
* [hitbtc](/docs/exchanges/hitbtc#fetchtickers)
* [hollaex](/docs/exchanges/hollaex#fetchtickers)
* [htx](/docs/exchanges/htx#fetchtickers)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchtickers)
* [indodax](/docs/exchanges/indodax#fetchtickers)
* [kraken](/docs/exchanges/kraken#fetchtickers)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchtickers)
* [kucoin](/docs/exchanges/kucoin#fetchtickers)
* [latoken](/docs/exchanges/latoken#fetchtickers)
* [lbank](/docs/exchanges/lbank#fetchtickers)
* [lighter](/docs/exchanges/lighter#fetchtickers)
* [luno](/docs/exchanges/luno#fetchtickers)
* [mexc](/docs/exchanges/mexc#fetchtickers)
* [mudrex](/docs/exchanges/mudrex#fetchtickers)
* [nado](/docs/exchanges/nado#fetchtickers)
* [ndax](/docs/exchanges/ndax#fetchtickers)
* [okx](/docs/exchanges/okx#fetchtickers)
* [onetrading](/docs/exchanges/onetrading#fetchtickers)
* [p2b](/docs/exchanges/p2b#fetchtickers)
* [pacifica](/docs/exchanges/pacifica#fetchtickers)
* [paradex](/docs/exchanges/paradex#fetchtickers)
* [phemex](/docs/exchanges/phemex#fetchtickers)
* [poloniex](/docs/exchanges/poloniex#fetchtickers)
* [revolutx](/docs/exchanges/revolutx#fetchtickers)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchtickers)
* [toobit](/docs/exchanges/toobit#fetchtickers)
* [upbit](/docs/exchanges/upbit#fetchtickers)
* [weex](/docs/exchanges/weex#fetchtickers)
* [whitebit](/docs/exchanges/whitebit#fetchtickers)
* [woofipro](/docs/exchanges/woofipro#fetchtickers)
* [xt](/docs/exchanges/xt#fetchtickers)
* [zebpay](/docs/exchanges/zebpay#fetchtickers)
***
## fetchTime [#fetchtime]
fetches the current integer timestamp in milliseconds from the exchange server
**Kind**: instance\
**Returns**: int - the current integer timestamp in milliseconds from the exchange server
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-178]
* [alpaca](/docs/exchanges/alpaca#fetchtime)
* [apex](/docs/exchanges/apex#fetchtime)
* [aster](/docs/exchanges/aster#fetchtime)
* [backpack](/docs/exchanges/backpack#fetchtime)
* [bigone](/docs/exchanges/bigone#fetchtime)
* [binance](/docs/exchanges/binance#fetchtime)
* [bingx](/docs/exchanges/bingx#fetchtime)
* [bitget](/docs/exchanges/bitget#fetchtime)
* [bitrue](/docs/exchanges/bitrue#fetchtime)
* [bittrade](/docs/exchanges/bittrade#fetchtime)
* [bitvavo](/docs/exchanges/bitvavo#fetchtime)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchtime)
* [btse](/docs/exchanges/btse#fetchtime)
* [bullish](/docs/exchanges/bullish#fetchtime)
* [bybit](/docs/exchanges/bybit#fetchtime)
* [cex](/docs/exchanges/cex#fetchtime)
* [coinbase](/docs/exchanges/coinbase#fetchtime)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchtime)
* [coinex](/docs/exchanges/coinex#fetchtime)
* [coinmate](/docs/exchanges/coinmate#fetchtime)
* [coinsph](/docs/exchanges/coinsph#fetchtime)
* [delta](/docs/exchanges/delta#fetchtime)
* [deribit](/docs/exchanges/deribit#fetchtime)
* [derive](/docs/exchanges/derive#fetchtime)
* [digifinex](/docs/exchanges/digifinex#fetchtime)
* [dydx](/docs/exchanges/dydx#fetchtime)
* [gate](/docs/exchanges/gate#fetchtime)
* [hashkey](/docs/exchanges/hashkey#fetchtime)
* [hibachi](/docs/exchanges/hibachi#fetchtime)
* [htx](/docs/exchanges/htx#fetchtime)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchtime)
* [indodax](/docs/exchanges/indodax#fetchtime)
* [kraken](/docs/exchanges/kraken#fetchtime)
* [kucoin](/docs/exchanges/kucoin#fetchtime)
* [latoken](/docs/exchanges/latoken#fetchtime)
* [lbank](/docs/exchanges/lbank#fetchtime)
* [lighter](/docs/exchanges/lighter#fetchtime)
* [mexc](/docs/exchanges/mexc#fetchtime)
* [modetrade](/docs/exchanges/modetrade#fetchtime)
* [nado](/docs/exchanges/nado#fetchtime)
* [okx](/docs/exchanges/okx#fetchtime)
* [onetrading](/docs/exchanges/onetrading#fetchtime)
* [paradex](/docs/exchanges/paradex#fetchtime)
* [poloniex](/docs/exchanges/poloniex#fetchtime)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchtime)
* [toobit](/docs/exchanges/toobit#fetchtime)
* [weex](/docs/exchanges/weex#fetchtime)
* [whitebit](/docs/exchanges/whitebit#fetchtime)
* [woo](/docs/exchanges/woo#fetchtime)
* [woofipro](/docs/exchanges/woofipro#fetchtime)
* [xt](/docs/exchanges/xt#fetchtime)
* [zebpay](/docs/exchanges/zebpay#fetchtime)
***
## fetchTrades [#fetchtrades]
get the list of most recent trades for a particular symbol
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#public-trades)
| Param | Type | Required | Description |
| ------------- | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market to fetch trades for |
| since | int | No | timestamp in ms of the earliest trade to fetch |
| limit | int | No | the maximum amount of trades to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.loc | string | No | crypto location, default: us |
| params.method | string | No | method, default: marketPublicGetV1beta3CryptoLocTrades |
##### Supported exchanges [#supported-exchanges-179]
* [alpaca](/docs/exchanges/alpaca#fetchtrades)
* [apex](/docs/exchanges/apex#fetchtrades)
* [aster](/docs/exchanges/aster#fetchtrades)
* [backpack](/docs/exchanges/backpack#fetchtrades)
* [bigone](/docs/exchanges/bigone#fetchtrades)
* [binance](/docs/exchanges/binance#fetchtrades)
* [bingx](/docs/exchanges/bingx#fetchtrades)
* [bit2c](/docs/exchanges/bit2c#fetchtrades)
* [bitbank](/docs/exchanges/bitbank#fetchtrades)
* [bitbns](/docs/exchanges/bitbns#fetchtrades)
* [bitfinex](/docs/exchanges/bitfinex#fetchtrades)
* [bitflyer](/docs/exchanges/bitflyer#fetchtrades)
* [bitget](/docs/exchanges/bitget#fetchtrades)
* [bithumb](/docs/exchanges/bithumb#fetchtrades)
* [bitmex](/docs/exchanges/bitmex#fetchtrades)
* [bitopro](/docs/exchanges/bitopro#fetchtrades)
* [bitrue](/docs/exchanges/bitrue#fetchtrades)
* [bitso](/docs/exchanges/bitso#fetchtrades)
* [bitstamp](/docs/exchanges/bitstamp#fetchtrades)
* [bitteam](/docs/exchanges/bitteam#fetchtrades)
* [bittrade](/docs/exchanges/bittrade#fetchtrades)
* [bitvavo](/docs/exchanges/bitvavo#fetchtrades)
* [blofin](/docs/exchanges/blofin#fetchtrades)
* [btcbox](/docs/exchanges/btcbox#fetchtrades)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchtrades)
* [btcturk](/docs/exchanges/btcturk#fetchtrades)
* [btse](/docs/exchanges/btse#fetchtrades)
* [bullish](/docs/exchanges/bullish#fetchtrades)
* [bybit](/docs/exchanges/bybit#fetchtrades)
* [bydfi](/docs/exchanges/bydfi#fetchtrades)
* [cex](/docs/exchanges/cex#fetchtrades)
* [coinbase](/docs/exchanges/coinbase#fetchtrades)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchtrades)
* [coincheck](/docs/exchanges/coincheck#fetchtrades)
* [coinex](/docs/exchanges/coinex#fetchtrades)
* [coinmate](/docs/exchanges/coinmate#fetchtrades)
* [coinone](/docs/exchanges/coinone#fetchtrades)
* [coinsph](/docs/exchanges/coinsph#fetchtrades)
* [coinspot](/docs/exchanges/coinspot#fetchtrades)
* [cryptocom](/docs/exchanges/cryptocom#fetchtrades)
* [cryptomus](/docs/exchanges/cryptomus#fetchtrades)
* [deepcoin](/docs/exchanges/deepcoin#fetchtrades)
* [delta](/docs/exchanges/delta#fetchtrades)
* [deribit](/docs/exchanges/deribit#fetchtrades)
* [derive](/docs/exchanges/derive#fetchtrades)
* [digifinex](/docs/exchanges/digifinex#fetchtrades)
* [dydx](/docs/exchanges/dydx#fetchtrades)
* [extended](/docs/exchanges/extended#fetchtrades)
* [foxbit](/docs/exchanges/foxbit#fetchtrades)
* [gate](/docs/exchanges/gate#fetchtrades)
* [gemini](/docs/exchanges/gemini#fetchtrades)
* [grvt](/docs/exchanges/grvt#fetchtrades)
* [hashkey](/docs/exchanges/hashkey#fetchtrades)
* [hibachi](/docs/exchanges/hibachi#fetchtrades)
* [hitbtc](/docs/exchanges/hitbtc#fetchtrades)
* [hollaex](/docs/exchanges/hollaex#fetchtrades)
* [htx](/docs/exchanges/htx#fetchtrades)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchtrades)
* [independentreserve](/docs/exchanges/independentreserve#fetchtrades)
* [indodax](/docs/exchanges/indodax#fetchtrades)
* [kraken](/docs/exchanges/kraken#fetchtrades)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchtrades)
* [kucoin](/docs/exchanges/kucoin#fetchtrades)
* [latoken](/docs/exchanges/latoken#fetchtrades)
* [lbank](/docs/exchanges/lbank#fetchtrades)
* [luno](/docs/exchanges/luno#fetchtrades)
* [mercado](/docs/exchanges/mercado#fetchtrades)
* [mexc](/docs/exchanges/mexc#fetchtrades)
* [modetrade](/docs/exchanges/modetrade#fetchtrades)
* [nado](/docs/exchanges/nado#fetchtrades)
* [ndax](/docs/exchanges/ndax#fetchtrades)
* [okx](/docs/exchanges/okx#fetchtrades)
* [p2b](/docs/exchanges/p2b#fetchtrades)
* [pacifica](/docs/exchanges/pacifica#fetchtrades)
* [paradex](/docs/exchanges/paradex#fetchtrades)
* [paymium](/docs/exchanges/paymium#fetchtrades)
* [phemex](/docs/exchanges/phemex#fetchtrades)
* [poloniex](/docs/exchanges/poloniex#fetchtrades)
* [revolutx](/docs/exchanges/revolutx#fetchtrades)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchtrades)
* [toobit](/docs/exchanges/toobit#fetchtrades)
* [upbit](/docs/exchanges/upbit#fetchtrades)
* [weex](/docs/exchanges/weex#fetchtrades)
* [whitebit](/docs/exchanges/whitebit#fetchtrades)
* [woo](/docs/exchanges/woo#fetchtrades)
* [woofipro](/docs/exchanges/woofipro#fetchtrades)
* [xt](/docs/exchanges/xt#fetchtrades)
* [zaif](/docs/exchanges/zaif#fetchtrades)
* [zebpay](/docs/exchanges/zebpay#fetchtrades)
***
## fetchTradesWs [#fetchtradesws]
fetch all trades made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#trade-structure)
| Param | Type | Required | Description |
| ------------- | ------------------- | -------- | ----------------------------------------------------------------------------------- |
| symbol | string | Yes | unified market symbol |
| since | int | No | the earliest time in ms to fetch trades for |
| limit | int | No | the maximum number of trades structures to retrieve, default=500, max=1000 |
| params | object | No | extra parameters specific to the exchange API endpoint EXCHANGE SPECIFIC PARAMETERS |
| params.fromId | int | No | trade ID to begin at |
##### Supported exchanges [#supported-exchanges-180]
* [binance](/docs/exchanges/binance#fetchtradesws)
* [lbank](/docs/exchanges/lbank#fetchtradesws)
***
## fetchTradingFee [#fetchtradingfee]
fetch the trading fees for a market
**Kind**: instance\
**Returns**: object - a [fee structure](/docs/manual#fee-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-181]
* [aster](/docs/exchanges/aster#fetchtradingfee)
* [binance](/docs/exchanges/binance#fetchtradingfee)
* [bingx](/docs/exchanges/bingx#fetchtradingfee)
* [bitflyer](/docs/exchanges/bitflyer#fetchtradingfee)
* [bitget](/docs/exchanges/bitget#fetchtradingfee)
* [bitstamp](/docs/exchanges/bitstamp#fetchtradingfee)
* [bitvavo](/docs/exchanges/bitvavo#fetchtradingfee)
* [btse](/docs/exchanges/btse#fetchtradingfee)
* [bybit](/docs/exchanges/bybit#fetchtradingfee)
* [coinex](/docs/exchanges/coinex#fetchtradingfee)
* [coinmate](/docs/exchanges/coinmate#fetchtradingfee)
* [coinsph](/docs/exchanges/coinsph#fetchtradingfee)
* [cryptocom](/docs/exchanges/cryptocom#fetchtradingfee)
* [digifinex](/docs/exchanges/digifinex#fetchtradingfee)
* [extended](/docs/exchanges/extended#fetchtradingfee)
* [gate](/docs/exchanges/gate#fetchtradingfee)
* [hashkey](/docs/exchanges/hashkey#fetchtradingfee)
* [hitbtc](/docs/exchanges/hitbtc#fetchtradingfee)
* [htx](/docs/exchanges/htx#fetchtradingfee)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchtradingfee)
* [kraken](/docs/exchanges/kraken#fetchtradingfee)
* [kucoin](/docs/exchanges/kucoin#fetchtradingfee)
* [latoken](/docs/exchanges/latoken#fetchtradingfee)
* [lbank](/docs/exchanges/lbank#fetchtradingfee)
* [luno](/docs/exchanges/luno#fetchtradingfee)
* [mexc](/docs/exchanges/mexc#fetchtradingfee)
* [okx](/docs/exchanges/okx#fetchtradingfee)
* [pacifica](/docs/exchanges/pacifica#fetchtradingfee)
* [paradex](/docs/exchanges/paradex#fetchtradingfee)
* [upbit](/docs/exchanges/upbit#fetchtradingfee)
* [weex](/docs/exchanges/weex#fetchtradingfee)
* [woo](/docs/exchanges/woo#fetchtradingfee)
* [xt](/docs/exchanges/xt#fetchtradingfee)
* [zebpay](/docs/exchanges/zebpay#fetchtradingfee)
***
## fetchTradingFees [#fetchtradingfees]
fetch the trading fees for multiple markets
**Kind**: instance\
**Returns**: object - a dictionary of [fee structures](/docs/manual#fee-structure) indexed by market symbols
| Param | Type | Required | Description |
| -------------- | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.subType | string | No | "linear" or "inverse" |
##### Supported exchanges [#supported-exchanges-182]
* [binance](/docs/exchanges/binance#fetchtradingfees)
* [bit2c](/docs/exchanges/bit2c#fetchtradingfees)
* [bitbank](/docs/exchanges/bitbank#fetchtradingfees)
* [bitfinex](/docs/exchanges/bitfinex#fetchtradingfees)
* [bitget](/docs/exchanges/bitget#fetchtradingfees)
* [bitopro](/docs/exchanges/bitopro#fetchtradingfees)
* [bitso](/docs/exchanges/bitso#fetchtradingfees)
* [bitstamp](/docs/exchanges/bitstamp#fetchtradingfees)
* [bitvavo](/docs/exchanges/bitvavo#fetchtradingfees)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchtradingfees)
* [btse](/docs/exchanges/btse#fetchtradingfees)
* [bybit](/docs/exchanges/bybit#fetchtradingfees)
* [cex](/docs/exchanges/cex#fetchtradingfees)
* [coinbase](/docs/exchanges/coinbase#fetchtradingfees)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchtradingfees)
* [coincheck](/docs/exchanges/coincheck#fetchtradingfees)
* [coinex](/docs/exchanges/coinex#fetchtradingfees)
* [coinsph](/docs/exchanges/coinsph#fetchtradingfees)
* [cryptocom](/docs/exchanges/cryptocom#fetchtradingfees)
* [cryptomus](/docs/exchanges/cryptomus#fetchtradingfees)
* [deribit](/docs/exchanges/deribit#fetchtradingfees)
* [extended](/docs/exchanges/extended#fetchtradingfees)
* [foxbit](/docs/exchanges/foxbit#fetchtradingfees)
* [gate](/docs/exchanges/gate#fetchtradingfees)
* [gemini](/docs/exchanges/gemini#fetchtradingfees)
* [hashkey](/docs/exchanges/hashkey#fetchtradingfees)
* [hibachi](/docs/exchanges/hibachi#fetchtradingfees)
* [hitbtc](/docs/exchanges/hitbtc#fetchtradingfees)
* [hollaex](/docs/exchanges/hollaex#fetchtradingfees)
* [independentreserve](/docs/exchanges/independentreserve#fetchtradingfees)
* [krakenfutures](/docs/exchanges/krakenfutures#fetchtradingfees)
* [lbank](/docs/exchanges/lbank#fetchtradingfees)
* [modetrade](/docs/exchanges/modetrade#fetchtradingfees)
* [onetrading](/docs/exchanges/onetrading#fetchtradingfees)
* [paradex](/docs/exchanges/paradex#fetchtradingfees)
* [poloniex](/docs/exchanges/poloniex#fetchtradingfees)
* [toobit](/docs/exchanges/toobit#fetchtradingfees)
* [upbit](/docs/exchanges/upbit#fetchtradingfees)
* [whitebit](/docs/exchanges/whitebit#fetchtradingfees)
* [woo](/docs/exchanges/woo#fetchtradingfees)
* [woofipro](/docs/exchanges/woofipro#fetchtradingfees)
* [xt](/docs/exchanges/xt#fetchtradingfees)
* [zebpay](/docs/exchanges/zebpay#fetchtradingfees)
***
## fetchTradingFeesWs [#fetchtradingfeesws]
fetch the trading fees for multiple markets
**Kind**: instance\
**Returns**: object - a dictionary of [fee structures](/docs/manual#fee-structure) indexed by market symbols
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-183]
* [bitvavo](/docs/exchanges/bitvavo#fetchtradingfeesws)
***
## fetchTradingLimits [#fetchtradinglimits]
fetch the trading limits for a market
**Kind**: instance\
**Returns**: object - a [trading limits structure](/docs/manual#trading-limits-structure)
| Param | Type | Required | Description |
| ------- | --------------------------------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\, undefined | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-184]
* [whitebit](/docs/exchanges/whitebit#fetchtradinglimits)
***
## fetchTransactionFee [#fetchtransactionfee]
fetch the fee for a transaction
**Kind**: instance\
**Returns**: object - a [fee structure](/docs/manual#fee-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-185]
* [indodax](/docs/exchanges/indodax#fetchtransactionfee)
* [kucoin](/docs/exchanges/kucoin#fetchtransactionfee)
***
## fetchTransactionFees [#fetchtransactionfees]
please use fetchDepositWithdrawFees instead
**Kind**: instance\
**Returns**: Array\ - a list of [fee structures](/docs/manual#fee-structure)
| Param | Type | Required | Description |
| ------ | --------------------------------------------------- | -------- | ------------------------------------------------------ |
| codes | Array\, undefined | Yes | not used by fetchTransactionFees () |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-186]
* [binance](/docs/exchanges/binance#fetchtransactionfees)
* [bitso](/docs/exchanges/bitso#fetchtransactionfees)
* [bitstamp](/docs/exchanges/bitstamp#fetchtransactionfees)
* [gate](/docs/exchanges/gate#fetchtransactionfees)
* [lbank](/docs/exchanges/lbank#fetchtransactionfees)
* [mexc](/docs/exchanges/mexc#fetchtransactionfees)
* [whitebit](/docs/exchanges/whitebit#fetchtransactionfees)
***
## fetchTransactions [#fetchtransactions]
fetch history of deposits, withdrawals, and transfers
**Kind**: instance\
**Returns**: Array\ - a list of [transaction structures](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| --------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| code | string | No | unified currency code |
| since | int | No | the earliest time in ms to fetch transactions for |
| limit | int | No | the maximum number of transaction structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](/docs/manual#pagination-params) |
##### Supported exchanges [#supported-exchanges-187]
* [extended](/docs/exchanges/extended#fetchtransactions)
* [foxbit](/docs/exchanges/foxbit#fetchtransactions)
* [latoken](/docs/exchanges/latoken#fetchtransactions)
* [whitebit](/docs/exchanges/whitebit#fetchtransactions)
***
## fetchTransfer [#fetchtransfer]
fetches a transfer
**Kind**: instance\
**Returns**: object - a [transfer structure](/docs/manual#transfer-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | transfer id |
| code | string | No | unified currency code of the currency transferred |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-188]
* [bitvavo](/docs/exchanges/bitvavo#fetchtransfer)
* [mexc](/docs/exchanges/mexc#fetchtransfer)
* [okx](/docs/exchanges/okx#fetchtransfer)
***
## fetchTransfers [#fetchtransfers]
fetch a history of internal transfers made on an account
**Kind**: instance\
**Returns**: Array\ - a list of [transfer structures](/docs/manual#transfer-structure)
| Param | Type | Required | Description |
| --------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| code | string | Yes | unified currency code of the currency transferred |
| since | int | No | the earliest time in ms to fetch transfers for |
| limit | int | No | the maximum number of transfers structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | the latest time in ms to fetch transfers for |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](/docs/manual#pagination-params) |
| params.internal | boolean | No | default false, when true will fetch pay trade history |
##### Supported exchanges [#supported-exchanges-189]
* [binance](/docs/exchanges/binance#fetchtransfers)
* [bingx](/docs/exchanges/bingx#fetchtransfers)
* [bitget](/docs/exchanges/bitget#fetchtransfers)
* [bitrue](/docs/exchanges/bitrue#fetchtransfers)
* [bitvavo](/docs/exchanges/bitvavo#fetchtransfers)
* [bullish](/docs/exchanges/bullish#fetchtransfers)
* [bybit](/docs/exchanges/bybit#fetchtransfers)
* [bydfi](/docs/exchanges/bydfi#fetchtransfers)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchtransfers)
* [coinex](/docs/exchanges/coinex#fetchtransfers)
* [deribit](/docs/exchanges/deribit#fetchtransfers)
* [digifinex](/docs/exchanges/digifinex#fetchtransfers)
* [dydx](/docs/exchanges/dydx#fetchtransfers)
* [extended](/docs/exchanges/extended#fetchtransfers)
* [grvt](/docs/exchanges/grvt#fetchtransfers)
* [htx](/docs/exchanges/htx#fetchtransfers)
* [kucoin](/docs/exchanges/kucoin#fetchtransfers)
* [latoken](/docs/exchanges/latoken#fetchtransfers)
* [lighter](/docs/exchanges/lighter#fetchtransfers)
* [mexc](/docs/exchanges/mexc#fetchtransfers)
* [okx](/docs/exchanges/okx#fetchtransfers)
* [paradex](/docs/exchanges/paradex#fetchtransfers)
* [phemex](/docs/exchanges/phemex#fetchtransfers)
* [weex](/docs/exchanges/weex#fetchtransfers)
* [woo](/docs/exchanges/woo#fetchtransfers)
***
## fetchUnderlyingAssets [#fetchunderlyingassets]
fetches the market ids of underlying assets for a specific contract market type
**Kind**: instance\
**Returns**: Array\ - a list of [underlying assets](/docs/manual#underlying-assets-structure)
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | ------------------------------------------------------------------------------- |
| params | object | No | exchange specific params |
| params.type | string | No | the contract market type, 'option', 'swap' or 'future', the default is 'option' |
##### Supported exchanges [#supported-exchanges-190]
* [gate](/docs/exchanges/gate#fetchunderlyingassets)
* [okx](/docs/exchanges/okx#fetchunderlyingassets)
***
## fetchUtaBalance [#fetchutabalance]
helper method for fetching balance with unified trading account (uta) endpoint
**Kind**: instance\
**Returns**: object - a [balance structure](/docs/manual#balance-structure)
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.type | string | No | 'unified', 'spot', 'funding', 'cross', 'isolated' or 'swap' (default is 'unified') |
| params.marginMode | string | No | 'cross' or 'isolated', margin type for fetching margin balance, only applicable if type is margin (default is cross) |
##### Supported exchanges [#supported-exchanges-191]
* [kucoin](/docs/exchanges/kucoin#fetchutabalance)
***
## fetchUtaOrder [#fetchutaorder]
fetch uta order
**Kind**: instance\
**Returns**: object - An [order structure](/docs/manual#order-structure)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | ----------------------------------------------------------------------------------------------------------- |
| id | string | Yes | order id |
| symbol | string | Yes | unified symbol of the market the order was made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.accountMode | string | No | 'unified' or 'classic' (default is 'unified') |
| params.clientOrderId | string | No | client order id, required if id is not provided |
| params.marginMode | string | No | 'cross' or 'isolated', required if fetching a margin order (unified accountMode supports only cross margin) |
##### Supported exchanges [#supported-exchanges-192]
* [kucoin](/docs/exchanges/kucoin#fetchutaorder)
***
## fetchUtaOrdersByStatus [#fetchutaordersbystatus]
helper method for fetching orders by status with uta endpoint
**Kind**: instance\
**Returns**: An [array of order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------------------ | -------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| status | string | Yes | 'active' or 'closed', only 'active' is valid for stop orders |
| symbol | string | Yes | unified symbol for the market to retrieve orders from |
| since | int | No | timestamp in ms of the earliest order to retrieve |
| limit | int | No | The maximum number of orders to retrieve |
| params | object | No | exchange specific parameters |
| params.until | int | No | End time in ms |
| params.side | string | No | *closed orders only* 'BUY' or 'SELL' |
| params.accountMode | string | No | 'unified' or 'classic' (default is unified) |
| params.marginMode | string | No | 'cross' or 'isolated', only for margin orders (unified accountMode supports only cross margin) |
| params.paginate | boolean | No | default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](/docs/manual#pagination-params) |
##### Supported exchanges [#supported-exchanges-193]
* [kucoin](/docs/exchanges/kucoin#fetchutaordersbystatus)
***
## fetchVolatilityHistory [#fetchvolatilityhistory]
fetch the historical volatility of an option market based on an underlying asset
**Kind**: instance\
**Returns**: Array\ - a list of [volatility history objects](/docs/manual#volatility-structure)
| Param | Type | Required | Description |
| ------------- | ------------------- | -------- | ------------------------------------------------------------------------ |
| code | string | Yes | unified currency code |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.period | int | No | the period in days to fetch the volatility for: 7,14,21,30,60,90,180,270 |
##### Supported exchanges [#supported-exchanges-194]
* [bybit](/docs/exchanges/bybit#fetchvolatilityhistory)
* [deribit](/docs/exchanges/deribit#fetchvolatilityhistory)
***
## fetchWithdrawal [#fetchwithdrawal]
fetch data on a currency withdrawal via the withdrawal id
**Kind**: instance\
**Returns**: object - a [transaction structure](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------- |
| id | string | Yes | withdrawal id |
| code | string | No | the currency code |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.txid | string | No | the transaction id for the withdrawal |
| params.generation | int | No | *only generation 2 is supported* if you want to use the API generation 1 or 2, default is 2 |
##### Supported exchanges [#supported-exchanges-195]
* [bithumb](/docs/exchanges/bithumb#fetchwithdrawal)
* [bitopro](/docs/exchanges/bitopro#fetchwithdrawal)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchwithdrawal)
* [hollaex](/docs/exchanges/hollaex#fetchwithdrawal)
* [okx](/docs/exchanges/okx#fetchwithdrawal)
* [upbit](/docs/exchanges/upbit#fetchwithdrawal)
***
## fetchWithdrawalWhitelist [#fetchwithdrawalwhitelist]
fetch a list of allowed withdrawal addresses
**Kind**: instance\
**Returns**: Array\ - a list response from the exchange
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.generation | int | No | *only generation 2 is supported* if you want to use the API generation 1 or 2, default is 2 |
##### Supported exchanges [#supported-exchanges-196]
* [bithumb](/docs/exchanges/bithumb#fetchwithdrawalwhitelist)
***
## fetchWithdrawals [#fetchwithdrawals]
fetch all withdrawals made from an account
**Kind**: instance\
**Returns**: Array\ - a list of [transaction structures](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------- |
| code | string | No | unified currency code |
| since | int | No | the earliest time in ms to fetch withdrawals for |
| limit | int | No | the maximum number of withdrawal structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-197]
* [alpaca](/docs/exchanges/alpaca#fetchwithdrawals)
* [backpack](/docs/exchanges/backpack#fetchwithdrawals)
* [bigone](/docs/exchanges/bigone#fetchwithdrawals)
* [binance](/docs/exchanges/binance#fetchwithdrawals)
* [bingx](/docs/exchanges/bingx#fetchwithdrawals)
* [bitbns](/docs/exchanges/bitbns#fetchwithdrawals)
* [bitflyer](/docs/exchanges/bitflyer#fetchwithdrawals)
* [bitget](/docs/exchanges/bitget#fetchwithdrawals)
* [bithumb](/docs/exchanges/bithumb#fetchwithdrawals)
* [bitopro](/docs/exchanges/bitopro#fetchwithdrawals)
* [bitrue](/docs/exchanges/bitrue#fetchwithdrawals)
* [bitstamp](/docs/exchanges/bitstamp#fetchwithdrawals)
* [bittrade](/docs/exchanges/bittrade#fetchwithdrawals)
* [bitvavo](/docs/exchanges/bitvavo#fetchwithdrawals)
* [blockchaincom](/docs/exchanges/blockchaincom#fetchwithdrawals)
* [blofin](/docs/exchanges/blofin#fetchwithdrawals)
* [btcmarkets](/docs/exchanges/btcmarkets#fetchwithdrawals)
* [btse](/docs/exchanges/btse#fetchwithdrawals)
* [bybit](/docs/exchanges/bybit#fetchwithdrawals)
* [bydfi](/docs/exchanges/bydfi#fetchwithdrawals)
* [coinbase](/docs/exchanges/coinbase#fetchwithdrawals)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#fetchwithdrawals)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#fetchwithdrawals)
* [coincheck](/docs/exchanges/coincheck#fetchwithdrawals)
* [coinex](/docs/exchanges/coinex#fetchwithdrawals)
* [coinsph](/docs/exchanges/coinsph#fetchwithdrawals)
* [cryptocom](/docs/exchanges/cryptocom#fetchwithdrawals)
* [deepcoin](/docs/exchanges/deepcoin#fetchwithdrawals)
* [deribit](/docs/exchanges/deribit#fetchwithdrawals)
* [derive](/docs/exchanges/derive#fetchwithdrawals)
* [digifinex](/docs/exchanges/digifinex#fetchwithdrawals)
* [dydx](/docs/exchanges/dydx#fetchwithdrawals)
* [extended](/docs/exchanges/extended#fetchwithdrawals)
* [foxbit](/docs/exchanges/foxbit#fetchwithdrawals)
* [gate](/docs/exchanges/gate#fetchwithdrawals)
* [grvt](/docs/exchanges/grvt#fetchwithdrawals)
* [hashkey](/docs/exchanges/hashkey#fetchwithdrawals)
* [hibachi](/docs/exchanges/hibachi#fetchwithdrawals)
* [hitbtc](/docs/exchanges/hitbtc#fetchwithdrawals)
* [hollaex](/docs/exchanges/hollaex#fetchwithdrawals)
* [htx](/docs/exchanges/htx#fetchwithdrawals)
* [hyperliquid](/docs/exchanges/hyperliquid#fetchwithdrawals)
* [kraken](/docs/exchanges/kraken#fetchwithdrawals)
* [kucoin](/docs/exchanges/kucoin#fetchwithdrawals)
* [lbank](/docs/exchanges/lbank#fetchwithdrawals)
* [lighter](/docs/exchanges/lighter#fetchwithdrawals)
* [mexc](/docs/exchanges/mexc#fetchwithdrawals)
* [modetrade](/docs/exchanges/modetrade#fetchwithdrawals)
* [nado](/docs/exchanges/nado#fetchwithdrawals)
* [ndax](/docs/exchanges/ndax#fetchwithdrawals)
* [okx](/docs/exchanges/okx#fetchwithdrawals)
* [paradex](/docs/exchanges/paradex#fetchwithdrawals)
* [phemex](/docs/exchanges/phemex#fetchwithdrawals)
* [poloniex](/docs/exchanges/poloniex#fetchwithdrawals)
* [tokocrypto](/docs/exchanges/tokocrypto#fetchwithdrawals)
* [toobit](/docs/exchanges/toobit#fetchwithdrawals)
* [upbit](/docs/exchanges/upbit#fetchwithdrawals)
* [whitebit](/docs/exchanges/whitebit#fetchwithdrawals)
* [woo](/docs/exchanges/woo#fetchwithdrawals)
* [woofipro](/docs/exchanges/woofipro#fetchwithdrawals)
* [xt](/docs/exchanges/xt#fetchwithdrawals)
***
## fetchWithdrawalsWs [#fetchwithdrawalsws]
fetch all withdrawals made from an account
**Kind**: instance\
**Returns**: Array\ - a list of [transaction structures](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | -------------------------------------------------------- |
| code | string | Yes | unified currency code |
| since | int | No | the earliest time in ms to fetch withdrawals for |
| limit | int | No | the maximum number of withdrawals structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-198]
* [bitvavo](/docs/exchanges/bitvavo#fetchwithdrawalsws)
***
## isUTAEnabled [#isutaenabled]
returns true or false so the user can check if unified account is enabled
**Kind**: instance\
**Returns**: boolean - true if unified account is enabled, false otherwise
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-199]
* [kucoin](/docs/exchanges/kucoin#isutaenabled)
***
## isUnifiedEnabled [#isunifiedenabled]
returns \[enableUnifiedMargin, enableUnifiedAccount] so the user can check if unified account is enabled
**Kind**: instance\
**Returns**: any - \[enableUnifiedMargin, enableUnifiedAccount]
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-200]
* [bybit](/docs/exchanges/bybit#isunifiedenabled)
* [hyperliquid](/docs/exchanges/hyperliquid#isunifiedenabled)
***
## loadMigrationStatus [#loadmigrationstatus]
loads the migration status for the account (hf or not)
**Kind**: instance\
**Returns**: any - ignore
| Param | Type | Description |
| ----- | -------------------- | ----------------------------- |
| force | boolean | load account state for non hf |
##### Supported exchanges [#supported-exchanges-201]
* [kucoin](/docs/exchanges/kucoin#loadmigrationstatus)
***
## loadUnifiedStatus [#loadunifiedstatus]
returns unifiedAccount so the user can check if the unified account is enabled
**Kind**: instance\
**Returns**: boolean - true or false if the enabled unified account is enabled or not and sets the unifiedAccount option if it is undefined
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-202]
* [gate](/docs/exchanges/gate#loadunifiedstatus)
***
## market [#market]
calculates the presumptive fee that would be charged for an order
**Kind**: instance\
**Returns**: object - contains the rate, the percentage multiplied to the order amount to obtain the fee amount, and cost, the total value of the fee in units of the quote currency, for the order
| Param | Type | Description |
| ------------ | ------------------- | --------------------------------------------------------------------------------------------------- |
| symbol | string | unified market symbol |
| type | string | not used by btcmarkets.calculateFee |
| side | string | not used by btcmarkets.calculateFee |
| amount | float | how much you want to trade, in units of the base currency on most exchanges, or number of contracts |
| price | float | the price for the order to be filled at, in units of the quote currency |
| takerOrMaker | string | 'taker' or 'maker' |
| params | object | |
##### Supported exchanges [#supported-exchanges-203]
* \
***
## preLoadLighterLibrary [#preloadlighterlibrary]
if the required credentials are available in options, it will pre-load the lighter Signer to avoid delaying sensitive calls like createOrder the first time they're executed
**Kind**: instance\
**Returns**: boolean - true if the signer was loaded, false otherwise
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-204]
* [lighter](/docs/exchanges/lighter#preloadlighterlibrary)
***
## redeemGiftCode [#redeemgiftcode]
redeem gift code
**Kind**: instance\
**Returns**: object - response from the exchange
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------ |
| giftcardCode | string | Yes | |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-205]
* [binance](/docs/exchanges/binance#redeemgiftcode)
***
## reduceMargin [#reducemargin]
remove margin from a position
**Kind**: instance\
**Returns**: object - a [margin structure](/docs/manual#reduce-margin-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol |
| amount | float | Yes | the amount of margin to remove |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-206]
* [aster](/docs/exchanges/aster#reducemargin)
* [binance](/docs/exchanges/binance#reducemargin)
* [bitget](/docs/exchanges/bitget#reducemargin)
* [coinex](/docs/exchanges/coinex#reducemargin)
* [delta](/docs/exchanges/delta#reducemargin)
* [digifinex](/docs/exchanges/digifinex#reducemargin)
* [gate](/docs/exchanges/gate#reducemargin)
* [hashkey](/docs/exchanges/hashkey#reducemargin)
* [hitbtc](/docs/exchanges/hitbtc#reducemargin)
* [hyperliquid](/docs/exchanges/hyperliquid#reducemargin)
* [kucoin](/docs/exchanges/kucoin#reducemargin)
* [lighter](/docs/exchanges/lighter#reducemargin)
* [mexc](/docs/exchanges/mexc#reducemargin)
* [mudrex](/docs/exchanges/mudrex#reducemargin)
* [okx](/docs/exchanges/okx#reducemargin)
* [poloniex](/docs/exchanges/poloniex#reducemargin)
* [weex](/docs/exchanges/weex#reducemargin)
* [woo](/docs/exchanges/woo#reducemargin)
* [woofipro](/docs/exchanges/woofipro#reducemargin)
* [xt](/docs/exchanges/xt#reducemargin)
* [zebpay](/docs/exchanges/zebpay#reducemargin)
***
## repayCrossMargin [#repaycrossmargin]
repay borrowed margin and interest
**Kind**: instance\
**Returns**: object - a [margin loan structure](/docs/manual#margin-loan-structure)
| Param | Type | Required | Description |
| ----------------------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------- |
| code | string | Yes | unified currency code of the currency to repay |
| amount | float | Yes | the amount to repay |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.portfolioMargin | boolean | No | set to true if you would like to repay margin in a portfolio margin account |
| params.repayCrossMarginMethod | string | No | *portfolio margin only* 'papiPostRepayLoan' (default), 'papiPostMarginRepayDebt' (alternative) |
| params.specifyRepayAssets | string | No | *portfolio margin papiPostMarginRepayDebt only* specific asset list to repay debt |
##### Supported exchanges [#supported-exchanges-207]
* [binance](/docs/exchanges/binance#repaycrossmargin)
* [bitget](/docs/exchanges/bitget#repaycrossmargin)
* [bybit](/docs/exchanges/bybit#repaycrossmargin)
* [gate](/docs/exchanges/gate#repaycrossmargin)
* [htx](/docs/exchanges/htx#repaycrossmargin)
* [kucoin](/docs/exchanges/kucoin#repaycrossmargin)
* [okx](/docs/exchanges/okx#repaycrossmargin)
***
## repayIsolatedMargin [#repayisolatedmargin]
repay borrowed margin and interest
**Kind**: instance\
**Returns**: object - a [margin loan structure](/docs/manual#margin-loan-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol, required for isolated margin |
| code | string | Yes | unified currency code of the currency to repay |
| amount | float | Yes | the amount to repay |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-208]
* [binance](/docs/exchanges/binance#repayisolatedmargin)
* [bitget](/docs/exchanges/bitget#repayisolatedmargin)
* [coinex](/docs/exchanges/coinex#repayisolatedmargin)
* [gate](/docs/exchanges/gate#repayisolatedmargin)
* [htx](/docs/exchanges/htx#repayisolatedmargin)
* [kucoin](/docs/exchanges/kucoin#repayisolatedmargin)
***
## repayMargin [#repaymargin]
repay borrowed margin and interest
**Kind**: instance\
**Returns**: object - a [margin loan structure](/docs/manual#margin-loan-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code of the currency to repay |
| amount | float | Yes | the amount to repay |
| symbol | string | Yes | not used by woo.repayMargin () |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-209]
* [woo](/docs/exchanges/woo#repaymargin)
***
## reserveRequestWeight [#reserverequestweight]
Instead of trading to increase the address based rate limits, this action allows reserving additional actions for 0.0005 USDC per request. The cost is paid from the Perps balance.
**Kind**: instance\
**Returns**: object - a response object
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------------------ |
| weight | number | Yes | the weight to reserve, 1 weight = 1 action, 0.0005 USDC per action |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-210]
* [hyperliquid](/docs/exchanges/hyperliquid#reserverequestweight)
***
## setAgentAbstraction [#setagentabstraction]
set agent abstraction mode
**Kind**: instance\
**Returns**: dictionary response from the exchange
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ |
| abstraction | string | Yes | one of the strings \["i", "u", "p"] where "i" is "disabled", "u" is "unifiedAccount", and "p" is "portfolioMargin" |
| params | object | No | |
##### Supported exchanges [#supported-exchanges-211]
* [hyperliquid](/docs/exchanges/hyperliquid#setagentabstraction)
***
## setContractLeverage [#setcontractleverage]
set the level of leverage for a market
**Kind**: instance\
**Returns**: object - response from the exchange
| Param | Type | Required | Description |
| ---------- | -------------------- | -------- | ------------------------------------------------------ |
| leverage | float | Yes | the rate of leverage |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.uta | boolean | No | set to true for the unified trading account (uta) |
##### Supported exchanges [#supported-exchanges-212]
* [kucoin](/docs/exchanges/kucoin#setcontractleverage)
***
## setLeverage [#setleverage]
set the level of leverage for a market
**Kind**: instance\
**Returns**: object - response from the exchange
| Param | Type | Required | Description |
| -------- | ------------------- | -------- | ------------------------------------------------------ |
| leverage | float | Yes | the rate of leverage |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-213]
* [apex](/docs/exchanges/apex#setleverage)
* [aster](/docs/exchanges/aster#setleverage)
* [binance](/docs/exchanges/binance#setleverage)
* [bingx](/docs/exchanges/bingx#setleverage)
* [bitget](/docs/exchanges/bitget#setleverage)
* [bitmex](/docs/exchanges/bitmex#setleverage)
* [bitrue](/docs/exchanges/bitrue#setleverage)
* [blofin](/docs/exchanges/blofin#setleverage)
* [btse](/docs/exchanges/btse#setleverage)
* [bybit](/docs/exchanges/bybit#setleverage)
* [bydfi](/docs/exchanges/bydfi#setleverage)
* [coinex](/docs/exchanges/coinex#setleverage)
* [deepcoin](/docs/exchanges/deepcoin#setleverage)
* [delta](/docs/exchanges/delta#setleverage)
* [digifinex](/docs/exchanges/digifinex#setleverage)
* [extended](/docs/exchanges/extended#setleverage)
* [gate](/docs/exchanges/gate#setleverage)
* [grvt](/docs/exchanges/grvt#setleverage)
* [hashkey](/docs/exchanges/hashkey#setleverage)
* [hitbtc](/docs/exchanges/hitbtc#setleverage)
* [htx](/docs/exchanges/htx#setleverage)
* [hyperliquid](/docs/exchanges/hyperliquid#setleverage)
* [krakenfutures](/docs/exchanges/krakenfutures#setleverage)
* [kucoin](/docs/exchanges/kucoin#setleverage)
* [lighter](/docs/exchanges/lighter#setleverage)
* [mexc](/docs/exchanges/mexc#setleverage)
* [modetrade](/docs/exchanges/modetrade#setleverage)
* [mudrex](/docs/exchanges/mudrex#setleverage)
* [okx](/docs/exchanges/okx#setleverage)
* [pacifica](/docs/exchanges/pacifica#setleverage)
* [paradex](/docs/exchanges/paradex#setleverage)
* [phemex](/docs/exchanges/phemex#setleverage)
* [poloniex](/docs/exchanges/poloniex#setleverage)
* [toobit](/docs/exchanges/toobit#setleverage)
* [weex](/docs/exchanges/weex#setleverage)
* [whitebit](/docs/exchanges/whitebit#setleverage)
* [woo](/docs/exchanges/woo#setleverage)
* [woofipro](/docs/exchanges/woofipro#setleverage)
* [xt](/docs/exchanges/xt#setleverage)
* [zebpay](/docs/exchanges/zebpay#setleverage)
***
## setMargin [#setmargin]
Either adds or reduces margin in an isolated position in order to set the margin to a specific value
**Kind**: instance\
**Returns**: object - A [margin structure](/docs/manual#margin-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ---------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market to set margin in |
| amount | float | Yes | the amount to set the margin to |
| params | object | No | parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-214]
* [bingx](/docs/exchanges/bingx#setmargin)
* [bitfinex](/docs/exchanges/bitfinex#setmargin)
* [bitrue](/docs/exchanges/bitrue#setmargin)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#setmargin)
* [lighter](/docs/exchanges/lighter#setmargin)
* [phemex](/docs/exchanges/phemex#setmargin)
***
## setMarginMode [#setmarginmode]
set margin mode to 'cross' or 'isolated'
**Kind**: instance\
**Returns**: object - response from the exchange
| Param | Type | Required | Description |
| ---------- | ------------------- | -------- | ------------------------------------------------------ |
| marginMode | string | Yes | 'cross' or 'isolated' |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-215]
* [aster](/docs/exchanges/aster#setmarginmode)
* [binance](/docs/exchanges/binance#setmarginmode)
* [bingx](/docs/exchanges/bingx#setmarginmode)
* [bitget](/docs/exchanges/bitget#setmarginmode)
* [bitmex](/docs/exchanges/bitmex#setmarginmode)
* [blofin](/docs/exchanges/blofin#setmarginmode)
* [btse](/docs/exchanges/btse#setmarginmode)
* [bybit](/docs/exchanges/bybit#setmarginmode)
* [bydfi](/docs/exchanges/bydfi#setmarginmode)
* [coinex](/docs/exchanges/coinex#setmarginmode)
* [delta](/docs/exchanges/delta#setmarginmode)
* [digifinex](/docs/exchanges/digifinex#setmarginmode)
* [hashkey](/docs/exchanges/hashkey#setmarginmode)
* [hyperliquid](/docs/exchanges/hyperliquid#setmarginmode)
* [kucoin](/docs/exchanges/kucoin#setmarginmode)
* [lighter](/docs/exchanges/lighter#setmarginmode)
* [mexc](/docs/exchanges/mexc#setmarginmode)
* [okx](/docs/exchanges/okx#setmarginmode)
* [pacifica](/docs/exchanges/pacifica#setmarginmode)
* [paradex](/docs/exchanges/paradex#setmarginmode)
* [phemex](/docs/exchanges/phemex#setmarginmode)
* [toobit](/docs/exchanges/toobit#setmarginmode)
* [weex](/docs/exchanges/weex#setmarginmode)
* [woofipro](/docs/exchanges/woofipro#setmarginmode)
* [xt](/docs/exchanges/xt#setmarginmode)
***
## setPositionMode [#setpositionmode]
set hedged to true or false for a market
**Kind**: instance\
**Returns**: object - response from the exchange
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| hedged | bool | Yes | set to true to use dualSidePosition |
| symbol | string | Yes | not used by setPositionMode () |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-216]
* [aster](/docs/exchanges/aster#setpositionmode)
* [binance](/docs/exchanges/binance#setpositionmode)
* [bingx](/docs/exchanges/bingx#setpositionmode)
* [bitget](/docs/exchanges/bitget#setpositionmode)
* [blofin](/docs/exchanges/blofin#setpositionmode)
* [btse](/docs/exchanges/btse#setpositionmode)
* [bybit](/docs/exchanges/bybit#setpositionmode)
* [bydfi](/docs/exchanges/bydfi#setpositionmode)
* [gate](/docs/exchanges/gate#setpositionmode)
* [htx](/docs/exchanges/htx#setpositionmode)
* [kucoin](/docs/exchanges/kucoin#setpositionmode)
* [mexc](/docs/exchanges/mexc#setpositionmode)
* [okx](/docs/exchanges/okx#setpositionmode)
* [phemex](/docs/exchanges/phemex#setpositionmode)
* [poloniex](/docs/exchanges/poloniex#setpositionmode)
* [weex](/docs/exchanges/weex#setpositionmode)
* [woo](/docs/exchanges/woo#setpositionmode)
***
## setSandboxMode [#setsandboxmode]
enables or disables demo trading mode, if enabled will send PAPTRADING=1 in headers
**Kind**: instance
| Param |
| ------- |
| enabled |
##### Supported exchanges [#supported-exchanges-217]
* [bitget](/docs/exchanges/bitget#setsandboxmode)
***
## setUserAbstraction [#setuserabstraction]
set user abstraction mode
**Kind**: instance\
**Returns**: dictionary response from the exchange
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | ----------------------------------------------------------------------------- |
| abstraction | string | Yes | one of the strings \["disabled", "unifiedAccount", "portfolioMargin"], |
| params | object | No | |
| params.type | string | No | 'userSetAbstraction' or 'agentSetAbstraction' default is 'userSetAbstraction' |
##### Supported exchanges [#supported-exchanges-218]
* [hyperliquid](/docs/exchanges/hyperliquid#setuserabstraction)
***
## signIn [#signin]
sign in, must be called prior to using other authenticated methods
**Kind**: instance\
**Returns**: response from exchange
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-219]
* [aster](/docs/exchanges/aster#signin)
* [bullish](/docs/exchanges/bullish#signin)
* [grvt](/docs/exchanges/grvt#signin)
* [ndax](/docs/exchanges/ndax#signin)
***
## transfer [#transfer]
transfer currency internally between wallets on the same account
**Kind**: instance\
**Returns**: object - a [transfer structure](/docs/manual#transfer-structure)
| Param | Type | Required | Description |
| ----------------- | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| amount | float | Yes | amount to transfer |
| fromAccount | string | Yes | account to transfer from |
| toAccount | string | Yes | account to transfer to |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.transferId | string | No | UUID, which is unique across the platform |
##### Supported exchanges [#supported-exchanges-220]
* [apex](/docs/exchanges/apex#transfer)
* [aster](/docs/exchanges/aster#transfer)
* [bigone](/docs/exchanges/bigone#transfer)
* [binance](/docs/exchanges/binance#transfer)
* [bingx](/docs/exchanges/bingx#transfer)
* [bitfinex](/docs/exchanges/bitfinex#transfer)
* [bitget](/docs/exchanges/bitget#transfer)
* [bitrue](/docs/exchanges/bitrue#transfer)
* [bitstamp](/docs/exchanges/bitstamp#transfer)
* [bitvavo](/docs/exchanges/bitvavo#transfer)
* [blofin](/docs/exchanges/blofin#transfer)
* [bullish](/docs/exchanges/bullish#transfer)
* [bybit](/docs/exchanges/bybit#transfer)
* [budfi](/docs/exchanges/budfi#transfer)
* [cex](/docs/exchanges/cex#transfer)
* [coinbase](/docs/exchanges/coinbase#transfer)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#transfer)
* [coinex](/docs/exchanges/coinex#transfer)
* [deepcoin](/docs/exchanges/deepcoin#transfer)
* [deribit](/docs/exchanges/deribit#transfer)
* [digifinex](/docs/exchanges/digifinex#transfer)
* [dydx](/docs/exchanges/dydx#transfer)
* [extended](/docs/exchanges/extended#transfer)
* [gate](/docs/exchanges/gate#transfer)
* [grvt](/docs/exchanges/grvt#transfer)
* [hashkey](/docs/exchanges/hashkey#transfer)
* [hitbtc](/docs/exchanges/hitbtc#transfer)
* [htx](/docs/exchanges/htx#transfer)
* [hyperliquid](/docs/exchanges/hyperliquid#transfer)
* [kraken](/docs/exchanges/kraken#transfer)
* [krakenfutures](/docs/exchanges/krakenfutures#transfer)
* [kucoin](/docs/exchanges/kucoin#transfer)
* [kucoinfutures](/docs/exchanges/kucoinfutures#transfer)
* [latoken](/docs/exchanges/latoken#transfer)
* [lighter](/docs/exchanges/lighter#transfer)
* [mexc](/docs/exchanges/mexc#transfer)
* [mudrex](/docs/exchanges/mudrex#transfer)
* [okx](/docs/exchanges/okx#transfer)
* [pacifica](/docs/exchanges/pacifica#transfer)
* [paymium](/docs/exchanges/paymium#transfer)
* [phemex](/docs/exchanges/phemex#transfer)
* [poloniex](/docs/exchanges/poloniex#transfer)
* [toobit](/docs/exchanges/toobit#transfer)
* [whitebit](/docs/exchanges/whitebit#transfer)
* [woo](/docs/exchanges/woo#transfer)
* [xt](/docs/exchanges/xt#transfer)
***
## transferClassic [#transferclassic]
transfer currency internally between wallets on the same account with classic endpoints
**Kind**: instance\
**Returns**: object - a [transfer structure](/docs/manual#transfer-structure)
| Param | Type | Required | Description |
| ------------------- | ------------------- | -------- | ---------------------------------------------------------------- |
| code | string | Yes | unified currency code |
| amount | float | Yes | amount to transfer |
| fromAccount | string | Yes | account to transfer from |
| toAccount | string | Yes | account to transfer to |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.transferType | string | No | INTERNAL, PARENT\_TO\_SUB, SUB\_TO\_PARENT (default is INTERNAL) |
| params.fromUserId | string | No | required if transferType is SUB\_TO\_PARENT |
| params.toUserId | string | No | required if transferType is PARENT\_TO\_SUB |
##### Supported exchanges [#supported-exchanges-221]
* [kucoin](/docs/exchanges/kucoin#transferclassic)
***
## transferOut [#transferout]
transfer from spot wallet to futures wallet
**Kind**: instance\
**Returns**: a [transfer structure](/docs/manual#transfer-structure)
| Param | Type | Required | Description |
| ------ | ------------------ | -------- | ---------------------------- |
| code | str | Yes | Unified currency code |
| amount | float | Yes | Size of the transfer |
| params | dict | No | Exchange specific parameters |
##### Supported exchanges [#supported-exchanges-222]
* [kraken](/docs/exchanges/kraken#transferout)
* [krakenfutures](/docs/exchanges/krakenfutures#transferout)
***
## transferUta [#transferuta]
transfer currency internally between wallets on the same account with uta endpoint
**Kind**: instance\
**Returns**: object - a [transfer structure](/docs/manual#transfer-structure)
| Param | Type | Required | Description |
| ------------------- | ------------------- | -------- | ------------------------------------------------------------------------------ |
| code | string | Yes | unified currency code |
| amount | float | Yes | amount to transfer |
| fromAccount | string | Yes | account to transfer from |
| toAccount | string | Yes | account to transfer to |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.transferType | string | No | INTERNAL, PARENT\_TO\_SUB, SUB\_TO\_PARENT, SUB\_TO\_SUB (default is INTERNAL) |
| params.fromUserId | string | No | required if transferType is SUB\_TO\_PARENT or SUB\_TO\_SUB |
| params.toUserId | string | No | required if transferType is PARENT\_TO\_SUB or SUB\_TO\_SUB |
##### Supported exchanges [#supported-exchanges-223]
* [kucoin](/docs/exchanges/kucoin#transferuta)
***
## unWatchBalance [#unwatchbalance]
unWatches balance
**Kind**: instance\
**Returns**: object - status of the unwatch request
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-224]
* [hyperliquid](/docs/exchanges/hyperliquid#unwatchbalance)
***
## unWatchBidsAsks [#unwatchbidsasks]
unWatches best bid & ask for symbols
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-225]
* [aster](/docs/exchanges/aster#unwatchbidsasks)
* [backpack](/docs/exchanges/backpack#unwatchbidsasks)
* [binance](/docs/exchanges/binance#unwatchbidsasks)
* [mexc](/docs/exchanges/mexc#unwatchbidsasks)
* [nado](/docs/exchanges/nado#unwatchbidsasks)
* [weex](/docs/exchanges/weex#unwatchbidsasks)
* [woo](/docs/exchanges/woo#unwatchbidsasks)
***
## unWatchFundingRate [#unwatchfundingrate]
unWatches the current funding rate for a symbol
**Kind**: instance\
**Returns**: object - a [funding rate structure](/docs/manual#funding-rate-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-226]
* [kucoin](/docs/exchanges/kucoin#unwatchfundingrate)
* [mexc](/docs/exchanges/mexc#unwatchfundingrate)
***
## unWatchMarkPrice [#unwatchmarkprice]
unWatches a mark price for a specific market
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ---------------- | -------------------- | -------- | -------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.use1sFreq | boolean | No | *default is true* if set to true, the mark price will be updated every second, otherwise every 3 seconds |
##### Supported exchanges [#supported-exchanges-227]
* [aster](/docs/exchanges/aster#unwatchmarkprice)
* [binance](/docs/exchanges/binance#unwatchmarkprice)
* [kucoin](/docs/exchanges/kucoin#unwatchmarkprice)
* [lighter](/docs/exchanges/lighter#unwatchmarkprice)
***
## unWatchMarkPrices [#unwatchmarkprices]
watches the mark price for all markets
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ---------------- | --------------------------- | -------- | -------------------------------------------------------------------------------------------------------- |
| symbols | Array\ | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.use1sFreq | boolean | No | *default is true* if set to true, the mark price will be updated every second, otherwise every 3 seconds |
##### Supported exchanges [#supported-exchanges-228]
* [aster](/docs/exchanges/aster#unwatchmarkprices)
* [binance](/docs/exchanges/binance#unwatchmarkprices)
* [lighter](/docs/exchanges/lighter#unwatchmarkprices)
***
## unWatchMyTrades [#unwatchmytrades]
unWatches information on multiple trades made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| -------------------- | -------------------- | -------- | ------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market orders were made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.unifiedMargin | boolean | No | use unified margin account |
| params.executionFast | boolean | No | use fast execution |
##### Supported exchanges [#supported-exchanges-229]
* [bybit](/docs/exchanges/bybit#unwatchmytrades)
* [hyperliquid](/docs/exchanges/hyperliquid#unwatchmytrades)
* [lighter](/docs/exchanges/lighter#unwatchmytrades)
* [nado](/docs/exchanges/nado#unwatchmytrades)
* [pacifica](/docs/exchanges/pacifica#unwatchmytrades)
* [weex](/docs/exchanges/weex#unwatchmytrades)
***
## unWatchOHLCV [#unwatchohlcv]
unWatches historical candlestick data containing the open, high, low, and close price, and the volume of a market
**Kind**: instance\
**Returns**: Array\> - A list of candles ordered as timestamp, open, high, low, close, volume
| Param | Type | Required | Description |
| --------- | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market to fetch OHLCV data for |
| timeframe | string | Yes | the length of time each candle represents |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-230]
* [aster](/docs/exchanges/aster#unwatchohlcv)
* [backpack](/docs/exchanges/backpack#unwatchohlcv)
* [binance](/docs/exchanges/binance#unwatchohlcv)
* [bingx](/docs/exchanges/bingx#unwatchohlcv)
* [bitfinex](/docs/exchanges/bitfinex#unwatchohlcv)
* [bitget](/docs/exchanges/bitget#unwatchohlcv)
* [bitvavo](/docs/exchanges/bitvavo#unwatchohlcv)
* [bybit](/docs/exchanges/bybit#unwatchohlcv)
* [bydfi](/docs/exchanges/bydfi#unwatchohlcv)
* [cryptocom](/docs/exchanges/cryptocom#unwatchohlcv)
* [deepcoin](/docs/exchanges/deepcoin#unwatchohlcv)
* [dydx](/docs/exchanges/dydx#unwatchohlcv)
* [htx](/docs/exchanges/htx#unwatchohlcv)
* [hyperliquid](/docs/exchanges/hyperliquid#unwatchohlcv)
* [kucoin](/docs/exchanges/kucoin#unwatchohlcv)
* [mexc](/docs/exchanges/mexc#unwatchohlcv)
* [nado](/docs/exchanges/nado#unwatchohlcv)
* [okx](/docs/exchanges/okx#unwatchohlcv)
* [pacifica](/docs/exchanges/pacifica#unwatchohlcv)
* [weex](/docs/exchanges/weex#unwatchohlcv)
* [woo](/docs/exchanges/woo#unwatchohlcv)
***
## unWatchOHLCVForSymbols [#unwatchohlcvforsymbols]
unWatches historical candlestick data containing the open, high, low, and close price, and the volume of a market
**Kind**: instance\
**Returns**: Array\> - A list of candles ordered as timestamp, open, high, low, close, volume
| Param | Type | Required | Description |
| -------------------- | ----------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| symbolsAndTimeframes | Array\> | Yes | array of arrays containing unified symbols and timeframes to fetch OHLCV data for, example \[\['BTC/USDT', '1m'], \['LTC/USDT', '5m']] |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-231]
* [aster](/docs/exchanges/aster#unwatchohlcvforsymbols)
* [backpack](/docs/exchanges/backpack#unwatchohlcvforsymbols)
* [binance](/docs/exchanges/binance#unwatchohlcvforsymbols)
* [bitvavo](/docs/exchanges/bitvavo#unwatchohlcvforsymbols)
* [bybit](/docs/exchanges/bybit#unwatchohlcvforsymbols)
* [bydfi](/docs/exchanges/bydfi#unwatchohlcvforsymbols)
* [nado](/docs/exchanges/nado#unwatchohlcvforsymbols)
* [okx](/docs/exchanges/okx#unwatchohlcvforsymbols)
* [weex](/docs/exchanges/weex#unwatchohlcvforsymbols)
***
## unWatchOrderBook [#unwatchorderbook]
unsubscribe from the orderbook channel
**Kind**: instance\
**Returns**: object - A dictionary of [order book structures](/docs/manual#order-book-structure)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | symbol of the market to unwatch the trades for |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.limit | int | No | orderbook limit, default is undefined |
##### Supported exchanges [#supported-exchanges-232]
* [aster](/docs/exchanges/aster#unwatchorderbook)
* [backpack](/docs/exchanges/backpack#unwatchorderbook)
* [binance](/docs/exchanges/binance#unwatchorderbook)
* [bingx](/docs/exchanges/bingx#unwatchorderbook)
* [bitget](/docs/exchanges/bitget#unwatchorderbook)
* [bitvavo](/docs/exchanges/bitvavo#unwatchorderbook)
* [bybit](/docs/exchanges/bybit#unwatchorderbook)
* [bydfi](/docs/exchanges/bydfi#unwatchorderbook)
* [cryptocom](/docs/exchanges/cryptocom#unwatchorderbook)
* [deepcoin](/docs/exchanges/deepcoin#unwatchorderbook)
* [derive](/docs/exchanges/derive#unwatchorderbook)
* [dydx](/docs/exchanges/dydx#unwatchorderbook)
* [gate](/docs/exchanges/gate#unwatchorderbook)
* [htx](/docs/exchanges/htx#unwatchorderbook)
* [hyperliquid](/docs/exchanges/hyperliquid#unwatchorderbook)
* [kucoin](/docs/exchanges/kucoin#unwatchorderbook)
* [lighter](/docs/exchanges/lighter#unwatchorderbook)
* [mexc](/docs/exchanges/mexc#unwatchorderbook)
* [nado](/docs/exchanges/nado#unwatchorderbook)
* [okx](/docs/exchanges/okx#unwatchorderbook)
* [pacifica](/docs/exchanges/pacifica#unwatchorderbook)
* [weex](/docs/exchanges/weex#unwatchorderbook)
* [woo](/docs/exchanges/woo#unwatchorderbook)
***
## unWatchOrderBookForSymbols [#unwatchorderbookforsymbols]
unsubscribe from the orderbook channel
**Kind**: instance\
**Returns**: object - A dictionary of [order book structures](/docs/manual#order-book-structure)
| Param | Type | Required | Description |
| ------------ | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | Yes | unified symbol of the market to unwatch the trades for |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.limit | int | No | orderbook limit, default is undefined |
##### Supported exchanges [#supported-exchanges-233]
* [aster](/docs/exchanges/aster#unwatchorderbookforsymbols)
* [backpack](/docs/exchanges/backpack#unwatchorderbookforsymbols)
* [binance](/docs/exchanges/binance#unwatchorderbookforsymbols)
* [bitvavo](/docs/exchanges/bitvavo#unwatchorderbookforsymbols)
* [bybit](/docs/exchanges/bybit#unwatchorderbookforsymbols)
* [bydfi](/docs/exchanges/bydfi#unwatchorderbookforsymbols)
* [cryptocom](/docs/exchanges/cryptocom#unwatchorderbookforsymbols)
* [kucoin](/docs/exchanges/kucoin#unwatchorderbookforsymbols)
* [nado](/docs/exchanges/nado#unwatchorderbookforsymbols)
* [okx](/docs/exchanges/okx#unwatchorderbookforsymbols)
* [weex](/docs/exchanges/weex#unwatchorderbookforsymbols)
***
## unWatchOrders [#unwatchorders]
unWatches information on multiple orders made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------- |
| symbol | string | No | unified market symbol of the market orders were made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-234]
* [backpack](/docs/exchanges/backpack#unwatchorders)
* [bybit](/docs/exchanges/bybit#unwatchorders)
* [hyperliquid](/docs/exchanges/hyperliquid#unwatchorders)
* [lighter](/docs/exchanges/lighter#unwatchorders)
* [nado](/docs/exchanges/nado#unwatchorders)
* [pacifica](/docs/exchanges/pacifica#unwatchorders)
* [weex](/docs/exchanges/weex#unwatchorders)
***
## unWatchPositions [#unwatchpositions]
unWatches from the stream channel
**Kind**: instance\
**Returns**: Array\ - a list of [position structure](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | No | list of unified market symbols to watch positions for |
| params | object | Yes | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-235]
* [backpack](/docs/exchanges/backpack#unwatchpositions)
* [bybit](/docs/exchanges/bybit#unwatchpositions)
* [hyperliquid](/docs/exchanges/hyperliquid#unwatchpositions)
* [nado](/docs/exchanges/nado#unwatchpositions)
* [weex](/docs/exchanges/weex#unwatchpositions)
***
## unWatchTicker [#unwatchticker]
unWatches a price ticker
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-236]
* [aster](/docs/exchanges/aster#unwatchticker)
* [backpack](/docs/exchanges/backpack#unwatchticker)
* [binance](/docs/exchanges/binance#unwatchticker)
* [bingx](/docs/exchanges/bingx#unwatchticker)
* [bitfinex](/docs/exchanges/bitfinex#unwatchticker)
* [bitget](/docs/exchanges/bitget#unwatchticker)
* [bybit](/docs/exchanges/bybit#unwatchticker)
* [bydfi](/docs/exchanges/bydfi#unwatchticker)
* [cryptocom](/docs/exchanges/cryptocom#unwatchticker)
* [deepcoin](/docs/exchanges/deepcoin#unwatchticker)
* [htx](/docs/exchanges/htx#unwatchticker)
* [hyperliquid](/docs/exchanges/hyperliquid#unwatchticker)
* [kucoin](/docs/exchanges/kucoin#unwatchticker)
* [lighter](/docs/exchanges/lighter#unwatchticker)
* [mexc](/docs/exchanges/mexc#unwatchticker)
* [nado](/docs/exchanges/nado#unwatchticker)
* [okx](/docs/exchanges/okx#unwatchticker)
* [weex](/docs/exchanges/weex#unwatchticker)
* [woo](/docs/exchanges/woo#unwatchticker)
***
## unWatchTickers [#unwatchtickers]
unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-237]
* [aster](/docs/exchanges/aster#unwatchtickers)
* [backpack](/docs/exchanges/backpack#unwatchtickers)
* [binance](/docs/exchanges/binance#unwatchtickers)
* [bybit](/docs/exchanges/bybit#unwatchtickers)
* [bydfi](/docs/exchanges/bydfi#unwatchtickers)
* [cryptocom](/docs/exchanges/cryptocom#unwatchtickers)
* [hyperliquid](/docs/exchanges/hyperliquid#unwatchtickers)
* [lighter](/docs/exchanges/lighter#unwatchtickers)
* [mexc](/docs/exchanges/mexc#unwatchtickers)
* [nado](/docs/exchanges/nado#unwatchtickers)
* [okx](/docs/exchanges/okx#unwatchtickers)
* [pacifica](/docs/exchanges/pacifica#unwatchtickers)
* [weex](/docs/exchanges/weex#unwatchtickers)
* [woo](/docs/exchanges/woo#unwatchtickers)
***
## unWatchTrades [#unwatchtrades]
unsubscribe from the trades channel
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#trade-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market trades were made in |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-238]
* [aster](/docs/exchanges/aster#unwatchtrades)
* [backpack](/docs/exchanges/backpack#unwatchtrades)
* [binance](/docs/exchanges/binance#unwatchtrades)
* [bingx](/docs/exchanges/bingx#unwatchtrades)
* [bitfinex](/docs/exchanges/bitfinex#unwatchtrades)
* [bitget](/docs/exchanges/bitget#unwatchtrades)
* [bitvavo](/docs/exchanges/bitvavo#unwatchtrades)
* [bybit](/docs/exchanges/bybit#unwatchtrades)
* [cryptocom](/docs/exchanges/cryptocom#unwatchtrades)
* [deepcoin](/docs/exchanges/deepcoin#unwatchtrades)
* [derive](/docs/exchanges/derive#unwatchtrades)
* [dydx](/docs/exchanges/dydx#unwatchtrades)
* [gate](/docs/exchanges/gate#unwatchtrades)
* [htx](/docs/exchanges/htx#unwatchtrades)
* [hyperliquid](/docs/exchanges/hyperliquid#unwatchtrades)
* [kucoin](/docs/exchanges/kucoin#unwatchtrades)
* [lighter](/docs/exchanges/lighter#unwatchtrades)
* [mexc](/docs/exchanges/mexc#unwatchtrades)
* [nado](/docs/exchanges/nado#unwatchtrades)
* [okx](/docs/exchanges/okx#unwatchtrades)
* [pacifica](/docs/exchanges/pacifica#unwatchtrades)
* [weex](/docs/exchanges/weex#unwatchtrades)
* [woo](/docs/exchanges/woo#unwatchtrades)
***
## unWatchTradesForSymbols [#unwatchtradesforsymbols]
unsubscribe from the trades channel
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#public-trades)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | Yes | unified symbol of the market to fetch trades for |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-239]
* [aster](/docs/exchanges/aster#unwatchtradesforsymbols)
* [backpack](/docs/exchanges/backpack#unwatchtradesforsymbols)
* [binance](/docs/exchanges/binance#unwatchtradesforsymbols)
* [bitvavo](/docs/exchanges/bitvavo#unwatchtradesforsymbols)
* [bybit](/docs/exchanges/bybit#unwatchtradesforsymbols)
* [cryptocom](/docs/exchanges/cryptocom#unwatchtradesforsymbols)
* [gate](/docs/exchanges/gate#unwatchtradesforsymbols)
* [kucoin](/docs/exchanges/kucoin#unwatchtradesforsymbols)
* [nado](/docs/exchanges/nado#unwatchtradesforsymbols)
* [okx](/docs/exchanges/okx#unwatchtradesforsymbols)
* [weex](/docs/exchanges/weex#unwatchtradesforsymbols)
***
## upgradeUnifiedTradeAccount [#upgradeunifiedtradeaccount]
upgrades the account to unified trade account *warning* this is irreversible
**Kind**: instance\
**Returns**: any - nothing
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-240]
* [bybit](/docs/exchanges/bybit#upgradeunifiedtradeaccount)
***
## verifyGiftCode [#verifygiftcode]
verify gift code
**Kind**: instance\
**Returns**: object - response from the exchange
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | reference number id |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-241]
* [binance](/docs/exchanges/binance#verifygiftcode)
***
## watchBalance [#watchbalance]
query for balance and get the amount of funds available for trading or funds locked in orders
**Kind**: instance\
**Returns**: object - a [balance structure](/docs/manual#balance-structure)
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.type | string | No | 'spot' or 'swap', default is 'spot' |
##### Supported exchanges [#supported-exchanges-242]
* [aster](/docs/exchanges/aster#watchbalance)
* [binance](/docs/exchanges/binance#watchbalance)
* [bingx](/docs/exchanges/bingx#watchbalance)
* [bitfinex](/docs/exchanges/bitfinex#watchbalance)
* [bitget](/docs/exchanges/bitget#watchbalance)
* [bithumb](/docs/exchanges/bithumb#watchbalance)
* [bitmex](/docs/exchanges/bitmex#watchbalance)
* [bitopro](/docs/exchanges/bitopro#watchbalance)
* [bitrue](/docs/exchanges/bitrue#watchbalance)
* [blockchaincom](/docs/exchanges/blockchaincom#watchbalance)
* [blofin](/docs/exchanges/blofin#watchbalance)
* [bullish](/docs/exchanges/bullish#watchbalance)
* [bybit](/docs/exchanges/bybit#watchbalance)
* [bydfi](/docs/exchanges/bydfi#watchbalance)
* [cex](/docs/exchanges/cex#watchbalance)
* [coinex](/docs/exchanges/coinex#watchbalance)
* [cryptocom](/docs/exchanges/cryptocom#watchbalance)
* [deribit](/docs/exchanges/deribit#watchbalance)
* [extended](/docs/exchanges/extended#watchbalance)
* [gate](/docs/exchanges/gate#watchbalance)
* [hashkey](/docs/exchanges/hashkey#watchbalance)
* [hollaex](/docs/exchanges/hollaex#watchbalance)
* [htx](/docs/exchanges/htx#watchbalance)
* [hyperliquid](/docs/exchanges/hyperliquid#watchbalance)
* [kucoin](/docs/exchanges/kucoin#watchbalance)
* [lbank](/docs/exchanges/lbank#watchbalance)
* [lighter](/docs/exchanges/lighter#watchbalance)
* [mexc](/docs/exchanges/mexc#watchbalance)
* [modetrade](/docs/exchanges/modetrade#watchbalance)
* [okx](/docs/exchanges/okx#watchbalance)
* [onetrading](/docs/exchanges/onetrading#watchbalance)
* [phemex](/docs/exchanges/phemex#watchbalance)
* [toobit](/docs/exchanges/toobit#watchbalance)
* [upbit](/docs/exchanges/upbit#watchbalance)
* [weex](/docs/exchanges/weex#watchbalance)
* [whitebit](/docs/exchanges/whitebit#watchbalance)
* [woo](/docs/exchanges/woo#watchbalance)
* [woofipro](/docs/exchanges/woofipro#watchbalance)
***
## watchBidsAsks [#watchbidsasks]
watches best bid & ask for symbols
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-243]
* [aster](/docs/exchanges/aster#watchbidsasks)
* [backpack](/docs/exchanges/backpack#watchbidsasks)
* [binance](/docs/exchanges/binance#watchbidsasks)
* [bitget](/docs/exchanges/bitget#watchbidsasks)
* [bitvavo](/docs/exchanges/bitvavo#watchbidsasks)
* [blofin](/docs/exchanges/blofin#watchbidsasks)
* [bybit](/docs/exchanges/bybit#watchbidsasks)
* [coinex](/docs/exchanges/coinex#watchbidsasks)
* [cryptocom](/docs/exchanges/cryptocom#watchbidsasks)
* [deribit](/docs/exchanges/deribit#watchbidsasks)
* [gate](/docs/exchanges/gate#watchbidsasks)
* [gemini](/docs/exchanges/gemini#watchbidsasks)
* [kucoin](/docs/exchanges/kucoin#watchbidsasks)
* [mexc](/docs/exchanges/mexc#watchbidsasks)
* [modetrade](/docs/exchanges/modetrade#watchbidsasks)
* [nado](/docs/exchanges/nado#watchbidsasks)
* [okx](/docs/exchanges/okx#watchbidsasks)
* [weex](/docs/exchanges/weex#watchbidsasks)
* [woo](/docs/exchanges/woo#watchbidsasks)
* [woofipro](/docs/exchanges/woofipro#watchbidsasks)
***
## watchFundingRate [#watchfundingrate]
watch the current funding rate
**Kind**: instance\
**Returns**: object - a [funding rate structure](/docs/manual#funding-rate-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified market symbol |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-244]
* [blofin](/docs/exchanges/blofin#watchfundingrate)
* [extended](/docs/exchanges/extended#watchfundingrate)
* [kucoin](/docs/exchanges/kucoin#watchfundingrate)
* [mexc](/docs/exchanges/mexc#watchfundingrate)
* [okx](/docs/exchanges/okx#watchfundingrate)
* [woo](/docs/exchanges/woo#watchfundingrate)
***
## watchFundingRates [#watchfundingrates]
watch the funding rate for multiple markets
**Kind**: instance\
**Returns**: object - a dictionary of [funding rates structures](/docs/manual#funding-rate-structure), indexed by market symbols
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | Yes | a list of unified market symbols |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-245]
* [okx](/docs/exchanges/okx#watchfundingrates)
***
## watchLiquidations [#watchliquidations]
watch the public liquidations of a trading pair
**Kind**: instance\
**Returns**: object - an array of [liquidation structures](/docs/manual#liquidation-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | -------------------------------------------------------- |
| symbol | string | Yes | unified CCXT market symbol |
| since | int | No | the earliest time in ms to fetch liquidations for |
| limit | int | No | the maximum number of liquidation structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-246]
* [binance](/docs/exchanges/binance#watchliquidations)
* [bitmex](/docs/exchanges/bitmex#watchliquidations)
* [bybit](/docs/exchanges/bybit#watchliquidations)
* [lighter](/docs/exchanges/lighter#watchliquidations)
***
## watchLiquidationsForSymbols [#watchliquidationsforsymbols]
watch the public liquidations of a trading pair
**Kind**: instance\
**Returns**: object - an array of [liquidation structures](/docs/manual#liquidation-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | -------------------------------------------------------- |
| symbols | Array\ | Yes | list of unified market symbols |
| since | int | No | the earliest time in ms to fetch liquidations for |
| limit | int | No | the maximum number of liquidation structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-247]
* [binance](/docs/exchanges/binance#watchliquidationsforsymbols)
* [bitmex](/docs/exchanges/bitmex#watchliquidationsforsymbols)
* [okx](/docs/exchanges/okx#watchliquidationsforsymbols)
***
## watchMarkPrice [#watchmarkprice]
watches a mark price for a specific market
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ---------------- | -------------------- | -------- | -------------------------------------------------------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.use1sFreq | boolean | No | *default is true* if set to true, the mark price will be updated every second, otherwise every 3 seconds |
##### Supported exchanges [#supported-exchanges-248]
* [aster](/docs/exchanges/aster#watchmarkprice)
* [binance](/docs/exchanges/binance#watchmarkprice)
* [extended](/docs/exchanges/extended#watchmarkprice)
* [kucoin](/docs/exchanges/kucoin#watchmarkprice)
* [lighter](/docs/exchanges/lighter#watchmarkprice)
* [okx](/docs/exchanges/okx#watchmarkprice)
***
## watchMarkPrices [#watchmarkprices]
watches the mark price for all markets
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ---------------- | --------------------------- | -------- | -------------------------------------------------------------------------------------------------------- |
| symbols | Array\ | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.use1sFreq | boolean | No | *default is true* if set to true, the mark price will be updated every second, otherwise every 3 seconds |
##### Supported exchanges [#supported-exchanges-249]
* [aster](/docs/exchanges/aster#watchmarkprices)
* [binance](/docs/exchanges/binance#watchmarkprices)
* [lighter](/docs/exchanges/lighter#watchmarkprices)
* [okx](/docs/exchanges/okx#watchmarkprices)
***
## watchMyLiquidations [#watchmyliquidations]
watch the private liquidations of a trading pair
**Kind**: instance\
**Returns**: object - an array of [liquidation structures](/docs/manual#liquidation-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | -------------------------------------------------------- |
| symbol | string | Yes | unified CCXT market symbol |
| since | int | No | the earliest time in ms to fetch liquidations for |
| limit | int | No | the maximum number of liquidation structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-250]
* [binance](/docs/exchanges/binance#watchmyliquidations)
* [gate](/docs/exchanges/gate#watchmyliquidations)
***
## watchMyLiquidationsForSymbols [#watchmyliquidationsforsymbols]
watch the private liquidations of a trading pair
**Kind**: instance\
**Returns**: object - an array of [liquidation structures](/docs/manual#liquidation-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | -------------------------------------------------------- |
| symbols | Array\ | Yes | list of unified market symbols |
| since | int | No | the earliest time in ms to fetch liquidations for |
| limit | int | No | the maximum number of liquidation structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-251]
* [binance](/docs/exchanges/binance#watchmyliquidationsforsymbols)
* [gate](/docs/exchanges/gate#watchmyliquidationsforsymbols)
* [okx](/docs/exchanges/okx#watchmyliquidationsforsymbols)
***
## watchMyTrades [#watchmytrades]
watches information on multiple trades made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#trade-structure)
| Param | Type | Required | Description |
| -------------------- | -------------------- | -------- | ------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market trades were made in |
| since | int | No | the earliest time in ms to fetch trades for |
| limit | int | No | the maximum number of trade structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.unifiedMargin | boolean | No | use unified margin account |
##### Supported exchanges [#supported-exchanges-252]
* [alpaca](/docs/exchanges/alpaca#watchmytrades)
* [apex](/docs/exchanges/apex#watchmytrades)
* [aster](/docs/exchanges/aster#watchmytrades)
* [binance](/docs/exchanges/binance#watchmytrades)
* [bingx](/docs/exchanges/bingx#watchmytrades)
* [bitfinex](/docs/exchanges/bitfinex#watchmytrades)
* [bitget](/docs/exchanges/bitget#watchmytrades)
* [bitmex](/docs/exchanges/bitmex#watchmytrades)
* [bitopro](/docs/exchanges/bitopro#watchmytrades)
* [bitvavo](/docs/exchanges/bitvavo#watchmytrades)
* [bullish](/docs/exchanges/bullish#watchmytrades)
* [bybit](/docs/exchanges/bybit#watchmytrades)
* [cex](/docs/exchanges/cex#watchmytrades)
* [coinex](/docs/exchanges/coinex#watchmytrades)
* [cryptocom](/docs/exchanges/cryptocom#watchmytrades)
* [deepcoin](/docs/exchanges/deepcoin#watchmytrades)
* [deribit](/docs/exchanges/deribit#watchmytrades)
* [derive](/docs/exchanges/derive#watchmytrades)
* [extended](/docs/exchanges/extended#watchmytrades)
* [gate](/docs/exchanges/gate#watchmytrades)
* [grvt](/docs/exchanges/grvt#watchmytrades)
* [hashkey](/docs/exchanges/hashkey#watchmytrades)
* [hollaex](/docs/exchanges/hollaex#watchmytrades)
* [htx](/docs/exchanges/htx#watchmytrades)
* [hyperliquid](/docs/exchanges/hyperliquid#watchmytrades)
* [kucoin](/docs/exchanges/kucoin#watchmytrades)
* [lighter](/docs/exchanges/lighter#watchmytrades)
* [mexc](/docs/exchanges/mexc#watchmytrades)
* [modetrade](/docs/exchanges/modetrade#watchmytrades)
* [nado](/docs/exchanges/nado#watchmytrades)
* [okx](/docs/exchanges/okx#watchmytrades)
* [onetrading](/docs/exchanges/onetrading#watchmytrades)
* [pacifica](/docs/exchanges/pacifica#watchmytrades)
* [phemex](/docs/exchanges/phemex#watchmytrades)
* [toobit](/docs/exchanges/toobit#watchmytrades)
* [upbit](/docs/exchanges/upbit#watchmytrades)
* [weex](/docs/exchanges/weex#watchmytrades)
* [whitebit](/docs/exchanges/whitebit#watchmytrades)
* [woo](/docs/exchanges/woo#watchmytrades)
* [woofipro](/docs/exchanges/woofipro#watchmytrades)
***
## watchOHLCV [#watchohlcv]
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
**Kind**: instance\
**Returns**: Array\> - A list of candles ordered as timestamp, open, high, low, close, volume
| Param | Type | Required | Description |
| --------- | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market to fetch OHLCV data for |
| timeframe | string | Yes | the length of time each candle represents |
| since | int | No | timestamp in ms of the earliest candle to fetch |
| limit | int | No | the maximum amount of candles to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-253]
* [alpaca](/docs/exchanges/alpaca#watchohlcv)
* [apex](/docs/exchanges/apex#watchohlcv)
* [aster](/docs/exchanges/aster#watchohlcv)
* [backpack](/docs/exchanges/backpack#watchohlcv)
* [binance](/docs/exchanges/binance#watchohlcv)
* [bingx](/docs/exchanges/bingx#watchohlcv)
* [bitfinex](/docs/exchanges/bitfinex#watchohlcv)
* [bitget](/docs/exchanges/bitget#watchohlcv)
* [bitmex](/docs/exchanges/bitmex#watchohlcv)
* [bitrue](/docs/exchanges/bitrue#watchohlcv)
* [bittrade](/docs/exchanges/bittrade#watchohlcv)
* [bitvavo](/docs/exchanges/bitvavo#watchohlcv)
* [blockchaincom](/docs/exchanges/blockchaincom#watchohlcv)
* [blofin](/docs/exchanges/blofin#watchohlcv)
* [bybit](/docs/exchanges/bybit#watchohlcv)
* [bydfi](/docs/exchanges/bydfi#watchohlcv)
* [cex](/docs/exchanges/cex#watchohlcv)
* [cryptocom](/docs/exchanges/cryptocom#watchohlcv)
* [deepcoin](/docs/exchanges/deepcoin#watchohlcv)
* [deribit](/docs/exchanges/deribit#watchohlcv)
* [dydx](/docs/exchanges/dydx#watchohlcv)
* [extended](/docs/exchanges/extended#watchohlcv)
* [gate](/docs/exchanges/gate#watchohlcv)
* [gemini](/docs/exchanges/gemini#watchohlcv)
* [grvt](/docs/exchanges/grvt#watchohlcv)
* [hashkey](/docs/exchanges/hashkey#watchohlcv)
* [htx](/docs/exchanges/htx#watchohlcv)
* [hyperliquid](/docs/exchanges/hyperliquid#watchohlcv)
* [kucoin](/docs/exchanges/kucoin#watchohlcv)
* [lbank](/docs/exchanges/lbank#watchohlcv)
* [mexc](/docs/exchanges/mexc#watchohlcv)
* [modetrade](/docs/exchanges/modetrade#watchohlcv)
* [nado](/docs/exchanges/nado#watchohlcv)
* [ndax](/docs/exchanges/ndax#watchohlcv)
* [okx](/docs/exchanges/okx#watchohlcv)
* [onetrading](/docs/exchanges/onetrading#watchohlcv)
* [pacifica](/docs/exchanges/pacifica#watchohlcv)
* [phemex](/docs/exchanges/phemex#watchohlcv)
* [toobit](/docs/exchanges/toobit#watchohlcv)
* [upbit](/docs/exchanges/upbit#watchohlcv)
* [weex](/docs/exchanges/weex#watchohlcv)
* [whitebit](/docs/exchanges/whitebit#watchohlcv)
* [woo](/docs/exchanges/woo#watchohlcv)
* [woofipro](/docs/exchanges/woofipro#watchohlcv)
***
## watchOHLCVForSymbols [#watchohlcvforsymbols]
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
**Kind**: instance\
**Returns**: object - A list of candles ordered as timestamp, open, high, low, close, volume
| Param | Type | Required | Description |
| -------------------- | ----------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| symbolsAndTimeframes | Array\> | Yes | array of arrays containing unified symbols and timeframes to fetch OHLCV data for, example \[\['BTC/USDT', '1m'], \['LTC/USDT', '5m']] |
| since | int | No | timestamp in ms of the earliest candle to fetch |
| limit | int | No | the maximum amount of candles to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-254]
* [apex](/docs/exchanges/apex#watchohlcvforsymbols)
* [aster](/docs/exchanges/aster#watchohlcvforsymbols)
* [backpack](/docs/exchanges/backpack#watchohlcvforsymbols)
* [binance](/docs/exchanges/binance#watchohlcvforsymbols)
* [bitvavo](/docs/exchanges/bitvavo#watchohlcvforsymbols)
* [blofin](/docs/exchanges/blofin#watchohlcvforsymbols)
* [bybit](/docs/exchanges/bybit#watchohlcvforsymbols)
* [bydfi](/docs/exchanges/bydfi#watchohlcvforsymbols)
* [deribit](/docs/exchanges/deribit#watchohlcvforsymbols)
* [grvt](/docs/exchanges/grvt#watchohlcvforsymbols)
* [nado](/docs/exchanges/nado#watchohlcvforsymbols)
* [okx](/docs/exchanges/okx#watchohlcvforsymbols)
* [toobit](/docs/exchanges/toobit#watchohlcvforsymbols)
* [weex](/docs/exchanges/weex#watchohlcvforsymbols)
***
## watchOrderBook [#watchorderbook]
watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
**Kind**: instance\
**Returns**: object - an [order book structure](/docs/manual#order-book-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | -------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to fetch the order book for |
| limit | int | No | the maximum amount of order book entries to return. |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-255]
* [alpaca](/docs/exchanges/alpaca#watchorderbook)
* [apex](/docs/exchanges/apex#watchorderbook)
* [aster](/docs/exchanges/aster#watchorderbook)
* [backpack](/docs/exchanges/backpack#watchorderbook)
* [binance](/docs/exchanges/binance#watchorderbook)
* [bingx](/docs/exchanges/bingx#watchorderbook)
* [bitfinex](/docs/exchanges/bitfinex#watchorderbook)
* [bitget](/docs/exchanges/bitget#watchorderbook)
* [bithumb](/docs/exchanges/bithumb#watchorderbook)
* [bitmex](/docs/exchanges/bitmex#watchorderbook)
* [bitopro](/docs/exchanges/bitopro#watchorderbook)
* [bitstamp](/docs/exchanges/bitstamp#watchorderbook)
* [bittrade](/docs/exchanges/bittrade#watchorderbook)
* [bitvavo](/docs/exchanges/bitvavo#watchorderbook)
* [blockchaincom](/docs/exchanges/blockchaincom#watchorderbook)
* [blofin](/docs/exchanges/blofin#watchorderbook)
* [bullish](/docs/exchanges/bullish#watchorderbook)
* [bybit](/docs/exchanges/bybit#watchorderbook)
* [bydfi](/docs/exchanges/bydfi#watchorderbook)
* [cex](/docs/exchanges/cex#watchorderbook)
* [coincheck](/docs/exchanges/coincheck#watchorderbook)
* [coinex](/docs/exchanges/coinex#watchorderbook)
* [coinone](/docs/exchanges/coinone#watchorderbook)
* [cryptocom](/docs/exchanges/cryptocom#watchorderbook)
* [deepcoin](/docs/exchanges/deepcoin#watchorderbook)
* [deribit](/docs/exchanges/deribit#watchorderbook)
* [derive](/docs/exchanges/derive#watchorderbook)
* [dydx](/docs/exchanges/dydx#watchorderbook)
* [extended](/docs/exchanges/extended#watchorderbook)
* [gate](/docs/exchanges/gate#watchorderbook)
* [gemini](/docs/exchanges/gemini#watchorderbook)
* [grvt](/docs/exchanges/grvt#watchorderbook)
* [hashkey](/docs/exchanges/hashkey#watchorderbook)
* [hollaex](/docs/exchanges/hollaex#watchorderbook)
* [htx](/docs/exchanges/htx#watchorderbook)
* [hyperliquid](/docs/exchanges/hyperliquid#watchorderbook)
* [independentreserve](/docs/exchanges/independentreserve#watchorderbook)
* [kucoin](/docs/exchanges/kucoin#watchorderbook)
* [lbank](/docs/exchanges/lbank#watchorderbook)
* [lighter](/docs/exchanges/lighter#watchorderbook)
* [luno](/docs/exchanges/luno#watchorderbook)
* [mexc](/docs/exchanges/mexc#watchorderbook)
* [modetrade](/docs/exchanges/modetrade#watchorderbook)
* [nado](/docs/exchanges/nado#watchorderbook)
* [ndax](/docs/exchanges/ndax#watchorderbook)
* [okx](/docs/exchanges/okx#watchorderbook)
* [onetrading](/docs/exchanges/onetrading#watchorderbook)
* [pacifica](/docs/exchanges/pacifica#watchorderbook)
* [phemex](/docs/exchanges/phemex#watchorderbook)
* [toobit](/docs/exchanges/toobit#watchorderbook)
* [upbit](/docs/exchanges/upbit#watchorderbook)
* [weex](/docs/exchanges/weex#watchorderbook)
* [whitebit](/docs/exchanges/whitebit#watchorderbook)
* [woo](/docs/exchanges/woo#watchorderbook)
* [woofipro](/docs/exchanges/woofipro#watchorderbook)
***
## watchOrderBookForSymbols [#watchorderbookforsymbols]
watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
**Kind**: instance\
**Returns**: object - an [order book structure](/docs/manual#order-book-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | Yes | unified array of symbols |
| limit | int | No | the maximum amount of order book entries to return. |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-256]
* [apex](/docs/exchanges/apex#watchorderbookforsymbols)
* [aster](/docs/exchanges/aster#watchorderbookforsymbols)
* [backpack](/docs/exchanges/backpack#watchorderbookforsymbols)
* [binance](/docs/exchanges/binance#watchorderbookforsymbols)
* [bitget](/docs/exchanges/bitget#watchorderbookforsymbols)
* [bitmex](/docs/exchanges/bitmex#watchorderbookforsymbols)
* [bitvavo](/docs/exchanges/bitvavo#watchorderbookforsymbols)
* [blofin](/docs/exchanges/blofin#watchorderbookforsymbols)
* [bybit](/docs/exchanges/bybit#watchorderbookforsymbols)
* [bydfi](/docs/exchanges/bydfi#watchorderbookforsymbols)
* [coinex](/docs/exchanges/coinex#watchorderbookforsymbols)
* [cryptocom](/docs/exchanges/cryptocom#watchorderbookforsymbols)
* [deribit](/docs/exchanges/deribit#watchorderbookforsymbols)
* [gemini](/docs/exchanges/gemini#watchorderbookforsymbols)
* [grvt](/docs/exchanges/grvt#watchorderbookforsymbols)
* [kucoin](/docs/exchanges/kucoin#watchorderbookforsymbols)
* [nado](/docs/exchanges/nado#watchorderbookforsymbols)
* [okx](/docs/exchanges/okx#watchorderbookforsymbols)
* [toobit](/docs/exchanges/toobit#watchorderbookforsymbols)
* [weex](/docs/exchanges/weex#watchorderbookforsymbols)
***
## watchOrders [#watchorders]
watches information on multiple orders made by the user
**Kind**: instance\
**Returns**: Array\ - a list of [order structures](/docs/manual#order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market orders were made in |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-257]
* [alpaca](/docs/exchanges/alpaca#watchorders)
* [apex](/docs/exchanges/apex#watchorders)
* [aster](/docs/exchanges/aster#watchorders)
* [backpack](/docs/exchanges/backpack#watchorders)
* [binance](/docs/exchanges/binance#watchorders)
* [bingx](/docs/exchanges/bingx#watchorders)
* [bitfinex](/docs/exchanges/bitfinex#watchorders)
* [bitget](/docs/exchanges/bitget#watchorders)
* [bithumb](/docs/exchanges/bithumb#watchorders)
* [bitmex](/docs/exchanges/bitmex#watchorders)
* [bitrue](/docs/exchanges/bitrue#watchorders)
* [bitstamp](/docs/exchanges/bitstamp#watchorders)
* [bitvavo](/docs/exchanges/bitvavo#watchorders)
* [biofin](/docs/exchanges/biofin#watchorders)
* [bullish](/docs/exchanges/bullish#watchorders)
* [bybit](/docs/exchanges/bybit#watchorders)
* [bydfi](/docs/exchanges/bydfi#watchorders)
* [cex](/docs/exchanges/cex#watchorders)
* [coinex](/docs/exchanges/coinex#watchorders)
* [cryptocom](/docs/exchanges/cryptocom#watchorders)
* [deepcoin](/docs/exchanges/deepcoin#watchorders)
* [deribit](/docs/exchanges/deribit#watchorders)
* [derive](/docs/exchanges/derive#watchorders)
* [extended](/docs/exchanges/extended#watchorders)
* [gate](/docs/exchanges/gate#watchorders)
* [grvt](/docs/exchanges/grvt#watchorders)
* [hashkey](/docs/exchanges/hashkey#watchorders)
* [hollaex](/docs/exchanges/hollaex#watchorders)
* [htx](/docs/exchanges/htx#watchorders)
* [hyperliquid](/docs/exchanges/hyperliquid#watchorders)
* [kucoin](/docs/exchanges/kucoin#watchorders)
* [lbank](/docs/exchanges/lbank#watchorders)
* [mexc](/docs/exchanges/mexc#watchorders)
* [modetrade](/docs/exchanges/modetrade#watchorders)
* [nado](/docs/exchanges/nado#watchorders)
* [okx](/docs/exchanges/okx#watchorders)
* [onetrading](/docs/exchanges/onetrading#watchorders)
* [pacifica](/docs/exchanges/pacifica#watchorders)
* [phemex](/docs/exchanges/phemex#watchorders)
* [toobit](/docs/exchanges/toobit#watchorders)
* [upbit](/docs/exchanges/upbit#watchorders)
* [weex](/docs/exchanges/weex#watchorders)
* [whitebit](/docs/exchanges/whitebit#watchorders)
* [woo](/docs/exchanges/woo#watchorders)
* [woofipro](/docs/exchanges/woofipro#watchorders)
***
## watchOrdersForSymbols [#watchordersforsymbols]
watches information on multiple orders made by the user across multiple symbols
**Kind**: instance\
**Returns**: Array\ - a list of \[order structures]\{@link /docs/manual#order-structure
| Param | Type | Required | Description |
| -------------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | Yes | |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.trigger | boolean | No | set to true for trigger orders |
##### Supported exchanges [#supported-exchanges-258]
* [blofin](/docs/exchanges/blofin#watchordersforsymbols)
* [bydfi](/docs/exchanges/bydfi#watchordersforsymbols)
***
## watchPosition [#watchposition]
watch open positions for a specific symbol
**Kind**: instance\
**Returns**: object - a [position structure](/docs/manual#position-structure)
| Param | Type | Description |
| ------ | ------------------------------------------- | ------------------------------------------------------ |
| symbol | string, undefined | unified market symbol |
| params | object | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-259]
* [kucoin](/docs/exchanges/kucoin#watchposition)
***
## watchPositions [#watchpositions]
watch all open positions
**Kind**: instance\
**Returns**: Array\ - a list of [position structure](/docs/manual#position-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | No | list of unified market symbols |
| since | int | No | the earliest time in ms to fetch positions for |
| limit | int | No | the maximum number of positions to retrieve |
| params | object | Yes | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-260]
* [apex](/docs/exchanges/apex#watchpositions)
* [aster](/docs/exchanges/aster#watchpositions)
* [backpack](/docs/exchanges/backpack#watchpositions)
* [binance](/docs/exchanges/binance#watchpositions)
* [bingx](/docs/exchanges/bingx#watchpositions)
* [bitget](/docs/exchanges/bitget#watchpositions)
* [bitmex](/docs/exchanges/bitmex#watchpositions)
* [blofin](/docs/exchanges/blofin#watchpositions)
* [bullish](/docs/exchanges/bullish#watchpositions)
* [bybit](/docs/exchanges/bybit#watchpositions)
* [bydfi](/docs/exchanges/bydfi#watchpositions)
* [cryptocom](/docs/exchanges/cryptocom#watchpositions)
* [deepcoin](/docs/exchanges/deepcoin#watchpositions)
* [extended](/docs/exchanges/extended#watchpositions)
* [gate](/docs/exchanges/gate#watchpositions)
* [grvt](/docs/exchanges/grvt#watchpositions)
* [hashkey](/docs/exchanges/hashkey#watchpositions)
* [htx](/docs/exchanges/htx#watchpositions)
* [hyperliquid](/docs/exchanges/hyperliquid#watchpositions)
* [kucoin](/docs/exchanges/kucoin#watchpositions)
* [modetrade](/docs/exchanges/modetrade#watchpositions)
* [nado](/docs/exchanges/nado#watchpositions)
* [okx](/docs/exchanges/okx#watchpositions)
* [toobit](/docs/exchanges/toobit#watchpositions)
* [weex](/docs/exchanges/weex#watchpositions)
* [woo](/docs/exchanges/woo#watchpositions)
* [woofipro](/docs/exchanges/woofipro#watchpositions)
***
## watchTicker [#watchticker]
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| symbol | string | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-261]
* [alpaca](/docs/exchanges/alpaca#watchticker)
* [apex](/docs/exchanges/apex#watchticker)
* [aster](/docs/exchanges/aster#watchticker)
* [backpack](/docs/exchanges/backpack#watchticker)
* [binance](/docs/exchanges/binance#watchticker)
* [bingx](/docs/exchanges/bingx#watchticker)
* [bitfinex](/docs/exchanges/bitfinex#watchticker)
* [bitget](/docs/exchanges/bitget#watchticker)
* [bithumb](/docs/exchanges/bithumb#watchticker)
* [bitmex](/docs/exchanges/bitmex#watchticker)
* [bitopro](/docs/exchanges/bitopro#watchticker)
* [bitrue](/docs/exchanges/bitrue#watchticker)
* [bittrade](/docs/exchanges/bittrade#watchticker)
* [bitvavo](/docs/exchanges/bitvavo#watchticker)
* [blockchaincom](/docs/exchanges/blockchaincom#watchticker)
* [blofin](/docs/exchanges/blofin#watchticker)
* [bullish](/docs/exchanges/bullish#watchticker)
* [bybit](/docs/exchanges/bybit#watchticker)
* [bydfi](/docs/exchanges/bydfi#watchticker)
* [cex](/docs/exchanges/cex#watchticker)
* [coinex](/docs/exchanges/coinex#watchticker)
* [coinone](/docs/exchanges/coinone#watchticker)
* [cryptocom](/docs/exchanges/cryptocom#watchticker)
* [deepcoin](/docs/exchanges/deepcoin#watchticker)
* [deribit](/docs/exchanges/deribit#watchticker)
* [derive](/docs/exchanges/derive#watchticker)
* [gate](/docs/exchanges/gate#watchticker)
* [grvt](/docs/exchanges/grvt#watchticker)
* [hashkey](/docs/exchanges/hashkey#watchticker)
* [htx](/docs/exchanges/htx#watchticker)
* [hyperliquid](/docs/exchanges/hyperliquid#watchticker)
* [kucoin](/docs/exchanges/kucoin#watchticker)
* [lbank](/docs/exchanges/lbank#watchticker)
* [lighter](/docs/exchanges/lighter#watchticker)
* [mexc](/docs/exchanges/mexc#watchticker)
* [modetrade](/docs/exchanges/modetrade#watchticker)
* [nado](/docs/exchanges/nado#watchticker)
* [ndax](/docs/exchanges/ndax#watchticker)
* [okx](/docs/exchanges/okx#watchticker)
* [onetrading](/docs/exchanges/onetrading#watchticker)
* [pacifica](/docs/exchanges/pacifica#watchticker)
* [phemex](/docs/exchanges/phemex#watchticker)
* [toobit](/docs/exchanges/toobit#watchticker)
* [upbit](/docs/exchanges/upbit#watchticker)
* [weex](/docs/exchanges/weex#watchticker)
* [whitebit](/docs/exchanges/whitebit#watchticker)
* [woo](/docs/exchanges/woo#watchticker)
* [woofipro](/docs/exchanges/woofipro#watchticker)
***
## watchTickers [#watchtickers]
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
**Kind**: instance\
**Returns**: object - a [ticker structure](/docs/manual#ticker-structure)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | Yes | unified symbol of the market to fetch the ticker for |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-262]
* [apex](/docs/exchanges/apex#watchtickers)
* [aster](/docs/exchanges/aster#watchtickers)
* [backpack](/docs/exchanges/backpack#watchtickers)
* [binance](/docs/exchanges/binance#watchtickers)
* [bitget](/docs/exchanges/bitget#watchtickers)
* [bithumb](/docs/exchanges/bithumb#watchtickers)
* [bitmex](/docs/exchanges/bitmex#watchtickers)
* [bitvavo](/docs/exchanges/bitvavo#watchtickers)
* [blofin](/docs/exchanges/blofin#watchtickers)
* [bybit](/docs/exchanges/bybit#watchtickers)
* [bydfi](/docs/exchanges/bydfi#watchtickers)
* [cex](/docs/exchanges/cex#watchtickers)
* [coinex](/docs/exchanges/coinex#watchtickers)
* [cryptocom](/docs/exchanges/cryptocom#watchtickers)
* [deribit](/docs/exchanges/deribit#watchtickers)
* [gate](/docs/exchanges/gate#watchtickers)
* [grvt](/docs/exchanges/grvt#watchtickers)
* [hyperliquid](/docs/exchanges/hyperliquid#watchtickers)
* [kucoin](/docs/exchanges/kucoin#watchtickers)
* [lighter](/docs/exchanges/lighter#watchtickers)
* [mexc](/docs/exchanges/mexc#watchtickers)
* [modetrade](/docs/exchanges/modetrade#watchtickers)
* [nado](/docs/exchanges/nado#watchtickers)
* [okx](/docs/exchanges/okx#watchtickers)
* [onetrading](/docs/exchanges/onetrading#watchtickers)
* [pacifica](/docs/exchanges/pacifica#watchtickers)
* [phemex](/docs/exchanges/phemex#watchtickers)
* [toobit](/docs/exchanges/toobit#watchtickers)
* [upbit](/docs/exchanges/upbit#watchtickers)
* [weex](/docs/exchanges/weex#watchtickers)
* [whitebit](/docs/exchanges/whitebit#watchtickers)
* [woo](/docs/exchanges/woo#watchtickers)
* [woofipro](/docs/exchanges/woofipro#watchtickers)
***
## watchTrades [#watchtrades]
watches information on multiple trades made in a market
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#trade-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------- |
| symbol | string | Yes | unified market symbol of the market trades were made in |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of trade structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-263]
* [alpaca](/docs/exchanges/alpaca#watchtrades)
* [apex](/docs/exchanges/apex#watchtrades)
* [aster](/docs/exchanges/aster#watchtrades)
* [backpack](/docs/exchanges/backpack#watchtrades)
* [binance](/docs/exchanges/binance#watchtrades)
* [bingx](/docs/exchanges/bingx#watchtrades)
* [bitfinex](/docs/exchanges/bitfinex#watchtrades)
* [bitget](/docs/exchanges/bitget#watchtrades)
* [bithumb](/docs/exchanges/bithumb#watchtrades)
* [bitmex](/docs/exchanges/bitmex#watchtrades)
* [bitopro](/docs/exchanges/bitopro#watchtrades)
* [bitrue](/docs/exchanges/bitrue#watchtrades)
* [bitstamp](/docs/exchanges/bitstamp#watchtrades)
* [bittrade](/docs/exchanges/bittrade#watchtrades)
* [bitvavo](/docs/exchanges/bitvavo#watchtrades)
* [blockchaincom](/docs/exchanges/blockchaincom#watchtrades)
* [blofin](/docs/exchanges/blofin#watchtrades)
* [bullish](/docs/exchanges/bullish#watchtrades)
* [bybit](/docs/exchanges/bybit#watchtrades)
* [cex](/docs/exchanges/cex#watchtrades)
* [coincheck](/docs/exchanges/coincheck#watchtrades)
* [coinex](/docs/exchanges/coinex#watchtrades)
* [coinone](/docs/exchanges/coinone#watchtrades)
* [cryptocom](/docs/exchanges/cryptocom#watchtrades)
* [deepcoin](/docs/exchanges/deepcoin#watchtrades)
* [deribit](/docs/exchanges/deribit#watchtrades)
* [derive](/docs/exchanges/derive#watchtrades)
* [dydx](/docs/exchanges/dydx#watchtrades)
* [extended](/docs/exchanges/extended#watchtrades)
* [gate](/docs/exchanges/gate#watchtrades)
* [gemini](/docs/exchanges/gemini#watchtrades)
* [grvt](/docs/exchanges/grvt#watchtrades)
* [hashkey](/docs/exchanges/hashkey#watchtrades)
* [hollaex](/docs/exchanges/hollaex#watchtrades)
* [htx](/docs/exchanges/htx#watchtrades)
* [hyperliquid](/docs/exchanges/hyperliquid#watchtrades)
* [independentreserve](/docs/exchanges/independentreserve#watchtrades)
* [kucoin](/docs/exchanges/kucoin#watchtrades)
* [lbank](/docs/exchanges/lbank#watchtrades)
* [lighter](/docs/exchanges/lighter#watchtrades)
* [luno](/docs/exchanges/luno#watchtrades)
* [mexc](/docs/exchanges/mexc#watchtrades)
* [modetrade](/docs/exchanges/modetrade#watchtrades)
* [nado](/docs/exchanges/nado#watchtrades)
* [ndax](/docs/exchanges/ndax#watchtrades)
* [okx](/docs/exchanges/okx#watchtrades)
* [pacifica](/docs/exchanges/pacifica#watchtrades)
* [phemex](/docs/exchanges/phemex#watchtrades)
* [toobit](/docs/exchanges/toobit#watchtrades)
* [upbit](/docs/exchanges/upbit#watchtrades)
* [weex](/docs/exchanges/weex#watchtrades)
* [whitebit](/docs/exchanges/whitebit#watchtrades)
* [woo](/docs/exchanges/woo#watchtrades)
* [woofipro](/docs/exchanges/woofipro#watchtrades)
***
## watchTradesForSymbols [#watchtradesforsymbols]
get the list of most recent trades for a list of symbols
**Kind**: instance\
**Returns**: Array\ - a list of [trade structures](/docs/manual#public-trades)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| symbols | Array\ | Yes | unified symbol of the market to fetch trades for |
| since | int | No | timestamp in ms of the earliest trade to fetch |
| limit | int | No | the maximum amount of trades to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-264]
* [apex](/docs/exchanges/apex#watchtradesforsymbols)
* [aster](/docs/exchanges/aster#watchtradesforsymbols)
* [backpack](/docs/exchanges/backpack#watchtradesforsymbols)
* [binance](/docs/exchanges/binance#watchtradesforsymbols)
* [bitget](/docs/exchanges/bitget#watchtradesforsymbols)
* [bitmex](/docs/exchanges/bitmex#watchtradesforsymbols)
* [bitvavo](/docs/exchanges/bitvavo#watchtradesforsymbols)
* [blofin](/docs/exchanges/blofin#watchtradesforsymbols)
* [bybit](/docs/exchanges/bybit#watchtradesforsymbols)
* [coinex](/docs/exchanges/coinex#watchtradesforsymbols)
* [cryptocom](/docs/exchanges/cryptocom#watchtradesforsymbols)
* [deribit](/docs/exchanges/deribit#watchtradesforsymbols)
* [gate](/docs/exchanges/gate#watchtradesforsymbols)
* [gemini](/docs/exchanges/gemini#watchtradesforsymbols)
* [grvt](/docs/exchanges/grvt#watchtradesforsymbols)
* [kucoin](/docs/exchanges/kucoin#watchtradesforsymbols)
* [nado](/docs/exchanges/nado#watchtradesforsymbols)
* [okx](/docs/exchanges/okx#watchtradesforsymbols)
* [toobit](/docs/exchanges/toobit#watchtradesforsymbols)
* [upbit](/docs/exchanges/upbit#watchtradesforsymbols)
* [weex](/docs/exchanges/weex#watchtradesforsymbols)
***
## withdraw [#withdraw]
make a withdrawal
**Kind**: instance\
**Returns**: object - a [transaction structure](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| amount | float | Yes | the amount to withdraw |
| address | string | Yes | the address to withdraw to |
| tag | string | Yes | a memo for the transaction |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-265]
* [alpaca](/docs/exchanges/alpaca#withdraw)
* [aster](/docs/exchanges/aster#withdraw)
* [backpack](/docs/exchanges/backpack#withdraw)
* [bigone](/docs/exchanges/bigone#withdraw)
* [binance](/docs/exchanges/binance#withdraw)
* [bingx](/docs/exchanges/bingx#withdraw)
* [bitbank](/docs/exchanges/bitbank#withdraw)
* [bitfinex](/docs/exchanges/bitfinex#withdraw)
* [bitflyer](/docs/exchanges/bitflyer#withdraw)
* [bitget](/docs/exchanges/bitget#withdraw)
* [bithumb](/docs/exchanges/bithumb#withdraw)
* [bitmex](/docs/exchanges/bitmex#withdraw)
* [bitopro](/docs/exchanges/bitopro#withdraw)
* [bitrue](/docs/exchanges/bitrue#withdraw)
* [bitso](/docs/exchanges/bitso#withdraw)
* [bitstamp](/docs/exchanges/bitstamp#withdraw)
* [bittrade](/docs/exchanges/bittrade#withdraw)
* [bitvavo](/docs/exchanges/bitvavo#withdraw)
* [blockchaincom](/docs/exchanges/blockchaincom#withdraw)
* [btcmarkets](/docs/exchanges/btcmarkets#withdraw)
* [bullish](/docs/exchanges/bullish#withdraw)
* [bybit](/docs/exchanges/bybit#withdraw)
* [coinbase](/docs/exchanges/coinbase#withdraw)
* [coinbaseexchange](/docs/exchanges/coinbaseexchange#withdraw)
* [coinbaseinternational](/docs/exchanges/coinbaseinternational#withdraw)
* [coinex](/docs/exchanges/coinex#withdraw)
* [coinmate](/docs/exchanges/coinmate#withdraw)
* [coinsph](/docs/exchanges/coinsph#withdraw)
* [cryptocom](/docs/exchanges/cryptocom#withdraw)
* [deribit](/docs/exchanges/deribit#withdraw)
* [digifinex](/docs/exchanges/digifinex#withdraw)
* [dydx](/docs/exchanges/dydx#withdraw)
* [extended](/docs/exchanges/extended#withdraw)
* [foxbit](/docs/exchanges/foxbit#withdraw)
* [gate](/docs/exchanges/gate#withdraw)
* [gemini](/docs/exchanges/gemini#withdraw)
* [grvt](/docs/exchanges/grvt#withdraw)
* [hashkey](/docs/exchanges/hashkey#withdraw)
* [hibachi](/docs/exchanges/hibachi#withdraw)
* [hitbtc](/docs/exchanges/hitbtc#withdraw)
* [hollaex](/docs/exchanges/hollaex#withdraw)
* [htx](/docs/exchanges/htx#withdraw)
* [hyperliquid](/docs/exchanges/hyperliquid#withdraw)
* [independentreserve](/docs/exchanges/independentreserve#withdraw)
* [indodax](/docs/exchanges/indodax#withdraw)
* [kraken](/docs/exchanges/kraken#withdraw)
* [kucoin](/docs/exchanges/kucoin#withdraw)
* [lbank](/docs/exchanges/lbank#withdraw)
* [lighter](/docs/exchanges/lighter#withdraw)
* [mercado](/docs/exchanges/mercado#withdraw)
* [mexc](/docs/exchanges/mexc#withdraw)
* [modetrade](/docs/exchanges/modetrade#withdraw)
* [ndax](/docs/exchanges/ndax#withdraw)
* [okx](/docs/exchanges/okx#withdraw)
* [pacifica](/docs/exchanges/pacifica#withdraw)
* [phemex](/docs/exchanges/phemex#withdraw)
* [poloniex](/docs/exchanges/poloniex#withdraw)
* [tokocrypto](/docs/exchanges/tokocrypto#withdraw)
* [toobit](/docs/exchanges/toobit#withdraw)
* [upbit](/docs/exchanges/upbit#withdraw)
* [whitebit](/docs/exchanges/whitebit#withdraw)
* [woo](/docs/exchanges/woo#withdraw)
* [woofipro](/docs/exchanges/woofipro#withdraw)
* [xt](/docs/exchanges/xt#withdraw)
* [zaif](/docs/exchanges/zaif#withdraw)
***
## withdrawWs [#withdrawws]
make a withdrawal
**Kind**: instance\
**Returns**: object - a [transaction structure](/docs/manual#transaction-structure)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| code | string | Yes | unified currency code |
| amount | float | Yes | the amount to withdraw |
| address | string | Yes | the address to withdraw to |
| tag | string | Yes | |
| params | object | No | extra parameters specific to the exchange API endpoint |
##### Supported exchanges [#supported-exchanges-266]
* [bitvavo](/docs/exchanges/bitvavo#withdrawws)
# Certification (/docs/certification)
# CCXT Certification Program ·  [#ccxt-certification-program--]
The structure of CCXT defines a good, portable and cross-compatible standard for exchanges' API interfaces, that is implemented in the CCXT Unified API. Exchanges are welcome to apply for our certification program. Certification is technically supervised and quality-assured by members of the CCXT Dev Team. That implies that an exchange having a "certified" badge is properly implemented and tested by the authors of CCXT. Certification means less bugs, more functionality, priority support and a much more stable and efficient implementation in general.
## Requirements [#requirements]
Getting integrated and certified requires the exchange to implement a quality API. Please, see the full list of technical requirements here: /docs/requirements
## Contact Us [#contact-us]
For inquiries on getting your exchange integrated, listed and certified: [info@ccxt.trade](mailto:info@ccxt.trade)
# Changelog (/docs/changelog)
# [v4.5.78](https://github.com/ccxt/ccxt/releases/tag/v4.5.78) - 2026-09-07 [#v4578---2026-09-07]
## What's Changed [#whats-changed]
* chore: adjust release and package.json by [@carlosmiei](https://github.com/carlosmiei) in [#30298](https://github.com/ccxt/ccxt/pull/30298)
* chore: fix go and rust build by [@carlosmiei](https://github.com/carlosmiei) in [#30301](https://github.com/ccxt/ccxt/pull/30301)
* fix(paradex): ts error by [@carlosmiei](https://github.com/carlosmiei) in [#30303](https://github.com/ccxt/ccxt/pull/30303)
* chore: skip examples transpilation by [@carlosmiei](https://github.com/carlosmiei) in [#30304](https://github.com/ccxt/ccxt/pull/30304)
* chore: split force-build command by [@carlosmiei](https://github.com/carlosmiei) in [#30306](https://github.com/ccxt/ccxt/pull/30306)
* chore: rust set build jobs to 2 in release.yml by [@carlosmiei](https://github.com/carlosmiei) in [#30307](https://github.com/ccxt/ccxt/pull/30307)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/ccxt-mcp-v0.1.3...v4.5.78](https://github.com/ccxt/ccxt/compare/ccxt-mcp-v0.1.3...v4.5.78)
[Changes][v4.5.78]
# [ccxt-mcp v0.1.3 (ccxt-mcp-v0.1.3)](https://github.com/ccxt/ccxt/releases/tag/ccxt-mcp-v0.1.3) - 2026-09-07 [#ccxt-mcp-v013-ccxt-mcp-v013---2026-09-07]
Download **ccxt-mcp.mcpb** below and open it in Claude Desktop (Settings > Extensions) for a one-click install. Any other MCP host (Claude Code, Cursor, VS Code, Windsurf): `claude mcp add ccxt -- npx -y ccxt-mcp`. Docs: /docs/manual#/mcp
[Changes][ccxt-mcp-v0.1.3]
# [ccxt-mcp v0.1.2 (ccxt-mcp-v0.1.2)](https://github.com/ccxt/ccxt/releases/tag/ccxt-mcp-v0.1.2) - 2026-09-03 [#ccxt-mcp-v012-ccxt-mcp-v012---2026-09-03]
Download **ccxt-mcp.mcpb** below and open it in Claude Desktop (Settings > Extensions) for a one-click install. Any other MCP host (Claude Code, Cursor, VS Code, Windsurf): `claude mcp add ccxt -- npx -y ccxt-mcp`. Docs: /docs/manual#/mcp
[Changes][ccxt-mcp-v0.1.2]
# [CCXT MCP - latest (v0.1.3) (ccxt-mcp-latest)](https://github.com/ccxt/ccxt/releases/tag/ccxt-mcp-latest) - 2026-09-03 [#ccxt-mcp---latest-v013-ccxt-mcp-latest---2026-09-03]
Download **ccxt-mcp.mcpb** below and open it in Claude Desktop (Settings > Extensions) for a one-click install. Any other MCP host (Claude Code, Cursor, VS Code, Windsurf): `claude mcp add ccxt -- npx -y ccxt-mcp`. Docs: /docs/manual#/mcp
[Changes][ccxt-mcp-latest]
# [v4.5.77](https://github.com/ccxt/ccxt/releases/tag/v4.5.77) - 2026-09-01 [#v4577---2026-09-01]
## What's Changed [#whats-changed-1]
* chore(build): retry git pushes in the release workflow by [@carlosmiei](https://github.com/carlosmiei) in [#30131](https://github.com/ccxt/ccxt/pull/30131)
* feat(alpaca): fetchOHLCV pagination via next\_page\_token behind params paginate by [@rayBastard](https://github.com/rayBastard) in [#30117](https://github.com/ccxt/ccxt/pull/30117)
* perf(php): inline calls by [@ttodua](https://github.com/ttodua) in [#30143](https://github.com/ccxt/ccxt/pull/30143)
* feat(bitget): support UTA (v3) deposit & withdrawal methods by [@rayBastard](https://github.com/rayBastard) in [#30146](https://github.com/ccxt/ccxt/pull/30146)
* fix(bybit): normalize liquidation side for allLiquidation frames by [@carlotestor](https://github.com/carlotestor) in [#30149](https://github.com/ccxt/ccxt/pull/30149)
* fix(deepcoin, derive, paradex): return position numbers as numbers by [@mkzung](https://github.com/mkzung) in [#30158](https://github.com/ccxt/ccxt/pull/30158)
* test(toobit): pin the reduce-only close side by [@mkzung](https://github.com/mkzung) in [#30160](https://github.com/ccxt/ccxt/pull/30160)
* fix(cryptocom): a position side is long or short, and contracts is a number by [@mkzung](https://github.com/mkzung) in [#30157](https://github.com/ccxt/ccxt/pull/30157)
* fix(bybit): map linear/inverse minNotionalValue to limits.cost.min by [@douglaspetrin](https://github.com/douglaspetrin) in [#30154](https://github.com/ccxt/ccxt/pull/30154)
* test(apex): record a fetchPositions case and type entryPrice by [@mkzung](https://github.com/mkzung) in [#30159](https://github.com/ccxt/ccxt/pull/30159)
* perf(php): is\_dictionary optimization by [@ttodua](https://github.com/ttodua) in [#30150](https://github.com/ccxt/ccxt/pull/30150)
* fix(coinbaseinternational): drop has flags for unimplemented fetchMyBuys/fetchMySells by [@oleg6k](https://github.com/oleg6k) in [#30162](https://github.com/ccxt/ccxt/pull/30162)
* fix(bingx): correct wallet history filters by [@AresArtemius](https://github.com/AresArtemius) in [#30173](https://github.com/ccxt/ccxt/pull/30173)
* fix(binance): pass symbol in single-symbol fetchBidsAsks requests by [@AresArtemius](https://github.com/AresArtemius) in [#30062](https://github.com/ccxt/ccxt/pull/30062)
* fix(toobit): fetchBidsAsks returns nothing when a symbol is named by [@mkzung](https://github.com/mkzung) in [#30176](https://github.com/ccxt/ccxt/pull/30176)
* fix(bingx): parse documented deposit address field by [@AresArtemius](https://github.com/AresArtemius) in [#30175](https://github.com/ccxt/ccxt/pull/30175)
* fix(onetrading): correct order status and time-in-force enum mapping by [@rayBastard](https://github.com/rayBastard) in [#30165](https://github.com/ccxt/ccxt/pull/30165)
* fix(tokocrypto): route market data by symbol type instead of quote currency by [@rayBastard](https://github.com/rayBastard) in [#30141](https://github.com/ccxt/ccxt/pull/30141)
* docs(p2b): fix copy-pasted description and stale [@see](https://github.com/see) link by [@rayBastard](https://github.com/rayBastard) in [#30137](https://github.com/ccxt/ccxt/pull/30137)
* fix(toobit): single-flight listenKey and watchPositions hash by [@carlotestor](https://github.com/carlotestor) in [#30184](https://github.com/ccxt/ccxt/pull/30184)
* fix(poloniex, bitget, coinbaseinternational): unified words in enumerated fields by [@mkzung](https://github.com/mkzung) in [#30177](https://github.com/ccxt/ccxt/pull/30177)
* fix(bingx): parse documented deposit address field by [@AresArtemius](https://github.com/AresArtemius) in [#30185](https://github.com/ccxt/ccxt/pull/30185)
* update(bithumb): reduce rateLimit with conservative order costs by [@marshallyunn](https://github.com/marshallyunn) in [#30145](https://github.com/ccxt/ccxt/pull/30145)
* fix(bingx): correct Coin-M market status by [@AresArtemius](https://github.com/AresArtemius) in [#30201](https://github.com/ccxt/ccxt/pull/30201)
* fix(onetrading): support since without to and add until param by [@rayBastard](https://github.com/rayBastard) in [#30190](https://github.com/ccxt/ccxt/pull/30190)
* fix(grvt): funding\_rate arrives in percentage points, so scale it by [@mkzung](https://github.com/mkzung) in [#30195](https://github.com/ccxt/ccxt/pull/30195)
* feat(bingx): add API key restrictions endpoint by [@AresArtemius](https://github.com/AresArtemius) in [#30191](https://github.com/ccxt/ccxt/pull/30191)
* feat(revolutx): add revolutx exchange by [@stas-chistyakov](https://github.com/stas-chistyakov) in [#29848](https://github.com/ccxt/ccxt/pull/29848)
* feat(bithumb): generation 2 API support and testing by [@Dan-krm](https://github.com/Dan-krm) in [#29036](https://github.com/ccxt/ccxt/pull/29036)
* chore: disable flaky test in go by [@carlosmiei](https://github.com/carlosmiei) in [#30210](https://github.com/ccxt/ccxt/pull/30210)
## New Contributors [#new-contributors]
* [@douglaspetrin](https://github.com/douglaspetrin) made their first contribution in [#30154](https://github.com/ccxt/ccxt/pull/30154)
* [@oleg6k](https://github.com/oleg6k) made their first contribution in [#30162](https://github.com/ccxt/ccxt/pull/30162)
* [@marshallyunn](https://github.com/marshallyunn) made their first contribution in [#30145](https://github.com/ccxt/ccxt/pull/30145)
* [@stas-chistyakov](https://github.com/stas-chistyakov) made their first contribution in [#29848](https://github.com/ccxt/ccxt/pull/29848)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.76...v4.5.77](https://github.com/ccxt/ccxt/compare/v4.5.76...v4.5.77)
[Changes][v4.5.77]
# [v4.5.76](https://github.com/ccxt/ccxt/releases/tag/v4.5.76) - 2026-08-26 [#v4576---2026-08-26]
## What's Changed [#whats-changed-2]
* fix(lbank): single-flight subscribeKey authenticate (refs [#29393](https://github.com/ccxt/ccxt/issues/29393)) by [@carlotestor](https://github.com/carlotestor) in [#29993](https://github.com/ccxt/ccxt/pull/29993)
* fix(bitstamp): single-flight websocket token authenticate (refs [#29393](https://github.com/ccxt/ccxt/issues/29393)) by [@carlotestor](https://github.com/carlotestor) in [#29994](https://github.com/ccxt/ccxt/pull/29994)
* fix(xt): single-flight listen key acquisition (refs [#29393](https://github.com/ccxt/ccxt/issues/29393)) by [@carlotestor](https://github.com/carlotestor) in [#29997](https://github.com/ccxt/ccxt/pull/29997)
* fix(kraken): single-flight websockets token authenticate (refs [#29393](https://github.com/ccxt/ccxt/issues/29393)) by [@carlotestor](https://github.com/carlotestor) in [#29996](https://github.com/ccxt/ccxt/pull/29996)
* fix(whitebit): single-flight websocket token authenticate (refs [#29393](https://github.com/ccxt/ccxt/issues/29393)) by [@carlotestor](https://github.com/carlotestor) in [#30000](https://github.com/ccxt/ccxt/pull/30000)
* fix(bitrue): single-flight listenKey authenticate (refs [#29393](https://github.com/ccxt/ccxt/issues/29393)) by [@carlotestor](https://github.com/carlotestor) in [#29999](https://github.com/ccxt/ccxt/pull/29999)
* fix(hashkey): single-flight listenKey authenticate (refs [#29393](https://github.com/ccxt/ccxt/issues/29393)) by [@carlotestor](https://github.com/carlotestor) in [#29995](https://github.com/ccxt/ccxt/pull/29995)
* fix(tokocrypto): route fetchTrades by symbol type and await the open/v1 response by [@rayBastard](https://github.com/rayBastard) in [#30013](https://github.com/ccxt/ccxt/pull/30013)
* fix(bingx): correct fetchTrades limits by [@AresArtemius](https://github.com/AresArtemius) in [#30011](https://github.com/ccxt/ccxt/pull/30011)
* fix(deepcoin): single-flight listenKey authenticate (refs [#29393](https://github.com/ccxt/ccxt/issues/29393)) by [@carlotestor](https://github.com/carlotestor) in [#29998](https://github.com/ccxt/ccxt/pull/29998)
* fix(bybit): anchor fetchOpenInterestHistory window when only since is given by [@carlotestor](https://github.com/carlotestor) in [#30016](https://github.com/ccxt/ccxt/pull/30016)
* fix(bithumb): remove incorrect ALT -> ArchLoot commonCurrencies mapping by [@factec-kyle](https://github.com/factec-kyle) in [#30015](https://github.com/ccxt/ccxt/pull/30015)
* fix(gate): convert since to seconds in fetchOpenInterestHistory by [@carlotestor](https://github.com/carlotestor) in [#30018](https://github.com/ccxt/ccxt/pull/30018)
* chore: fix wiki-pushback by [@carlosmiei](https://github.com/carlosmiei) in [#30020](https://github.com/ccxt/ccxt/pull/30020)
* fix(bingx): reject unsupported Coin-M fetchTrades by [@AresArtemius](https://github.com/AresArtemius) in [#30021](https://github.com/ccxt/ccxt/pull/30021)
* fix(bingx): correct Coin-M open interest by [@AresArtemius](https://github.com/AresArtemius) in [#30026](https://github.com/ccxt/ccxt/pull/30026)
* perf: python Precise by [@ttodua](https://github.com/ttodua) in [#30024](https://github.com/ccxt/ccxt/pull/30024)
* docs(blog): add "Front-running the S-1" Anthropic-IPO prediction-markets post by [@pcriadoperez](https://github.com/pcriadoperez) in [#30025](https://github.com/ccxt/ccxt/pull/30025)
* fix(upbit): do not default unknown order side to sell by [@rayBastard](https://github.com/rayBastard) in [#30012](https://github.com/ccxt/ccxt/pull/30012)
* feat(mcp): official CCXT MCP server by [@pcriadoperez](https://github.com/pcriadoperez) in [#29277](https://github.com/ccxt/ccxt/pull/29277)
* chore(deps): bump hono from 4.12.31 to 4.13.3 in /mcp by [@dependabot](https://github.com/dependabot)\[bot] in [#30029](https://github.com/ccxt/ccxt/pull/30029)
* build(go): trampoline async cores so Promise.all fans out like the C#/Java ports by [@carlotestor](https://github.com/carlotestor) in [#29647](https://github.com/ccxt/ccxt/pull/29647)
* fix(java): bump msgpack-core to 0.9.12 (CVE-2026-21452) by [@huiboxes](https://github.com/huiboxes) in [#30040](https://github.com/ccxt/ccxt/pull/30040)
* refactor(php): one fiber per HTTP call (3 → 1) — collapse fetch2 and fetch by [@carlotestor](https://github.com/carlotestor) in [#30039](https://github.com/ccxt/ccxt/pull/30039)
* chore(deps): bump undici and ccxt in /mcp by [@dependabot](https://github.com/dependabot)\[bot] in [#30030](https://github.com/ccxt/ccxt/pull/30030)
* fix(whitebit): parse TradFi futures as swaps by [@AresArtemius](https://github.com/AresArtemius) in [#30033](https://github.com/ccxt/ccxt/pull/30033)
* chore(deps): bump @hono/node-server from 1.19.14 to 1.19.17 in /mcp by [@dependabot](https://github.com/dependabot)\[bot] in [#30032](https://github.com/ccxt/ccxt/pull/30032)
* chore(deps): bump fast-uri from 3.1.4 to 3.1.5 in /mcp by [@dependabot](https://github.com/dependabot)\[bot] in [#30035](https://github.com/ccxt/ccxt/pull/30035)
* chore(deps): bump ip-address from 10.2.0 to 10.5.0 in /mcp by [@dependabot](https://github.com/dependabot)\[bot] in [#30031](https://github.com/ccxt/ccxt/pull/30031)
* fix(bingx): parse position liquidation price by [@AresArtemius](https://github.com/AresArtemius) in [#30034](https://github.com/ccxt/ccxt/pull/30034)
* fix(bingx): parse Coin-M funding rate response by [@AresArtemius](https://github.com/AresArtemius) in [#30023](https://github.com/ccxt/ccxt/pull/30023)
* fix(blofin): order cost is the quote volume, not the margin by [@mkzung](https://github.com/mkzung) in [#29975](https://github.com/ccxt/ccxt/pull/29975)
* fix(bingx): ignore account updates without positions by [@AresArtemius](https://github.com/AresArtemius) in [#29948](https://github.com/ccxt/ccxt/pull/29948)
* go: type wrapper optional locals and core body locals from TypeScript by [@carlotestor](https://github.com/carlotestor) in [#30041](https://github.com/ccxt/ccxt/pull/30041)
* fix(pro): js indexed order book side builds holes from no-op deltas by [@L1nkus](https://github.com/L1nkus) in [#30049](https://github.com/ccxt/ccxt/pull/30049)
* perf(pro): js order book side shift without copyWithin -3.3x by [@L1nkus](https://github.com/L1nkus) in [#30048](https://github.com/ccxt/ccxt/pull/30048)
* feat(cs): type wrapper optional scalar locals from TypeScript by [@carlotestor](https://github.com/carlotestor) in [#30053](https://github.com/ccxt/ccxt/pull/30053)
* fix(paradex): read reduceOnly from the flags array in parseOrder by [@rayBastard](https://github.com/rayBastard) in [#30065](https://github.com/ccxt/ccxt/pull/30065)
* feat(benchmarks): cross-language performance benchmark + blog post by [@pcriadoperez](https://github.com/pcriadoperez) in [#30028](https://github.com/ccxt/ccxt/pull/30028)
* fix(bingx): reject unsupported Coin-M leverage tiers by [@AresArtemius](https://github.com/AresArtemius) in [#30076](https://github.com/ccxt/ccxt/pull/30076)
* fix(bingx): reject unsupported Coin-M position mode by [@AresArtemius](https://github.com/AresArtemius) in [#30068](https://github.com/ccxt/ccxt/pull/30068)
* fix(paradex): omit zero trigger\_price in parseOrder by [@rayBastard](https://github.com/rayBastard) in [#30069](https://github.com/ccxt/ccxt/pull/30069)
* fix(typescript): remove truth coercion by [@carlosmiei](https://github.com/carlosmiei) in [#30080](https://github.com/ccxt/ccxt/pull/30080)
* perf(js): getValueFromKeysInArray optimization by [@ttodua](https://github.com/ttodua) in [#29798](https://github.com/ccxt/ccxt/pull/29798)
* perf: check string first by [@ttodua](https://github.com/ttodua) in [#29804](https://github.com/ccxt/ccxt/pull/29804)
* perf: undefined optimization in type by [@ttodua](https://github.com/ttodua) in [#29806](https://github.com/ccxt/ccxt/pull/29806)
* fix(bingx): restrict position close by id to linear by [@AresArtemius](https://github.com/AresArtemius) in [#30088](https://github.com/ccxt/ccxt/pull/30088)
* fix(p2b): read errorCode from response root in handleErrors by [@rayBastard](https://github.com/rayBastard) in [#30098](https://github.com/ccxt/ccxt/pull/30098)
* perf(go): precise reorganization by [@ttodua](https://github.com/ttodua) in [#30043](https://github.com/ccxt/ccxt/pull/30043)
* perf(c#): precise optimization (c) by [@ttodua](https://github.com/ttodua) in [#30089](https://github.com/ccxt/ccxt/pull/30089)
* perf(java): precise optimization (c) by [@ttodua](https://github.com/ttodua) in [#30090](https://github.com/ccxt/ccxt/pull/30090)
* fix(btse): derive ticker percentage instead of using the raw ratio field by [@carlotestor](https://github.com/carlotestor) in [#30093](https://github.com/ccxt/ccxt/pull/30093)
* feat(cs): type the generated C# cores (incl. createOrder -> Task) and their parameters by [@carlotestor](https://github.com/carlotestor) in [#30066](https://github.com/ccxt/ccxt/pull/30066)
* refactor(ts): require boolean conditions via strict-boolean-expressions by [@carlotestor](https://github.com/carlotestor) in [#30082](https://github.com/ccxt/ccxt/pull/30082)
* fix(krakenfutures): raise ExchangeNotAvailable on degraded fetchPositions response by [@akshaykumarhudedmani](https://github.com/akshaykumarhudedmani) in [#30084](https://github.com/ccxt/ccxt/pull/30084)
* fix(xt): support postOnly orders via timeInForce GTX by [@rayBastard](https://github.com/rayBastard) in [#30059](https://github.com/ccxt/ccxt/pull/30059)
* ci(js): persist emitAPI abstracts on master auto-commit by [@carlotestor](https://github.com/carlotestor) in [#30111](https://github.com/ccxt/ccxt/pull/30111)
* bitget parseUtaBalance fix by [@ndubel](https://github.com/ndubel) in [#30083](https://github.com/ccxt/ccxt/pull/30083)
* feat(cs): fold watch\* Copy into cores and drop leftover wrappers by [@carlotestor](https://github.com/carlotestor) in [#30110](https://github.com/ccxt/ccxt/pull/30110)
* docs: remove status page from docs site and sidebar by [@carlotestor](https://github.com/carlotestor) in [#30112](https://github.com/ccxt/ccxt/pull/30112)
* fix(p2b): map min\_total to market limits.cost by [@rayBastard](https://github.com/rayBastard) in [#30099](https://github.com/ccxt/ccxt/pull/30099)
* fix(pacifica): resolve order symbol in parseOrder and return latest order state from fetchOrder by [@rayBastard](https://github.com/rayBastard) in [#30097](https://github.com/ccxt/ccxt/pull/30097)
* fix(alpaca): declare limits.cost.min of 10 for USD-quoted crypto markets by [@rayBastard](https://github.com/rayBastard) in [#30101](https://github.com/ccxt/ccxt/pull/30101)
* fix(paradex): expose liquidation\_price in parsePosition by [@rayBastard](https://github.com/rayBastard) in [#30096](https://github.com/ccxt/ccxt/pull/30096)
* fix(bingx): normalize leverage side by [@AresArtemius](https://github.com/AresArtemius) in [#30070](https://github.com/ccxt/ccxt/pull/30070)
* fix(xt): satisfy strict-boolean-expressions lint on postOnly checks by [@rayBastard](https://github.com/rayBastard) in [#30115](https://github.com/ccxt/ccxt/pull/30115)
* fix(alpaca): classify error 40310000 by message, not by code by [@rayBastard](https://github.com/rayBastard) in [#30103](https://github.com/ccxt/ccxt/pull/30103)
* fix(tokocrypto): read market margin flag from marginTradingEnable by [@rayBastard](https://github.com/rayBastard) in [#30064](https://github.com/ccxt/ccxt/pull/30064)
* fix(bingx): reject unsupported Coin-M createOrders by [@AresArtemius](https://github.com/AresArtemius) in [#30091](https://github.com/ccxt/ccxt/pull/30091)
* fix(alpaca): fetchTickers without symbols defaults to all markets by [@rayBastard](https://github.com/rayBastard) in [#30102](https://github.com/ccxt/ccxt/pull/30102)
* fix(alpaca): fetchOHLCV since sent day-truncated, intraday ranges return empty by [@rayBastard](https://github.com/rayBastard) in [#30100](https://github.com/ccxt/ccxt/pull/30100)
* fix(bingx): satisfy strict-boolean-expressions lint on the inverse market check by [@rayBastard](https://github.com/rayBastard) in [#30118](https://github.com/ccxt/ccxt/pull/30118)
* feat(transpiler): basetests only transpilation by [@ttodua](https://github.com/ttodua) in [#30116](https://github.com/ccxt/ccxt/pull/30116)
* fix(binance): drop 'stock' from default fetchMarkets types by [@carlotestor](https://github.com/carlotestor) in [#30126](https://github.com/ccxt/ccxt/pull/30126)
* fix(bybit): increase paginationCalls in fetchLeveragetiers by [@carlosmiei](https://github.com/carlosmiei) in [#30127](https://github.com/ccxt/ccxt/pull/30127)
## New Contributors [#new-contributors-1]
* [@factec-kyle](https://github.com/factec-kyle) made their first contribution in [#30015](https://github.com/ccxt/ccxt/pull/30015)
* [@huiboxes](https://github.com/huiboxes) made their first contribution in [#30040](https://github.com/ccxt/ccxt/pull/30040)
* [@akshaykumarhudedmani](https://github.com/akshaykumarhudedmani) made their first contribution in [#30084](https://github.com/ccxt/ccxt/pull/30084)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.75...v4.5.76](https://github.com/ccxt/ccxt/compare/v4.5.75...v4.5.76)
[Changes][v4.5.76]
# [v4.5.75](https://github.com/ccxt/ccxt/releases/tag/v4.5.75) - 2026-08-21 [#v4575---2026-08-21]
## What's Changed [#whats-changed-3]
* test(bitmex): skip the last-vs-median ticker check through the wind-down by [@kroitor](https://github.com/kroitor) in [#29914](https://github.com/ccxt/ccxt/pull/29914)
* bingx: fix websocket balance routing by [@AresArtemius](https://github.com/AresArtemius) in [#29936](https://github.com/ccxt/ccxt/pull/29936)
* fix(poloniex): map futures v3 error codes by [@rayBastard](https://github.com/rayBastard) in [#29920](https://github.com/ccxt/ccxt/pull/29920)
* fix(krakenfutures): parse unrealizedPnl in parsePosition by [@shuxue6662-a11y](https://github.com/shuxue6662-a11y) in [#29937](https://github.com/ccxt/ccxt/pull/29937)
* fix(binance): deduplicate and merge keepAliveStockListenKey into keepAliveListenKey by [@kroitor](https://github.com/kroitor) in [#29908](https://github.com/ccxt/ccxt/pull/29908)
* fix(krakenfutures): don't resolve watchPositions with empty list on malformed frame by [@shuxue6662-a11y](https://github.com/shuxue6662-a11y) in [#29943](https://github.com/ccxt/ccxt/pull/29943)
* fix(extended): stop account ws frames falling through to handleOrderBook by [@carlotestor](https://github.com/carlotestor) in [#29942](https://github.com/ccxt/ccxt/pull/29942)
* fix(binance): guard option and stock from the linear/inverse rewrite in authenticate by [@kroitor](https://github.com/kroitor) in [#29946](https://github.com/ccxt/ccxt/pull/29946)
* perf(pro): speed up ArrayCache append hot path -63%..-93% by [@carlotestor](https://github.com/carlotestor) in [#29945](https://github.com/ccxt/ccxt/pull/29945)
* refactor(binance)!: fold authenticateStock into authenticate by [@kroitor](https://github.com/kroitor) in [#29950](https://github.com/ccxt/ccxt/pull/29950)
* fix(cs): settle Future.reject once, under the resolve lock by [@kroitor](https://github.com/kroitor) in [#29951](https://github.com/ccxt/ccxt/pull/29951)
* fix(poloniex): TRC20 withdrawals must send network TRX, not TRON by [@rayBastard](https://github.com/rayBastard) in [#29954](https://github.com/ccxt/ccxt/pull/29954)
* ci: move language workflows back to GitHub-hosted runners by [@frosty00](https://github.com/frosty00) in [#29957](https://github.com/ccxt/ccxt/pull/29957)
* Revert "ci: move language workflows back to GitHub-hosted runners" by [@frosty00](https://github.com/frosty00) in [#29959](https://github.com/ccxt/ccxt/pull/29959)
* fix(build): go ws client casts panic when the transport hands a \*WSClient by [@carlosmiei](https://github.com/carlosmiei) in [#29962](https://github.com/ccxt/ccxt/pull/29962)
* fix(cs): normalize mixed numeric boxes in sortBy keys by [@kroitor](https://github.com/kroitor) in [#29964](https://github.com/ccxt/ccxt/pull/29964)
* fix(poloniex): map unified clientOrderId to clOrdId for swap orders by [@rayBastard](https://github.com/rayBastard) in [#29966](https://github.com/ccxt/ccxt/pull/29966)
* fix(phemex): apply amount precision to swap order quantity in createOrder by [@rayBastard](https://github.com/rayBastard) in [#29967](https://github.com/ccxt/ccxt/pull/29967)
* refactor(binance): centralize user-data type derivation in resolveAuthType by [@kroitor](https://github.com/kroitor) in [#29969](https://github.com/ccxt/ccxt/pull/29969)
* fix(krakenfutures): map open\_orders cancel reason to unified status by [@official-burak](https://github.com/official-burak) in [#29970](https://github.com/ccxt/ccxt/pull/29970)
* fix(kucoin): priceChgPct on contracts is a ratio, so scale it by [@mkzung](https://github.com/mkzung) in [#29918](https://github.com/ccxt/ccxt/pull/29918)
* fix(kraken): watchOHLCV returned strings in descending order by [@mkzung](https://github.com/mkzung) in [#29976](https://github.com/ccxt/ccxt/pull/29976)
* fix(toobit): strip the \_OPEN and \_CLOSE suffix from the order side by [@mkzung](https://github.com/mkzung) in [#29974](https://github.com/ccxt/ccxt/pull/29974)
* fix(foxbit): drop the misspelt fecthOrderBook capability flag by [@mkzung](https://github.com/mkzung) in [#29973](https://github.com/ccxt/ccxt/pull/29973)
* feat(base): ws auth single-flight primitives by [@kroitor](https://github.com/kroitor) in [#29903](https://github.com/ccxt/ccxt/pull/29903)
* fix(bitmex): the watchPositions flag is spelled watchPostions by [@mkzung](https://github.com/mkzung) in [#29972](https://github.com/ccxt/ccxt/pull/29972)
* refactor(binance): migrate authenticate to the singleFlight primitives by [@kroitor](https://github.com/kroitor) in [#29977](https://github.com/ccxt/ccxt/pull/29977)
* fix(aster): prevent concurrent ws auth races via base single-flight guard by [@kroitor](https://github.com/kroitor) in [#29984](https://github.com/ccxt/ccxt/pull/29984)
* fix(binance): reject the auth flight on an empty listenKey by [@kroitor](https://github.com/kroitor) in [#29986](https://github.com/ccxt/ccxt/pull/29986)
* fix(bingx): prevent concurrent ws auth races via base single-flight guard by [@kroitor](https://github.com/kroitor) in [#29987](https://github.com/ccxt/ccxt/pull/29987)
* test(exchange): exempt option markets from ticker percentage bounds by [@kroitor](https://github.com/kroitor) in [#29988](https://github.com/ccxt/ccxt/pull/29988)
* chore(tests): store JSON request fixture output as objects by [@carlotestor](https://github.com/carlotestor) in [#29980](https://github.com/ccxt/ccxt/pull/29980)
* fix(toobit): a reduce-only order was sent on the opposite side by [@mkzung](https://github.com/mkzung) in [#29982](https://github.com/ccxt/ccxt/pull/29982)
* perf(js): precise methods (version 1) by [@ttodua](https://github.com/ttodua) in [#29952](https://github.com/ccxt/ccxt/pull/29952)
* fix(phemex): correct fetchPositionsADLRank jsdoc name and unify scale getters by [@rayBastard](https://github.com/rayBastard) in [#29985](https://github.com/ccxt/ccxt/pull/29985)
* chore: remove this\[method] from rest side by [@carlosmiei](https://github.com/carlosmiei) in [#30003](https://github.com/ccxt/ccxt/pull/30003)
* revert(pro): drop Client.resolve pending-results queue by [@carlotestor](https://github.com/carlotestor) in [#30008](https://github.com/ccxt/ccxt/pull/30008)
* fix(java): guard WsClient futures/rejections with a monitor by [@carlotestor](https://github.com/carlotestor) in [#30004](https://github.com/ccxt/ccxt/pull/30004)
* fix(bitmex, cryptocom): watchPositions never resolves for a symbol-filtered subscription by [@mkzung](https://github.com/mkzung) in [#29981](https://github.com/ccxt/ccxt/pull/29981)
* fix(binance): load stock markets if in options by [@carlosmiei](https://github.com/carlosmiei) in [#30010](https://github.com/ccxt/ccxt/pull/30010)
* refactor(pro): inline the ws auth single-flight logic into authenticate() by [@carlotestor](https://github.com/carlotestor) in [#29992](https://github.com/ccxt/ccxt/pull/29992)
## New Contributors [#new-contributors-2]
* [@shuxue6662-a11y](https://github.com/shuxue6662-a11y) made their first contribution in [#29937](https://github.com/ccxt/ccxt/pull/29937)
* [@official-burak](https://github.com/official-burak) made their first contribution in [#29970](https://github.com/ccxt/ccxt/pull/29970)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.74...v4.5.75](https://github.com/ccxt/ccxt/compare/v4.5.74...v4.5.75)
[Changes][v4.5.75]
# [v4.5.74](https://github.com/ccxt/ccxt/releases/tag/v4.5.74) - 2026-08-17 [#v4574---2026-08-17]
## What's Changed [#whats-changed-4]
* test: add empty dict test by [@ttodua](https://github.com/ttodua) in [#29759](https://github.com/ccxt/ccxt/pull/29759)
* feat(okx): add fiat deposit and withdrawal endpoints by [@kroitor](https://github.com/kroitor) in [#29769](https://github.com/ccxt/ccxt/pull/29769)
* fix(doc): correct lighter sdk url by [@sc0Vu](https://github.com/sc0Vu) in [#29767](https://github.com/ccxt/ccxt/pull/29767)
* feat(woo): cancelAllOrders via DELETE /v3/trade/allOrders by [@rayBastard](https://github.com/rayBastard) in [#29763](https://github.com/ccxt/ccxt/pull/29763)
* feat(woofipro): add fetchOpenInterest and fetchOpenInterests by [@rayBastard](https://github.com/rayBastard) in [#29764](https://github.com/ccxt/ccxt/pull/29764)
* feat(xt): add fetchTradingFee and fetchTradingFees by [@rayBastard](https://github.com/rayBastard) in [#29765](https://github.com/ccxt/ccxt/pull/29765)
* test(whitebit): add fetchOpenOrders and fetchClosedOrders static fixtures by [@rayBastard](https://github.com/rayBastard) in [#29768](https://github.com/ccxt/ccxt/pull/29768)
* coinex error mapping by [@ndubel](https://github.com/ndubel) in [#29773](https://github.com/ccxt/ccxt/pull/29773)
* fix(ws): retain results resolved without a waiter in ts, php and cs clients by [@kroitor](https://github.com/kroitor) in [#29772](https://github.com/ccxt/ccxt/pull/29772)
* fix(tokocrypto): declare ticker/24hr as dual-shape like binance does by [@kroitor](https://github.com/kroitor) in [#29777](https://github.com/ccxt/ccxt/pull/29777)
* fix(cs): default indexed orderbook snapshot to an empty dict like its siblings by [@kroitor](https://github.com/kroitor) in [#29776](https://github.com/ccxt/ccxt/pull/29776)
* fix(cs): count any inbound ws frame as keepalive liveness by [@kroitor](https://github.com/kroitor) in [#29778](https://github.com/ccxt/ccxt/pull/29778)
* feat(weex): add createTriggerOrder via capi/v3/algoOrder by [@rayBastard](https://github.com/rayBastard) in [#29766](https://github.com/ccxt/ccxt/pull/29766)
* fix(bitrue): declare the dapi ticker and klines shapes like their fapi twins by [@kroitor](https://github.com/kroitor) in [#29780](https://github.com/ccxt/ccxt/pull/29780)
* fix(binance): declare the dual-shape ticker/price leaves per the api docs by [@kroitor](https://github.com/kroitor) in [#29781](https://github.com/ccxt/ccxt/pull/29781)
* feat(krakenfutures): add fetchTradingFees by [@rayBastard](https://github.com/rayBastard) in [#29779](https://github.com/ccxt/ccxt/pull/29779)
* feat(krakenfutures): add fetchLedger by [@rayBastard](https://github.com/rayBastard) in [#29782](https://github.com/ccxt/ccxt/pull/29782)
* fix(ci): guard against entry-point imports in exchange files by [@kroitor](https://github.com/kroitor) in [#29783](https://github.com/ccxt/ccxt/pull/29783)
* fix(weex): enable has flags for implemented unWatchOrderBook methods by [@rayBastard](https://github.com/rayBastard) in [#29784](https://github.com/ccxt/ccxt/pull/29784)
* test(whitebit): add fetchMyTrades and fetchOrderTrades static fixtures by [@rayBastard](https://github.com/rayBastard) in [#29785](https://github.com/ccxt/ccxt/pull/29785)
* fix(ci): run scoped live tests for first-time exchange integrations by [@kroitor](https://github.com/kroitor) in [#29787](https://github.com/ccxt/ccxt/pull/29787)
* fix(base): take the primary symbol from the selected symbols array in private tests by [@kroitor](https://github.com/kroitor) in [#29788](https://github.com/ccxt/ccxt/pull/29788)
* fix(base): pass the symbol variable instead of a string literal in leverage-tiers and margin-modes tests by [@kroitor](https://github.com/kroitor) in [#29789](https://github.com/ccxt/ccxt/pull/29789)
* fix(cli): prefer the local typescript sources over built artifacts so new integrations work without any build steps by [@kroitor](https://github.com/kroitor) in [#29790](https://github.com/ccxt/ccxt/pull/29790)
* fix(cli): correct the inverted partial-function check that reversed method arguments whenever --param was used by [@kroitor](https://github.com/kroitor) in [#29791](https://github.com/ccxt/ccxt/pull/29791)
* fix(cli): make --no-keys actually strip credentials loaded from the keys files by [@kroitor](https://github.com/kroitor) in [#29792](https://github.com/ccxt/ccxt/pull/29792)
* fix(cli): detect implicit api methods under the ts-sources loader when placing the params object by [@kroitor](https://github.com/kroitor) in [#29794](https://github.com/ccxt/ccxt/pull/29794)
* fix(krakenfutures): fix positions REST fail-open and WS crash regressions by [@pcriadoperez](https://github.com/pcriadoperez) in [#29713](https://github.com/ccxt/ccxt/pull/29713)
* fix(tokocrypto): unwrap data.list envelope in fetchOHLCV for non-USDT markets by [@pcriadoperez](https://github.com/pcriadoperez) in [#29664](https://github.com/ccxt/ccxt/pull/29664)
* chore: reuse go binary in the live-tests section by [@carlosmiei](https://github.com/carlosmiei) in [#29712](https://github.com/ccxt/ccxt/pull/29712)
* chore(tests): add static tests to Watch methods by [@carlosmiei](https://github.com/carlosmiei) in [#29795](https://github.com/ccxt/ccxt/pull/29795)
* chore: fix injectWsMessages sleep by [@carlosmiei](https://github.com/carlosmiei) in [#29797](https://github.com/ccxt/ccxt/pull/29797)
* fix(ci): exclude deleted files from scoped exchange collection by [@kroitor](https://github.com/kroitor) in [#29799](https://github.com/ccxt/ccxt/pull/29799)
* refactor: js prop optim by [@ttodua](https://github.com/ttodua) in [#29650](https://github.com/ccxt/ccxt/pull/29650)
* fix!(exmo): delist by [@ttodua](https://github.com/ttodua) in [#29796](https://github.com/ccxt/ccxt/pull/29796)
* fix(xt): regenerate implicit api to type step-rate endpoints by [@kroitor](https://github.com/kroitor) in [#29803](https://github.com/ccxt/ccxt/pull/29803)
* fix(go): compare numeric sort keys numerically in sortBy by [@kroitor](https://github.com/kroitor) in [#29802](https://github.com/ccxt/ccxt/pull/29802)
* test(whitebit): add deposit history static fixtures by [@rayBastard](https://github.com/rayBastard) in [#29810](https://github.com/ccxt/ccxt/pull/29810)
* feat(xt): add trailing stop order creation and cancellation by [@rayBastard](https://github.com/rayBastard) in [#29811](https://github.com/ccxt/ccxt/pull/29811)
* fix(nado): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#29808](https://github.com/ccxt/ccxt/pull/29808)
* docs(woo): add developer.woox.io as primary doc url by [@rayBastard](https://github.com/rayBastard) in [#29812](https://github.com/ccxt/ccxt/pull/29812)
* fix(bitstamp): accumulate currencies locally instead of a shared options scratch key by [@kroitor](https://github.com/kroitor) in [#29815](https://github.com/ccxt/ccxt/pull/29815)
* bitstamp parseOrder id fix by [@ndubel](https://github.com/ndubel) in [#29809](https://github.com/ccxt/ccxt/pull/29809)
* feat(lighter): add ws api by [@sc0Vu](https://github.com/sc0Vu) in [#29770](https://github.com/ccxt/ccxt/pull/29770)
* fix(go): mirror the javascript delete semantics on missing keys in remove by [@kroitor](https://github.com/kroitor) in [#29814](https://github.com/ccxt/ccxt/pull/29814)
* feat(kucoin): uta fetchPosition new response field updateTime by [@Dan-krm](https://github.com/Dan-krm) in [#29805](https://github.com/ccxt/ccxt/pull/29805)
* fix(deribit): read baseVolume from stats.volume and quoteVolume from stats.volume\_notional by [@mkzung](https://github.com/mkzung) in [#29807](https://github.com/ccxt/ccxt/pull/29807)
* fix(hashkey): omit the zero last price on dormant listings by [@kroitor](https://github.com/kroitor) in [#29816](https://github.com/ccxt/ccxt/pull/29816)
* test(whitebit): add fetchWithdrawals and fetchFundingHistory fixtures by [@rayBastard](https://github.com/rayBastard) in [#29817](https://github.com/ccxt/ccxt/pull/29817)
* refactor(woo): dedupe transfer and transaction status parsers by [@rayBastard](https://github.com/rayBastard) in [#29823](https://github.com/ccxt/ccxt/pull/29823)
* feat(xt): add trailing stop order fetching by [@rayBastard](https://github.com/rayBastard) in [#29818](https://github.com/ccxt/ccxt/pull/29818)
* fix(lbank): unmap the price band ratios from the absolute price limits by [@kroitor](https://github.com/kroitor) in [#29819](https://github.com/ccxt/ccxt/pull/29819)
* feat(xt): add trailing stop orders mass cancellation by [@rayBastard](https://github.com/rayBastard) in [#29826](https://github.com/ccxt/ccxt/pull/29826)
* test(whitebit): add transfer and fetchAccounts fixtures, fix fetchAcсounts parsing by [@rayBastard](https://github.com/rayBastard) in [#29824](https://github.com/ccxt/ccxt/pull/29824)
* test(whitebit): add deposit address static fixtures by [@rayBastard](https://github.com/rayBastard) in [#29831](https://github.com/ccxt/ccxt/pull/29831)
* chore(woo): audit network mappings against live token networks by [@rayBastard](https://github.com/rayBastard) in [#29827](https://github.com/ccxt/ccxt/pull/29827)
* fix(php): compare strictly against the filter value in filter by by [@kroitor](https://github.com/kroitor) in [#29829](https://github.com/ccxt/ccxt/pull/29829)
* refactor(xt): replace safeValue with typed safe methods by [@rayBastard](https://github.com/rayBastard) in [#29833](https://github.com/ccxt/ccxt/pull/29833)
* test(whitebit): add setLeverage, fetchBorrowInterest, fetchStatus and withdraw fixtures by [@rayBastard](https://github.com/rayBastard) in [#29836](https://github.com/ccxt/ccxt/pull/29836)
* chore(woo): remove dead v2 api section by [@rayBastard](https://github.com/rayBastard) in [#29835](https://github.com/ccxt/ccxt/pull/29835)
* test(xt): remove stale loadMarkets taker/maker skips by [@rayBastard](https://github.com/rayBastard) in [#29837](https://github.com/ccxt/ccxt/pull/29837)
* test(whitebit): add fetchTradingFees static fixtures by [@rayBastard](https://github.com/rayBastard) in [#29844](https://github.com/ccxt/ccxt/pull/29844)
* fix(xt): throw NotSupported for market-type guards instead of BadSymbol by [@rayBastard](https://github.com/rayBastard) in [#29845](https://github.com/ccxt/ccxt/pull/29845)
* fix(alpaca): quoteVolume was the trade count by [@mkzung](https://github.com/mkzung) in [#29841](https://github.com/ccxt/ccxt/pull/29841)
* chore: add ws static tests to different exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#29800](https://github.com/ccxt/ccxt/pull/29800)
* fix(toobit): scale swap baseVolume from contracts to base units by [@mkzung](https://github.com/mkzung) in [#29842](https://github.com/ccxt/ccxt/pull/29842)
* fix(delta): read spot quoteVolume from turnover\_usd, not the base-denominated turnover by [@mkzung](https://github.com/mkzung) in [#29840](https://github.com/ccxt/ccxt/pull/29840)
* feat(woofipro): add margin mode and position margin methods by [@rayBastard](https://github.com/rayBastard) in [#29821](https://github.com/ccxt/ccxt/pull/29821)
* perf(transpile): skip impossible base-method renames by [@carlotestor](https://github.com/carlotestor) in [#29854](https://github.com/ccxt/ccxt/pull/29854)
* fix(bitget): price24hPcnt is a ratio, so scale it to a percentage by [@mkzung](https://github.com/mkzung) in [#29857](https://github.com/ccxt/ccxt/pull/29857)
* fix(hashkey): scale swap baseVolume from contracts to base units by [@mkzung](https://github.com/mkzung) in [#29851](https://github.com/ccxt/ccxt/pull/29851)
* fix(poloniex): scale swap baseVolume from contracts to base units by [@mkzung](https://github.com/mkzung) in [#29852](https://github.com/ccxt/ccxt/pull/29852)
* fix(upbit): signed\_change\_rate is a ratio, so scale it to a percentage by [@mkzung](https://github.com/mkzung) in [#29855](https://github.com/ccxt/ccxt/pull/29855)
* fix(toobit): 'pcp' is a ratio, so scale it to a percentage by [@mkzung](https://github.com/mkzung) in [#29856](https://github.com/ccxt/ccxt/pull/29856)
* fix!(bybit): fetchOrders classic accounts removal by [@ttodua](https://github.com/ttodua) in [#29847](https://github.com/ccxt/ccxt/pull/29847)
* perf(python): drop redundant OrderBookSide **getitem** override and hoist hot lookups -23% by [@carlotestor](https://github.com/carlotestor) in [#29858](https://github.com/ccxt/ccxt/pull/29858)
* perf(php): drop exchangeArray on OrderBookSide update -31% by [@carlotestor](https://github.com/carlotestor) in [#29862](https://github.com/ccxt/ccxt/pull/29862)
* fix(test): tolerate quote-side rounding in the ticker volume identity by [@kroitor](https://github.com/kroitor) in [#29865](https://github.com/ccxt/ccxt/pull/29865)
* test(pro): pick most-active market for watchOrderBook live tests by [@carlotestor](https://github.com/carlotestor) in [#29875](https://github.com/ccxt/ccxt/pull/29875)
* perf(go): bound OrderBookSide index memmove -12% by [@carlotestor](https://github.com/carlotestor) in [#29861](https://github.com/ccxt/ccxt/pull/29861)
* perf(java): skip BigDecimal for the order book amount field -43% by [@carlotestor](https://github.com/carlotestor) in [#29860](https://github.com/ccxt/ccxt/pull/29860)
* fix(pro): python ArrayCache tuple index, max\_size=0, and clear() reset by [@carlotestor](https://github.com/carlotestor) in [#29870](https://github.com/ccxt/ccxt/pull/29870)
* fix(binance): single-flight ws auth via existing client futures by [@carlotestor](https://github.com/carlotestor) in [#29878](https://github.com/ccxt/ccxt/pull/29878)
* refactor(pro): type-hint Python ArrayCache by [@carlotestor](https://github.com/carlotestor) in [#29877](https://github.com/ccxt/ccxt/pull/29877)
* fix(tests): stop ws OHLCV live tests requesting sub-minute candles by [@carlotestor](https://github.com/carlotestor) in [#29880](https://github.com/ccxt/ccxt/pull/29880)
* fix(pro): php ArrayCache field-merge, two-field match, and clear() by [@carlotestor](https://github.com/carlotestor) in [#29871](https://github.com/ccxt/ccxt/pull/29871)
* fix(pro): reset ArrayCache maps on clear and stop short-OHLCV stale tails by [@carlotestor](https://github.com/carlotestor) in [#29869](https://github.com/ccxt/ccxt/pull/29869)
* refactor(pro): python ArrayCache seen\_updates\_by\_symbol for int counts by [@carlotestor](https://github.com/carlotestor) in [#29884](https://github.com/ccxt/ccxt/pull/29884)
* fix(pro): csharp ArrayCacheByTimestamp eviction and in-place merge by [@carlotestor](https://github.com/carlotestor) in [#29872](https://github.com/ccxt/ccxt/pull/29872)
* fix(pro): java ArrayCache hashmap, getLimit, BySide, and move-to-end by [@carlotestor](https://github.com/carlotestor) in [#29873](https://github.com/ccxt/ccxt/pull/29873)
* perf(cs): single-lock OrderBookSide bisect -61% and atomic Copy() by [@carlotestor](https://github.com/carlotestor) in [#29859](https://github.com/ccxt/ccxt/pull/29859)
* fix(htx): fetchStatus via live endpoints, drop the dead statuspage hosts by [@kroitor](https://github.com/kroitor) in [#29876](https://github.com/ccxt/ccxt/pull/29876)
* fix(krakenfutures): populate market maker/taker so parseTrade computes fees by [@rayBastard](https://github.com/rayBastard) in [#29881](https://github.com/ccxt/ccxt/pull/29881)
* fix(toobit): send amount for market sell orders by [@rayBastard](https://github.com/rayBastard) in [#29885](https://github.com/ccxt/ccxt/pull/29885)
* test(pro): add single-flight base ws unit test via client.future by [@carlotestor](https://github.com/carlotestor) in [#29891](https://github.com/ccxt/ccxt/pull/29891)
* fix(toobit): correct fetchLeverage response parsing and marginMode by [@rayBastard](https://github.com/rayBastard) in [#29893](https://github.com/ccxt/ccxt/pull/29893)
* fix(php): let ClientTrait spawn and delay take over in the async exchange by [@kroitor](https://github.com/kroitor) in [#29897](https://github.com/ccxt/ccxt/pull/29897)
* docs(contributing): require language mirrors for base ws runtime changes by [@kroitor](https://github.com/kroitor) in [#29898](https://github.com/ccxt/ccxt/pull/29898)
* fix(build): repair broken Python, PHP and Go base builds on master by [@carlotestor](https://github.com/carlotestor) in [#29895](https://github.com/ccxt/ccxt/pull/29895)
* fix(pro): store Go ArrayCache counts as ints with seenUpdatesBySymbol by [@carlotestor](https://github.com/carlotestor) in [#29900](https://github.com/ccxt/ccxt/pull/29900)
* test(java): point the connect-atomicity storm at a blackhole address by [@kroitor](https://github.com/kroitor) in [#29904](https://github.com/ccxt/ccxt/pull/29904)
* fix(pro): count the global and the symbol getLimit scopes independently by [@kroitor](https://github.com/kroitor) in [#29905](https://github.com/ccxt/ccxt/pull/29905)
* fix: route OKX RPI order book updates by [@mvanhorn](https://github.com/mvanhorn) in [#29886](https://github.com/ccxt/ccxt/pull/29886)
* fix(latoken): drop non-positive book levels and skip the stale-ticker median check by [@kroitor](https://github.com/kroitor) in [#29906](https://github.com/ccxt/ccxt/pull/29906)
* fix(bit2c): drop dead zero-amount orders from the full book snapshot by [@kroitor](https://github.com/kroitor) in [#29907](https://github.com/ccxt/ccxt/pull/29907)
* fix(binance): skip stocks endpoint if apiKey is "" by [@carlosmiei](https://github.com/carlosmiei) in [#29909](https://github.com/ccxt/ccxt/pull/29909)
* fix(bybit): fetchCrossBorrowRate by [@carlosmiei](https://github.com/carlosmiei) in [#29912](https://github.com/ccxt/ccxt/pull/29912)
* fix(poloniex): remove obsolete swap OHLCV timeframe restrictions by [@rayBastard](https://github.com/rayBastard) in [#29911](https://github.com/ccxt/ccxt/pull/29911)
* fix(toobit): convert network code to exchange id in withdraw() by [@rayBastard](https://github.com/rayBastard) in [#29910](https://github.com/ccxt/ccxt/pull/29910)
* chore: fix abstract by [@carlosmiei](https://github.com/carlosmiei) in [#29913](https://github.com/ccxt/ccxt/pull/29913)
* BTSE integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#27862](https://github.com/ccxt/ccxt/pull/27862)
* chore: fix ws npm comamnd by [@carlosmiei](https://github.com/carlosmiei) in [#29916](https://github.com/ccxt/ccxt/pull/29916)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.73...v4.5.74](https://github.com/ccxt/ccxt/compare/v4.5.73...v4.5.74)
[Changes][v4.5.74]
# [v4.5.73](https://github.com/ccxt/ccxt/releases/tag/v4.5.73) - 2026-08-11 [#v4573---2026-08-11]
## What's Changed [#whats-changed-5]
* fix(binance): watchOrderBook market resolving by [@carlosmiei](https://github.com/carlosmiei) in [#29762](https://github.com/ccxt/ccxt/pull/29762)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.72...v4.5.73](https://github.com/ccxt/ccxt/compare/v4.5.72...v4.5.73)
[Changes][v4.5.73]
# [v4.5.72](https://github.com/ccxt/ccxt/releases/tag/v4.5.72) - 2026-08-11 [#v4572---2026-08-11]
## What's Changed [#whats-changed-6]
* fix(playground): make AI-inserted code runnable in Go, PHP and Java by [@carlotestor](https://github.com/carlotestor) in [#29529](https://github.com/ccxt/ccxt/pull/29529)
* build(deps-dev): bump fast-uri from 3.1.4 to 3.1.5 in /docs/website by [@dependabot](https://github.com/dependabot)\[bot] in [#29527](https://github.com/ccxt/ccxt/pull/29527)
* build(deps): bump undici from 7.28.0 to 7.29.0 in /docs/playground by [@dependabot](https://github.com/dependabot)\[bot] in [#29526](https://github.com/ccxt/ccxt/pull/29526)
* fix(go): contractSize generated type by [@carlosmiei](https://github.com/carlosmiei) in [#29530](https://github.com/ccxt/ccxt/pull/29530)
* fix(docs): brand mark → ccxt.com; AI private snippets use dummy apiKey/secret by [@carlotestor](https://github.com/carlotestor) in [#29532](https://github.com/ccxt/ccxt/pull/29532)
* feat(docs/playground): refresh next to You clears chat and shows new prompts by [@carlotestor](https://github.com/carlotestor) in [#29534](https://github.com/ccxt/ccxt/pull/29534)
* commit docs-fumadocs workflow by [@frosty00](https://github.com/frosty00) in [#29535](https://github.com/ccxt/ccxt/pull/29535)
* fix(docs): brand mark same-tab to ccxt.com + public/private API memo by [@carlotestor](https://github.com/carlotestor) in [#29533](https://github.com/ccxt/ccxt/pull/29533)
* fix(docs/playground): include OKX/\{hostname} API hosts in egress allowlist by [@carlotestor](https://github.com/carlotestor) in [#29537](https://github.com/ccxt/ccxt/pull/29537)
* fix(docs): remove target=\_blank from CCXT brand mark (slots.navTitle) by [@carlotestor](https://github.com/carlotestor) in [#29538](https://github.com/ccxt/ccxt/pull/29538)
* fix(docs): make slots.navTitle a client component (RSC-safe) by [@carlotestor](https://github.com/carlotestor) in [#29539](https://github.com/ccxt/ccxt/pull/29539)
* fix(bullish): set `has.future` true by [@ttodua](https://github.com/ttodua) in [#29540](https://github.com/ccxt/ccxt/pull/29540)
* fix(playground): unblock AI scroll while streaming + auto-insert code by [@carlotestor](https://github.com/carlotestor) in [#29542](https://github.com/ccxt/ccxt/pull/29542)
* python: raise cryptography and aiohttp floors (4 Dependabot alerts) by [@kroitor](https://github.com/kroitor) in [#29543](https://github.com/ccxt/ccxt/pull/29543)
* build - per-file tsc lane honors tsconfig.json (extends shim) by [@kroitor](https://github.com/kroitor) in [#29544](https://github.com/ccxt/ccxt/pull/29544)
* php - fix array/string transpile confusions breaking the php test lane by [@kroitor](https://github.com/kroitor) in [#29546](https://github.com/ccxt/ccxt/pull/29546)
* fix(woofipro): parse order filled from executed\_quantity, compute remaining in base units by [@rayBastard](https://github.com/rayBastard) in [#29545](https://github.com/ccxt/ccxt/pull/29545)
* fix(coinbaseinternational): set `has.future` false by [@ttodua](https://github.com/ttodua) in [#29541](https://github.com/ccxt/ccxt/pull/29541)
* fix(xt): doc links by [@rayBastard](https://github.com/rayBastard) in [#29536](https://github.com/ccxt/ccxt/pull/29536)
* derive - migrate ws watchTicker to the ticker\_slim channel by [@kroitor](https://github.com/kroitor) in [#29547](https://github.com/ccxt/ccxt/pull/29547)
* grvt - send content-type on public json POSTs (fixes loadMarkets 400) by [@kroitor](https://github.com/kroitor) in [#29548](https://github.com/ccxt/ccxt/pull/29548)
* tests - networksById dict assert tolerates php int-coerced numeric keys by [@kroitor](https://github.com/kroitor) in [#29549](https://github.com/ccxt/ccxt/pull/29549)
* tests - move the ticker percentage validator out of the sync-shared php file by [@kroitor](https://github.com/kroitor) in [#29550](https://github.com/ccxt/ccxt/pull/29550)
* fix(ci): rebuild cs from clean state in live tests by [@kroitor](https://github.com/kroitor) in [#29551](https://github.com/ccxt/ccxt/pull/29551)
* test(exchange): relax ticker strictness for locked books and meme pumps by [@kroitor](https://github.com/kroitor) in [#29552](https://github.com/ccxt/ccxt/pull/29552)
* fix(bitfinex): tolerate numeric network ids in currency parsing by [@kroitor](https://github.com/kroitor) in [#29553](https://github.com/ccxt/ccxt/pull/29553)
* fix(bitrue): skip entries without a symbol in fetchTickers by [@kroitor](https://github.com/kroitor) in [#29554](https://github.com/ccxt/ccxt/pull/29554)
* fix(bitfinex): fetchOHLCV without since should return latest candles by [@kroitor](https://github.com/kroitor) in [#29555](https://github.com/ccxt/ccxt/pull/29555)
* fix(phemex): send mandatory from param and fix until scale in fetchOHLCV by [@kroitor](https://github.com/kroitor) in [#29556](https://github.com/ccxt/ccxt/pull/29556)
* fix(indodax): apply costToPrecision to limit buy total by [@kroitor](https://github.com/kroitor) in [#29557](https://github.com/ccxt/ccxt/pull/29557)
* fix(bithumb): encode spaces as + in signed body for auth compatibility by [@kroitor](https://github.com/kroitor) in [#29558](https://github.com/ccxt/ccxt/pull/29558)
* fix(hyperliquid): populate stopLossPrice and takeProfitPrice for trigger orders by [@kroitor](https://github.com/kroitor) in [#29559](https://github.com/ccxt/ccxt/pull/29559)
* fix(xt): align fetchOHLCV startTime up to candle boundary for exact pagination by [@kroitor](https://github.com/kroitor) in [#29560](https://github.com/ccxt/ccxt/pull/29560)
* fix(base): add [@vite-ignore](https://github.com/vite-ignore) hint to dynamicImport for optional proxy agents by [@kroitor](https://github.com/kroitor) in [#29561](https://github.com/ccxt/ccxt/pull/29561)
* fix(base): anchor deterministic pagination at since for fully-historical ranges by [@kroitor](https://github.com/kroitor) in [#29562](https://github.com/ccxt/ccxt/pull/29562)
* feat(gate): add paginate support to fetchClosedOrders by [@kroitor](https://github.com/kroitor) in [#29564](https://github.com/ccxt/ccxt/pull/29564)
* docs(gate): document params.paginate on fetchClosedOrders by [@kroitor](https://github.com/kroitor) in [#29565](https://github.com/ccxt/ccxt/pull/29565)
* test(exchange): skip quoteVolume identity for inverse contracts in ticker validation by [@kroitor](https://github.com/kroitor) in [#29566](https://github.com/ccxt/ccxt/pull/29566)
* chore(tests): remove orphan static currency fixtures for delisted exchanges by [@kroitor](https://github.com/kroitor) in [#29567](https://github.com/ccxt/ccxt/pull/29567)
* feat(bybit): add flexible-available-inventory to implicit api by [@kroitor](https://github.com/kroitor) in [#29569](https://github.com/ccxt/ccxt/pull/29569)
* docs(manual): remove nonexistent fetchBorrowRatesPerSymbol from borrow rates section by [@kroitor](https://github.com/kroitor) in [#29570](https://github.com/ccxt/ccxt/pull/29570)
* refactor(build): stop re-emitting parent endpoints in derived Go \_api.go files by [@carlotestor](https://github.com/carlotestor) in [#29575](https://github.com/ccxt/ccxt/pull/29575)
* docs(coinbase, coinbaseexchange): disambiguate the two classes in class-level docs by [@kroitor](https://github.com/kroitor) in [#29579](https://github.com/ccxt/ccxt/pull/29579)
* feat(base): add Status and PositionModeInfo types for fetchStatus/fetchPositionMode by [@carlotestor](https://github.com/carlotestor) in [#29576](https://github.com/ccxt/ccxt/pull/29576)
* types(ts): converge return annotations on divergent exchange helper methods by [@carlotestor](https://github.com/carlotestor) in [#29577](https://github.com/ccxt/ccxt/pull/29577)
* fix(woofipro): TP/SL child orders lost in PHP/Go — untyped fallback + array aliasing by [@rayBastard](https://github.com/rayBastard) in [#29572](https://github.com/ccxt/ccxt/pull/29572)
* feat(base): add MarginLoan type and annotate borrow/repay margin returns by [@carlotestor](https://github.com/carlotestor) in [#29581](https://github.com/ccxt/ccxt/pull/29581)
* types(base): annotate honest return types for cancelUnifiedOrder, watchFundingRatesForSymbols and bitvavo ws transaction methods by [@carlotestor](https://github.com/carlotestor) in [#29583](https://github.com/ccxt/ccxt/pull/29583)
* fix(woofipro): parseBalance frozen field mapped to unified used by [@rayBastard](https://github.com/rayBastard) in [#29585](https://github.com/ccxt/ccxt/pull/29585)
* fix(alpaca): route deposit and withdrawal history through account activities in sandbox mode by [@kroitor](https://github.com/kroitor) in [#29589](https://github.com/ccxt/ccxt/pull/29589)
* feat(luno): add fetchDepositWithdrawFee via the send\_fee endpoint by [@kroitor](https://github.com/kroitor) in [#29590](https://github.com/ccxt/ccxt/pull/29590)
* fix(whitebit): remove fetchCrossBorrowRate returning lending plan rates by [@rayBastard](https://github.com/rayBastard) in [#29584](https://github.com/ccxt/ccxt/pull/29584)
* feat(indodax): add fetchDepositWithdrawFee via the tapi withdrawFee method by [@kroitor](https://github.com/kroitor) in [#29591](https://github.com/ccxt/ccxt/pull/29591)
* docs(coinbase): document CDP key instantiation in the class description by [@kroitor](https://github.com/kroitor) in [#29592](https://github.com/ccxt/ccxt/pull/29592)
* fix(hyperliquid): route spot USDC sub-account transfers through subAccountSpotTransfer by [@kroitor](https://github.com/kroitor) in [#29593](https://github.com/ccxt/ccxt/pull/29593)
* feat(hyperliquid): watchTicker via per-coin activeAssetCtx channel by [@kroitor](https://github.com/kroitor) in [#29594](https://github.com/ccxt/ccxt/pull/29594)
* fix(java): WsOrderBook implements Map — shared WS orderbook structure tests by [@kroitor](https://github.com/kroitor) in [#29596](https://github.com/ccxt/ccxt/pull/29596)
* fix(lbank): NotSupported for swap symbols in ws watch methods by [@kroitor](https://github.com/kroitor) in [#29597](https://github.com/ccxt/ccxt/pull/29597)
* fix(hyperliquid): per-user subscribeHash for watchOrders/watchMyTrades, non-fatal 'Already subscribed' by [@kroitor](https://github.com/kroitor) in [#29598](https://github.com/ccxt/ccxt/pull/29598)
* fix(bitget): set info on ws balance structure for REST parity by [@kroitor](https://github.com/kroitor) in [#29599](https://github.com/ccxt/ccxt/pull/29599)
* fix(go,java): ws orderbook map-view fixes — Go InOp OrderBookInterface case, Java entrySet snapshot by [@kroitor](https://github.com/kroitor) in [#29600](https://github.com/ccxt/ccxt/pull/29600)
* fix(bybit): parseOrder amount for spot market buys (qty is quote-denominated) by [@kroitor](https://github.com/kroitor) in [#29602](https://github.com/ccxt/ccxt/pull/29602)
* fix(php): ws OrderBook.reset phantom index sentinels corrupt books under limit() by [@kroitor](https://github.com/kroitor) in [#29603](https://github.com/ccxt/ccxt/pull/29603)
* fix(networks): rename ARBONE to ARBITRUM, ARBNOVA to ARBITRUM\_NOVA by [@ttodua](https://github.com/ttodua) in [#29601](https://github.com/ccxt/ccxt/pull/29601)
* fix(woofipro): drop stray type param from setPositionsCache signature by [@rayBastard](https://github.com/rayBastard) in [#29604](https://github.com/ccxt/ccxt/pull/29604)
* feat(xt): add fetchOpenInterest by [@rayBastard](https://github.com/rayBastard) in [#29607](https://github.com/ccxt/ccxt/pull/29607)
* fix(build): keep Go IExchange in lockstep after late base-wrapper rewrite by [@carlotestor](https://github.com/carlotestor) in [#29606](https://github.com/ccxt/ccxt/pull/29606)
* fix(gate,bybit,bitget): network code unification one-liners from [#23989](https://github.com/ccxt/ccxt/issues/23989) by [@kroitor](https://github.com/kroitor) in [#29610](https://github.com/ccxt/ccxt/pull/29610)
* docs(woofipro): update Orderly doc links to new URL structure by [@rayBastard](https://github.com/rayBastard) in [#29611](https://github.com/ccxt/ccxt/pull/29611)
* feat(xt): add swap support to fetchBidsAsks by [@rayBastard](https://github.com/rayBastard) in [#29609](https://github.com/ccxt/ccxt/pull/29609)
* chore: remove fast build from cs.yml by [@carlosmiei](https://github.com/carlosmiei) in [#29614](https://github.com/ccxt/ccxt/pull/29614)
* fix(java): WsOrderBook.get missing the cache key, NPE in snapshot-buffering ws handlers by [@kroitor](https://github.com/kroitor) in [#29620](https://github.com/ccxt/ccxt/pull/29620)
* feat(gate): watchOrders trigger-order support (spot.priceorders / futures.autoorders) by [@kroitor](https://github.com/kroitor) in [#29612](https://github.com/ccxt/ccxt/pull/29612)
* mexc new endpoint by [@ndubel](https://github.com/ndubel) in [#29621](https://github.com/ccxt/ccxt/pull/29621)
* fix(kucoinfutures): route no-limit fetchOrderBook to the full L2 snapshot by [@kroitor](https://github.com/kroitor) in [#29624](https://github.com/ccxt/ccxt/pull/29624)
* docs(pro): binance multi-account watchOrders setup by [@kroitor](https://github.com/kroitor) in [#29625](https://github.com/ccxt/ccxt/pull/29625)
* fix(bingx): allow base quantity for spot trigger-market sells by [@AresArtemius](https://github.com/AresArtemius) in [#29626](https://github.com/ccxt/ccxt/pull/29626)
* fix(Exchange.ts): add default user-agent by [@carlosmiei](https://github.com/carlosmiei) in [#29631](https://github.com/ccxt/ccxt/pull/29631)
* feat(binance): new prediction by [@sc0Vu](https://github.com/sc0Vu) in [#29232](https://github.com/ccxt/ccxt/pull/29232)
* chore: cancel-in-progress set to true by [@carlosmiei](https://github.com/carlosmiei) in [#29633](https://github.com/ccxt/ccxt/pull/29633)
* chore: upgrade cancel-in-progress by [@carlosmiei](https://github.com/carlosmiei) in [#29635](https://github.com/ccxt/ccxt/pull/29635)
* chore: add retry pushback logic by [@carlosmiei](https://github.com/carlosmiei) in [#29636](https://github.com/ccxt/ccxt/pull/29636)
* chore(deps-dev): bump js-yaml from 4.3.0 to 4.3.1 by [@dependabot](https://github.com/dependabot)\[bot] in [#29634](https://github.com/ccxt/ccxt/pull/29634)
* bitget fetchBalance, transfer v3 by [@ndubel](https://github.com/ndubel) in [#29617](https://github.com/ccxt/ccxt/pull/29617)
* fix(binance): option-market watch calls fail fast instead of silently hanging by [@kroitor](https://github.com/kroitor) in [#29629](https://github.com/ccxt/ccxt/pull/29629)
* feat(whitebit): support timeInForce IOC and PO in createOrder by [@rayBastard](https://github.com/rayBastard) in [#29608](https://github.com/ccxt/ccxt/pull/29608)
* fix(build): wire OrderBooks POJO + Market/Currency aliases for Java typed returns by [@carlotestor](https://github.com/carlotestor) in [#29639](https://github.com/ccxt/ccxt/pull/29639)
* fix(exchange): guard fire-and-forget spawn rejections by [@kroitor](https://github.com/kroitor) in [#29641](https://github.com/ccxt/ccxt/pull/29641)
* refactor(ts): replace any/unknown variable types with honest domain types by [@carlotestor](https://github.com/carlotestor) in [#29622](https://github.com/ccxt/ccxt/pull/29622)
* refactor(base): List-only parse\* params + multi-lang implicit API return shapes by [@carlotestor](https://github.com/carlotestor) in [#29645](https://github.com/ccxt/ccxt/pull/29645)
* test: validation of market types by [@ttodua](https://github.com/ttodua) in [#29055](https://github.com/ccxt/ccxt/pull/29055)
* feat(cs): typed Task implicit API returns without silent body drops by [@carlotestor](https://github.com/carlotestor) in [#29648](https://github.com/ccxt/ccxt/pull/29648)
* feat(foxbit): add X-FB-CLIENT identification headers by [@matheus-alcuri-foxbit](https://github.com/matheus-alcuri-foxbit) in [#29646](https://github.com/ccxt/ccxt/pull/29646)
* perf(base): speed up number.ts helpers (decimalToPrecision, numberToString, precisionFromString) by [@carlotestor](https://github.com/carlotestor) in [#29652](https://github.com/ccxt/ccxt/pull/29652)
* build(php): emit hybrid async PHP without the nested `function () use (...)` closure by [@carlotestor](https://github.com/carlotestor) in [#29651](https://github.com/ccxt/ccxt/pull/29651)
* perf(python): speed up decimal\_to\_precision by [@carlotestor](https://github.com/carlotestor) in [#29654](https://github.com/ccxt/ccxt/pull/29654)
* perf(go): speed up DecimalToPrecision helpers by [@carlotestor](https://github.com/carlotestor) in [#29656](https://github.com/ccxt/ccxt/pull/29656)
* perf(cs): speed up DecimalToPrecision helpers by [@carlotestor](https://github.com/carlotestor) in [#29655](https://github.com/ccxt/ccxt/pull/29655)
* perf(php): speed up decimalToPrecision helpers by [@carlotestor](https://github.com/carlotestor) in [#29657](https://github.com/ccxt/ccxt/pull/29657)
* fix(go): declare GetCcxtVersion on BaseExchange so go/v4/prediction builds again by [@carlotestor](https://github.com/carlotestor) in [#29658](https://github.com/ccxt/ccxt/pull/29658)
* perf(java): speed up decimalToPrecision helpers by [@carlotestor](https://github.com/carlotestor) in [#29659](https://github.com/ccxt/ccxt/pull/29659)
* feat(opinion): opinion integration by [@rayBastard](https://github.com/rayBastard) in [#29329](https://github.com/ccxt/ccxt/pull/29329)
* feat: add contact and about-us pages to website by [@carlosmiei](https://github.com/carlosmiei) in [#29660](https://github.com/ccxt/ccxt/pull/29660)
* feat(ws): reconnect backoff — exponential, jittered, capped — across all runtimes by [@kroitor](https://github.com/kroitor) in [#29627](https://github.com/ccxt/ccxt/pull/29627)
* fix(whitebit): correct contractSize for swap markets by [@rayBastard](https://github.com/rayBastard) in [#29649](https://github.com/ccxt/ccxt/pull/29649)
* fix(luno): correct trading fees - categorical schedule and volume tiers by [@nikoloooodeon](https://github.com/nikoloooodeon) in [#29619](https://github.com/ccxt/ccxt/pull/29619)
* refactor(whitebit): remove unreachable duplicate timeout check in can… by [@rayBastard](https://github.com/rayBastard) in [#29661](https://github.com/ccxt/ccxt/pull/29661)
* chore(deps-dev): bump js-yaml from 4.3.0 to 4.3.1 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#29662](https://github.com/ccxt/ccxt/pull/29662)
* feat(binance): add eOptions WebSocket support by [@lucasjamar](https://github.com/lucasjamar) in [#27982](https://github.com/ccxt/ccxt/pull/27982)
* fix(whitebit): repair watchBalance subscription and multi-currency updates by [@rayBastard](https://github.com/rayBastard) in [#29665](https://github.com/ccxt/ccxt/pull/29665)
* fix(docs): bump nanoid to 3.3.18 for GHSA-2v37-7h3g-55p8 by [@kroitor](https://github.com/kroitor) in [#29666](https://github.com/ccxt/ccxt/pull/29666)
* fix(deps): bump nanoid to 3.3.18 in remaining lockfiles (GHSA-2v37-7h3g-55p8) by [@kroitor](https://github.com/kroitor) in [#29668](https://github.com/ccxt/ccxt/pull/29668)
* feat(weex): sandbox mode via demo-trading /sim/ endpoints by [@rayBastard](https://github.com/rayBastard) in [#29628](https://github.com/ccxt/ccxt/pull/29628)
* fix(bitget): derive spot marginModes per-symbol from v2/margin/currencies availability fields by [@kroitor](https://github.com/kroitor) in [#29671](https://github.com/ccxt/ccxt/pull/29671)
* fix(okx): correct borrow rate period - hourly for cross, annualized for history by [@kroitor](https://github.com/kroitor) in [#29670](https://github.com/ccxt/ccxt/pull/29670)
* fix: fix method name as argument by [@carlosmiei](https://github.com/carlosmiei) in [#29672](https://github.com/ccxt/ccxt/pull/29672)
* feat(transpile) - auto-populating the .has tree by [@ttodua](https://github.com/ttodua) in [#24252](https://github.com/ccxt/ccxt/pull/24252)
* docs: document optional balance structure keys (timestamp, datetime, debt) by [@kroitor](https://github.com/kroitor) in [#29676](https://github.com/ccxt/ccxt/pull/29676)
* fix(cs): refresh timestamp inside ws PingLoop - pong-timeout check was frozen by [@kroitor](https://github.com/kroitor) in [#29679](https://github.com/ccxt/ccxt/pull/29679)
* fix(java): make ws connect() atomic with the onError future swap by [@kroitor](https://github.com/kroitor) in [#29680](https://github.com/ccxt/ccxt/pull/29680)
* fix(java): zero-arg varargs call in ImplicitApi example instead of bare null by [@kroitor](https://github.com/kroitor) in [#29681](https://github.com/ccxt/ccxt/pull/29681)
* chore(deps): bump ast-transpiler to pick up the java trailing-null varargs fix by [@kroitor](https://github.com/kroitor) in [#29682](https://github.com/ccxt/ccxt/pull/29682)
* fix(mudrex,mexc,bullish): hoist array .length out of conditionals + fix offset concat (php transpile) by [@kroitor](https://github.com/kroitor) in [#29684](https://github.com/ccxt/ccxt/pull/29684)
* chore(deps): re-bump ast-transpiler - the varargs fix needed a dist rebuild to take effect by [@kroitor](https://github.com/kroitor) in [#29685](https://github.com/ccxt/ccxt/pull/29685)
* fix(woo): switch editOrder to PUT /v3/trade/order and /v3/trade/algoOrder by [@rayBastard](https://github.com/rayBastard) in [#29623](https://github.com/ccxt/ccxt/pull/29623)
* fix(deps): bump ast-transpiler - required-parameter gate unbreaks the java lane by [@kroitor](https://github.com/kroitor) in [#29686](https://github.com/ccxt/ccxt/pull/29686)
* fix(deps): bump ast-transpiler - covariance-safe as-string\[] emission for the cs ws test lane by [@kroitor](https://github.com/kroitor) in [#29687](https://github.com/ccxt/ccxt/pull/29687)
* test(whitebit): add negative-precision market to fetchMarkets fixtures by [@rayBastard](https://github.com/rayBastard) in [#29691](https://github.com/ccxt/ccxt/pull/29691)
* fix(whitebit): backfill lowercaseId in the PEPE\_PERP static fixture - cs Id Tests reject null by [@kroitor](https://github.com/kroitor) in [#29692](https://github.com/ccxt/ccxt/pull/29692)
* fix(deps): bump ast-transpiler - cast-free as-string\[] emission unbreaks master cs id-tests by [@kroitor](https://github.com/kroitor) in [#29693](https://github.com/ccxt/ccxt/pull/29693)
* fix(woo): send symbol server-side in fetchPositions and fetchPositionsADLRank by [@rayBastard](https://github.com/rayBastard) in [#29689](https://github.com/ccxt/ccxt/pull/29689)
* fix(bitopro): guard ws handleTicker against TICKER frames without a pair by [@kroitor](https://github.com/kroitor) in [#29694](https://github.com/ccxt/ccxt/pull/29694)
* test(weex): extend static fixture coverage to 46 methods by [@rayBastard](https://github.com/rayBastard) in [#29690](https://github.com/ccxt/ccxt/pull/29690)
* cs: fix CS8629 nullable warnings in ws backoff config reads by [@kroitor](https://github.com/kroitor) in [#29695](https://github.com/ccxt/ccxt/pull/29695)
* prediction/binance: aggregate all failed orders in cancelOrders error, fix CS0162 by [@kroitor](https://github.com/kroitor) in [#29696](https://github.com/ccxt/ccxt/pull/29696)
* fix(cs): emit override for PredictionExchange fetchOrderBook (CS0114), enable TreatWarningsAsErrors by [@kroitor](https://github.com/kroitor) in [#29697](https://github.com/ccxt/ccxt/pull/29697)
* fix(tests): accept empty responses in dict-shape asserts, php cannot type empty arrays by [@kroitor](https://github.com/kroitor) in [#29698](https://github.com/ccxt/ccxt/pull/29698)
* fix(cs): atomic subscription claim in watch, reject all futures on error by [@kroitor](https://github.com/kroitor) in [#29699](https://github.com/ccxt/ccxt/pull/29699)
* fix(woo): parseOrder remaining and postOnly, parseDepositAddress network by [@rayBastard](https://github.com/rayBastard) in [#29701](https://github.com/ccxt/ccxt/pull/29701)
* fix(go): IsArray recognizes IOrderBookSide for js parity by [@kroitor](https://github.com/kroitor) in [#29706](https://github.com/ccxt/ccxt/pull/29706)
* test(whitebit): add fetchOrder and cancelOrder static fixtures by [@rayBastard](https://github.com/rayBastard) in [#29705](https://github.com/ccxt/ccxt/pull/29705)
* feat(weex): add fetchLastPrices, fetchMarkPrice and fetchMarkPrices by [@rayBastard](https://github.com/rayBastard) in [#29703](https://github.com/ccxt/ccxt/pull/29703)
* chore: remove popup from landingpage by [@carlosmiei](https://github.com/carlosmiei) in [#29702](https://github.com/ccxt/ccxt/pull/29702)
* feat(xt): add fetchPositionsHistory by [@rayBastard](https://github.com/rayBastard) in [#29616](https://github.com/ccxt/ccxt/pull/29616)
* feat(woofipro): add fetchTicker and fetchTickers by [@rayBastard](https://github.com/rayBastard) in [#29615](https://github.com/ccxt/ccxt/pull/29615)
* fix(go): route embedded orderbook types and marshal sides as plain arrays by [@kroitor](https://github.com/kroitor) in [#29708](https://github.com/ccxt/ccxt/pull/29708)
* fix(go): serve live orderbook reads in tests from one frozen snapshot by [@kroitor](https://github.com/kroitor) in [#29716](https://github.com/ccxt/ccxt/pull/29716)
* fix(go): eliminate ws future resolve races and retain unconsumed results by [@kroitor](https://github.com/kroitor) in [#29719](https://github.com/ccxt/ccxt/pull/29719)
* fix(python): retain ws results resolved without a waiter by [@kroitor](https://github.com/kroitor) in [#29720](https://github.com/ccxt/ccxt/pull/29720)
* fix(tests): stop trimming stderr chunks in run-tests so warnings keep line breaks by [@kroitor](https://github.com/kroitor) in [#29727](https://github.com/ccxt/ccxt/pull/29727)
* fix(tests): newline-join warnings on the progress line and dedupe stderr residue by [@kroitor](https://github.com/kroitor) in [#29730](https://github.com/ccxt/ccxt/pull/29730)
* fix(python): silence handshake noise walls, back off failed dials, attribute ws timeouts by [@kroitor](https://github.com/kroitor) in [#29731](https://github.com/ccxt/ccxt/pull/29731)
* fix(binance): resolve ws ticker market type from stream url for ambiguous ids by [@kroitor](https://github.com/kroitor) in [#29733](https://github.com/ccxt/ccxt/pull/29733)
* fix(tests): collect warnings from output instead of stderr in run-tests by [@kroitor](https://github.com/kroitor) in [#29734](https://github.com/ccxt/ccxt/pull/29734)
* fix(python): guard ping loop transport writes and cancel keepalive before close by [@kroitor](https://github.com/kroitor) in [#29735](https://github.com/ccxt/ccxt/pull/29735)
* fix(tests): drop warn spacer walls and column padding, stop reducer resets by [@kroitor](https://github.com/kroitor) in [#29736](https://github.com/ccxt/ccxt/pull/29736)
* fix(ci): treat hand-written go base files as important in the modified-files check by [@kroitor](https://github.com/kroitor) in [#29740](https://github.com/ccxt/ccxt/pull/29740)
* fix(go): route ws keepalive ping failures promptly, drop unreachable control arms by [@kroitor](https://github.com/kroitor) in [#29741](https://github.com/ccxt/ccxt/pull/29741)
* refactor: rewrite isDictionary into non-transpilable parts by [@ttodua](https://github.com/ttodua) in [#29704](https://github.com/ccxt/ccxt/pull/29704)
* docs: document the php empty-array dictionary ambiguity by [@kroitor](https://github.com/kroitor) in [#29743](https://github.com/ccxt/ccxt/pull/29743)
* test(php): guard the ws orderbook index invariant and replay the desync sequence by [@kroitor](https://github.com/kroitor) in [#29744](https://github.com/ccxt/ccxt/pull/29744)
* fix(ci): treat hand-written cs and java ws base files as important by [@kroitor](https://github.com/kroitor) in [#29747](https://github.com/ccxt/ccxt/pull/29747)
* fix(ws): clean indexed orderbook hashmap on limit and bound the id walks by [@kroitor](https://github.com/kroitor) in [#29749](https://github.com/ccxt/ccxt/pull/29749)
* fix(go): bound indexed orderbook id walks and recover missing delta prices by [@kroitor](https://github.com/kroitor) in [#29751](https://github.com/ccxt/ccxt/pull/29751)
* fix(go): recognize live ws orderbooks as dictionaries by [@kroitor](https://github.com/kroitor) in [#29752](https://github.com/ccxt/ccxt/pull/29752)
* fix(java): implement id-keyed indexed orderbook sides by [@kroitor](https://github.com/kroitor) in [#29753](https://github.com/ccxt/ccxt/pull/29753)
* fix(lighter): set orderExpiry for postOnly orders to avoid signing rejection by [@pcriadoperez](https://github.com/pcriadoperez) in [#29683](https://github.com/ccxt/ccxt/pull/29683)
* fix(htx): parse swap position side from direction in one-way mode by [@pcriadoperez](https://github.com/pcriadoperez) in [#29715](https://github.com/ccxt/ccxt/pull/29715)
* fix(java): clear orderbook side price index in lockstep with rows by [@kroitor](https://github.com/kroitor) in [#29754](https://github.com/ccxt/ccxt/pull/29754)
* fix(tests): space-join java dump so timeout warnings name the stalled methods by [@kroitor](https://github.com/kroitor) in [#29755](https://github.com/ccxt/ccxt/pull/29755)
* fix(ci): treat hand-written java-root base files and gradle wiring as important by [@kroitor](https://github.com/kroitor) in [#29756](https://github.com/ccxt/ccxt/pull/29756)
* feat(binance): stock support by [@Dan-krm](https://github.com/Dan-krm) in [#29464](https://github.com/ccxt/ccxt/pull/29464)
* chore: regenerate stale abstract signatures for weex, xt, opinion by [@carlosmiei](https://github.com/carlosmiei) in [#29757](https://github.com/ccxt/ccxt/pull/29757)
* fix(extended): return unified dict from cancelAllOrdersAfter by [@carlosmiei](https://github.com/carlosmiei) in [#29758](https://github.com/ccxt/ccxt/pull/29758)
## New Contributors [#new-contributors-3]
* [@nikoloooodeon](https://github.com/nikoloooodeon) made their first contribution in [#29619](https://github.com/ccxt/ccxt/pull/29619)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.71...v4.5.72](https://github.com/ccxt/ccxt/compare/v4.5.71...v4.5.72)
[Changes][v4.5.72]
# [v4.5.71](https://github.com/ccxt/ccxt/releases/tag/v4.5.71) - 2026-08-04 [#v4571---2026-08-04]
## What's Changed [#whats-changed-7]
* feat(aster): memoize walletAddress by [@carlosmiei](https://github.com/carlosmiei) in [#29342](https://github.com/ccxt/ccxt/pull/29342)
* chore: add imgs to .gitattributes by [@carlosmiei](https://github.com/carlosmiei) in [#29343](https://github.com/ccxt/ccxt/pull/29343)
* chore: update name by [@carlosmiei](https://github.com/carlosmiei) in [#29344](https://github.com/ccxt/ccxt/pull/29344)
* chore: Try new img cs by [@carlosmiei](https://github.com/carlosmiei) in [#29345](https://github.com/ccxt/ccxt/pull/29345)
* chore: disable part os of release temporarily by [@carlosmiei](https://github.com/carlosmiei) in [#29347](https://github.com/ccxt/ccxt/pull/29347)
* chore: restore release.yml by [@carlosmiei](https://github.com/carlosmiei) in [#29348](https://github.com/ccxt/ccxt/pull/29348)
* fix(okx): support fetchFundingRate(s) for XPERP futures by [@rayBastard](https://github.com/rayBastard) in [#29350](https://github.com/ccxt/ccxt/pull/29350)
* test(structure): start requiring strict structure by [@ttodua](https://github.com/ttodua) in [#25823](https://github.com/ccxt/ccxt/pull/25823)
* fix(php): disable php8.5 warnings by [@carlosmiei](https://github.com/carlosmiei) in [#29351](https://github.com/ccxt/ccxt/pull/29351)
* chore: update examples by [@carlosmiei](https://github.com/carlosmiei) in [#29358](https://github.com/ccxt/ccxt/pull/29358)
* fix(js): enable dual-stack Happy Eyeballs on undici (10ms floor) by [@carlotestor](https://github.com/carlotestor) in [#29352](https://github.com/ccxt/ccxt/pull/29352)
* fix(go): explicit dual-stack DialContext in exchange.go (FallbackDelay=1ns) by [@carlotestor](https://github.com/carlotestor) in [#29357](https://github.com/ccxt/ccxt/pull/29357)
* fix(java): remove preferIPv4Stack for dual-stack IPv6 by [@carlotestor](https://github.com/carlotestor) in [#29356](https://github.com/ccxt/ccxt/pull/29356)
* fix(aster): encode privateKey before keccak hash cache by [@carlotestor](https://github.com/carlotestor) in [#29360](https://github.com/ccxt/ccxt/pull/29360)
* fix(cs): explicit dual-stack REST/WS (runtime HE; no delay knob on netstandard) by [@carlotestor](https://github.com/carlotestor) in [#29355](https://github.com/ccxt/ccxt/pull/29355)
* fix(php): explicit dual-stack curl + 1ms Happy Eyeballs timeout by [@carlotestor](https://github.com/carlotestor) in [#29354](https://github.com/ccxt/ccxt/pull/29354)
* fix(bybit): private ws methods Authentication error handling by [@carlosmiei](https://github.com/carlosmiei) in [#29362](https://github.com/ccxt/ccxt/pull/29362)
* fix(python): explicit dual-stack aiohttp connector (happy\_eyeballs\_delay=0) by [@carlotestor](https://github.com/carlotestor) in [#29353](https://github.com/ccxt/ccxt/pull/29353)
* update eslint cache-strategy by [@frosty00](https://github.com/frosty00) in [#29363](https://github.com/ccxt/ccxt/pull/29363)
* chore(php): remove unused/delisted by [@ttodua](https://github.com/ttodua) in [#29367](https://github.com/ccxt/ccxt/pull/29367)
* feat: orderbook copy across langs by [@ttodua](https://github.com/ttodua) in [#29280](https://github.com/ccxt/ccxt/pull/29280)
* chore: try to fix some tests by [@carlosmiei](https://github.com/carlosmiei) in [#29371](https://github.com/ccxt/ccxt/pull/29371)
* delist: remove bitmart by [@carlosmiei](https://github.com/carlosmiei) in [#29376](https://github.com/ccxt/ccxt/pull/29376)
* chore(php): update reactphp-http-proxy version to 1.10 by [@ttodua](https://github.com/ttodua) in [#29366](https://github.com/ccxt/ccxt/pull/29366)
* chore: bitmart leftovers by [@carlosmiei](https://github.com/carlosmiei) in [#29378](https://github.com/ccxt/ccxt/pull/29378)
* chore: remove bitmart and id test by [@carlosmiei](https://github.com/carlosmiei) in [#29382](https://github.com/ccxt/ccxt/pull/29382)
* chore(build): point ast-transpiler at GitHub master by [@carlotestor](https://github.com/carlotestor) in [#29372](https://github.com/ccxt/ccxt/pull/29372)
* feat(transpile): rm using null as the key parameter for array\_key\_exi… by [@carlosmiei](https://github.com/carlosmiei) in [#29385](https://github.com/ccxt/ccxt/pull/29385)
* chore: expose timed out tests by [@carlosmiei](https://github.com/carlosmiei) in [#29377](https://github.com/ccxt/ccxt/pull/29377)
* blofin: fill market limits ([#23973](https://github.com/ccxt/ccxt/issues/23973)) + fix inverse swap parsing by [@kroitor](https://github.com/kroitor) in [#29386](https://github.com/ccxt/ccxt/pull/29386)
* fix(python): remove setuptools from runtime dependencies by [@kroitor](https://github.com/kroitor) in [#29387](https://github.com/ccxt/ccxt/pull/29387)
* okx: fill limits.amount.max from maxLmtSz by [@kroitor](https://github.com/kroitor) in [#29388](https://github.com/ccxt/ccxt/pull/29388)
* fix(poloniex): handle\_order crash on fill events for uncached orders by [@kroitor](https://github.com/kroitor) in [#29389](https://github.com/ccxt/ccxt/pull/29389)
* fix(python): pytest collect guard for the shipped ccxt/test harness ([#29383](https://github.com/ccxt/ccxt/issues/29383)) by [@kroitor](https://github.com/kroitor) in [#29390](https://github.com/ccxt/ccxt/pull/29390)
* chore(deps): bump ast-transpiler lock to master (Java emit idempotency) by [@carlotestor](https://github.com/carlotestor) in [#29391](https://github.com/ccxt/ccxt/pull/29391)
* fix(mexc): prevent concurrent listenKey fetch race in ws authenticate by [@kroitor](https://github.com/kroitor) in [#29392](https://github.com/ccxt/ccxt/pull/29392)
* fix(mexc): transpiler-safe comments in ws authenticate (php build hotfix) by [@kroitor](https://github.com/kroitor) in [#29394](https://github.com/ccxt/ccxt/pull/29394)
* feat(bingx): anchor spot daily candles to UTC by default (timeZone option) by [@kroitor](https://github.com/kroitor) in [#29395](https://github.com/ccxt/ccxt/pull/29395)
* fix(bingx): add timeZone to spot ohlcv request fixture by [@kroitor](https://github.com/kroitor) in [#29396](https://github.com/ccxt/ccxt/pull/29396)
* chore(deps): bump ast-transpiler lock for java bare-rethrow fix by [@kroitor](https://github.com/kroitor) in [#29397](https://github.com/ccxt/ccxt/pull/29397)
* fix(base): stop infinite loadOrderBook recursion on snapshot failure (all languages) by [@kroitor](https://github.com/kroitor) in [#29398](https://github.com/ccxt/ccxt/pull/29398)
* fix(base): route loadOrderBook snapshots through the safe fetch + go orderbook reset by [@kroitor](https://github.com/kroitor) in [#29400](https://github.com/ccxt/ccxt/pull/29400)
* fix(ws): match cache rows by symbol and id to survive cross-symbol order-id collisions by [@kroitor](https://github.com/kroitor) in [#29401](https://github.com/ccxt/ccxt/pull/29401)
* fix(bybit): align fetchOHLCV start up to the interval boundary by [@kroitor](https://github.com/kroitor) in [#29402](https://github.com/ccxt/ccxt/pull/29402)
* fix(htx): remove the messageHash-keyed subscription on ws error by [@kroitor](https://github.com/kroitor) in [#29404](https://github.com/ccxt/ccxt/pull/29404)
* fix(examples): undefined loop in async-gather-concurrency.py \[skip ci] by [@kroitor](https://github.com/kroitor) in [#29406](https://github.com/ccxt/ccxt/pull/29406)
* fix(krakenfutures): guard parsePositions against missing openPositions + map INSUFFICIENT\_MARGIN by [@kroitor](https://github.com/kroitor) in [#29407](https://github.com/ccxt/ccxt/pull/29407)
* chore(deps): bump ast-transpiler lock to master HEAD by [@carlotestor](https://github.com/carlotestor) in [#29410](https://github.com/ccxt/ccxt/pull/29410)
* chore(java): silence varargs warnings in credential init by [@kroitor](https://github.com/kroitor) in [#29408](https://github.com/ccxt/ccxt/pull/29408)
* fix(build): remove global.checker from C# transpiler wrapper by [@carlotestor](https://github.com/carlotestor) in [#29405](https://github.com/ccxt/ccxt/pull/29405)
* perf(build): go transpile single-process piscina threads by [@carlotestor](https://github.com/carlotestor) in [#29380](https://github.com/ccxt/ccxt/pull/29380)
* perf(build): java transpile single-process piscina threads by [@carlotestor](https://github.com/carlotestor) in [#29379](https://github.com/ccxt/ccxt/pull/29379)
* fix(coinone): migrate createOrder and fetchOpenOrders to the v2.1 api by [@kroitor](https://github.com/kroitor) in [#29411](https://github.com/ccxt/ccxt/pull/29411)
* refactor(playground): replace the JavaScript tab with TypeScript by [@pcriadoperez](https://github.com/pcriadoperez) in [#29409](https://github.com/ccxt/ccxt/pull/29409)
* chore: skip btcbox live tests by [@carlosmiei](https://github.com/carlosmiei) in [#29413](https://github.com/ccxt/ccxt/pull/29413)
* fix(bitget): send the execute prices for attached take profit and stop loss by [@kroitor](https://github.com/kroitor) in [#29414](https://github.com/ccxt/ccxt/pull/29414)
* perf(build): csharp transpile single-process piscina threads by [@carlotestor](https://github.com/carlotestor) in [#29381](https://github.com/ccxt/ccxt/pull/29381)
* fix(kucoin,bitvavo): map cancel-after-fill errors to OrderNotFound by [@kroitor](https://github.com/kroitor) in [#29422](https://github.com/ccxt/ccxt/pull/29422)
* fix(coinone): parse v2.1 open-order fills by [@ShiroKSH](https://github.com/ShiroKSH) in [#29420](https://github.com/ccxt/ccxt/pull/29420)
* fix(bingx): restore the 0x prefix on evm deposit addresses by [@kroitor](https://github.com/kroitor) in [#29423](https://github.com/ccxt/ccxt/pull/29423)
* perf(build): skip unchanged exchanges and up-to-date stages in the go/java/cs transpilers unless --force by [@carlotestor](https://github.com/carlotestor) in [#29419](https://github.com/ccxt/ccxt/pull/29419)
* fix(transpile): keep the negation outside php string-method emissions by [@kroitor](https://github.com/kroitor) in [#29424](https://github.com/ccxt/ccxt/pull/29424)
* playground: enable the Go runner in production by [@carlotestor](https://github.com/carlotestor) in [#29418](https://github.com/ccxt/ccxt/pull/29418)
* fix(bybit): derive the used balance from the margin fields in the wallet stream by [@kroitor](https://github.com/kroitor) in [#29425](https://github.com/ccxt/ccxt/pull/29425)
* chore: abstract the exchange name out of the time difference comment by [@kroitor](https://github.com/kroitor) in [#29427](https://github.com/ccxt/ccxt/pull/29427)
* chore: fix docstrings naming the wrong exchange by [@kroitor](https://github.com/kroitor) in [#29428](https://github.com/ccxt/ccxt/pull/29428)
* chore(docs): build docs + playground images for amd64 on the new box by [@pcriadoperez](https://github.com/pcriadoperez) in [#29429](https://github.com/ccxt/ccxt/pull/29429)
* chore: abstract the seed patterns out of the docstrings by [@kroitor](https://github.com/kroitor) in [#29431](https://github.com/ccxt/ccxt/pull/29431)
* fix(kucoineu): set only spot by [@ttodua](https://github.com/ttodua) in [#29432](https://github.com/ccxt/ccxt/pull/29432)
* chore: fix typos in the inline comments by [@kroitor](https://github.com/kroitor) in [#29434](https://github.com/ccxt/ccxt/pull/29434)
* fix(coinbaseinternational): send amount instead of ammount in transfer by [@kroitor](https://github.com/kroitor) in [#29435](https://github.com/ccxt/ccxt/pull/29435)
* fix(p2b): reset the order book on full depth updates in the stream by [@kroitor](https://github.com/kroitor) in [#29436](https://github.com/ccxt/ccxt/pull/29436)
* fix(xt): derive the order side for stop loss and take profit entries by [@kroitor](https://github.com/kroitor) in [#29438](https://github.com/ccxt/ccxt/pull/29438)
* fix(bitget): guard the execute price when editing spot plan orders by [@kroitor](https://github.com/kroitor) in [#29439](https://github.com/ccxt/ccxt/pull/29439)
* docs: modernize the php async dependency instructions by [@kroitor](https://github.com/kroitor) in [#29440](https://github.com/ccxt/ccxt/pull/29440)
* chore(bybit): rename the filterExecTypes option to execType by [@kroitor](https://github.com/kroitor) in [#29441](https://github.com/ccxt/ccxt/pull/29441)
* docs: mark the symbol as optional in the cancelAllOrders docstrings by [@kroitor](https://github.com/kroitor) in [#29442](https://github.com/ccxt/ccxt/pull/29442)
* docs: clean up three cancelAllOrders docstrings by [@kroitor](https://github.com/kroitor) in [#29443](https://github.com/ccxt/ccxt/pull/29443)
* fix(python): guard the ws receive callback against cancelled tasks by [@kroitor](https://github.com/kroitor) in [#29445](https://github.com/ccxt/ccxt/pull/29445)
* perf(build): stage cleanups from REST/WS profile (no concurrent REST+WS) by [@carlotestor](https://github.com/carlotestor) in [#29437](https://github.com/ccxt/ccxt/pull/29437)
* docs: fix the watchOrderBookForSymbols return description by [@kroitor](https://github.com/kroitor) in [#29446](https://github.com/ccxt/ccxt/pull/29446)
* update js.yml to use lint instead of eslint (to reuse the cache) by [@frosty00](https://github.com/frosty00) in [#29450](https://github.com/ccxt/ccxt/pull/29450)
* fix(playground): load OpenRouter free models dynamically at startup by [@carlotestor](https://github.com/carlotestor) in [#29452](https://github.com/ccxt/ccxt/pull/29452)
* playground: skip sum.golang.org for ccxt's own go module during provisioning by [@carlotestor](https://github.com/carlotestor) in [#29426](https://github.com/ccxt/ccxt/pull/29426)
* fix(playground): unbreak webpack `next dev` on undici in instrumentation by [@carlotestor](https://github.com/carlotestor) in [#29456](https://github.com/ccxt/ccxt/pull/29456)
* fix(playground): responsive mobile layout for docs playground by [@carlotestor](https://github.com/carlotestor) in [#29453](https://github.com/ccxt/ccxt/pull/29453)
* fix(kucoin): accumulate the average fill price in the spot order stream by [@kroitor](https://github.com/kroitor) in [#29458](https://github.com/ccxt/ccxt/pull/29458)
* fix(bybit): stop ws trade ops from hanging on auth errors without a reqId by [@kroitor](https://github.com/kroitor) in [#29459](https://github.com/ccxt/ccxt/pull/29459)
* chore: strip redundant trailing undefined arguments by [@kroitor](https://github.com/kroitor) in [#29460](https://github.com/ccxt/ccxt/pull/29460)
* coinex - parseTransaction fee\_ccy field fallback by [@kroitor](https://github.com/kroitor) in [#29461](https://github.com/ccxt/ccxt/pull/29461)
* indodax - parseOrder filled amount from receive\_\{base} field by [@kroitor](https://github.com/kroitor) in [#29462](https://github.com/ccxt/ccxt/pull/29462)
* fix(blockchaincom,woofipro): resolve PHP null array offset deprecations by [@carlotestor](https://github.com/carlotestor) in [#29467](https://github.com/ccxt/ccxt/pull/29467)
* feat(playground): generate AI assistant code for all languages by [@carlotestor](https://github.com/carlotestor) in [#29465](https://github.com/ccxt/ccxt/pull/29465)
* fix(coinbase): swap flag enable by [@ttodua](https://github.com/ttodua) in [#29448](https://github.com/ccxt/ccxt/pull/29448)
* fix(python): refuse lazy open after close to stop aiohttp session leaks by [@carlotestor](https://github.com/carlotestor) in [#29466](https://github.com/ccxt/ccxt/pull/29466)
* fix(tests): trim third-party frames from PHP test stack traces by [@carlotestor](https://github.com/carlotestor) in [#29468](https://github.com/ccxt/ccxt/pull/29468)
* playground: raise run caps to 6 CPUs / 12 GB; restrict Go imports to stdlib + ccxt by [@carlotestor](https://github.com/carlotestor) in [#29469](https://github.com/ccxt/ccxt/pull/29469)
* playground: stop doubling the image with a post-build chown -R by [@carlotestor](https://github.com/carlotestor) in [#29470](https://github.com/ccxt/ccxt/pull/29470)
* chore(docs): cap the docs container's docker log by [@pcriadoperez](https://github.com/pcriadoperez) in [#29471](https://github.com/ccxt/ccxt/pull/29471)
* feat(playground): runnable Java runner with REST + WebSocket proxy support by [@carlotestor](https://github.com/carlotestor) in [#29472](https://github.com/ccxt/ccxt/pull/29472)
* fix(playground): install JDK 21 via Temurin on bookworm by [@carlotestor](https://github.com/carlotestor) in [#29473](https://github.com/ccxt/ccxt/pull/29473)
* fix(playground): base image on Debian 13 (trixie), JDK 21 from apt by [@carlotestor](https://github.com/carlotestor) in [#29474](https://github.com/ccxt/ccxt/pull/29474)
* fix(base): enable strictNullChecks compliance across ts/src by [@carlotestor](https://github.com/carlotestor) in [#29229](https://github.com/ccxt/ccxt/pull/29229)
* fix(coinbase): sort websocket trades and refresh stale skips by [@manojpramesh](https://github.com/manojpramesh) in [#29477](https://github.com/ccxt/ccxt/pull/29477)
* Delist kucoineu by [@frosty00](https://github.com/frosty00) in [#29480](https://github.com/ccxt/ccxt/pull/29480)
* chore(build): remove unused utils/remove-exchange.ts by [@carlotestor](https://github.com/carlotestor) in [#29482](https://github.com/ccxt/ccxt/pull/29482)
* chore(build): filter exchanges.json in delist.sh by [@carlotestor](https://github.com/carlotestor) in [#29481](https://github.com/ccxt/ccxt/pull/29481)
* feat(playground): progressive primary AI Insert with silent multi-lang fill by [@carlotestor](https://github.com/carlotestor) in [#29475](https://github.com/ccxt/ccxt/pull/29475)
* fix(xt): route setMarginMode to inverse endpoint for coin-margined ma… by [@rayBastard](https://github.com/rayBastard) in [#29463](https://github.com/ccxt/ccxt/pull/29463)
* fix(bingx): correct 3x inflated amount in fetchMyTrades for linear swaps by [@pcriadoperez](https://github.com/pcriadoperez) in [#29478](https://github.com/ccxt/ccxt/pull/29478)
* python - explicit aiohttp ClientTimeout with sock\_read to prevent indefinite hangs by [@kroitor](https://github.com/kroitor) in [#29486](https://github.com/ccxt/ccxt/pull/29486)
* docs - define what the rateLimit number means by [@kroitor](https://github.com/kroitor) in [#29487](https://github.com/ccxt/ccxt/pull/29487)
* feat(hyperliquid): add fetchFundingRate (singular) by [@kroitor](https://github.com/kroitor) in [#29488](https://github.com/ccxt/ccxt/pull/29488)
* feat(website): add exchange API latency study blog post with animated world map by [@pcriadoperez](https://github.com/pcriadoperez) in [#29479](https://github.com/ccxt/ccxt/pull/29479)
* chore(cryptocom): remove option support by [@ttodua](https://github.com/ttodua) in [#29447](https://github.com/ccxt/ccxt/pull/29447)
* fix(derive): spot & perp flags; skip maker sides for trades by [@ttodua](https://github.com/ttodua) in [#29444](https://github.com/ccxt/ccxt/pull/29444)
* feat(xt): add funding rate watch and unwatch methods by [@rayBastard](https://github.com/rayBastard) in [#29483](https://github.com/ccxt/ccxt/pull/29483)
* feat(coinbase): add transfer between portfolios by [@manojpramesh](https://github.com/manojpramesh) in [#29370](https://github.com/ccxt/ccxt/pull/29370)
* chore(ts): enable noImplicitOverride and add override modifiers by [@carlotestor](https://github.com/carlotestor) in [#29490](https://github.com/ccxt/ccxt/pull/29490)
* chore(python): remove unused fastflake.sh and qa.py by [@carlotestor](https://github.com/carlotestor) in [#29493](https://github.com/ccxt/ccxt/pull/29493)
* throw an error when strictNullChecks fails by [@frosty00](https://github.com/frosty00) in [#29491](https://github.com/ccxt/ccxt/pull/29491)
* fix(ts): clear remaining strictNullChecks residuals on master by [@carlotestor](https://github.com/carlotestor) in [#29498](https://github.com/ccxt/ccxt/pull/29498)
* chore(build): remove unused dead helpers and fixTSBug by [@carlotestor](https://github.com/carlotestor) in [#29497](https://github.com/ccxt/ccxt/pull/29497)
* docs(coinbase): add WebSocket market-data examples by [@manojpramesh](https://github.com/manojpramesh) in [#29496](https://github.com/ccxt/ccxt/pull/29496)
* fix: resynchronize Nado order books after update gaps by [@mvanhorn](https://github.com/mvanhorn) in [#29492](https://github.com/ccxt/ccxt/pull/29492)
* chore(ts): enable noUnusedLocals and remove unused locals by [@carlotestor](https://github.com/carlotestor) in [#29489](https://github.com/ccxt/ccxt/pull/29489)
* chore(ts): enable noPropertyAccessFromIndexSignature by [@carlotestor](https://github.com/carlotestor) in [#29499](https://github.com/ccxt/ccxt/pull/29499)
* fix(cs): correct hand-written C# type structs to match ts/src/base/types.ts by [@carlotestor](https://github.com/carlotestor) in [#29502](https://github.com/ccxt/ccxt/pull/29502)
* playground: post the assistant to a configured chat endpoint by [@carlotestor](https://github.com/carlotestor) in [#29503](https://github.com/ccxt/ccxt/pull/29503)
* chore(ts): enable noImplicitAny and eliminate residual implicit any by [@carlotestor](https://github.com/carlotestor) in [#29494](https://github.com/ccxt/ccxt/pull/29494)
* feat(go): type fetchDepositWithdrawFee(s) returns and close types.ts/Go struct gaps by [@carlotestor](https://github.com/carlotestor) in [#29504](https://github.com/ccxt/ccxt/pull/29504)
* feat(java): wire ADL and BalanceAccount into typed wrapper generator by [@carlotestor](https://github.com/carlotestor) in [#29501](https://github.com/ccxt/ccxt/pull/29501)
* bitbank - support ACCESS-TIME-WINDOW authentication, default to it by [@kroitor](https://github.com/kroitor) in [#29508](https://github.com/ccxt/ccxt/pull/29508)
* move deploy to self-hosted by [@frosty00](https://github.com/frosty00) in [#29509](https://github.com/ccxt/ccxt/pull/29509)
* add timeout by [@frosty00](https://github.com/frosty00) in [#29511](https://github.com/ccxt/ccxt/pull/29511)
* build: generate base types from ts/src/base/types.ts for all language ports by [@carlotestor](https://github.com/carlotestor) in [#29507](https://github.com/ccxt/ccxt/pull/29507)
* fix(docs): allow [https://ccxt.com](https://ccxt.com) to iframe docs.ccxt.com by [@carlotestor](https://github.com/carlotestor) in [#29512](https://github.com/ccxt/ccxt/pull/29512)
* chore(ts): replace broad `any` with honest domain types from base/types by [@carlotestor](https://github.com/carlotestor) in [#29506](https://github.com/ccxt/ccxt/pull/29506)
* feat(xt): add break-list functionality to position fetching by [@rayBastard](https://github.com/rayBastard) in [#29500](https://github.com/ccxt/ccxt/pull/29500)
* feat(bitvavo): add watchXForSymbols and unWatch methods by [@carlosmiei](https://github.com/carlosmiei) in [#29516](https://github.com/ccxt/ccxt/pull/29516)
* chore: push missing file by [@carlosmiei](https://github.com/carlosmiei) in [#29518](https://github.com/ccxt/ccxt/pull/29518)
* chore: fix go build by [@carlosmiei](https://github.com/carlosmiei) in [#29519](https://github.com/ccxt/ccxt/pull/29519)
* fix(docs/playground): prediction markets support (allowlist + examples + ccxt 4.5.66) + ?theme= URL param by [@carlotestor](https://github.com/carlotestor) in [#29513](https://github.com/ccxt/ccxt/pull/29513)
* build(deps): bump cryptography from 49.0.0 to 50.0.0 by [@dependabot](https://github.com/dependabot)\[bot] in [#29521](https://github.com/ccxt/ccxt/pull/29521)
* playground: build the language runtimes before the app source (29 min deploy -> \~4 min) by [@carlotestor](https://github.com/carlotestor) in [#29523](https://github.com/ccxt/ccxt/pull/29523)
* fix(okxus): set correct market types by [@ttodua](https://github.com/ttodua) in [#29430](https://github.com/ccxt/ccxt/pull/29430)
* chore: loosen some python deps by [@carlosmiei](https://github.com/carlosmiei) in [#29520](https://github.com/ccxt/ccxt/pull/29520)
* js: bump undici dep to 7.29.0 by [@carlosmiei](https://github.com/carlosmiei) in [#29524](https://github.com/ccxt/ccxt/pull/29524)
* fix(docs/playground): proxy prediction-market exchanges through the egress allowlist by [@carlotestor](https://github.com/carlotestor) in [#29525](https://github.com/ccxt/ccxt/pull/29525)
## New Contributors [#new-contributors-4]
* [@ShiroKSH](https://github.com/ShiroKSH) made their first contribution in [#29420](https://github.com/ccxt/ccxt/pull/29420)
* [@manojpramesh](https://github.com/manojpramesh) made their first contribution in [#29477](https://github.com/ccxt/ccxt/pull/29477)
* [@mvanhorn](https://github.com/mvanhorn) made their first contribution in [#29492](https://github.com/ccxt/ccxt/pull/29492)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.70...v4.5.71](https://github.com/ccxt/ccxt/compare/v4.5.70...v4.5.71)
[Changes][v4.5.71]
# [v4.5.70](https://github.com/ccxt/ccxt/releases/tag/v4.5.70) - 2026-07-29 [#v4570---2026-07-29]
## What's Changed [#whats-changed-8]
* chore(docs): move playground/ and website/ under docs/ by [@pcriadoperez](https://github.com/pcriadoperez) in [#29302](https://github.com/ccxt/ccxt/pull/29302)
* perf(python): safeString optimization by [@ttodua](https://github.com/ttodua) in [#29315](https://github.com/ccxt/ccxt/pull/29315)
* Update workflows by [@frosty00](https://github.com/frosty00) in [#29326](https://github.com/ccxt/ccxt/pull/29326)
* move to self-hosted github actions runners by [@frosty00](https://github.com/frosty00) in [#29328](https://github.com/ccxt/ccxt/pull/29328)
* github actions complains about old node20 versions by [@frosty00](https://github.com/frosty00) in [#29330](https://github.com/ccxt/ccxt/pull/29330)
* perf(go): safeString optimization by [@ttodua](https://github.com/ttodua) in [#29319](https://github.com/ccxt/ccxt/pull/29319)
* fix(Exchange): omit paginationDirection in fetchPaginatedCallDeterministic by [@g0rdonL](https://github.com/g0rdonL) in [#29332](https://github.com/ccxt/ccxt/pull/29332)
* fix(bitget): route UTA private WS order/fill to the right market by [@slotheth](https://github.com/slotheth) in [#29327](https://github.com/ccxt/ccxt/pull/29327)
* fix(nado): parseMarkets in python by [@carlosmiei](https://github.com/carlosmiei) in [#29334](https://github.com/ccxt/ccxt/pull/29334)
* perf(base): speed up pure-Python Keccak-256 fallback (\~2x) by [@pcriadoperez](https://github.com/pcriadoperez) in [#29318](https://github.com/ccxt/ccxt/pull/29318)
* fix(client.py): add compress option (RFC 7692) by [@carlosmiei](https://github.com/carlosmiei) in [#29336](https://github.com/ccxt/ccxt/pull/29336)
* perf(java): safeString optimization by [@ttodua](https://github.com/ttodua) in [#29320](https://github.com/ccxt/ccxt/pull/29320)
* perf(c#): safeString optimization by [@ttodua](https://github.com/ttodua) in [#29316](https://github.com/ccxt/ccxt/pull/29316)
* perf(php): safeString optimizations by [@ttodua](https://github.com/ttodua) in [#29314](https://github.com/ccxt/ccxt/pull/29314)
* chore: temporarily try gh\_token2 by [@carlosmiei](https://github.com/carlosmiei) in [#29337](https://github.com/ccxt/ccxt/pull/29337)
* feat(nado): upgrade ws to v2 by [@carlosmiei](https://github.com/carlosmiei) in [#29338](https://github.com/ccxt/ccxt/pull/29338)
* chore: pushback using github app by [@carlosmiei](https://github.com/carlosmiei) in [#29339](https://github.com/ccxt/ccxt/pull/29339)
* chore: autostash in actions to avoid push error by [@carlosmiei](https://github.com/carlosmiei) in [#29340](https://github.com/ccxt/ccxt/pull/29340)
* chore: disable cleanup old tags by [@carlosmiei](https://github.com/carlosmiei) in [#29341](https://github.com/ccxt/ccxt/pull/29341)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.69...v4.5.70](https://github.com/ccxt/ccxt/compare/v4.5.69...v4.5.70)
[Changes][v4.5.70]
# [v4.5.69](https://github.com/ccxt/ccxt/releases/tag/v4.5.69) - 2026-07-28 [#v4569---2026-07-28]
## What's Changed [#whats-changed-9]
* fix(website): resolve sharp/libvips GHSA-f88m-g3jw-g9cj by pinning sharp to 0.35.0 by [@kroitor](https://github.com/kroitor) with [@Copilot](https://github.com/Copilot) in [#29287](https://github.com/ccxt/ccxt/pull/29287)
* fix(playground): pin sharp to 0.35.0 for libvips CVE remediation by [@kroitor](https://github.com/kroitor) with [@Copilot](https://github.com/Copilot) in [#29288](https://github.com/ccxt/ccxt/pull/29288)
* fix: broken urls by [@ttodua](https://github.com/ttodua) in [#29291](https://github.com/ccxt/ccxt/pull/29291)
* chore(deps): bump next from 16.2.6 to 16.2.11 in /website by [@dependabot](https://github.com/dependabot)\[bot] in [#29293](https://github.com/ccxt/ccxt/pull/29293)
* fix: rootDir paths by [@ttodua](https://github.com/ttodua) in [#29292](https://github.com/ccxt/ccxt/pull/29292)
* chore(deps): bump next from 16.2.6 to 16.2.11 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#29295](https://github.com/ccxt/ccxt/pull/29295)
* fix(phemex): round spot order quantities to market precision before Ev scaling by [@g0rdonL](https://github.com/g0rdonL) in [#29294](https://github.com/ccxt/ccxt/pull/29294)
* fix(weex): scale ticker percentage by [@Shiven0504](https://github.com/Shiven0504) in [#29299](https://github.com/ccxt/ccxt/pull/29299)
* golang http.Transport is not reused for proxies, huge leak by [@thebocher](https://github.com/thebocher) in [#29300](https://github.com/ccxt/ccxt/pull/29300)
* fix(lbank): parse swap ticker timestamp by [@mavlevich](https://github.com/mavlevich) in [#29303](https://github.com/ccxt/ccxt/pull/29303)
* fix(build): reclaim playground box disk before deploy, not only after success by [@pcriadoperez](https://github.com/pcriadoperez) in [#29301](https://github.com/ccxt/ccxt/pull/29301)
* chore(deps): bump postcss from 8.5.15 to 8.5.18 in /website by [@dependabot](https://github.com/dependabot)\[bot] in [#29306](https://github.com/ccxt/ccxt/pull/29306)
* Align Docker image `idna` pin with project metadata by [@kroitor](https://github.com/kroitor) with [@Copilot](https://github.com/Copilot) in [#29307](https://github.com/ccxt/ccxt/pull/29307)
* fix(build): restore arm64 development image by [@mavlevich](https://github.com/mavlevich) in [#29305](https://github.com/ccxt/ccxt/pull/29305)
* refactor(js): safestring optimization by [@ttodua](https://github.com/ttodua) in [#29296](https://github.com/ccxt/ccxt/pull/29296)
* fix(future): nativeRejectionHandled by [@carlosmiei](https://github.com/carlosmiei) in [#29322](https://github.com/ccxt/ccxt/pull/29322)
* feat(myriad): update fetchEvent(s) for ob events, add static tests by [@Dan-krm](https://github.com/Dan-krm) in [#29297](https://github.com/ccxt/ccxt/pull/29297)
* feat(playground): add Polymarket prediction example by [@pcriadoperez](https://github.com/pcriadoperez) in [#29224](https://github.com/ccxt/ccxt/pull/29224)
* perf(js): safe function consistency by [@ttodua](https://github.com/ttodua) in [#29313](https://github.com/ccxt/ccxt/pull/29313)
* fix(htx): cap fetchFundingRateHistory limit at 100 for linear swaps by [@rayBastard](https://github.com/rayBastard) in [#29325](https://github.com/ccxt/ccxt/pull/29325)
* feat(nado): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#28800](https://github.com/ccxt/ccxt/pull/28800)
## New Contributors [#new-contributors-5]
* [@g0rdonL](https://github.com/g0rdonL) made their first contribution in [#29294](https://github.com/ccxt/ccxt/pull/29294)
* [@thebocher](https://github.com/thebocher) made their first contribution in [#29300](https://github.com/ccxt/ccxt/pull/29300)
* [@mavlevich](https://github.com/mavlevich) made their first contribution in [#29303](https://github.com/ccxt/ccxt/pull/29303)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.68...v4.5.69](https://github.com/ccxt/ccxt/compare/v4.5.68...v4.5.69)
[Changes][v4.5.69]
# [v4.5.68](https://github.com/ccxt/ccxt/releases/tag/v4.5.68) - 2026-07-22 [#v4568---2026-07-22]
## What's Changed [#whats-changed-10]
* refactor(utils): move to build by [@ttodua](https://github.com/ttodua) in [#29243](https://github.com/ccxt/ccxt/pull/29243)
* fix(coinex): do not use 'value' as quoteVolume on inverse contracts by [@mkzung](https://github.com/mkzung) in [#29247](https://github.com/ccxt/ccxt/pull/29247)
* fix(bitfinex): populate order book sides correctly in PHP by [@carlotestor](https://github.com/carlotestor) in [#29249](https://github.com/ccxt/ccxt/pull/29249)
* fix(okx): forward pagination for fetchCanceledOrders & fetchClosedOrders by [@carlotestor](https://github.com/carlotestor) in [#29254](https://github.com/ccxt/ccxt/pull/29254)
* kraken: fix leaking order cancel updates in watchOrders (tail=true in watchPrivate) by [@carlotestor](https://github.com/carlotestor) in [#29255](https://github.com/ccxt/ccxt/pull/29255)
* bitmex: fix fetchOrderBook empty results in PHP transpile by [@carlotestor](https://github.com/carlotestor) in [#29256](https://github.com/ccxt/ccxt/pull/29256)
* coinbase: fetchClosedOrders - increase pagination maxEntriesPerRequest to 1000 by [@carlotestor](https://github.com/carlotestor) in [#29257](https://github.com/ccxt/ccxt/pull/29257)
* chore: fix granular GO build to support prediction exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#29251](https://github.com/ccxt/ccxt/pull/29251)
* ndax: fix empty orderbook arrays in PHP by [@carlotestor](https://github.com/carlotestor) in [#29259](https://github.com/ccxt/ccxt/pull/29259)
* fix(xt): read spot baseVolume from 'q' by [@mkzung](https://github.com/mkzung) in [#29250](https://github.com/ccxt/ccxt/pull/29250)
* fix(bybit): set linear/inverse/subType for expired option markets by [@carlotestor](https://github.com/carlotestor) in [#29258](https://github.com/ccxt/ccxt/pull/29258)
* fix(binance): allow empty symbols in watchLiquidationsForSymbols by [@carlotestor](https://github.com/carlotestor) in [#29260](https://github.com/ccxt/ccxt/pull/29260)
* fix(27997): binance skip futures balance assets with updateTime 0 in parseBalance by [@carlotestor](https://github.com/carlotestor) in [#29108](https://github.com/ccxt/ccxt/pull/29108)
* fix(whitebit): parse side and role in watchMyTrades deals\_update by [@carlotestor](https://github.com/carlotestor) in [#29264](https://github.com/ccxt/ccxt/pull/29264)
* fix(coinex): map WS order event to unified status in watchOrders by [@carlotestor](https://github.com/carlotestor) in [#29266](https://github.com/ccxt/ccxt/pull/29266)
* fix(htx): set lastTradeTimestamp on spot watchOrders trade events by [@carlotestor](https://github.com/carlotestor) in [#29263](https://github.com/ccxt/ccxt/pull/29263)
* fix(binance): parse stringified JSON response in fetchWithdrawals by [@carlotestor](https://github.com/carlotestor) in [#29262](https://github.com/ccxt/ccxt/pull/29262)
* refactor(test): safe methods by [@ttodua](https://github.com/ttodua) in [#29261](https://github.com/ccxt/ccxt/pull/29261)
* chore(deps): bump js-yaml, fumadocs-mdx and fumadocs-ui in /website by [@dependabot](https://github.com/dependabot)\[bot] in [#29270](https://github.com/ccxt/ccxt/pull/29270)
* chore(deps): bump js-yaml and fumadocs-core in /website by [@dependabot](https://github.com/dependabot)\[bot] in [#29272](https://github.com/ccxt/ccxt/pull/29272)
* chore(deps-dev): bump linkify-it from 5.0.1 to 5.0.2 by [@dependabot](https://github.com/dependabot)\[bot] in [#29273](https://github.com/ccxt/ccxt/pull/29273)
* chore(deps): bump setuptools from 82.0.1 to 83.0.0 by [@dependabot](https://github.com/dependabot)\[bot] in [#29274](https://github.com/ccxt/ccxt/pull/29274)
* chore(deps): bump guzzlehttp/psr7 to 2.13.0 by [@moridsadat](https://github.com/moridsadat) in [#29269](https://github.com/ccxt/ccxt/pull/29269)
* chore(deps): bump dompurify from 3.4.11 to 3.4.12 in /playground by [@dependabot](https://github.com/dependabot)\[bot] in [#29275](https://github.com/ccxt/ccxt/pull/29275)
* fix(whitebit): use actual fee currency from watchMyTrades WS payload by [@rayBastard](https://github.com/rayBastard) in [#29276](https://github.com/ccxt/ccxt/pull/29276)
* Revert "fix(binance): parse stringified JSON response in fetchWithdrawals" by [@frosty00](https://github.com/frosty00) in [#29279](https://github.com/ccxt/ccxt/pull/29279)
* feat(polymarket): add builderFee 0 just for tracking purposes by [@carlosmiei](https://github.com/carlosmiei) in [#29278](https://github.com/ccxt/ccxt/pull/29278)
* feat(hyperliquid): add tracking (fee=0) builder id by [@carlosmiei](https://github.com/carlosmiei) in [#29281](https://github.com/ccxt/ccxt/pull/29281)
* chore: trim changelong entries by [@carlosmiei](https://github.com/carlosmiei) in [#29283](https://github.com/ccxt/ccxt/pull/29283)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#29284](https://github.com/ccxt/ccxt/pull/29284)
* chore: fix test-commonjs.cjs by [@carlosmiei](https://github.com/carlosmiei) in [#29285](https://github.com/ccxt/ccxt/pull/29285)
* chore: bump ast-transpiler to 95 by [@carlosmiei](https://github.com/carlosmiei) in [#29286](https://github.com/ccxt/ccxt/pull/29286)
## New Contributors [#new-contributors-6]
* [@moridsadat](https://github.com/moridsadat) made their first contribution in [#29269](https://github.com/ccxt/ccxt/pull/29269)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.67...v4.5.68](https://github.com/ccxt/ccxt/compare/v4.5.67...v4.5.68)
[Changes][v4.5.68]
# [v4.5.67](https://github.com/ccxt/ccxt/releases/tag/v4.5.67) - 2026-07-19 [#v4567---2026-07-19]
## What's Changed [#whats-changed-11]
* docs(woo): update [@see](https://github.com/see), update docs by [@sc0Vu](https://github.com/sc0Vu) in [#29230](https://github.com/ccxt/ccxt/pull/29230)
* feat(paradex): add apis, update [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#29221](https://github.com/ccxt/ccxt/pull/29221)
* chore: push changelog to tg and discord by [@carlosmiei](https://github.com/carlosmiei) in [#29234](https://github.com/ccxt/ccxt/pull/29234)
* feat(polymarket): add tags support by [@carlosmiei](https://github.com/carlosmiei) in [#29235](https://github.com/ccxt/ccxt/pull/29235)
* chore: try to speed up c# build by [@carlosmiei](https://github.com/carlosmiei) in [#29236](https://github.com/ccxt/ccxt/pull/29236)
* fix(binance): parsePosition fix when leverage = 0 by [@carlosmiei](https://github.com/carlosmiei) in [#29245](https://github.com/ccxt/ccxt/pull/29245)
* fix(coinex): populate quoteVolume from the ticker 'value' field by [@mkzung](https://github.com/mkzung) in [#29246](https://github.com/ccxt/ccxt/pull/29246)
## New Contributors [#new-contributors-7]
* [@mkzung](https://github.com/mkzung) made their first contribution in [#29246](https://github.com/ccxt/ccxt/pull/29246)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.66...v4.5.67](https://github.com/ccxt/ccxt/compare/v4.5.66...v4.5.67)
[Changes][v4.5.67]
# [v4.5.66](https://github.com/ccxt/ccxt/releases/tag/v4.5.66) - 2026-07-16 [#v4566---2026-07-16]
## What's Changed [#whats-changed-12]
* refactor: reduce safeN calls by [@kroitor](https://github.com/kroitor) in [#29200](https://github.com/ccxt/ccxt/pull/29200)
* refactor: reduce safeN calls by [@kroitor](https://github.com/kroitor) in [#29202](https://github.com/ccxt/ccxt/pull/29202)
* fix: safe\_string uppercasing/lowercasing across all langs by [@ttodua](https://github.com/ttodua) in [#29199](https://github.com/ccxt/ccxt/pull/29199)
* fix: implodeHostname dydx & blofin by [@ttodua](https://github.com/ttodua) in [#29207](https://github.com/ccxt/ccxt/pull/29207)
* fix(build): keep setuptools intermediate tree out of root build/ by [@carlotestor](https://github.com/carlotestor) in [#29209](https://github.com/ccxt/ccxt/pull/29209)
* chore: comment in tests by [@ttodua](https://github.com/ttodua) in [#29208](https://github.com/ccxt/ccxt/pull/29208)
* docs(luno): add apis, update [@see](https://github.com/see), update docs by [@sc0Vu](https://github.com/sc0Vu) in [#29204](https://github.com/ccxt/ccxt/pull/29204)
* refactor(build): pass head\_commit.message via env in github workflows by [@kobihikri](https://github.com/kobihikri) in [#29203](https://github.com/ccxt/ccxt/pull/29203)
* chore(okx): ticker comments by [@ttodua](https://github.com/ttodua) in [#26084](https://github.com/ccxt/ccxt/pull/26084)
* doc: ccxt pro links by [@ttodua](https://github.com/ttodua) in [#28535](https://github.com/ccxt/ccxt/pull/28535)
* perf: python inline imports by [@ttodua](https://github.com/ttodua) in [#27951](https://github.com/ccxt/ccxt/pull/27951)
* fix(grvt): ternary transpilation by [@ttodua](https://github.com/ttodua) in [#29212](https://github.com/ccxt/ccxt/pull/29212)
* fix(js): dynamic imports for nuxtjs etc by [@ttodua](https://github.com/ttodua) in [#26938](https://github.com/ccxt/ccxt/pull/26938)
* feat: Prediction on ccxt by [@carlosmiei](https://github.com/carlosmiei) in [#28752](https://github.com/ccxt/ccxt/pull/28752)
* fix(docs): restore blog label in nav NAV\_LABELS by [@pcriadoperez](https://github.com/pcriadoperez) in [#29215](https://github.com/ccxt/ccxt/pull/29215)
* docs(pacifica): update docs by [@sc0Vu](https://github.com/sc0Vu) in [#29214](https://github.com/ccxt/ccxt/pull/29214)
* docs(toobit): add apis, update [@see](https://github.com/see), update docs by [@sc0Vu](https://github.com/sc0Vu) in [#29213](https://github.com/ccxt/ccxt/pull/29213)
* docs(prediction): guide polish + home hero prediction support by [@pcriadoperez](https://github.com/pcriadoperez) in [#29217](https://github.com/ccxt/ccxt/pull/29217)
* docs(prediction): reference prediction structures in [@returns](https://github.com/returns) by [@pcriadoperez](https://github.com/pcriadoperez) in [#29216](https://github.com/ccxt/ccxt/pull/29216)
* fix(gemini): watchOrderBook fix by [@ttodua](https://github.com/ttodua) in [#29218](https://github.com/ccxt/ccxt/pull/29218)
* chore(build): git mv check-dependencies.sh into build/ by [@carlotestor](https://github.com/carlotestor) in [#29220](https://github.com/ccxt/ccxt/pull/29220)
* feat(mexc): update by [@sc0Vu](https://github.com/sc0Vu) in [#29205](https://github.com/ccxt/ccxt/pull/29205)
* docs(onetrading): add apis, update [@see](https://github.com/see), update ws url by [@sc0Vu](https://github.com/sc0Vu) in [#29222](https://github.com/ccxt/ccxt/pull/29222)
* fix(bingx): edit order by [@ttodua](https://github.com/ttodua) in [#29211](https://github.com/ccxt/ccxt/pull/29211)
* chore(python): remove aiodns package req by [@ttodua](https://github.com/ttodua) in [#27129](https://github.com/ccxt/ccxt/pull/27129)
## New Contributors [#new-contributors-8]
* [@kobihikri](https://github.com/kobihikri) made their first contribution in [#29203](https://github.com/ccxt/ccxt/pull/29203)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.65...v4.5.66](https://github.com/ccxt/ccxt/compare/v4.5.65...v4.5.66)
[Changes][v4.5.66]
# [v4.5.65](https://github.com/ccxt/ccxt/releases/tag/v4.5.65) - 2026-07-13 [#v4565---2026-07-13]
## What's Changed [#whats-changed-13]
* test: add atom/cosmos networkcode by [@ttodua](https://github.com/ttodua) in [#29060](https://github.com/ccxt/ccxt/pull/29060)
* chore(build): replace python setup.py with root pyproject.toml, pin python dependencies by [@carlotestor](https://github.com/carlotestor) in [#29093](https://github.com/ccxt/ccxt/pull/29093)
* refactor: remove SPL network by [@ttodua](https://github.com/ttodua) in [#29096](https://github.com/ccxt/ccxt/pull/29096)
* feat(python): uvloop/winloop/orjson accelerators with safe defaults by [@carlotestor](https://github.com/carlotestor) in [#29098](https://github.com/ccxt/ccxt/pull/29098)
* perf(python): uvloop/winloop/orjson accelerators + precision-safe JSON handling by [@carlotestor](https://github.com/carlotestor) in [#29100](https://github.com/ccxt/ccxt/pull/29100)
* release.yml: push back exchanges.json (force-add past .gitignore) by [@carlotestor](https://github.com/carlotestor) in [#29109](https://github.com/ccxt/ccxt/pull/29109)
* fix(26168): deribit parseTransfer timestamp parsing (already in milliseconds) by [@carlotestor](https://github.com/carlotestor) in [#29102](https://github.com/ccxt/ccxt/pull/29102)
* fix(26731): mexc pro - map sendTime to lastTradeTimestamp in watchOrders by [@carlotestor](https://github.com/carlotestor) in [#29103](https://github.com/ccxt/ccxt/pull/29103)
* fix(base): safeTicker - preserve legitimate zero change (fixes [#25971](https://github.com/ccxt/ccxt/issues/25971)) by [@carlotestor](https://github.com/carlotestor) in [#29105](https://github.com/ccxt/ccxt/pull/29105)
* fix(base): reduce strictNullChecks errors in base infra, functions, and coinex by [@carlotestor](https://github.com/carlotestor) in [#28960](https://github.com/ccxt/ccxt/pull/28960)
* fix(okx): reduce strictNullChecks errors + transpiler-safe ternaries by [@carlotestor](https://github.com/carlotestor) in [#28965](https://github.com/ccxt/ccxt/pull/28965)
* fix(base): position percentage derivation in safePosition (unrealisedPnl -> unrealizedPnl typo) by [@carlotestor](https://github.com/carlotestor) in [#29110](https://github.com/ccxt/ccxt/pull/29110)
* fix(27152): gate parsePosition maps initialMargin from margin field by [@carlotestor](https://github.com/carlotestor) in [#29104](https://github.com/ccxt/ccxt/pull/29104)
* feat(bitget): auto detect UTA account by [@carlosmiei](https://github.com/carlosmiei) in [#29051](https://github.com/ccxt/ccxt/pull/29051)
* feat(kucoin): update by [@yzh-pelle](https://github.com/yzh-pelle) in [#29042](https://github.com/ccxt/ccxt/pull/29042)
* fix(28709): bingx - omit quantity from swap order request when closePosition is true by [@carlotestor](https://github.com/carlotestor) in [#29106](https://github.com/ccxt/ccxt/pull/29106)
* fix(28622): add quant-backtest-utils to Awesome CCXT wiki by [@carlotestor](https://github.com/carlotestor) in [#29113](https://github.com/ccxt/ccxt/pull/29113)
* feat(hyperliquid): remove WebData2 stream by [@sc0Vu](https://github.com/sc0Vu) in [#29030](https://github.com/ccxt/ccxt/pull/29030)
* fix(gate): static response fixture percentage misplaced by [#29104](https://github.com/ccxt/ccxt/issues/29104)/[#29110](https://github.com/ccxt/ccxt/issues/29110) auto-merge by [@carlotestor](https://github.com/carlotestor) in [#29114](https://github.com/ccxt/ccxt/pull/29114)
* Replace ethereum and toolz static dependencies with hand-rolled ABI + EIP-712 encoder by [@carlotestor](https://github.com/carlotestor) in [#29112](https://github.com/ccxt/ccxt/pull/29112)
* fix(gate): regenerate stale Go output for parsePosition/safePosition by [@carlotestor](https://github.com/carlotestor) in [#29116](https://github.com/ccxt/ccxt/pull/29116)
* fix(exchanges): reduce strictNullChecks errors across exchanges and tests by [@carlotestor](https://github.com/carlotestor) in [#28966](https://github.com/ccxt/ccxt/pull/28966)
* fix(base): go Precise.Div must truncate toward zero like JS BigInt division by [@carlotestor](https://github.com/carlotestor) in [#29118](https://github.com/ccxt/ccxt/pull/29118)
* feat(base): replace node-fetch with native fetch (undici), HTTP/1.1 keep-alive pooling by [@carlotestor](https://github.com/carlotestor) in [#29084](https://github.com/ccxt/ccxt/pull/29084)
* chore(deps): bump undici from 7.27.2 to 7.28.0 by [@dependabot](https://github.com/dependabot)\[bot] in [#29120](https://github.com/ccxt/ccxt/pull/29120)
* base: parseJson fast path — requote numbers only when an unsafe integer is present by [@carlotestor](https://github.com/carlotestor) in [#29119](https://github.com/ccxt/ccxt/pull/29119)
* fix(mudrex): logo by [@kroitor](https://github.com/kroitor) in [#29121](https://github.com/ccxt/ccxt/pull/29121)
* php: remove quoteJsonNumbers regex pass, use JSON\_BIGINT\_AS\_STRING by [@carlotestor](https://github.com/carlotestor) in [#29123](https://github.com/ccxt/ccxt/pull/29123)
* refactor: guard loadMarkets calls by [@carlotestor](https://github.com/carlotestor) in [#29111](https://github.com/ccxt/ccxt/pull/29111)
* refactor(dydx): remove bip dependencies, support hex private keys only by [@carlotestor](https://github.com/carlotestor) in [#29124](https://github.com/ccxt/ccxt/pull/29124)
* fix(aftermath)!: delist by [@ttodua](https://github.com/ttodua) in [#29125](https://github.com/ccxt/ccxt/pull/29125)
* refactor(pro): drop vendored fflate, use node:zlib in node with fflate fallback by [@carlotestor](https://github.com/carlotestor) in [#29014](https://github.com/ccxt/ccxt/pull/29014)
* test(fetchTickers): enhance tickers change & precentage accuracy by [@ttodua](https://github.com/ttodua) in [#27763](https://github.com/ccxt/ccxt/pull/27763)
* edit postinstall by [@frosty00](https://github.com/frosty00) in [#29128](https://github.com/ccxt/ccxt/pull/29128)
* refactor(static-updater) - some updates by [@ttodua](https://github.com/ttodua) in [#25268](https://github.com/ccxt/ccxt/pull/25268)
* fix(coinex): fetchCurrencies & static tests all by [@ttodua](https://github.com/ttodua) in [#25987](https://github.com/ccxt/ccxt/pull/25987)
* feat(ai): add ccxt-cli skill by [@pcriadoperez](https://github.com/pcriadoperez) in [#29129](https://github.com/ccxt/ccxt/pull/29129)
* Remove vendored ecdsa static dependency, use coincurve + cryptography by [@carlotestor](https://github.com/carlotestor) in [#29131](https://github.com/ccxt/ccxt/pull/29131)
* feat(hibachi): add methods by [@sc0Vu](https://github.com/sc0Vu) in [#29137](https://github.com/ccxt/ccxt/pull/29137)
* fix(binance): fetchTradesMethod by [@sc0Vu](https://github.com/sc0Vu) in [#29138](https://github.com/ccxt/ccxt/pull/29138)
* refactor(bitmex)!: fetchOHLCVOpenTimestamp > useOpenTimestamp by [@ttodua](https://github.com/ttodua) in [#29142](https://github.com/ccxt/ccxt/pull/29142)
* docs(kraken): update [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#29136](https://github.com/ccxt/ccxt/pull/29136)
* chore(go): add unique in interface by [@ttodua](https://github.com/ttodua) in [#29126](https://github.com/ccxt/ccxt/pull/29126)
* feat(kucoin): add reduceMargin by [@sc0Vu](https://github.com/sc0Vu) in [#29135](https://github.com/ccxt/ccxt/pull/29135)
* feat(docs): add survey pop up by [@carlosmiei](https://github.com/carlosmiei) in [#29145](https://github.com/ccxt/ccxt/pull/29145)
* fix(cli): --no-send and --no-load-markets were silently ignored by [@pcriadoperez](https://github.com/pcriadoperez) in [#29141](https://github.com/ccxt/ccxt/pull/29141)
* feat(docs): add survey pop up change location by [@carlosmiei](https://github.com/carlosmiei) in [#29147](https://github.com/ccxt/ccxt/pull/29147)
* feat(docs): add blog to docs.ccxt.com by [@pcriadoperez](https://github.com/pcriadoperez) in [#29150](https://github.com/ccxt/ccxt/pull/29150)
* refactor(bitmex): api-expires > recvWindow by [@ttodua](https://github.com/ttodua) in [#29143](https://github.com/ccxt/ccxt/pull/29143)
* refactor(bigone): normalize options by [@ttodua](https://github.com/ttodua) in [#29151](https://github.com/ccxt/ccxt/pull/29151)
* refactor(apex): remove odd opt by [@ttodua](https://github.com/ttodua) in [#29146](https://github.com/ccxt/ccxt/pull/29146)
* refactor(alpaca): normalize options by [@ttodua](https://github.com/ttodua) in [#29144](https://github.com/ccxt/ccxt/pull/29144)
* refactor(aster): normalize options by [@ttodua](https://github.com/ttodua) in [#29148](https://github.com/ccxt/ccxt/pull/29148)
* refactor(bitmart): normalize options by [@ttodua](https://github.com/ttodua) in [#29157](https://github.com/ccxt/ccxt/pull/29157)
* refactor(bitopro): normalize options by [@ttodua](https://github.com/ttodua) in [#29158](https://github.com/ccxt/ccxt/pull/29158)
* refactor(bit2c): normalize options by [@ttodua](https://github.com/ttodua) in [#29154](https://github.com/ccxt/ccxt/pull/29154)
* refactor(bitfinex): normalize options by [@ttodua](https://github.com/ttodua) in [#29155](https://github.com/ccxt/ccxt/pull/29155)
* refactor(bitget): normalize options by [@ttodua](https://github.com/ttodua) in [#29156](https://github.com/ccxt/ccxt/pull/29156)
* refactor(bitrue): normalize options by [@ttodua](https://github.com/ttodua) in [#29159](https://github.com/ccxt/ccxt/pull/29159)
* Add Dependabot configuration for Go modules by [@kroitor](https://github.com/kroitor) in [#29161](https://github.com/ccxt/ccxt/pull/29161)
* fix(go): dependabot security fixes by [@kroitor](https://github.com/kroitor) in [#29163](https://github.com/ccxt/ccxt/pull/29163)
* chore(deps): bump golang.org/x/crypto from 0.45.0 to 0.52.0 in /go/tests/profile by [@dependabot](https://github.com/dependabot)\[bot] in [#29164](https://github.com/ccxt/ccxt/pull/29164)
* chore(deps): go/tests/types fixes by [@kroitor](https://github.com/kroitor) in [#29165](https://github.com/ccxt/ccxt/pull/29165)
* chore(deps): dependabot go cli fixes by [@kroitor](https://github.com/kroitor) in [#29166](https://github.com/ccxt/ccxt/pull/29166)
* feat(okx): update docs by [@sc0Vu](https://github.com/sc0Vu) in [#29168](https://github.com/ccxt/ccxt/pull/29168)
* refactor(alpaca): remove gtc by [@ttodua](https://github.com/ttodua) in [#29170](https://github.com/ccxt/ccxt/pull/29170)
* feat(ndax): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#29167](https://github.com/ccxt/ccxt/pull/29167)
* feat(bitso): implement fetchCurrencies; fix fetchMarkets; normalize options by [@ttodua](https://github.com/ttodua) in [#29169](https://github.com/ccxt/ccxt/pull/29169)
* refactor(bitteam): normalize options by [@ttodua](https://github.com/ttodua) in [#29172](https://github.com/ccxt/ccxt/pull/29172)
* fix(java): lang specific test by [@carlosmiei](https://github.com/carlosmiei) in [#29173](https://github.com/ccxt/ccxt/pull/29173)
* fix(alpaca): default gtc by [@ttodua](https://github.com/ttodua) in [#29174](https://github.com/ccxt/ccxt/pull/29174)
* fix: [#28494](https://github.com/ccxt/ccxt/issues/28494) use native WebSocket under Bun runtime by [@carlotestor](https://github.com/carlotestor) in [#29171](https://github.com/ccxt/ccxt/pull/29171)
* fix(tests): avoid Windows Defender false positive in test.watchOrderBookForSymbols.ts by [@carlotestor](https://github.com/carlotestor) in [#29177](https://github.com/ccxt/ccxt/pull/29177)
* refactor(binance): normalize options by [@ttodua](https://github.com/ttodua) in [#29152](https://github.com/ccxt/ccxt/pull/29152)
* build: bump TypeScript to 7.0.2 with typescript6 alias for compiler-API consumers by [@carlotestor](https://github.com/carlotestor) in [#29176](https://github.com/ccxt/ccxt/pull/29176)
* refactor(bittrade): normalize options by [@ttodua](https://github.com/ttodua) in [#29178](https://github.com/ccxt/ccxt/pull/29178)
* fix(go): add Precision to marketinterface struct by [@carlosmiei](https://github.com/carlosmiei) in [#29180](https://github.com/ccxt/ccxt/pull/29180)
* chore(aster): skip withdraw by [@ttodua](https://github.com/ttodua) in [#29183](https://github.com/ccxt/ccxt/pull/29183)
* refactor: normalize options by [@ttodua](https://github.com/ttodua) in [#29181](https://github.com/ccxt/ccxt/pull/29181)
* fix(build): run gofmt after Go transpile by [@pcriadoperez](https://github.com/pcriadoperez) in [#29184](https://github.com/ccxt/ccxt/pull/29184)
* chore(deps): bump mistune from 3.2.1 to 3.3.0 by [@dependabot](https://github.com/dependabot)\[bot] in [#29186](https://github.com/ccxt/ccxt/pull/29186)
* fix(java): regex concurrent by [@carlosmiei](https://github.com/carlosmiei) in [#29189](https://github.com/ccxt/ccxt/pull/29189)
* Go transpiler: emit gofmt-formatted output, drop formatGO step by [@carlotestor](https://github.com/carlotestor) in [#29191](https://github.com/ccxt/ccxt/pull/29191)
* fix(go): unblock Send when the websocket is not connected by [@vsaraikin](https://github.com/vsaraikin) in [#29187](https://github.com/ccxt/ccxt/pull/29187)
* perf(pro): convert pure WS delegators to non-async pass-through by [@carlotestor](https://github.com/carlotestor) in [#29122](https://github.com/ccxt/ccxt/pull/29122)
* fix(backpack): normalize ticker percentage with Precise.stringMul by [@Functionhx](https://github.com/Functionhx) in [#29192](https://github.com/ccxt/ccxt/pull/29192)
* fix(go): safeFloatN default assertion by [@carlosmiei](https://github.com/carlosmiei) in [#29193](https://github.com/ccxt/ccxt/pull/29193)
* perf(pro): deliver ws messages through a duplex stream instead of per-message deferred events by [@carlotestor](https://github.com/carlotestor) in [#29117](https://github.com/ccxt/ccxt/pull/29117)
* fix(docs): add java reference by [@carlosmiei](https://github.com/carlosmiei) in [#29194](https://github.com/ccxt/ccxt/pull/29194)
* refactor(php): allow sync only guarding async require statements fix [#29196](https://github.com/ccxt/ccxt/issues/29196) by [@kroitor](https://github.com/kroitor) in [#29197](https://github.com/ccxt/ccxt/pull/29197)
* feat(binance): add binance skills by [@pcriadoperez](https://github.com/pcriadoperez) in [#29160](https://github.com/ccxt/ccxt/pull/29160)
* fix(bingx): takeProfit & stopLoss fix by [@ttodua](https://github.com/ttodua) in [#29185](https://github.com/ccxt/ccxt/pull/29185)
## New Contributors [#new-contributors-9]
* [@vsaraikin](https://github.com/vsaraikin) made their first contribution in [#29187](https://github.com/ccxt/ccxt/pull/29187)
* [@Functionhx](https://github.com/Functionhx) made their first contribution in [#29192](https://github.com/ccxt/ccxt/pull/29192)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.64...v4.5.65](https://github.com/ccxt/ccxt/compare/v4.5.64...v4.5.65)
[Changes][v4.5.65]
# [v4.5.64](https://github.com/ccxt/ccxt/releases/tag/v4.5.64) - 2026-07-03 [#v4564---2026-07-03]
## What's Changed [#whats-changed-14]
* chore: fix go action to use pre-transpile-go by [@carlosmiei](https://github.com/carlosmiei) in [#29048](https://github.com/ccxt/ccxt/pull/29048)
* feat(kraken): parseOrder updated with lastUpdateTimestamp by [@yzh-pelle](https://github.com/yzh-pelle) in [#29049](https://github.com/ccxt/ccxt/pull/29049)
* feat(build): generate per-exchange implicit API docs pages by [@pcriadoperez](https://github.com/pcriadoperez) in [#29031](https://github.com/ccxt/ccxt/pull/29031)
* feat(delta): add apis, add setMarginMode by [@sc0Vu](https://github.com/sc0Vu) in [#29050](https://github.com/ccxt/ccxt/pull/29050)
* fix lighter: edit order when builder fee is disabled by [@encharge-code-review](https://github.com/encharge-code-review) in [#29054](https://github.com/ccxt/ccxt/pull/29054)
* fix(bingx): watchBalance with type = swap by [@carlosmiei](https://github.com/carlosmiei) in [#29053](https://github.com/ccxt/ccxt/pull/29053)
* feat: add recent\_fetch\_cache by [@ttodua](https://github.com/ttodua) in [#28721](https://github.com/ccxt/ccxt/pull/28721)
* fix(ascendex)!: delist by [@ttodua](https://github.com/ttodua) in [#29079](https://github.com/ccxt/ccxt/pull/29079)
* fix(novadax)!: delist by [@ttodua](https://github.com/ttodua) in [#29078](https://github.com/ccxt/ccxt/pull/29078)
* fix(coinmetro)!: delist by [@ttodua](https://github.com/ttodua) in [#29069](https://github.com/ccxt/ccxt/pull/29069)
* fix(poloniex): future false by [@ttodua](https://github.com/ttodua) in [#29082](https://github.com/ccxt/ccxt/pull/29082)
* fix(pacifica): future market type by [@ttodua](https://github.com/ttodua) in [#29081](https://github.com/ccxt/ccxt/pull/29081)
* fix(lighter): spot true by [@ttodua](https://github.com/ttodua) in [#29077](https://github.com/ccxt/ccxt/pull/29077)
* fix(hashkey): add swap market type by [@ttodua](https://github.com/ttodua) in [#29073](https://github.com/ccxt/ccxt/pull/29073)
* fix(hyperliquid): remove future type by [@ttodua](https://github.com/ttodua) in [#29076](https://github.com/ccxt/ccxt/pull/29076)
* test: skip mica exchanges for check by [@ttodua](https://github.com/ttodua) in [#29072](https://github.com/ccxt/ccxt/pull/29072)
* fix(kucoin): future type by [@ttodua](https://github.com/ttodua) in [#29074](https://github.com/ccxt/ccxt/pull/29074)
* chore: kucoineu currency id by [@ttodua](https://github.com/ttodua) in [#29075](https://github.com/ccxt/ccxt/pull/29075)
* fix(extended): spot type add by [@ttodua](https://github.com/ttodua) in [#29070](https://github.com/ccxt/ccxt/pull/29070)
* chore: derive skip fetchOrderBook by [@ttodua](https://github.com/ttodua) in [#29068](https://github.com/ccxt/ccxt/pull/29068)
* fix(coinbase): has swap & future added by [@ttodua](https://github.com/ttodua) in [#29067](https://github.com/ccxt/ccxt/pull/29067)
* fix(bitstamp): swap type by [@ttodua](https://github.com/ttodua) in [#29063](https://github.com/ccxt/ccxt/pull/29063)
* fix(bullish): swap true market type by [@ttodua](https://github.com/ttodua) in [#29065](https://github.com/ccxt/ccxt/pull/29065)
* fix(bitmex): .has index market false by [@ttodua](https://github.com/ttodua) in [#29062](https://github.com/ccxt/ccxt/pull/29062)
* chore: btcbox skip again 1 month by [@ttodua](https://github.com/ttodua) in [#29064](https://github.com/ccxt/ccxt/pull/29064)
* fix(aster): market types .has by [@ttodua](https://github.com/ttodua) in [#29057](https://github.com/ccxt/ccxt/pull/29057)
* fix(okxus): swap type add by [@ttodua](https://github.com/ttodua) in [#29080](https://github.com/ccxt/ccxt/pull/29080)
* chore(python): remove vendored sympy, marshmallow\_dataclass and typing\_inspect by [@carlotestor](https://github.com/carlotestor) in [#29086](https://github.com/ccxt/ccxt/pull/29086)
* test: fix symbol replacement by [@ttodua](https://github.com/ttodua) in [#29083](https://github.com/ccxt/ccxt/pull/29083)
* chore: coinbaseinternational skip ob check by [@ttodua](https://github.com/ttodua) in [#29066](https://github.com/ccxt/ccxt/pull/29066)
* chore: bitget inactive pcnt increase by [@ttodua](https://github.com/ttodua) in [#29061](https://github.com/ccxt/ccxt/pull/29061)
* feat(grvt): update docs by [@sc0Vu](https://github.com/sc0Vu) in [#29088](https://github.com/ccxt/ccxt/pull/29088)
* feat(dydx): update docs by [@sc0Vu](https://github.com/sc0Vu) in [#29087](https://github.com/ccxt/ccxt/pull/29087)
* feat(hibachi): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#29090](https://github.com/ccxt/ccxt/pull/29090)
* New exchange: Mudrex by [@DecentralizedJM](https://github.com/DecentralizedJM) in [#28266](https://github.com/ccxt/ccxt/pull/28266)
* fix(tests): disable base test that requires specific exchange by [@carlosmiei](https://github.com/carlosmiei) in [#29091](https://github.com/ccxt/ccxt/pull/29091)
* Kraken's OHLCV timestamp is referring to the candle's end time by [@gbeced](https://github.com/gbeced) in [#29085](https://github.com/ccxt/ccxt/pull/29085)
* fix(bitget): checksum validation by [@carlosmiei](https://github.com/carlosmiei) in [#29092](https://github.com/ccxt/ccxt/pull/29092)
* fix(bitget): signature in go, rawencode sorted order by [@carlosmiei](https://github.com/carlosmiei) in [#29094](https://github.com/ccxt/ccxt/pull/29094)
* feat(hashkey): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#29089](https://github.com/ccxt/ccxt/pull/29089)
## New Contributors [#new-contributors-10]
* [@encharge-code-review](https://github.com/encharge-code-review) made their first contribution in [#29054](https://github.com/ccxt/ccxt/pull/29054)
* [@DecentralizedJM](https://github.com/DecentralizedJM) made their first contribution in [#28266](https://github.com/ccxt/ccxt/pull/28266)
* [@gbeced](https://github.com/gbeced) made their first contribution in [#29085](https://github.com/ccxt/ccxt/pull/29085)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.63...v4.5.64](https://github.com/ccxt/ccxt/compare/v4.5.63...v4.5.64)
[Changes][v4.5.64]
# [v4.5.63](https://github.com/ccxt/ccxt/releases/tag/v4.5.63) - 2026-06-30 [#v4563---2026-06-30]
## What's Changed [#whats-changed-15]
* docs(cex): update [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#29028](https://github.com/ccxt/ccxt/pull/29028)
* feat(binance): linear and inverse update by [@yzh-pelle](https://github.com/yzh-pelle) in [#28905](https://github.com/ccxt/ccxt/pull/28905)
* feat(bybit): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#29027](https://github.com/ccxt/ccxt/pull/29027)
* feat(lighter): enhance side determination for own trades in Lighter by [@slavivanov](https://github.com/slavivanov) in [#29035](https://github.com/ccxt/ccxt/pull/29035)
* feat(coincheck): add apis, add fetchStatus by [@sc0Vu](https://github.com/sc0Vu) in [#29034](https://github.com/ccxt/ccxt/pull/29034)
* feat(coinsph): update by [@sc0Vu](https://github.com/sc0Vu) in [#29033](https://github.com/ccxt/ccxt/pull/29033)
* fix(status): disable rl by [@carlosmiei](https://github.com/carlosmiei) in [#29037](https://github.com/ccxt/ccxt/pull/29037)
* chore: add Kucoin EU by [@carlosmiei](https://github.com/carlosmiei) in [#29039](https://github.com/ccxt/ccxt/pull/29039)
* feat(hyperliquid): add 0% fee when flag is disabled by [@carlosmiei](https://github.com/carlosmiei) in [#29040](https://github.com/ccxt/ccxt/pull/29040)
* fix(go): client.sub migration to sync.map by [@carlosmiei](https://github.com/carlosmiei) in [#29043](https://github.com/ccxt/ccxt/pull/29043)
* chore: trigger build by [@carlosmiei](https://github.com/carlosmiei) in [#29044](https://github.com/ccxt/ccxt/pull/29044)
* chore(deps-dev): bump js-yaml from 4.1.1 to 4.3.0 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#29041](https://github.com/ccxt/ccxt/pull/29041)
* fix(export-exchanges): migrate to .ts and fix conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#29045](https://github.com/ccxt/ccxt/pull/29045)
* fix(export-exchanges): --js also produces wiki files by [@carlosmiei](https://github.com/carlosmiei) in [#29046](https://github.com/ccxt/ccxt/pull/29046)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.62...v4.5.63](https://github.com/ccxt/ccxt/compare/v4.5.62...v4.5.63)
[Changes][v4.5.63]
# [v4.5.62](https://github.com/ccxt/ccxt/releases/tag/v4.5.62) - 2026-06-29 [#v4562---2026-06-29]
## What's Changed [#whats-changed-16]
* test: fix undefined networks by [@ttodua](https://github.com/ttodua) in [#29022](https://github.com/ccxt/ccxt/pull/29022)
* docs: cleanup before tsc by [@ttodua](https://github.com/ttodua) in [#29003](https://github.com/ccxt/ccxt/pull/29003)
* docs: increase node version by [@ttodua](https://github.com/ttodua) in [#29024](https://github.com/ccxt/ccxt/pull/29024)
* fix(bitmex, exchange): inverse swaps parsing and async close() by [@carlosmiei](https://github.com/carlosmiei) in [#29029](https://github.com/ccxt/ccxt/pull/29029)
* feat(htx): V5 linear websocket support by [@Dan-krm](https://github.com/Dan-krm) in [#29017](https://github.com/ccxt/ccxt/pull/29017)
* fix(bingx): read trading-fee response after the API call in fetchTradingFee by [@jota78](https://github.com/jota78) in [#29025](https://github.com/ccxt/ccxt/pull/29025)
## New Contributors [#new-contributors-11]
* [@jota78](https://github.com/jota78) made their first contribution in [#29025](https://github.com/ccxt/ccxt/pull/29025)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.61...v4.5.62](https://github.com/ccxt/ccxt/compare/v4.5.61...v4.5.62)
[Changes][v4.5.62]
# [v4.5.61](https://github.com/ccxt/ccxt/releases/tag/v4.5.61) - 2026-06-27 [#v4561---2026-06-27]
## What's Changed [#whats-changed-17]
* chore(build): make protobufjs an optional peer dependency by [@carlotestor](https://github.com/carlotestor) in [#29011](https://github.com/ccxt/ccxt/pull/29011)
* chore(go): interface methods by [@ttodua](https://github.com/ttodua) in [#29012](https://github.com/ccxt/ccxt/pull/29012)
* perf(build): enable optimal tree shaking via sideEffects: false by [@carlotestor](https://github.com/carlotestor) in [#29013](https://github.com/ccxt/ccxt/pull/29013)
* fix(doc): return orderbook by [@sc0Vu](https://github.com/sc0Vu) in [#29007](https://github.com/ccxt/ccxt/pull/29007)
* chore: try to fix pushback conflict by [@carlosmiei](https://github.com/carlosmiei) in [#29015](https://github.com/ccxt/ccxt/pull/29015)
* fix(build): drop space before paren in transpiled PHP (array()/max/min) by [@carlotestor](https://github.com/carlotestor) in [#29010](https://github.com/ccxt/ccxt/pull/29010)
* Remove jsencrypt static dependency by [@frosty00](https://github.com/frosty00) in [#28955](https://github.com/ccxt/ccxt/pull/28955)
* docs: gateio -> gate by [@ttodua](https://github.com/ttodua) in [#29000](https://github.com/ccxt/ccxt/pull/29000)
* feat(gateeu): add gate EU by [@carlosmiei](https://github.com/carlosmiei) in [#29018](https://github.com/ccxt/ccxt/pull/29018)
* docs: remove ts two folders by [@ttodua](https://github.com/ttodua) in [#29021](https://github.com/ccxt/ccxt/pull/29021)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.60...v4.5.61](https://github.com/ccxt/ccxt/compare/v4.5.60...v4.5.61)
[Changes][v4.5.61]
# [v4.5.60](https://github.com/ccxt/ccxt/releases/tag/v4.5.60) - 2026-06-25 [#v4560---2026-06-25]
## What's Changed [#whats-changed-18]
* chore(deps): bump phpseclib/phpseclib from 2.0.54 to 2.0.55 by [@dependabot](https://github.com/dependabot)\[bot] in [#28897](https://github.com/ccxt/ccxt/pull/28897)
* update eslintrc by [@frosty00](https://github.com/frosty00) in [#28898](https://github.com/ccxt/ccxt/pull/28898)
* fix(bitmex): future type add by [@ttodua](https://github.com/ttodua) in [#28903](https://github.com/ccxt/ccxt/pull/28903)
* test: fix trade structure by [@ttodua](https://github.com/ttodua) in [#28901](https://github.com/ccxt/ccxt/pull/28901)
* fix(ts): isDictionary overwrite by [@ttodua](https://github.com/ttodua) in [#28902](https://github.com/ccxt/ccxt/pull/28902)
* chore: apex url change by [@ttodua](https://github.com/ttodua) in [#28914](https://github.com/ccxt/ccxt/pull/28914)
* docs: rename gateio -> gate by [@ttodua](https://github.com/ttodua) in [#28909](https://github.com/ccxt/ccxt/pull/28909)
* fix(docs): Telegram-fetchable og:image + on-brand social cards by [@pcriadoperez](https://github.com/pcriadoperez) in [#28906](https://github.com/ccxt/ccxt/pull/28906)
* docs: rename huobi -> htx by [@ttodua](https://github.com/ttodua) in [#28907](https://github.com/ccxt/ccxt/pull/28907)
* docs: rename okex -> okx by [@ttodua](https://github.com/ttodua) in [#28910](https://github.com/ccxt/ccxt/pull/28910)
* docs: rename bitfinex2 -> bitfinex by [@ttodua](https://github.com/ttodua) in [#28908](https://github.com/ccxt/ccxt/pull/28908)
* docs: gdax remove & rename coinbasepro -> coinbaseexchange by [@ttodua](https://github.com/ttodua) in [#28912](https://github.com/ccxt/ccxt/pull/28912)
* fix(coinspot): return correct value in createOrder by [@sc0Vu](https://github.com/sc0Vu) in [#28916](https://github.com/ccxt/ccxt/pull/28916)
* docs: bittrex remove/replace & rename hitbtc2 -> hitbtc by [@ttodua](https://github.com/ttodua) in [#28913](https://github.com/ccxt/ccxt/pull/28913)
* feat(lighter): update logo by [@sc0Vu](https://github.com/sc0Vu) in [#28915](https://github.com/ccxt/ccxt/pull/28915)
* coinbaseexchange new endpoints by [@ndubel](https://github.com/ndubel) in [#28917](https://github.com/ccxt/ccxt/pull/28917)
* docs: ts transpilation flag default by [@ttodua](https://github.com/ttodua) in [#28919](https://github.com/ccxt/ccxt/pull/28919)
* docs: move bots to lang by [@ttodua](https://github.com/ttodua) in [#28923](https://github.com/ccxt/ccxt/pull/28923)
* add types to typescript files by [@frosty00](https://github.com/frosty00) in [#28924](https://github.com/ccxt/ccxt/pull/28924)
* chore(deps): bump undici from 7.27.2 to 7.28.0 in /playground by [@dependabot](https://github.com/dependabot)\[bot] in [#28929](https://github.com/ccxt/ccxt/pull/28929)
* chore(deps-dev): bump piscina from 3.2.0 to 4.9.3 by [@dependabot](https://github.com/dependabot)\[bot] in [#28928](https://github.com/ccxt/ccxt/pull/28928)
* docs: some renames by [@ttodua](https://github.com/ttodua) in [#28918](https://github.com/ccxt/ccxt/pull/28918)
* chore(deps): bump dompurify from 3.4.10 to 3.4.11 in /playground by [@dependabot](https://github.com/dependabot)\[bot] in [#28931](https://github.com/ccxt/ccxt/pull/28931)
* chore(deps): bump guzzlehttp/psr7 from 2.11.0 to 2.12.1 by [@dependabot](https://github.com/dependabot)\[bot] in [#28930](https://github.com/ccxt/ccxt/pull/28930)
* chore: pushback examples by [@carlosmiei](https://github.com/carlosmiei) in [#28934](https://github.com/ccxt/ccxt/pull/28934)
* Typefix large by [@frosty00](https://github.com/frosty00) in [#28932](https://github.com/ccxt/ccxt/pull/28932)
* fix(go): stringMin by [@ttodua](https://github.com/ttodua) in [#28933](https://github.com/ccxt/ccxt/pull/28933)
* coinbase: fix swapped maker/taker in fetchTradingFees by [@nmcbride](https://github.com/nmcbride) in [#28922](https://github.com/ccxt/ccxt/pull/28922)
* Reduce typescript errors 5 by [@frosty00](https://github.com/frosty00) in [#28940](https://github.com/ccxt/ccxt/pull/28940)
* Reduce typescript errors 6 by [@frosty00](https://github.com/frosty00) in [#28941](https://github.com/ccxt/ccxt/pull/28941)
* Reduce typescript errors 4 by [@frosty00](https://github.com/frosty00) in [#28939](https://github.com/ccxt/ccxt/pull/28939)
* Revert "Reduce typescript errors 4" by [@frosty00](https://github.com/frosty00) in [#28944](https://github.com/ccxt/ccxt/pull/28944)
* Reduce typescript errors 1 by [@frosty00](https://github.com/frosty00) in [#28936](https://github.com/ccxt/ccxt/pull/28936)
* test: Precise with undefined args by [@ttodua](https://github.com/ttodua) in [#28719](https://github.com/ccxt/ccxt/pull/28719)
* Reduce typescript errors (over 1000 errors) by [@frosty00](https://github.com/frosty00) in [#28937](https://github.com/ccxt/ccxt/pull/28937)
* ci(docs): reliable docs deploys — stable server-actions key, zero-downtime swap, release-only trigger by [@pcriadoperez](https://github.com/pcriadoperez) in [#28948](https://github.com/ccxt/ccxt/pull/28948)
* fix(binance): fees codes by [@ttodua](https://github.com/ttodua) in [#28952](https://github.com/ccxt/ccxt/pull/28952)
* Reduce typescript errors 7 by [@frosty00](https://github.com/frosty00) in [#28942](https://github.com/ccxt/ccxt/pull/28942)
* fix(LastRestRequestTimestamp): data race in go by [@carlosmiei](https://github.com/carlosmiei) in [#28947](https://github.com/ccxt/ccxt/pull/28947)
* refactor(bybit): network codes update by [@ttodua](https://github.com/ttodua) in [#28945](https://github.com/ccxt/ccxt/pull/28945)
* test: re-enable props test by [@ttodua](https://github.com/ttodua) in [#28957](https://github.com/ccxt/ccxt/pull/28957)
* refactor(okx): common networks list by [@ttodua](https://github.com/ttodua) in [#28958](https://github.com/ccxt/ccxt/pull/28958)
* fix(strictNullChecks): null-safety fixes across kucoin exchange group by [@carlotestor](https://github.com/carlotestor) in [#28959](https://github.com/ccxt/ccxt/pull/28959)
* feat(htx): v5 linear swap updates by [@Dan-krm](https://github.com/Dan-krm) in [#28925](https://github.com/ccxt/ccxt/pull/28925)
* feat(hyperliquid): doc by [@sc0Vu](https://github.com/sc0Vu) in [#28967](https://github.com/ccxt/ccxt/pull/28967)
* refactor(binance): common networks list by [@ttodua](https://github.com/ttodua) in [#28951](https://github.com/ccxt/ccxt/pull/28951)
* fix(pro): reduce strictNullChecks errors across websocket exchanges by [@carlotestor](https://github.com/carlotestor) in [#28962](https://github.com/ccxt/ccxt/pull/28962)
* fix(python): minor transpiler fixes by [@frosty00](https://github.com/frosty00) in [#28968](https://github.com/ccxt/ccxt/pull/28968)
* chore: try to clean build by [@carlosmiei](https://github.com/carlosmiei) in [#28969](https://github.com/ccxt/ccxt/pull/28969)
* bump module version in tsconfig by [@frosty00](https://github.com/frosty00) in [#28974](https://github.com/ccxt/ccxt/pull/28974)
* fix(doc): fetchOrdersByStatusWs by [@sc0Vu](https://github.com/sc0Vu) in [#28975](https://github.com/ccxt/ccxt/pull/28975)
* fix(build): emit gofmt-formatted Go in generateImplicitAPI by [@carlotestor](https://github.com/carlotestor) in [#28976](https://github.com/ccxt/ccxt/pull/28976)
* update tsconfig and rollup.config by [@frosty00](https://github.com/frosty00) in [#28977](https://github.com/ccxt/ccxt/pull/28977)
* modify workflow to pushback some python files by [@frosty00](https://github.com/frosty00) in [#28978](https://github.com/ccxt/ccxt/pull/28978)
* fix(dist/ccxt.browser.js): replace the CRLF with a LF by [@carlotestor](https://github.com/carlotestor) in [#28979](https://github.com/ccxt/ccxt/pull/28979)
* docs: js to ts by [@ttodua](https://github.com/ttodua) in [#28920](https://github.com/ccxt/ccxt/pull/28920)
* test: fix type in currency & base method by [@ttodua](https://github.com/ttodua) in [#28981](https://github.com/ccxt/ccxt/pull/28981)
* fix(examples): tsconfig conflict by [@ttodua](https://github.com/ttodua) in [#28982](https://github.com/ccxt/ccxt/pull/28982)
* chore: examples tsconfig skip catch message by [@ttodua](https://github.com/ttodua) in [#28983](https://github.com/ccxt/ccxt/pull/28983)
* docs: ticker.ts fix by [@ttodua](https://github.com/ttodua) in [#28984](https://github.com/ccxt/ccxt/pull/28984)
* docs: remove delisted exchange by [@ttodua](https://github.com/ttodua) in [#28985](https://github.com/ccxt/ccxt/pull/28985)
* feat(htx): implement fetchTransfers method by [@sdfwds4](https://github.com/sdfwds4) in [#28972](https://github.com/ccxt/ccxt/pull/28972)
* docs: fix examples import by [@ttodua](https://github.com/ttodua) in [#28986](https://github.com/ccxt/ccxt/pull/28986)
* docs: batch type fix 2 by [@ttodua](https://github.com/ttodua) in [#28987](https://github.com/ccxt/ccxt/pull/28987)
* docs: examples batch fix 3 by [@ttodua](https://github.com/ttodua) in [#28988](https://github.com/ccxt/ccxt/pull/28988)
* docs: examples batch fix 4 by [@ttodua](https://github.com/ttodua) in [#28989](https://github.com/ccxt/ccxt/pull/28989)
* docs: examples batch fix 5 by [@ttodua](https://github.com/ttodua) in [#28991](https://github.com/ccxt/ccxt/pull/28991)
* docs: examples generated js files by [@ttodua](https://github.com/ttodua) in [#28990](https://github.com/ccxt/ccxt/pull/28990)
* docs: examples batch fix 6 by [@ttodua](https://github.com/ttodua) in [#28992](https://github.com/ccxt/ccxt/pull/28992)
* docs: examples batch fix 7 by [@ttodua](https://github.com/ttodua) in [#28993](https://github.com/ccxt/ccxt/pull/28993)
* docs: examples batch fix 9 by [@ttodua](https://github.com/ttodua) in [#28994](https://github.com/ccxt/ccxt/pull/28994)
* docs: examples batch fix 10 by [@ttodua](https://github.com/ttodua) in [#28995](https://github.com/ccxt/ccxt/pull/28995)
* docs: examples batch fix 11 by [@ttodua](https://github.com/ttodua) in [#28996](https://github.com/ccxt/ccxt/pull/28996)
* docs: examples batch fix 12 by [@ttodua](https://github.com/ttodua) in [#28997](https://github.com/ccxt/ccxt/pull/28997)
* docs: arbitrage example fix by [@ttodua](https://github.com/ttodua) in [#28998](https://github.com/ccxt/ccxt/pull/28998)
* chore: symlink AGENTS.md -> CLAUDE.md by [@pcriadoperez](https://github.com/pcriadoperez) in [#28999](https://github.com/ccxt/ccxt/pull/28999)
* fix(build): stop jsdoc2md emitting phantom exchange pages (fetchStatus/fetchBidsAsks/fetchCurrencies) by [@pcriadoperez](https://github.com/pcriadoperez) in [#28877](https://github.com/ccxt/ccxt/pull/28877)
* feat(exchange) - close and clean exchange by [@ttodua](https://github.com/ttodua) in [#24031](https://github.com/ccxt/ccxt/pull/24031)
* fix(bitmex): watchPositions side inference by [@carlosmiei](https://github.com/carlosmiei) in [#29002](https://github.com/ccxt/ccxt/pull/29002)
* chore: fix go base tests (add fetchTransfers to interface) by [@carlosmiei](https://github.com/carlosmiei) in [#29008](https://github.com/ccxt/ccxt/pull/29008)
* fix(hyperliquid): reject with error by [@sc0Vu](https://github.com/sc0Vu) in [#29006](https://github.com/ccxt/ccxt/pull/29006)
* chore: fix fetchTransfers in go by [@carlosmiei](https://github.com/carlosmiei) in [#29009](https://github.com/ccxt/ccxt/pull/29009)
## New Contributors [#new-contributors-12]
* [@nmcbride](https://github.com/nmcbride) made their first contribution in [#28922](https://github.com/ccxt/ccxt/pull/28922)
* [@carlotestor](https://github.com/carlotestor) made their first contribution in [#28959](https://github.com/ccxt/ccxt/pull/28959)
* [@sdfwds4](https://github.com/sdfwds4) made their first contribution in [#28972](https://github.com/ccxt/ccxt/pull/28972)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.59...v4.5.60](https://github.com/ccxt/ccxt/compare/v4.5.59...v4.5.60)
[Changes][v4.5.60]
# [v4.5.59](https://github.com/ccxt/ccxt/releases/tag/v4.5.59) - 2026-06-16 [#v4559---2026-06-16]
## What's Changed [#whats-changed-19]
* feat(rspack): use rspack instead of webpack for bundling by [@frosty00](https://github.com/frosty00) in [#28851](https://github.com/ccxt/ccxt/pull/28851)
* fix(docs): repair broken internal doc links at their source by [@pcriadoperez](https://github.com/pcriadoperez) in [#28848](https://github.com/ccxt/ccxt/pull/28848)
* feat(docs): add status/ table by [@carlosmiei](https://github.com/carlosmiei) in [#28858](https://github.com/ccxt/ccxt/pull/28858)
* fix(docs): exchange-status import by [@carlosmiei](https://github.com/carlosmiei) in [#28859](https://github.com/ccxt/ccxt/pull/28859)
* fix(docs): keep translated exchanges tables in sync, drop dead link by [@pcriadoperez](https://github.com/pcriadoperez) in [#28856](https://github.com/ccxt/ccxt/pull/28856)
* docs: generalizing instead of binance by [@ttodua](https://github.com/ttodua) in [#28864](https://github.com/ccxt/ccxt/pull/28864)
* docs: remove extra example by [@ttodua](https://github.com/ttodua) in [#28860](https://github.com/ccxt/ccxt/pull/28860)
* docs: eslint `no-named-as-default-member` by [@ttodua](https://github.com/ttodua) in [#28867](https://github.com/ccxt/ccxt/pull/28867)
* docs: apex remove & add faq by [@ttodua](https://github.com/ttodua) in [#28863](https://github.com/ccxt/ccxt/pull/28863)
* build(deps): update @rspack/cli and @rspack/core to 2.0.8 by [@frosty00](https://github.com/frosty00) in [#28869](https://github.com/ccxt/ccxt/pull/28869)
* chore(deps): bump esbuild from 0.28.0 to 0.28.1 in /website by [@dependabot](https://github.com/dependabot)\[bot] in [#28866](https://github.com/ccxt/ccxt/pull/28866)
* fix(precise)!: strict bools by [@ttodua](https://github.com/ttodua) in [#28854](https://github.com/ccxt/ccxt/pull/28854)
* chore(deps): bump uuid and @rspack/cli by [@dependabot](https://github.com/dependabot)\[bot] in [#28853](https://github.com/ccxt/ccxt/pull/28853)
* chore(deps): bump webpack-dev-server and @rspack/cli by [@dependabot](https://github.com/dependabot)\[bot] in [#28852](https://github.com/ccxt/ccxt/pull/28852)
* chore(huobi): remove alias by [@ttodua](https://github.com/ttodua) in [#28788](https://github.com/ccxt/ccxt/pull/28788)
* move some static dependencies into package.json by [@frosty00](https://github.com/frosty00) in [#28850](https://github.com/ccxt/ccxt/pull/28850)
* refactor(safeDict): use isDictionary by [@ttodua](https://github.com/ttodua) in [#28862](https://github.com/ccxt/ccxt/pull/28862)
* fix: use isDictionary instead of `object` type comparison by [@ttodua](https://github.com/ttodua) in [#28861](https://github.com/ccxt/ccxt/pull/28861)
* docs: normalize legacy docs.ccxt.com/#/?id= structure links to the redirecting form by [@pcriadoperez](https://github.com/pcriadoperez) in [#28879](https://github.com/ccxt/ccxt/pull/28879)
* fix(php): is\_json\_encoded\_object by [@ttodua](https://github.com/ttodua) in [#28880](https://github.com/ccxt/ccxt/pull/28880)
* chore(playground): patch postcss & dompurify security alerts by [@pcriadoperez](https://github.com/pcriadoperez) in [#28871](https://github.com/ccxt/ccxt/pull/28871)
* chore(website): patch postcss security alert by [@pcriadoperez](https://github.com/pcriadoperez) in [#28873](https://github.com/ccxt/ccxt/pull/28873)
* chore(examples): patch postcss alert in nextjs-page-router example by [@pcriadoperez](https://github.com/pcriadoperez) in [#28874](https://github.com/ccxt/ccxt/pull/28874)
* docs: watch symbols example by [@ttodua](https://github.com/ttodua) in [#28868](https://github.com/ccxt/ccxt/pull/28868)
* chore(coinbaseadvanced): remove alias by [@ttodua](https://github.com/ttodua) in [#28787](https://github.com/ccxt/ccxt/pull/28787)
* fix(playground): route AI assistant through the egress proxy by [@pcriadoperez](https://github.com/pcriadoperez) in [#28876](https://github.com/ccxt/ccxt/pull/28876)
* ci(playground): fix deploy smoke test + bump actions to Node 24 by [@pcriadoperez](https://github.com/pcriadoperez) in [#28872](https://github.com/ccxt/ccxt/pull/28872)
* fix(cs): getProperty for fields too by [@ttodua](https://github.com/ttodua) in [#28881](https://github.com/ccxt/ccxt/pull/28881)
* migrate to typescript 5 by [@frosty00](https://github.com/frosty00) in [#28870](https://github.com/ccxt/ccxt/pull/28870)
* feat(docs): make /docs/examples a hub — citations + Awesome showcases by [@pcriadoperez](https://github.com/pcriadoperez) in [#28875](https://github.com/ccxt/ccxt/pull/28875)
* test: add `.has` tests by [@ttodua](https://github.com/ttodua) in [#28885](https://github.com/ccxt/ccxt/pull/28885)
* fix(binance): ws .has inheritance fixes by [@ttodua](https://github.com/ttodua) in [#28886](https://github.com/ccxt/ccxt/pull/28886)
* chore: hibachi skip ts warning by [@ttodua](https://github.com/ttodua) in [#28887](https://github.com/ccxt/ccxt/pull/28887)
* fix(aster): fetchTicker(): 'percentage' is off by factor of 100 by [@Shiven0504](https://github.com/Shiven0504) in [#28889](https://github.com/ccxt/ccxt/pull/28889)
* chore: try to update package-lock by [@carlosmiei](https://github.com/carlosmiei) in [#28891](https://github.com/ccxt/ccxt/pull/28891)
* fix(bitget): handle non ascii symbols by [@carlosmiei](https://github.com/carlosmiei) in [#28890](https://github.com/ccxt/ccxt/pull/28890)
* fix(bybit): watchOrderBook in go by [@carlosmiei](https://github.com/carlosmiei) in [#28893](https://github.com/ccxt/ccxt/pull/28893)
* chore(deps): bump js-yaml from 4.1.1 to 4.2.0 in /website by [@dependabot](https://github.com/dependabot)\[bot] in [#28892](https://github.com/ccxt/ccxt/pull/28892)
* feat(htx): V5 linear swap order support by [@Dan-krm](https://github.com/Dan-krm) in [#28792](https://github.com/ccxt/ccxt/pull/28792)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.58...v4.5.59](https://github.com/ccxt/ccxt/compare/v4.5.58...v4.5.59)
[Changes][v4.5.59]
# [v4.5.58](https://github.com/ccxt/ccxt/releases/tag/v4.5.58) - 2026-06-11 [#v4558---2026-06-11]
## What's Changed [#whats-changed-20]
* add default allowSynchronousEvents = false by [@frosty00](https://github.com/frosty00) in [#28833](https://github.com/ccxt/ccxt/pull/28833)
* fix(precise)!: stringAdd nullify by [@ttodua](https://github.com/ttodua) in [#28834](https://github.com/ccxt/ccxt/pull/28834)
* Cleanup php static deps by [@frosty00](https://github.com/frosty00) in [#28835](https://github.com/ccxt/ccxt/pull/28835)
* fix type error in ccxt pro handleErrorMessage by [@frosty00](https://github.com/frosty00) in [#28836](https://github.com/ccxt/ccxt/pull/28836)
* fix(arkham)!: delist by [@ttodua](https://github.com/ttodua) in [#28000](https://github.com/ccxt/ccxt/pull/28000)
* fix(build): java implicit API emitter must extend parent Core class for derived exchanges by [@pcriadoperez](https://github.com/pcriadoperez) in [#28832](https://github.com/ccxt/ccxt/pull/28832)
* fix(hashkey): public watchTrades side & takerOrMaker by [@ttodua](https://github.com/ttodua) in [#28838](https://github.com/ccxt/ccxt/pull/28838)
* fix(weex): fetchTrades' parseTrade by [@ttodua](https://github.com/ttodua) in [#28837](https://github.com/ccxt/ccxt/pull/28837)
* chore(yobit): build fix for skip by [@ttodua](https://github.com/ttodua) in [#28824](https://github.com/ccxt/ccxt/pull/28824)
* fix(aster): extra static tests by [@ttodua](https://github.com/ttodua) in [#28830](https://github.com/ccxt/ccxt/pull/28830)
* fix(deepcoin): fetchTrades fix by [@ttodua](https://github.com/ttodua) in [#28815](https://github.com/ccxt/ccxt/pull/28815)
* docs: add Fumadocs documentation site by [@pcriadoperez](https://github.com/pcriadoperez) in [#28726](https://github.com/ccxt/ccxt/pull/28726)
* feat(playground): interactive multi-language CCXT playground by [@pcriadoperez](https://github.com/pcriadoperez) in [#28807](https://github.com/ccxt/ccxt/pull/28807)
* delist waves.exchange by [@frosty00](https://github.com/frosty00) in [#28844](https://github.com/ccxt/ccxt/pull/28844)
* chore(btcbox): skip further by [@ttodua](https://github.com/ttodua) in [#28814](https://github.com/ccxt/ccxt/pull/28814)
* fix(backpack): trades fix by [@ttodua](https://github.com/ttodua) in [#28813](https://github.com/ccxt/ccxt/pull/28813)
* fix(networks): add ADA & CARDANO to unified list by [@ttodua](https://github.com/ttodua) in [#28817](https://github.com/ccxt/ccxt/pull/28817)
* fix(xt): remove non-unified networkcode by [@ttodua](https://github.com/ttodua) in [#28818](https://github.com/ccxt/ccxt/pull/28818)
* delist yobit by [@frosty00](https://github.com/frosty00) in [#28845](https://github.com/ccxt/ccxt/pull/28845)
* Php secure dependent packages by [@frosty00](https://github.com/frosty00) in [#28841](https://github.com/ccxt/ccxt/pull/28841)
* fix(docs): point Fumadocs deploy smoke test at root paths by [@pcriadoperez](https://github.com/pcriadoperez) in [#28846](https://github.com/ccxt/ccxt/pull/28846)
* ci(docs): bump Fumadocs deploy actions to Node 24 runtimes by [@pcriadoperez](https://github.com/pcriadoperez) in [#28847](https://github.com/ccxt/ccxt/pull/28847)
* fix(cryptocom): fetchCurrencies using a sub-account by [@carlosmiei](https://github.com/carlosmiei) in [#28849](https://github.com/ccxt/ccxt/pull/28849)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.57...v4.5.58](https://github.com/ccxt/ccxt/compare/v4.5.57...v4.5.58)
[Changes][v4.5.58]
# [v4.5.57](https://github.com/ccxt/ccxt/releases/tag/v4.5.57) - 2026-06-10 [#v4557---2026-06-10]
## What's Changed [#whats-changed-21]
* chore: enable automatic release by [@carlosmiei](https://github.com/carlosmiei) in [#28710](https://github.com/ccxt/ccxt/pull/28710)
* chore: add java commands to package.json by [@carlosmiei](https://github.com/carlosmiei) in [#28715](https://github.com/ccxt/ccxt/pull/28715)
* fix(blofin): createOrder with tpsl option by [@ttodua](https://github.com/ttodua) in [#28632](https://github.com/ccxt/ccxt/pull/28632)
* refactor: bitfinex add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28646](https://github.com/ccxt/ccxt/pull/28646)
* refactor: coinex add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28658](https://github.com/ccxt/ccxt/pull/28658)
* fix(go): add IsDictionary interface by [@ttodua](https://github.com/ttodua) in [#28716](https://github.com/ccxt/ccxt/pull/28716)
* fix: use timezone-aware UTC in Python examples by [@Ghraven](https://github.com/Ghraven) in [#28704](https://github.com/ccxt/ccxt/pull/28704)
* chore: fix .gitattributes by [@carlosmiei](https://github.com/carlosmiei) in [#28718](https://github.com/ccxt/ccxt/pull/28718)
* refactor: remove simulated active by [@ttodua](https://github.com/ttodua) in [#28694](https://github.com/ccxt/ccxt/pull/28694)
* fix(poloniex): withdraw by [@ttodua](https://github.com/ttodua) in [#28722](https://github.com/ccxt/ccxt/pull/28722)
* fix(go): Precise. any by [@ttodua](https://github.com/ttodua) in [#28723](https://github.com/ccxt/ccxt/pull/28723)
* perf(safeMethods): safeBool (& safeBool2, safeBoolN); safeDict (& safeDict2, safeDictN); safeList (& safeList2, safeListN) by [@ttodua](https://github.com/ttodua) in [#27530](https://github.com/ccxt/ccxt/pull/27530)
* fix(kucoin): create order uta ([#28713](https://github.com/ccxt/ccxt/issues/28713)) by [@Playeromat](https://github.com/Playeromat) in [#28714](https://github.com/ccxt/ccxt/pull/28714)
* feat(bitvavo): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#28696](https://github.com/ccxt/ccxt/pull/28696)
* refactor: cryptomus fetchCurrencies & parseCurrency by [@ttodua](https://github.com/ttodua) in [#28685](https://github.com/ccxt/ccxt/pull/28685)
* fix java action by [@carlosmiei](https://github.com/carlosmiei) in [#28725](https://github.com/ccxt/ccxt/pull/28725)
* fix: modernize Python async examples by [@Ghraven](https://github.com/Ghraven) in [#28724](https://github.com/ccxt/ccxt/pull/28724)
* test: Precise.or by [@ttodua](https://github.com/ttodua) in [#28702](https://github.com/ccxt/ccxt/pull/28702)
* chore: add mvn version to readme by [@carlosmiei](https://github.com/carlosmiei) in [#28730](https://github.com/ccxt/ccxt/pull/28730)
* chore: add mvn smaller by [@carlosmiei](https://github.com/carlosmiei) in [#28731](https://github.com/ccxt/ccxt/pull/28731)
* fix(binance): undefined check by [@ttodua](https://github.com/ttodua) in [#28733](https://github.com/ccxt/ccxt/pull/28733)
* feat(delta): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28734](https://github.com/ccxt/ccxt/pull/28734)
* feat(latoken): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28747](https://github.com/ccxt/ccxt/pull/28747)
* feat(deribit): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28735](https://github.com/ccxt/ccxt/pull/28735)
* feat(luno): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28750](https://github.com/ccxt/ccxt/pull/28750)
* feat(lbank): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28748](https://github.com/ccxt/ccxt/pull/28748)
* feat(gemini): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28741](https://github.com/ccxt/ccxt/pull/28741)
* feat(hollaex): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28743](https://github.com/ccxt/ccxt/pull/28743)
* feat(hashkey): parsecurrency added by [@ttodua](https://github.com/ttodua) in [#28742](https://github.com/ccxt/ccxt/pull/28742)
* feat(foxbit): parsecurrency added by [@ttodua](https://github.com/ttodua) in [#28739](https://github.com/ccxt/ccxt/pull/28739)
* feat(digifinex): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28737](https://github.com/ccxt/ccxt/pull/28737)
* feat(mexc): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28751](https://github.com/ccxt/ccxt/pull/28751)
* feat(lighter): parseCurrency by [@ttodua](https://github.com/ttodua) in [#28749](https://github.com/ccxt/ccxt/pull/28749)
* feat(hyperliquid): parsecurrency added by [@ttodua](https://github.com/ttodua) in [#28745](https://github.com/ccxt/ccxt/pull/28745)
* feat(kraken): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28746](https://github.com/ccxt/ccxt/pull/28746)
* feat(htx): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28744](https://github.com/ccxt/ccxt/pull/28744)
* feat(derive): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28736](https://github.com/ccxt/ccxt/pull/28736)
* feat(exmo): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28738](https://github.com/ccxt/ccxt/pull/28738)
* coinbase: update docs by [@sc0Vu](https://github.com/sc0Vu) in [#28756](https://github.com/ccxt/ccxt/pull/28756)
* feat(gate): parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28740](https://github.com/ccxt/ccxt/pull/28740)
* fix(I/O): load file with dynamic `import` correctly on Windows by [@ttodua](https://github.com/ttodua) in [#28755](https://github.com/ccxt/ccxt/pull/28755)
* bitrue error mapping by [@ndubel](https://github.com/ndubel) in [#28758](https://github.com/ccxt/ccxt/pull/28758)
* fix(cryptocom): sort signature params for transpile-safe key order by [@slotheth](https://github.com/slotheth) in [#28760](https://github.com/ccxt/ccxt/pull/28760)
* fix(binance): reduce fetchOHLCV default limit to 499 by [@mfolofy](https://github.com/mfolofy) in [#28754](https://github.com/ccxt/ccxt/pull/28754)
* fix: run Binance watch balance example on one loop by [@Ghraven](https://github.com/Ghraven) in [#28728](https://github.com/ccxt/ccxt/pull/28728)
* refactor: cryptocom add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28664](https://github.com/ccxt/ccxt/pull/28664)
* fix(python): coincurve dependency removal from address generation by [@ttodua](https://github.com/ttodua) in [#28761](https://github.com/ccxt/ccxt/pull/28761)
* test: exchange live constructor by [@ttodua](https://github.com/ttodua) in [#28631](https://github.com/ccxt/ccxt/pull/28631)
* okx: map unified timeframe to native period in fetchLongShortRatioHistory by [@ducky-duke](https://github.com/ducky-duke) in [#28763](https://github.com/ccxt/ccxt/pull/28763)
* fix(bitmart): tp & sl order issue by [@ttodua](https://github.com/ttodua) in [#28762](https://github.com/ccxt/ccxt/pull/28762)
* fix: use running loop in pro close test by [@Ghraven](https://github.com/Ghraven) in [#28717](https://github.com/ccxt/ccxt/pull/28717)
* refactor: binance add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28643](https://github.com/ccxt/ccxt/pull/28643)
* feat(runtests): extra debug logs by [@ttodua](https://github.com/ttodua) in [#28633](https://github.com/ccxt/ccxt/pull/28633)
* fix(binance): fetchOpenOrders doesn't support swap market by [@sc0Vu](https://github.com/sc0Vu) in [#28774](https://github.com/ccxt/ccxt/pull/28774)
* chore(gateio): remove alias by [@ttodua](https://github.com/ttodua) in [#28786](https://github.com/ccxt/ccxt/pull/28786)
* fix(oxfun)!: delist by [@ttodua](https://github.com/ttodua) in [#28785](https://github.com/ccxt/ccxt/pull/28785)
* feat: zebpay add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28781](https://github.com/ccxt/ccxt/pull/28781)
* feat: weex add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28778](https://github.com/ccxt/ccxt/pull/28778)
* feat: phemex add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28777](https://github.com/ccxt/ccxt/pull/28777)
* feat: ndax add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28775](https://github.com/ccxt/ccxt/pull/28775)
* feat: onetrading add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28776](https://github.com/ccxt/ccxt/pull/28776)
* chore: fix gateio examples by [@carlosmiei](https://github.com/carlosmiei) in [#28794](https://github.com/ccxt/ccxt/pull/28794)
* fix(cryptocom): guard against an undefined message hash in handleBalance by [@slotheth](https://github.com/slotheth) in [#28791](https://github.com/ccxt/ccxt/pull/28791)
* refactor: modetrade parseCurrency added by [@ttodua](https://github.com/ttodua) in [#28773](https://github.com/ccxt/ccxt/pull/28773)
* fix(xt): networkcodes change by [@ttodua](https://github.com/ttodua) in [#28771](https://github.com/ccxt/ccxt/pull/28771)
* chore: fix idTests and remove leftovers by [@carlosmiei](https://github.com/carlosmiei) in [#28795](https://github.com/ccxt/ccxt/pull/28795)
* fix(digifinex): networkCodes map fix by [@ttodua](https://github.com/ttodua) in [#28770](https://github.com/ccxt/ccxt/pull/28770)
* fix(weex): unified networks change by [@ttodua](https://github.com/ttodua) in [#28772](https://github.com/ccxt/ccxt/pull/28772)
* test: add skip for networks & coinbase skip by [@ttodua](https://github.com/ttodua) in [#28767](https://github.com/ccxt/ccxt/pull/28767)
* fix(go): convert sync.Map in NewBalances (parity with NewMarketsMap) by [@slotheth](https://github.com/slotheth) in [#28790](https://github.com/ccxt/ccxt/pull/28790)
* fix(bittrade): remove empty networkcode OMNI by [@ttodua](https://github.com/ttodua) in [#28766](https://github.com/ccxt/ccxt/pull/28766)
* chore: test php pushback pro files by [@carlosmiei](https://github.com/carlosmiei) in [#28797](https://github.com/ccxt/ccxt/pull/28797)
* feat: move addKeyInArrayItems into base by [@ttodua](https://github.com/ttodua) in [#28779](https://github.com/ccxt/ccxt/pull/28779)
* transpile.ts 2x speed improvement by [@frosty00](https://github.com/frosty00) in [#28796](https://github.com/ccxt/ccxt/pull/28796)
* fix(bitrue): incorrect theta networkcode removed by [@ttodua](https://github.com/ttodua) in [#28765](https://github.com/ccxt/ccxt/pull/28765)
* refactor: parseBidAsk -> parseOrderBookBidAsk; parseBidsAsks -> parseOrderBookBidsAsks by [@ttodua](https://github.com/ttodua) in [#28499](https://github.com/ccxt/ccxt/pull/28499)
* feat: woofipro add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28784](https://github.com/ccxt/ccxt/pull/28784)
* feat: woo add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28783](https://github.com/ccxt/ccxt/pull/28783)
* feat: whitebit add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28780](https://github.com/ccxt/ccxt/pull/28780)
* test: add SOL & POLYGON to an allowed unified aliases by [@ttodua](https://github.com/ttodua) in [#28764](https://github.com/ccxt/ccxt/pull/28764)
* chore: htx extension by [@ttodua](https://github.com/ttodua) in [#28801](https://github.com/ccxt/ccxt/pull/28801)
* fix: networkcode related methods (part 3) by [@ttodua](https://github.com/ttodua) in [#28805](https://github.com/ccxt/ccxt/pull/28805)
* fix: networkcode related methods (part 2) by [@ttodua](https://github.com/ttodua) in [#28804](https://github.com/ccxt/ccxt/pull/28804)
* fix: networkcode related methods (part 1) by [@ttodua](https://github.com/ttodua) in [#28803](https://github.com/ccxt/ccxt/pull/28803)
* Remove php packages from static\_dependencies by [@frosty00](https://github.com/frosty00) in [#28799](https://github.com/ccxt/ccxt/pull/28799)
* doc: move examples from py/php pro by [@ttodua](https://github.com/ttodua) in [#28556](https://github.com/ccxt/ccxt/pull/28556)
* fix: networkcode related methods (part 4) by [@ttodua](https://github.com/ttodua) in [#28806](https://github.com/ccxt/ccxt/pull/28806)
* feat(extended): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#28471](https://github.com/ccxt/ccxt/pull/28471)
* fix(extended): dex flag by [@carlosmiei](https://github.com/carlosmiei) in [#28810](https://github.com/ccxt/ccxt/pull/28810)
* fix(okx): loadMarkets by [@carlosmiei](https://github.com/carlosmiei) in [#28825](https://github.com/ccxt/ccxt/pull/28825)
* fix(aster): safeMarket call by [@carlosmiei](https://github.com/carlosmiei) in [#28826](https://github.com/ccxt/ccxt/pull/28826)
* fix(okx): expired option inference improved by [@carlosmiei](https://github.com/carlosmiei) in [#28827](https://github.com/ccxt/ccxt/pull/28827)
* fix(aster): derive walletaddress & signerAddress from privkey by [@ttodua](https://github.com/ttodua) in [#28811](https://github.com/ccxt/ccxt/pull/28811)
## New Contributors [#new-contributors-13]
* [@Ghraven](https://github.com/Ghraven) made their first contribution in [#28704](https://github.com/ccxt/ccxt/pull/28704)
* [@Playeromat](https://github.com/Playeromat) made their first contribution in [#28714](https://github.com/ccxt/ccxt/pull/28714)
* [@slotheth](https://github.com/slotheth) made their first contribution in [#28760](https://github.com/ccxt/ccxt/pull/28760)
* [@mfolofy](https://github.com/mfolofy) made their first contribution in [#28754](https://github.com/ccxt/ccxt/pull/28754)
* [@ducky-duke](https://github.com/ducky-duke) made their first contribution in [#28763](https://github.com/ccxt/ccxt/pull/28763)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.56...v4.5.57](https://github.com/ccxt/ccxt/compare/v4.5.56...v4.5.57)
[Changes][v4.5.57]
# [v4.5.56](https://github.com/ccxt/ccxt/releases/tag/v4.5.56) - 2026-05-27 [#v4556---2026-05-27]
## What's Changed [#whats-changed-22]
* chore: release missing by [@carlosmiei](https://github.com/carlosmiei) in [#28690](https://github.com/ccxt/ccxt/pull/28690)
* chore: skip go release by [@carlosmiei](https://github.com/carlosmiei) in [#28691](https://github.com/ccxt/ccxt/pull/28691)
* chore: restore release file by [@carlosmiei](https://github.com/carlosmiei) in [#28692](https://github.com/ccxt/ccxt/pull/28692)
* fix(mexc): createswaporder parsing by [@carlosmiei](https://github.com/carlosmiei) in [#28699](https://github.com/ccxt/ccxt/pull/28699)
* fix(aster): Correct price streams and futures keepalive by [@colin-nl](https://github.com/colin-nl) in [#28695](https://github.com/ccxt/ccxt/pull/28695)
* fix(mexc): update open swap orders endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#28705](https://github.com/ccxt/ccxt/pull/28705)
* feat: Add Java by [@carlosmiei](https://github.com/carlosmiei) in [#27071](https://github.com/ccxt/ccxt/pull/27071)
* chore: dummy build by [@carlosmiei](https://github.com/carlosmiei) in [#28706](https://github.com/ccxt/ccxt/pull/28706)
* chore: add java to release by [@carlosmiei](https://github.com/carlosmiei) in [#28707](https://github.com/ccxt/ccxt/pull/28707)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.55...v4.5.56](https://github.com/ccxt/ccxt/compare/v4.5.55...v4.5.56)
[Changes][v4.5.56]
# [v4.5.55](https://github.com/ccxt/ccxt/releases/tag/v4.5.55) - 2026-05-25 [#v4555---2026-05-25]
## What's Changed [#whats-changed-23]
* chore: tmp release comment out build by [@carlosmiei](https://github.com/carlosmiei) in [#28600](https://github.com/ccxt/ccxt/pull/28600)
* chore: c# trust publisher by [@carlosmiei](https://github.com/carlosmiei) in [#28601](https://github.com/ccxt/ccxt/pull/28601)
* chore: c# second try by [@carlosmiei](https://github.com/carlosmiei) in [#28602](https://github.com/ccxt/ccxt/pull/28602)
* chore: try 4 by [@carlosmiei](https://github.com/carlosmiei) in [#28603](https://github.com/ccxt/ccxt/pull/28603)
* chore: try 5 by [@carlosmiei](https://github.com/carlosmiei) in [#28604](https://github.com/ccxt/ccxt/pull/28604)
* chore: try 6 by [@carlosmiei](https://github.com/carlosmiei) in [#28605](https://github.com/ccxt/ccxt/pull/28605)
* chore: replace FTX references with OKX by [@ttodua](https://github.com/ttodua) in [#28599](https://github.com/ccxt/ccxt/pull/28599)
* chore(deps-dev): bump protobufjs from 7.5.5 to 7.5.6 by [@dependabot](https://github.com/dependabot)\[bot] in [#28592](https://github.com/ccxt/ccxt/pull/28592)
* chore(deps-dev): bump @protobufjs/utf8 from 1.1.0 to 1.1.1 by [@dependabot](https://github.com/dependabot)\[bot] in [#28573](https://github.com/ccxt/ccxt/pull/28573)
* fix(exchange): increase buffer by 50% by [@ttodua](https://github.com/ttodua) in [#28606](https://github.com/ccxt/ccxt/pull/28606)
* fix(toobit): move ws props by [@ttodua](https://github.com/ttodua) in [#28607](https://github.com/ccxt/ccxt/pull/28607)
* feat(bitrue): add futures public WS (orderbook, trades, ohlcv, ticker) by [@pcriadoperez](https://github.com/pcriadoperez) in [#28614](https://github.com/ccxt/ccxt/pull/28614)
* feat(poloniex)!: fetchCurrencies new v2 endpoint by [@ttodua](https://github.com/ttodua) in [#28618](https://github.com/ccxt/ccxt/pull/28618)
* test(bitflyer): pin preferredSpotSymbol to BTC/JPY by [@pcriadoperez](https://github.com/pcriadoperez) in [#28612](https://github.com/ccxt/ccxt/pull/28612)
* fix(woo,woofipro,modetrade): send pong on server ping by [@pcriadoperez](https://github.com/pcriadoperez) in [#28611](https://github.com/ccxt/ccxt/pull/28611)
* test(gemini): set preferredSpotSymbol to BTC/USD by [@pcriadoperez](https://github.com/pcriadoperez) in [#28610](https://github.com/ccxt/ccxt/pull/28610)
* test(ws): use BTC/KRW as preferred spot symbol for bithumb by [@pcriadoperez](https://github.com/pcriadoperez) in [#28609](https://github.com/ccxt/ccxt/pull/28609)
* fix(apex): cache WS URL so each watch\* doesn't open a new connection by [@pcriadoperez](https://github.com/pcriadoperez) in [#28608](https://github.com/ccxt/ccxt/pull/28608)
* test(market): skip strict structure assertion for inactive markets by [@pcriadoperez](https://github.com/pcriadoperez) in [#28613](https://github.com/ccxt/ccxt/pull/28613)
* fix(bitvavo): RateLimitExceeded error remapping by [@ndubel](https://github.com/ndubel) in [#28619](https://github.com/ccxt/ccxt/pull/28619)
* test: network tests (2) - with protocol corrector by [@ttodua](https://github.com/ttodua) in [#28615](https://github.com/ccxt/ccxt/pull/28615)
* chore: uncomment release and add new action by [@carlosmiei](https://github.com/carlosmiei) in [#28628](https://github.com/ccxt/ccxt/pull/28628)
* fix(binanceus): false fetchCurrencies in rest instead of pro by [@ttodua](https://github.com/ttodua) in [#28644](https://github.com/ccxt/ccxt/pull/28644)
* test: fix weird symbols by [@ttodua](https://github.com/ttodua) in [#28630](https://github.com/ccxt/ccxt/pull/28630)
* refactor: aster add parsecurrency by [@ttodua](https://github.com/ttodua) in [#28639](https://github.com/ccxt/ccxt/pull/28639)
* refactor: backpack add parsecurrency by [@ttodua](https://github.com/ttodua) in [#28640](https://github.com/ccxt/ccxt/pull/28640)
* refactor: coinbaseexchange add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28657](https://github.com/ccxt/ccxt/pull/28657)
* refactor: bullish add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28656](https://github.com/ccxt/ccxt/pull/28656)
* refactor: bitvavo add currency by [@ttodua](https://github.com/ttodua) in [#28655](https://github.com/ccxt/ccxt/pull/28655)
* refactor: bittrade add parsecurrency by [@ttodua](https://github.com/ttodua) in [#28654](https://github.com/ccxt/ccxt/pull/28654)
* refactor: bitrue add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28651](https://github.com/ccxt/ccxt/pull/28651)
* refactor: hitbtc add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28634](https://github.com/ccxt/ccxt/pull/28634)
* refactor: bitteam add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28653](https://github.com/ccxt/ccxt/pull/28653)
* refactor: bitstamp add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28652](https://github.com/ccxt/ccxt/pull/28652)
* refactor: bitopro add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28650](https://github.com/ccxt/ccxt/pull/28650)
* refactor: bitmex add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28649](https://github.com/ccxt/ccxt/pull/28649)
* test: bequant fetchcurrencies by [@ttodua](https://github.com/ttodua) in [#28641](https://github.com/ccxt/ccxt/pull/28641)
* fix(okx): remove deprecated checksum field in OB by [@carlosmiei](https://github.com/carlosmiei) in [#28660](https://github.com/ccxt/ccxt/pull/28660)
* test: bequant fix static tests by [@ttodua](https://github.com/ttodua) in [#28663](https://github.com/ccxt/ccxt/pull/28663)
* refactor: aftermath tests update by [@ttodua](https://github.com/ttodua) in [#28637](https://github.com/ccxt/ccxt/pull/28637)
* chore(deps): bump ws from 8.17.1 to 8.21.0 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#28668](https://github.com/ccxt/ccxt/pull/28668)
* refactor: apex add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28635](https://github.com/ccxt/ccxt/pull/28635)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#28621](https://github.com/ccxt/ccxt/pull/28621)
* refactor: ascendex add parsecurrency by [@ttodua](https://github.com/ttodua) in [#28638](https://github.com/ccxt/ccxt/pull/28638)
* refactor: bigone add parsecurrency by [@ttodua](https://github.com/ttodua) in [#28642](https://github.com/ccxt/ccxt/pull/28642)
* refactor: bingx add parsecurrency by [@ttodua](https://github.com/ttodua) in [#28645](https://github.com/ccxt/ccxt/pull/28645)
* fix: correct "availble" typo in paradex.ts JSDoc pagination comments by [@Copilot](https://github.com/Copilot) in [#28667](https://github.com/ccxt/ccxt/pull/28667)
* refactor: coinmetro add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28659](https://github.com/ccxt/ccxt/pull/28659)
* refactor: coinone add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28661](https://github.com/ccxt/ccxt/pull/28661)
* refactor: coinsph add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28662](https://github.com/ccxt/ccxt/pull/28662)
* fix(hyperliquid): skip empty trades by [@carlosmiei](https://github.com/carlosmiei) in [#28670](https://github.com/ccxt/ccxt/pull/28670)
* refactor: bitget add parseCurrency by [@ttodua](https://github.com/ttodua) in [#28647](https://github.com/ccxt/ccxt/pull/28647)
* docs: trim CLAUDE.md and fix settings.json $schema URL by [@pcriadoperez](https://github.com/pcriadoperez) in [#28673](https://github.com/ccxt/ccxt/pull/28673)
* fix(okx): parseTickers 4th arg by [@carlosmiei](https://github.com/carlosmiei) in [#28682](https://github.com/ccxt/ccxt/pull/28682)
* fix(hyperliquid): isUnifiedENabled parsing by [@carlosmiei](https://github.com/carlosmiei) in [#28687](https://github.com/ccxt/ccxt/pull/28687)
* feat: add Bybit EU by [@carlosmiei](https://github.com/carlosmiei) in [#28683](https://github.com/ccxt/ccxt/pull/28683)
* chore: dummy build by [@carlosmiei](https://github.com/carlosmiei) in [#28689](https://github.com/ccxt/ccxt/pull/28689)
## New Contributors [#new-contributors-14]
* [@Copilot](https://github.com/Copilot) made their first contribution in [#28667](https://github.com/ccxt/ccxt/pull/28667)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.54...v4.5.55](https://github.com/ccxt/ccxt/compare/v4.5.54...v4.5.55)
[Changes][v4.5.55]
# [v4.5.54](https://github.com/ccxt/ccxt/releases/tag/v4.5.54) - 2026-05-15 [#v4554---2026-05-15]
## What's Changed [#whats-changed-24]
* chore: release js fix by [@carlosmiei](https://github.com/carlosmiei) in [#28566](https://github.com/ccxt/ccxt/pull/28566)
* chore: add debug statement by [@carlosmiei](https://github.com/carlosmiei) in [#28567](https://github.com/ccxt/ccxt/pull/28567)
* chore: fix js-release by [@carlosmiei](https://github.com/carlosmiei) in [#28569](https://github.com/ccxt/ccxt/pull/28569)
* chore: fix js-release by [@carlosmiei](https://github.com/carlosmiei) in [#28570](https://github.com/ccxt/ccxt/pull/28570)
* chore: Fix release js 5 by [@carlosmiei](https://github.com/carlosmiei) in [#28571](https://github.com/ccxt/ccxt/pull/28571)
* chore: npm\_config\_provenance by [@carlosmiei](https://github.com/carlosmiei) in [#28572](https://github.com/ccxt/ccxt/pull/28572)
* chore(deps): bump next from 16.2.3 to 16.2.6 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#28568](https://github.com/ccxt/ccxt/pull/28568)
* fix(krakenfutures): watchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#28574](https://github.com/ccxt/ccxt/pull/28574)
* fix(hashkey): ws trade side by [@ttodua](https://github.com/ttodua) in [#28577](https://github.com/ccxt/ccxt/pull/28577)
* fix(backpack): parse trade ws side by [@ttodua](https://github.com/ttodua) in [#28578](https://github.com/ccxt/ccxt/pull/28578)
* chore: multiple proxy for tests by [@ttodua](https://github.com/ttodua) in [#28541](https://github.com/ccxt/ccxt/pull/28541)
* fix!(zonda): delist by [@ttodua](https://github.com/ttodua) in [#28539](https://github.com/ccxt/ccxt/pull/28539)
* fix(bydfi): max trades limit by [@ttodua](https://github.com/ttodua) in [#28585](https://github.com/ccxt/ccxt/pull/28585)
* fix(coinex): max trades limit by [@ttodua](https://github.com/ttodua) in [#28584](https://github.com/ccxt/ccxt/pull/28584)
* refactor(hollaex): simplify by [@ttodua](https://github.com/ttodua) in [#28553](https://github.com/ccxt/ccxt/pull/28553)
* feat(safeNetwork) - base method by [@ttodua](https://github.com/ttodua) in [#23559](https://github.com/ccxt/ccxt/pull/23559)
* fix(weex): max trades limit by [@ttodua](https://github.com/ttodua) in [#28579](https://github.com/ccxt/ccxt/pull/28579)
* refactor(pacifica): no else by [@ttodua](https://github.com/ttodua) in [#28552](https://github.com/ccxt/ccxt/pull/28552)
* fix(xt): max trades limit by [@ttodua](https://github.com/ttodua) in [#28580](https://github.com/ccxt/ccxt/pull/28580)
* fix(paradex): max trades limit by [@ttodua](https://github.com/ttodua) in [#28581](https://github.com/ccxt/ccxt/pull/28581)
* doc: fix broken files by [@ttodua](https://github.com/ttodua) in [#28531](https://github.com/ccxt/ccxt/pull/28531)
* docs: fix#17741 fix ccxt pro links by [@pcriadoperez](https://github.com/pcriadoperez) in [#17915](https://github.com/ccxt/ccxt/pull/17915)
* chore: publish python package using trust publishers by [@carlosmiei](https://github.com/carlosmiei) in [#28588](https://github.com/ccxt/ccxt/pull/28588)
* fix(dydx): max trades limit by [@ttodua](https://github.com/ttodua) in [#28582](https://github.com/ccxt/ccxt/pull/28582)
* fix(weex): parse ws orders by [@ttodua](https://github.com/ttodua) in [#28586](https://github.com/ccxt/ccxt/pull/28586)
* fix(weex): ws position parsing by [@ttodua](https://github.com/ttodua) in [#28587](https://github.com/ccxt/ccxt/pull/28587)
* fix(deepcoin): max trades limit by [@ttodua](https://github.com/ttodua) in [#28583](https://github.com/ccxt/ccxt/pull/28583)
* test: fix weex by [@ttodua](https://github.com/ttodua) in [#28590](https://github.com/ccxt/ccxt/pull/28590)
* fix(coinbase): defer FUTURE/PERPETUAL market fetches until after spot await by [@ryanyue123](https://github.com/ryanyue123) in [#28594](https://github.com/ccxt/ccxt/pull/28594)
* chore(deps): bump mistune from 0.8.4 to 3.2.1 in /doc by [@dependabot](https://github.com/dependabot)\[bot] in [#28538](https://github.com/ccxt/ccxt/pull/28538)
* chore(deps-dev): bump fast-uri from 3.0.3 to 3.1.2 by [@dependabot](https://github.com/dependabot)\[bot] in [#28537](https://github.com/ccxt/ccxt/pull/28537)
* fix(binance): getWsUrl in all langs by [@carlosmiei](https://github.com/carlosmiei) in [#28596](https://github.com/ccxt/ccxt/pull/28596)
* chore: move python publish up by [@carlosmiei](https://github.com/carlosmiei) in [#28598](https://github.com/ccxt/ccxt/pull/28598)
* fix(kucoin): UTA OB by [@carlosmiei](https://github.com/carlosmiei) in [#28597](https://github.com/ccxt/ccxt/pull/28597)
## New Contributors [#new-contributors-15]
* [@ryanyue123](https://github.com/ryanyue123) made their first contribution in [#28594](https://github.com/ccxt/ccxt/pull/28594)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.53...v4.5.54](https://github.com/ccxt/ccxt/compare/v4.5.53...v4.5.54)
[Changes][v4.5.54]
# [v4.5.53](https://github.com/ccxt/ccxt/releases/tag/v4.5.53) - 2026-05-12 [#v4553---2026-05-12]
## What's Changed [#whats-changed-25]
* refactor(go): change `interface{}` to `any` by [@ttodua](https://github.com/ttodua) in [#27939](https://github.com/ccxt/ccxt/pull/27939)
* feat(blofin): fetchPositionsHistory by [@ttodua](https://github.com/ttodua) in [#28516](https://github.com/ccxt/ccxt/pull/28516)
* feat(phemex): fetchPositionHistory by [@ttodua](https://github.com/ttodua) in [#28517](https://github.com/ccxt/ccxt/pull/28517)
* test: remove ts check for watchTrades by [@ttodua](https://github.com/ttodua) in [#28515](https://github.com/ccxt/ccxt/pull/28515)
* chore: skip aftermath again by [@ttodua](https://github.com/ttodua) in [#28527](https://github.com/ccxt/ccxt/pull/28527)
* chore: btcbox extend skip 1 month by [@ttodua](https://github.com/ttodua) in [#28525](https://github.com/ccxt/ccxt/pull/28525)
* feat(okx): added a new demo account endpoint by [@Dan-krm](https://github.com/Dan-krm) in [#28534](https://github.com/ccxt/ccxt/pull/28534)
* fix(bitfinex): tickers parsing fix by [@ttodua](https://github.com/ttodua) in [#28526](https://github.com/ccxt/ccxt/pull/28526)
* chore: lighter contracts skip by [@ttodua](https://github.com/ttodua) in [#28523](https://github.com/ccxt/ccxt/pull/28523)
* doc: fix ccxt doc site links by [@ttodua](https://github.com/ttodua) in [#28530](https://github.com/ccxt/ccxt/pull/28530)
* fix(upbit): fetchTickers by [@ttodua](https://github.com/ttodua) in [#28522](https://github.com/ccxt/ccxt/pull/28522)
* fix(gate): created timestamp for unlisted options by [@ttodua](https://github.com/ttodua) in [#28524](https://github.com/ccxt/ccxt/pull/28524)
* fix(safeInteger): default value bug by [@ttodua](https://github.com/ttodua) in [#28521](https://github.com/ccxt/ccxt/pull/28521)
* fix(bitmart): ws subscriptions fix by [@ttodua](https://github.com/ttodua) in [#28514](https://github.com/ccxt/ccxt/pull/28514)
* fix(krakenfutures): watch unique subscriptions by [@ttodua](https://github.com/ttodua) in [#28529](https://github.com/ccxt/ccxt/pull/28529)
* refactor: safe dict first value by [@ttodua](https://github.com/ttodua) in [#28506](https://github.com/ccxt/ccxt/pull/28506)
* docs(repo): add CLAUDE.md contributor guide and AI-agent tooling by [@pcriadoperez](https://github.com/pcriadoperez) in [#28543](https://github.com/ccxt/ccxt/pull/28543)
* test: fix usd:usdc pairs selector (for `paradex`) by [@ttodua](https://github.com/ttodua) in [#28542](https://github.com/ccxt/ccxt/pull/28542)
* fix(bybit): handleErrorMessage reads req\_id (snake) for public-WS errors by [@pcriadoperez](https://github.com/pcriadoperez) in [#28545](https://github.com/ccxt/ccxt/pull/28545)
* fix(gate): update ws testnet urls by [@carlosmiei](https://github.com/carlosmiei) in [#28546](https://github.com/ccxt/ccxt/pull/28546)
* doc: examples reorganization into typescript by [@ttodua](https://github.com/ttodua) in [#28536](https://github.com/ccxt/ccxt/pull/28536)
* fix(mexc): update order contract url by [@carlosmiei](https://github.com/carlosmiei) in [#28550](https://github.com/ccxt/ccxt/pull/28550)
* fix(xt): max candles limit by [@ttodua](https://github.com/ttodua) in [#28549](https://github.com/ccxt/ccxt/pull/28549)
* fix(weex): max ohlcv by [@ttodua](https://github.com/ttodua) in [#28548](https://github.com/ccxt/ccxt/pull/28548)
* bitvavo update requests weights by [@ndubel](https://github.com/ndubel) in [#28547](https://github.com/ccxt/ccxt/pull/28547)
* chore: fix example by [@carlosmiei](https://github.com/carlosmiei) in [#28551](https://github.com/ccxt/ccxt/pull/28551)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#28554](https://github.com/ccxt/ccxt/pull/28554)
* docs: fix lint issues by [@ttodua](https://github.com/ttodua) in [#28555](https://github.com/ccxt/ccxt/pull/28555)
* doc: fix close any type by [@ttodua](https://github.com/ttodua) in [#28558](https://github.com/ccxt/ccxt/pull/28558)
* fix(kucoin): watchBidsAsks swap/futures sub by [@carlosmiei](https://github.com/carlosmiei) in [#28562](https://github.com/ccxt/ccxt/pull/28562)
* fix(maxRetriesOnFailure): don't reuse same request by [@carlosmiei](https://github.com/carlosmiei) in [#28563](https://github.com/ccxt/ccxt/pull/28563)
* fix(aster): skip incomplete markets by [@carlosmiei](https://github.com/carlosmiei) in [#28564](https://github.com/ccxt/ccxt/pull/28564)
* chore: release-publish using trusted publishers by [@carlosmiei](https://github.com/carlosmiei) in [#28565](https://github.com/ccxt/ccxt/pull/28565)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.52...v4.5.53](https://github.com/ccxt/ccxt/compare/v4.5.52...v4.5.53)
[Changes][v4.5.53]
# [v4.5.52](https://github.com/ccxt/ccxt/releases/tag/v4.5.52) - 2026-05-05 [#v4552---2026-05-05]
## What's Changed [#whats-changed-26]
* feat: isDictionary by [@ttodua](https://github.com/ttodua) in [#28465](https://github.com/ccxt/ccxt/pull/28465)
* test: watchOrderBookForSymbols & watchTradesForSymbols - ensure all symbols pass by [@ttodua](https://github.com/ttodua) in [#28449](https://github.com/ccxt/ccxt/pull/28449)
* fix(grvt): fix clientOrderId in python by [@carlosmiei](https://github.com/carlosmiei) in [#28470](https://github.com/ccxt/ccxt/pull/28470)
* doc: sl tp feature by [@ttodua](https://github.com/ttodua) in [#28468](https://github.com/ccxt/ccxt/pull/28468)
* feat(kraken): skip synthetic markets unification by [@yzh-pelle](https://github.com/yzh-pelle) in [#28472](https://github.com/ccxt/ccxt/pull/28472)
* test: fix cs tests by [@ttodua](https://github.com/ttodua) in [#28473](https://github.com/ccxt/ccxt/pull/28473)
* fix(go): ValueIsDefined by [@ttodua](https://github.com/ttodua) in [#28489](https://github.com/ccxt/ccxt/pull/28489)
* fix(kraken): fetchMarkets `symbol` in Python fixed by [@yzh-pelle](https://github.com/yzh-pelle) in [#28496](https://github.com/ccxt/ccxt/pull/28496)
* fix(binanceusdm): inheritance by [@ttodua](https://github.com/ttodua) in [#28493](https://github.com/ccxt/ccxt/pull/28493)
* fix(bequant): inheritance fix by [@ttodua](https://github.com/ttodua) in [#28495](https://github.com/ccxt/ccxt/pull/28495)
* doc: grvt authentication related by [@ttodua](https://github.com/ttodua) in [#28491](https://github.com/ccxt/ccxt/pull/28491)
* test: remove timestamp check by [@ttodua](https://github.com/ttodua) in [#28492](https://github.com/ccxt/ccxt/pull/28492)
* test: exchange properties tests by [@ttodua](https://github.com/ttodua) in [#27877](https://github.com/ccxt/ccxt/pull/27877)
* `costToPrecision` - fix by [@ttodua](https://github.com/ttodua) in [#14269](https://github.com/ccxt/ccxt/pull/14269)
* refactor: c# remove unreached line by [@ttodua](https://github.com/ttodua) in [#28140](https://github.com/ccxt/ccxt/pull/28140)
* pre push hooks - Windows addition & bash updates by [@ttodua](https://github.com/ttodua) in [#23924](https://github.com/ccxt/ccxt/pull/23924)
* test: add check that last price is not too far by [@ttodua](https://github.com/ttodua) in [#28102](https://github.com/ccxt/ccxt/pull/28102)
* test: skip go changes by [@ttodua](https://github.com/ttodua) in [#28237](https://github.com/ccxt/ccxt/pull/28237)
* fix(binance): fetchCurrencies reorg by [@ttodua](https://github.com/ttodua) in [#25721](https://github.com/ccxt/ccxt/pull/25721)
* binance cancelAllOrders requires symbol by [@ndubel](https://github.com/ndubel) in [#28507](https://github.com/ccxt/ccxt/pull/28507)
* test: fix go skip by [@ttodua](https://github.com/ttodua) in [#28512](https://github.com/ccxt/ccxt/pull/28512)
* fix(grvt): integer to string by [@ttodua](https://github.com/ttodua) in [#28513](https://github.com/ccxt/ccxt/pull/28513)
* fix(base): avoid params=\{} mutation in trigger/SL/TP wrappers (Python pollution) by [@pcriadoperez](https://github.com/pcriadoperez) in [#28508](https://github.com/ccxt/ccxt/pull/28508)
* feat(aster): v3 by [@ttodua](https://github.com/ttodua) in [#28394](https://github.com/ccxt/ccxt/pull/28394)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.51...v4.5.52](https://github.com/ccxt/ccxt/compare/v4.5.51...v4.5.52)
[Changes][v4.5.52]
# [v4.5.51](https://github.com/ccxt/ccxt/releases/tag/v4.5.51) - 2026-04-27 [#v4551---2026-04-27]
## What's Changed [#whats-changed-27]
* fix(blofin): createOrder TPSL by [@ttodua](https://github.com/ttodua) in [#28432](https://github.com/ccxt/ccxt/pull/28432)
* whitebit error mapping by [@ndubel](https://github.com/ndubel) in [#28435](https://github.com/ccxt/ccxt/pull/28435)
* fix(binance): parse spot order type by [@sc0Vu](https://github.com/sc0Vu) in [#28437](https://github.com/ccxt/ccxt/pull/28437)
* fix(aster): multi watchOrderBook sub by [@carlosmiei](https://github.com/carlosmiei) in [#28447](https://github.com/ccxt/ccxt/pull/28447)
* feat(kucoin): update WS with uta endpoints by [@yzh-pelle](https://github.com/yzh-pelle) in [#28213](https://github.com/ccxt/ccxt/pull/28213)
* Kucoinfutures - remove default `uta = false` by [@yzh-pelle](https://github.com/yzh-pelle) in [#28439](https://github.com/ccxt/ccxt/pull/28439)
* fix(tests): kucoin uta false by [@ttodua](https://github.com/ttodua) in [#28450](https://github.com/ccxt/ccxt/pull/28450)
* feat: remove cicular dependencies by [@sc0Vu](https://github.com/sc0Vu) in [#28451](https://github.com/ccxt/ccxt/pull/28451)
* lighter: update skip nonce by [@sc0Vu](https://github.com/sc0Vu) in [#28443](https://github.com/ccxt/ccxt/pull/28443)
* fix(binance): c# build by [@carlosmiei](https://github.com/carlosmiei) in [#28454](https://github.com/ccxt/ccxt/pull/28454)
* chore: fix cs action by [@carlosmiei](https://github.com/carlosmiei) in [#28458](https://github.com/ccxt/ccxt/pull/28458)
* chore(deps-dev): bump postcss from 8.4.31 to 8.5.10 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#28452](https://github.com/ccxt/ccxt/pull/28452)
* fix(gate): new spot OB channel (spot.obu) V2 by [@carlosmiei](https://github.com/carlosmiei) in [#28453](https://github.com/ccxt/ccxt/pull/28453)
* fix(bitget): guard symbols.length in fetchTickers UTA path by [@mshavliuk](https://github.com/mshavliuk) in [#28457](https://github.com/ccxt/ccxt/pull/28457)
* fix(hyperliquid): skip empty builder by [@carlosmiei](https://github.com/carlosmiei) in [#28460](https://github.com/ccxt/ccxt/pull/28460)
* fix(grvt): clientOrderId reading and postOnly orders, and watchOrders resolving by [@carlosmiei](https://github.com/carlosmiei) in [#28461](https://github.com/ccxt/ccxt/pull/28461)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.50...v4.5.51](https://github.com/ccxt/ccxt/compare/v4.5.50...v4.5.51)
[Changes][v4.5.51]
# [v4.5.50](https://github.com/ccxt/ccxt/releases/tag/v4.5.50) - 2026-04-20 [#v4550---2026-04-20]
## What's Changed [#whats-changed-28]
* chore(hibachi): test ip by [@ttodua](https://github.com/ttodua) in [#28403](https://github.com/ccxt/ccxt/pull/28403)
* test: show url on failure by [@ttodua](https://github.com/ttodua) in [#28400](https://github.com/ccxt/ccxt/pull/28400)
* fix(weex): update link by [@carlosmiei](https://github.com/carlosmiei) in [#28418](https://github.com/ccxt/ccxt/pull/28418)
* bitget: map 40917 to InvalidOrder by [@ABSllk](https://github.com/ABSllk) in [#28420](https://github.com/ccxt/ccxt/pull/28420)
* chore(deps-dev): bump protobufjs from 7.5.3 to 7.5.5 by [@dependabot](https://github.com/dependabot)\[bot] in [#28421](https://github.com/ccxt/ccxt/pull/28421)
* feat(lighter): api upgrade and add builder code by [@sc0Vu](https://github.com/sc0Vu) in [#28112](https://github.com/ccxt/ccxt/pull/28112)
* feat(okx): add 15 documented endpoints missing from implicit API by [@lucasjamar](https://github.com/lucasjamar) in [#28427](https://github.com/ccxt/ccxt/pull/28427)
* feat(okx): add DCA Trading and missing Dual Investment endpoints by [@lucasjamar](https://github.com/lucasjamar) in [#28425](https://github.com/ccxt/ccxt/pull/28425)
* feat(okx): parseFundingInterval add 2h interval by [@Dan-krm](https://github.com/Dan-krm) in [#28431](https://github.com/ccxt/ccxt/pull/28431)
* gate: fix RED market alias by [@stevelee477](https://github.com/stevelee477) in [#28423](https://github.com/ccxt/ccxt/pull/28423)
* fix(okx): parseTransaction - parse network from chain param by [@simbesh](https://github.com/simbesh) in [#28430](https://github.com/ccxt/ccxt/pull/28430)
* hyperliquid: add watchBalance and watchPosition by [@sc0Vu](https://github.com/sc0Vu) in [#28419](https://github.com/ccxt/ccxt/pull/28419)
## New Contributors [#new-contributors-16]
* [@stevelee477](https://github.com/stevelee477) made their first contribution in [#28423](https://github.com/ccxt/ccxt/pull/28423)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.49...v4.5.50](https://github.com/ccxt/ccxt/compare/go/v4.5.49...v4.5.50)
[Changes][v4.5.50]
# [v4.5.49](https://github.com/ccxt/ccxt/releases/tag/v4.5.49) - 2026-04-15 [#v4549---2026-04-15]
## What's Changed [#whats-changed-29]
* build(deps): bump next from 16.1.7 to 16.2.3 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#28386](https://github.com/ccxt/ccxt/pull/28386)
* feat(kucoin): fetchPoisition(s) docs updated with new params by [@yzh-pelle](https://github.com/yzh-pelle) in [#28388](https://github.com/ccxt/ccxt/pull/28388)
* fix(coinbase): use correct loop index in handleTrade websocket handler by [@claygeo](https://github.com/claygeo) in [#28384](https://github.com/ccxt/ccxt/pull/28384)
* feat(lighter) add watchOrders by [@PimRijkers](https://github.com/PimRijkers) in [#28336](https://github.com/ccxt/ccxt/pull/28336)
* feat(lighter): add watchBalance by [@PimRijkers](https://github.com/PimRijkers) in [#28358](https://github.com/ccxt/ccxt/pull/28358)
* feat(lighter): websocket order trades parsing by [@PimRijkers](https://github.com/PimRijkers) in [#28342](https://github.com/ccxt/ccxt/pull/28342)
* kraken error mapping by [@ndubel](https://github.com/ndubel) in [#28393](https://github.com/ccxt/ccxt/pull/28393)
* fix(binance): aggTrade use market/ url by [@carlosmiei](https://github.com/carlosmiei) in [#28397](https://github.com/ccxt/ccxt/pull/28397)
* chore(cex): skip timestamp sort by [@ttodua](https://github.com/ttodua) in [#28398](https://github.com/ccxt/ccxt/pull/28398)
* test(watchTradesForSymbols): fix sort skip by [@ttodua](https://github.com/ttodua) in [#28399](https://github.com/ccxt/ccxt/pull/28399)
* fix(paradex): markets by [@ttodua](https://github.com/ttodua) in [#28401](https://github.com/ccxt/ccxt/pull/28401)
* fix(krakenfutures): fetchClosedOrders fixed by [@yzh-pelle](https://github.com/yzh-pelle) in [#28409](https://github.com/ccxt/ccxt/pull/28409)
* WEEX exchange by [@yzh-pelle](https://github.com/yzh-pelle) in [#28362](https://github.com/ccxt/ccxt/pull/28362)
* chore(btcbox): test skip by [@ttodua](https://github.com/ttodua) in [#28404](https://github.com/ccxt/ccxt/pull/28404)
* check proxy setting for watch\_multitple by [@jeffgoku](https://github.com/jeffgoku) in [#28389](https://github.com/ccxt/ccxt/pull/28389)
* fix(mexc): rm unavailable contracts from perps API by [@carlosmiei](https://github.com/carlosmiei) in [#28411](https://github.com/ccxt/ccxt/pull/28411)
* fix(mexc): omit reduceOnly in non-hedged swap order branch by [@ToRvaLDz](https://github.com/ToRvaLDz) in [#28414](https://github.com/ccxt/ccxt/pull/28414)
* fix(mexc): hedged reduceOnly order side by [@carlosmiei](https://github.com/carlosmiei) in [#28415](https://github.com/ccxt/ccxt/pull/28415)
* fix(bullish): options markets by [@ttodua](https://github.com/ttodua) in [#28402](https://github.com/ccxt/ccxt/pull/28402)
## New Contributors [#new-contributors-17]
* [@claygeo](https://github.com/claygeo) made their first contribution in [#28384](https://github.com/ccxt/ccxt/pull/28384)
* [@jeffgoku](https://github.com/jeffgoku) made their first contribution in [#28389](https://github.com/ccxt/ccxt/pull/28389)
* [@ToRvaLDz](https://github.com/ToRvaLDz) made their first contribution in [#28414](https://github.com/ccxt/ccxt/pull/28414)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.48...v4.5.49](https://github.com/ccxt/ccxt/compare/go/v4.5.48...v4.5.49)
[Changes][v4.5.49]
# [v4.5.48](https://github.com/ccxt/ccxt/releases/tag/v4.5.48) - 2026-04-10 [#v4548---2026-04-10]
## What's Changed [#whats-changed-30]
* chore: bittrade skip by [@ttodua](https://github.com/ttodua) in [#28357](https://github.com/ccxt/ccxt/pull/28357)
* fix: coincheck remove mistake by [@ttodua](https://github.com/ttodua) in [#28356](https://github.com/ccxt/ccxt/pull/28356)
* Fix(blofin): withdrawal and deposit transaction status parsing by [@Nirator78](https://github.com/Nirator78) in [#28354](https://github.com/ccxt/ccxt/pull/28354)
* test: binaryConcat by [@ttodua](https://github.com/ttodua) in [#28352](https://github.com/ccxt/ccxt/pull/28352)
* fix(bitfinex): one request instead of multiple; add securities; static tests by [@ttodua](https://github.com/ttodua) in [#28348](https://github.com/ccxt/ccxt/pull/28348)
* refactor: remove unused costToPrecision from binance by [@ttodua](https://github.com/ttodua) in [#28318](https://github.com/ccxt/ccxt/pull/28318)
* fix(c#): compression types by [@ttodua](https://github.com/ttodua) in [#28051](https://github.com/ccxt/ccxt/pull/28051)
* refactor: default precision by [@ttodua](https://github.com/ttodua) in [#28347](https://github.com/ccxt/ccxt/pull/28347)
* fix(lighter) incorrect order parsing for createOrder by [@PimRijkers](https://github.com/PimRijkers) in [#28337](https://github.com/ccxt/ccxt/pull/28337)
* fix(lighter): websocket liquidation message parsing by [@PimRijkers](https://github.com/PimRijkers) in [#28335](https://github.com/ccxt/ccxt/pull/28335)
* fix(gate): cancelAllOrdersWs ArgumentsRequired by [@ndubel](https://github.com/ndubel) in [#28351](https://github.com/ccxt/ccxt/pull/28351)
* refactor: golang baseclass transpilation support by [@ttodua](https://github.com/ttodua) in [#28361](https://github.com/ccxt/ccxt/pull/28361)
* test: get exchange prop in both upper & lower case by [@ttodua](https://github.com/ttodua) in [#28360](https://github.com/ccxt/ccxt/pull/28360)
* feat(aster): add Implicit API Methods for aster ProAPI(V3) by [@tapstoone](https://github.com/tapstoone) in [#28359](https://github.com/ccxt/ccxt/pull/28359)
* fix(lighter): fix php transpiled code by [@PimRijkers](https://github.com/PimRijkers) in [#28367](https://github.com/ccxt/ccxt/pull/28367)
* fix(lighter): add filter to watchTrades by [@PimRijkers](https://github.com/PimRijkers) in [#28366](https://github.com/ccxt/ccxt/pull/28366)
* feat(lighter): auth token caching by [@PimRijkers](https://github.com/PimRijkers) in [#28316](https://github.com/ccxt/ccxt/pull/28316)
* fix(lighter) websocket trades ordering by [@PimRijkers](https://github.com/PimRijkers) in [#28341](https://github.com/ccxt/ccxt/pull/28341)
* fix(transpiler): php sync fix by [@ttodua](https://github.com/ttodua) in [#28371](https://github.com/ccxt/ccxt/pull/28371)
* feat(binance): add papi/v1/um/stock/contract by [@carlosmiei](https://github.com/carlosmiei) in [#28372](https://github.com/ccxt/ccxt/pull/28372)
* test: afterConstruct updates & sharedMethods implementation in base-tests by [@ttodua](https://github.com/ttodua) in [#28365](https://github.com/ccxt/ccxt/pull/28365)
* fix(okx): maxLimit for paginated orders fetching by [@yzh-pelle](https://github.com/yzh-pelle) in [#28374](https://github.com/ccxt/ccxt/pull/28374)
* feat(bitmart): watchBidsAsks bid-ask endpoint by [@ttodua](https://github.com/ttodua) in [#28373](https://github.com/ccxt/ccxt/pull/28373)
* feat(Mexc): add missing routes by [@Nirator78](https://github.com/Nirator78) in [#28376](https://github.com/ccxt/ccxt/pull/28376)
* fix(bitvavo): cancelAllOrdersWs operatorId check by [@ndubel](https://github.com/ndubel) in [#28378](https://github.com/ccxt/ccxt/pull/28378)
* fix(lighter): add spot markets by [@PimRijkers](https://github.com/PimRijkers) in [#28380](https://github.com/ccxt/ccxt/pull/28380)
* fix(lighter): add spot markets to fetchTicker by [@PimRijkers](https://github.com/PimRijkers) in [#28381](https://github.com/ccxt/ccxt/pull/28381)
* feat(pacifica) new exchange by [@Neiroleptik](https://github.com/Neiroleptik) in [#27759](https://github.com/ccxt/ccxt/pull/27759)
* fix(binance): preserve custom WS URLs in getWsUrl for proxy setups by [@NikhilChowdhury27](https://github.com/NikhilChowdhury27) in [#28377](https://github.com/ccxt/ccxt/pull/28377)
* fix(bitfinex): detect fetcktickers -vs- fetchTicker by [@ttodua](https://github.com/ttodua) in [#28383](https://github.com/ccxt/ccxt/pull/28383)
## New Contributors [#new-contributors-18]
* [@tapstoone](https://github.com/tapstoone) made their first contribution in [#28359](https://github.com/ccxt/ccxt/pull/28359)
* [@Neiroleptik](https://github.com/Neiroleptik) made their first contribution in [#27759](https://github.com/ccxt/ccxt/pull/27759)
* [@NikhilChowdhury27](https://github.com/NikhilChowdhury27) made their first contribution in [#28377](https://github.com/ccxt/ccxt/pull/28377)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.47...v4.5.48](https://github.com/ccxt/ccxt/compare/go/v4.5.47...v4.5.48)
[Changes][v4.5.48]
# [v4.5.47](https://github.com/ccxt/ccxt/releases/tag/v4.5.47) - 2026-04-06 [#v4547---2026-04-06]
## What's Changed [#whats-changed-31]
* feat(kucoin): update REST with uta endpoints by [@yzh-pelle](https://github.com/yzh-pelle) in [#28203](https://github.com/ccxt/ccxt/pull/28203)
* backpack error mapping by [@ndubel](https://github.com/ndubel) in [#28303](https://github.com/ccxt/ccxt/pull/28303)
* fix(okx): conflicting btclightning by [@ttodua](https://github.com/ttodua) in [#28307](https://github.com/ccxt/ccxt/pull/28307)
* chore: hollaex orderbooks missing timestamp (report) by [@ttodua](https://github.com/ttodua) in [#28311](https://github.com/ccxt/ccxt/pull/28311)
* fix(grvt): string num by [@ttodua](https://github.com/ttodua) in [#28309](https://github.com/ccxt/ccxt/pull/28309)
* fix(lighter): Sandbox Mode False by [@PimRijkers](https://github.com/PimRijkers) in [#28312](https://github.com/ccxt/ccxt/pull/28312)
* chore(aftermath): skip for now, as exchange does not function by [@ttodua](https://github.com/ttodua) in [#28305](https://github.com/ccxt/ccxt/pull/28305)
* fix(bittrade): ws orderbook snapshot parsing by [@ttodua](https://github.com/ttodua) in [#28308](https://github.com/ccxt/ccxt/pull/28308)
* chore: lighter fix ticker compare issue by [@ttodua](https://github.com/ttodua) in [#28310](https://github.com/ccxt/ccxt/pull/28310)
* fix(c#): getArrayLength by [@ttodua](https://github.com/ttodua) in [#28304](https://github.com/ccxt/ccxt/pull/28304)
* fix(lighter): fix websocket error message parsing by [@PimRijkers](https://github.com/PimRijkers) in [#28313](https://github.com/ccxt/ccxt/pull/28313)
* fix(bitfinex): network & statuses by [@ttodua](https://github.com/ttodua) in [#28302](https://github.com/ccxt/ccxt/pull/28302)
* test: show issue for unavailable currency transfers by [@ttodua](https://github.com/ttodua) in [#28306](https://github.com/ccxt/ccxt/pull/28306)
* test: base58ToBinary by [@ttodua](https://github.com/ttodua) in [#28271](https://github.com/ccxt/ccxt/pull/28271)
* test: binaryToBase58 by [@ttodua](https://github.com/ttodua) in [#28269](https://github.com/ccxt/ccxt/pull/28269)
* test: numberToBE by [@ttodua](https://github.com/ttodua) in [#28267](https://github.com/ccxt/ccxt/pull/28267)
* chore(deps): bump picomatch by [@dependabot](https://github.com/dependabot)\[bot] in [#28256](https://github.com/ccxt/ccxt/pull/28256)
* fix(binance) - networks unification across methods by [@ttodua](https://github.com/ttodua) in [#25242](https://github.com/ccxt/ccxt/pull/25242)
* fix(c#): base 58 binary conversion by [@ttodua](https://github.com/ttodua) in [#28315](https://github.com/ccxt/ccxt/pull/28315)
* feat(bitmex): add closePosition by [@Dan-krm](https://github.com/Dan-krm) in [#28321](https://github.com/ccxt/ccxt/pull/28321)
* kucoin: network related unification & parseCurrency implementation by [@ttodua](https://github.com/ttodua) in [#28291](https://github.com/ccxt/ccxt/pull/28291)
* feat(bitget): allow limit execution price for contract TPSL orders by [@ABSllk](https://github.com/ABSllk) in [#28324](https://github.com/ccxt/ccxt/pull/28324)
* Blofin add route spot trade history by [@Nirator78](https://github.com/Nirator78) in [#28325](https://github.com/ccxt/ccxt/pull/28325)
* bitstamp error remapping by [@ndubel](https://github.com/ndubel) in [#28326](https://github.com/ccxt/ccxt/pull/28326)
* test: enhance extend by [@ttodua](https://github.com/ttodua) in [#28330](https://github.com/ccxt/ccxt/pull/28330)
* Remove duplicate example files by [@xmatthias](https://github.com/xmatthias) in [#28329](https://github.com/ccxt/ccxt/pull/28329)
* feat(blofin): fetchMyTrades update with spot endpoint by [@yzh-pelle](https://github.com/yzh-pelle) in [#28331](https://github.com/ccxt/ccxt/pull/28331)
* refactor: c# transpiler support for baseclass only by [@ttodua](https://github.com/ttodua) in [#28332](https://github.com/ccxt/ccxt/pull/28332)
* Blofin update all route like api doc by [@Nirator78](https://github.com/Nirator78) in [#28327](https://github.com/ccxt/ccxt/pull/28327)
* fix(whitebit): process error message by [@carlosmiei](https://github.com/carlosmiei) in [#28338](https://github.com/ccxt/ccxt/pull/28338)
* test: clone by [@ttodua](https://github.com/ttodua) in [#28328](https://github.com/ccxt/ccxt/pull/28328)
* fix(bitstamp): fetchMyTrades parsing by [@ttodua](https://github.com/ttodua) in [#28333](https://github.com/ccxt/ccxt/pull/28333)
* fix(ci): stage new wiki files before sync commit by [@pcriadoperez](https://github.com/pcriadoperez) in [#28343](https://github.com/ccxt/ccxt/pull/28343)
* fix: delist coincatch by [@ttodua](https://github.com/ttodua) in [#28346](https://github.com/ccxt/ccxt/pull/28346)
* Kraken add reorder api route by [@Nirator78](https://github.com/Nirator78) in [#28340](https://github.com/ccxt/ccxt/pull/28340)
* chore(deps-dev): bump lodash from 4.17.23 to 4.18.1 by [@dependabot](https://github.com/dependabot)\[bot] in [#28349](https://github.com/ccxt/ccxt/pull/28349)
* fix(hyperliquid): Add all actions supported to Packb in go by [@AurelReb](https://github.com/AurelReb) in [#28345](https://github.com/ccxt/ccxt/pull/28345)
* chore: remove coincatch remnants by [@ttodua](https://github.com/ttodua) in [#28350](https://github.com/ccxt/ccxt/pull/28350)
* test: base16ToBinary by [@ttodua](https://github.com/ttodua) in [#28275](https://github.com/ccxt/ccxt/pull/28275)
* test: binaryToBase16 by [@ttodua](https://github.com/ttodua) in [#28276](https://github.com/ccxt/ccxt/pull/28276)
## New Contributors [#new-contributors-19]
* [@PimRijkers](https://github.com/PimRijkers) made their first contribution in [#28312](https://github.com/ccxt/ccxt/pull/28312)
* [@ABSllk](https://github.com/ABSllk) made their first contribution in [#28324](https://github.com/ccxt/ccxt/pull/28324)
* [@AurelReb](https://github.com/AurelReb) made their first contribution in [#28345](https://github.com/ccxt/ccxt/pull/28345)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.46...v4.5.47](https://github.com/ccxt/ccxt/compare/v4.5.46...v4.5.47)
[Changes][v4.5.47]
# [v4.5.46](https://github.com/ccxt/ccxt/releases/tag/v4.5.46) - 2026-03-31 [#v4546---2026-03-31]
## What's Changed [#whats-changed-32]
* chore: update gitattributes by [@carlosmiei](https://github.com/carlosmiei) in [#28244](https://github.com/ccxt/ccxt/pull/28244)
* test: rawEncode by [@ttodua](https://github.com/ttodua) in [#28224](https://github.com/ccxt/ccxt/pull/28224)
* test: urlencode by [@ttodua](https://github.com/ttodua) in [#28214](https://github.com/ccxt/ccxt/pull/28214)
* feat(Kraken): add get api key info by [@Nirator78](https://github.com/Nirator78) in [#28246](https://github.com/ccxt/ccxt/pull/28246)
* fix(cli): accept timestamps as datetime by [@carlosmiei](https://github.com/carlosmiei) in [#28247](https://github.com/ccxt/ccxt/pull/28247)
* fix(c#): capitalize by [@ttodua](https://github.com/ttodua) in [#28248](https://github.com/ccxt/ccxt/pull/28248)
* test: fix binaryToBase64 by [@ttodua](https://github.com/ttodua) in [#28249](https://github.com/ccxt/ccxt/pull/28249)
* test: guaranteed sorted checks for urlencode functions by [@ttodua](https://github.com/ttodua) in [#28250](https://github.com/ccxt/ccxt/pull/28250)
* fix(c#): yymmdd function by [@ttodua](https://github.com/ttodua) in [#28251](https://github.com/ccxt/ccxt/pull/28251)
* test: unique tests change by [@ttodua](https://github.com/ttodua) in [#28255](https://github.com/ccxt/ccxt/pull/28255)
* test: change sort by [@ttodua](https://github.com/ttodua) in [#28254](https://github.com/ccxt/ccxt/pull/28254)
* feat: stringToBase16 & test by [@ttodua](https://github.com/ttodua) in [#28265](https://github.com/ccxt/ccxt/pull/28265)
* test: base64ToBinary by [@ttodua](https://github.com/ttodua) in [#28263](https://github.com/ccxt/ccxt/pull/28263)
* test: encode & decode by [@ttodua](https://github.com/ttodua) in [#28261](https://github.com/ccxt/ccxt/pull/28261)
* fix(c#): string empty by [@ttodua](https://github.com/ttodua) in [#28259](https://github.com/ccxt/ccxt/pull/28259)
* chore(deps): bump picomatch from 2.3.1 to 2.3.2 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#28257](https://github.com/ccxt/ccxt/pull/28257)
* fix(c#): deepExtend by [@ttodua](https://github.com/ttodua) in [#28252](https://github.com/ccxt/ccxt/pull/28252)
* test: stringToBase64 by [@ttodua](https://github.com/ttodua) in [#28262](https://github.com/ccxt/ccxt/pull/28262)
* htx typos fix by [@ndubel](https://github.com/ndubel) in [#28278](https://github.com/ccxt/ccxt/pull/28278)
* gate update methods by [@ndubel](https://github.com/ndubel) in [#28277](https://github.com/ccxt/ccxt/pull/28277)
* fix(kucoin): fetchWithdrawals pagination limit by [@carlosmiei](https://github.com/carlosmiei) in [#28280](https://github.com/ccxt/ccxt/pull/28280)
* fix(okx): skip test ids in sandbox by [@carlosmiei](https://github.com/carlosmiei) in [#28279](https://github.com/ccxt/ccxt/pull/28279)
* fix: OKX WS error handler reads sMsg from wrong object by [@Shiven0504](https://github.com/Shiven0504) in [#28274](https://github.com/ccxt/ccxt/pull/28274)
* Kucoin re add route user api key by [@Nirator78](https://github.com/Nirator78) in [#28273](https://github.com/ccxt/ccxt/pull/28273)
* fix(c#): uppercase encoded by [@ttodua](https://github.com/ttodua) in [#28258](https://github.com/ccxt/ccxt/pull/28258)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.16.8 to 1.17.0 in /go/tests/profile by [@dependabot](https://github.com/dependabot)\[bot] in [#28272](https://github.com/ccxt/ccxt/pull/28272)
* test: remove keysort by [@ttodua](https://github.com/ttodua) in [#28253](https://github.com/ccxt/ccxt/pull/28253)
* fix(binance): unify network in transaction by [@carlosmiei](https://github.com/carlosmiei) in [#28281](https://github.com/ccxt/ccxt/pull/28281)
* fix: php add binary\_to\_base16 by [@ttodua](https://github.com/ttodua) in [#28286](https://github.com/ccxt/ccxt/pull/28286)
* test: add aggregate by [@ttodua](https://github.com/ttodua) in [#28243](https://github.com/ccxt/ccxt/pull/28243)
* fix(cs): add precision and marginModes to marketInterface by [@carlosmiei](https://github.com/carlosmiei) in [#28296](https://github.com/ccxt/ccxt/pull/28296)
* test: turn on c# base tests by [@ttodua](https://github.com/ttodua) in [#28260](https://github.com/ccxt/ccxt/pull/28260)
* chore(deps): bump serialize-javascript and terser-webpack-plugin by [@dependabot](https://github.com/dependabot)\[bot] in [#28297](https://github.com/ccxt/ccxt/pull/28297)
* refactor(binance): add few network codes & inverse by [@ttodua](https://github.com/ttodua) in [#28292](https://github.com/ccxt/ccxt/pull/28292)
* feat(gate): websocket updates based on comment by [@Dan-krm](https://github.com/Dan-krm) in [#28288](https://github.com/ccxt/ccxt/pull/28288)
* chore(deps-dev): bump handlebars from 4.7.8 to 4.7.9 by [@dependabot](https://github.com/dependabot)\[bot] in [#28282](https://github.com/ccxt/ccxt/pull/28282)
* fix(grvt): interval tickers by [@ttodua](https://github.com/ttodua) in [#28287](https://github.com/ccxt/ccxt/pull/28287)
* feat(bitmart): add new endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#28268](https://github.com/ccxt/ccxt/pull/28268)
* fix(go): unbounded goroutine leak in WatchMultiple/FutureRace by [@pcriadoperez](https://github.com/pcriadoperez) in [#28298](https://github.com/ccxt/ccxt/pull/28298)
* fix(bitmart): fetchStatus fixed by [@yzh-pelle](https://github.com/yzh-pelle) in [#28299](https://github.com/ccxt/ccxt/pull/28299)
* refactor(okx): parseCurrency & networks by [@ttodua](https://github.com/ttodua) in [#28290](https://github.com/ccxt/ccxt/pull/28290)
* fix(bybit): implement parseCurrency & network updates by [@ttodua](https://github.com/ttodua) in [#28289](https://github.com/ccxt/ccxt/pull/28289)
* fix(bydfi): change swap paths by [@Lester-xie](https://github.com/Lester-xie) in [#28285](https://github.com/ccxt/ccxt/pull/28285)
* test: validate exports map paths in package test by [@pcriadoperez](https://github.com/pcriadoperez) in [#28245](https://github.com/ccxt/ccxt/pull/28245)
* bitget errors mapping by [@ndubel](https://github.com/ndubel) in [#28300](https://github.com/ccxt/ccxt/pull/28300)
## New Contributors [#new-contributors-20]
* [@Lester-xie](https://github.com/Lester-xie) made their first contribution in [#28285](https://github.com/ccxt/ccxt/pull/28285)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.45...v4.5.46](https://github.com/ccxt/ccxt/compare/v4.5.45...v4.5.46)
[Changes][v4.5.46]
# [v4.5.45](https://github.com/ccxt/ccxt/releases/tag/v4.5.45) - 2026-03-24 [#v4545---2026-03-24]
## What's Changed [#whats-changed-33]
* chore(deps): bump next from 16.1.5 to 16.1.7 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#28178](https://github.com/ccxt/ccxt/pull/28178)
* fix(cex): rl err by [@ttodua](https://github.com/ttodua) in [#28176](https://github.com/ccxt/ccxt/pull/28176)
* chore: bitteam skip by [@ttodua](https://github.com/ttodua) in [#28177](https://github.com/ccxt/ccxt/pull/28177)
* fix(defx): delist by [@ttodua](https://github.com/ttodua) in [#28059](https://github.com/ccxt/ccxt/pull/28059)
* chore: delist timex by [@carlosmiei](https://github.com/carlosmiei) in [#28183](https://github.com/ccxt/ccxt/pull/28183)
* feat(gate): links to the docs updated by [@yzh-pelle](https://github.com/yzh-pelle) in [#28173](https://github.com/ccxt/ccxt/pull/28173)
* chore: remove defx test by [@carlosmiei](https://github.com/carlosmiei) in [#28187](https://github.com/ccxt/ccxt/pull/28187)
* chore: dummy trigger build by [@carlosmiei](https://github.com/carlosmiei) in [#28188](https://github.com/ccxt/ccxt/pull/28188)
* feat(okx): watchBalance update by [@yzh-pelle](https://github.com/yzh-pelle) in [#28184](https://github.com/ccxt/ccxt/pull/28184)
* feat(gate): doc-links update by [@yzh-pelle](https://github.com/yzh-pelle) in [#28189](https://github.com/ccxt/ccxt/pull/28189)
* Revert "chore: delist timex ([#28183](https://github.com/ccxt/ccxt/issues/28183))" to restore go tests by [@carlosmiei](https://github.com/carlosmiei) in [#28191](https://github.com/ccxt/ccxt/pull/28191)
* feat(kucoin): merge kucoin and kucoinfutures by [@yzh-pelle](https://github.com/yzh-pelle) in [#27661](https://github.com/ccxt/ccxt/pull/27661)
* chore(deps-dev): bump flatted from 3.2.9 to 3.4.2 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#28200](https://github.com/ccxt/ccxt/pull/28200)
* test: implodeParams by [@ttodua](https://github.com/ttodua) in [#28194](https://github.com/ccxt/ccxt/pull/28194)
* test: isJsonEncodedObject by [@ttodua](https://github.com/ttodua) in [#28193](https://github.com/ccxt/ccxt/pull/28193)
* test: inArray add by [@ttodua](https://github.com/ttodua) in [#28196](https://github.com/ccxt/ccxt/pull/28196)
* test: datetime reorg, seconds, ms, micros by [@ttodua](https://github.com/ttodua) in [#28192](https://github.com/ccxt/ccxt/pull/28192)
* chore(deps-dev): bump flatted from 3.3.2 to 3.4.2 by [@dependabot](https://github.com/dependabot)\[bot] in [#28201](https://github.com/ccxt/ccxt/pull/28201)
* Paradex exchange : fix market order detection and omit price for market orders. by [@E-kigai](https://github.com/E-kigai) in [#28204](https://github.com/ccxt/ccxt/pull/28204)
* test: add strip test by [@ttodua](https://github.com/ttodua) in [#28212](https://github.com/ccxt/ccxt/pull/28212)
* refactor: `isEmptyString` instead of `nonEmptyString` by [@ttodua](https://github.com/ttodua) in [#28205](https://github.com/ccxt/ccxt/pull/28205)
* fix(hyperliquid): don't lose address before this.isUnifiedEnabled() by [@carlosmiei](https://github.com/carlosmiei) in [#28217](https://github.com/ccxt/ccxt/pull/28217)
* feat(gate): rest api update by [@yzh-pelle](https://github.com/yzh-pelle) in [#28202](https://github.com/ccxt/ccxt/pull/28202)
* test: urlencodeWithArrayRepeat by [@ttodua](https://github.com/ttodua) in [#28219](https://github.com/ccxt/ccxt/pull/28219)
* fix!(alp): delist by [@ttodua](https://github.com/ttodua) in [#28221](https://github.com/ccxt/ccxt/pull/28221)
* chore: btcbox skip retest by [@ttodua](https://github.com/ttodua) in [#28222](https://github.com/ccxt/ccxt/pull/28222)
* test: arrayConcat by [@ttodua](https://github.com/ttodua) in [#28234](https://github.com/ccxt/ccxt/pull/28234)
* test: add datetime related tests by [@ttodua](https://github.com/ttodua) in [#28232](https://github.com/ccxt/ccxt/pull/28232)
* cli: fix tsc errors by [@carlosmiei](https://github.com/carlosmiei) in [#28240](https://github.com/ccxt/ccxt/pull/28240)
* hyperliquid rollingWindowSize by [@caoilainnl](https://github.com/caoilainnl) in [#28230](https://github.com/ccxt/ccxt/pull/28230)
* chore: alpaca add back by [@ttodua](https://github.com/ttodua) in [#28227](https://github.com/ccxt/ccxt/pull/28227)
* chore: bitrue withdrawal/deposits issue (disabling temporarily) by [@ttodua](https://github.com/ttodua) in [#28226](https://github.com/ccxt/ccxt/pull/28226)
* test: urlencodeNested add by [@ttodua](https://github.com/ttodua) in [#28218](https://github.com/ccxt/ccxt/pull/28218)
* fix(grvt): php loadmarkets by [@ttodua](https://github.com/ttodua) in [#28195](https://github.com/ccxt/ccxt/pull/28195)
* test: isEmpty by [@ttodua](https://github.com/ttodua) in [#28197](https://github.com/ccxt/ccxt/pull/28197)
* fixed the unify mexc ws OCO order parsing by [@Shiven0504](https://github.com/Shiven0504) in [#28190](https://github.com/ccxt/ccxt/pull/28190)
* test: toArray by [@ttodua](https://github.com/ttodua) in [#28198](https://github.com/ccxt/ccxt/pull/28198)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.16.8 to 1.17.0 in /go/tests/types by [@dependabot](https://github.com/dependabot)\[bot] in [#28228](https://github.com/ccxt/ccxt/pull/28228)
* test: fix c# tests base by [@ttodua](https://github.com/ttodua) in [#28206](https://github.com/ccxt/ccxt/pull/28206)
* test: timeframe functions by [@ttodua](https://github.com/ttodua) in [#28233](https://github.com/ccxt/ccxt/pull/28233)
* feat(krakenfutures): adjust parseOrder filled handling by [@Dan-krm](https://github.com/Dan-krm) in [#28231](https://github.com/ccxt/ccxt/pull/28231)
* test: lbank ip try by [@ttodua](https://github.com/ttodua) in [#28225](https://github.com/ccxt/ccxt/pull/28225)
* fix(poloniex): chinese markets in POST requests by [@carlosmiei](https://github.com/carlosmiei) in [#28241](https://github.com/ccxt/ccxt/pull/28241)
* chore: disable c# tests tmp by [@carlosmiei](https://github.com/carlosmiei) in [#28242](https://github.com/ccxt/ccxt/pull/28242)
## New Contributors [#new-contributors-21]
* [@E-kigai](https://github.com/E-kigai) made their first contribution in [#28204](https://github.com/ccxt/ccxt/pull/28204)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.44...v4.5.45](https://github.com/ccxt/ccxt/compare/v4.5.44...v4.5.45)
[Changes][v4.5.45]
# [v4.5.44](https://github.com/ccxt/ccxt/releases/tag/v4.5.44) - 2026-03-17 [#v4544---2026-03-17]
## What's Changed [#whats-changed-34]
* test(coincatch): static datas ^ by [@ttodua](https://github.com/ttodua) in [#27099](https://github.com/ccxt/ccxt/pull/27099)
* binance - networks unified list ^ by [@ttodua](https://github.com/ttodua) in [#18484](https://github.com/ccxt/ccxt/pull/18484)
* chore: go granular build by [@ttodua](https://github.com/ttodua) in [#28139](https://github.com/ccxt/ccxt/pull/28139)
* test: amend precision check for abnormal values by [@ttodua](https://github.com/ttodua) in [#28135](https://github.com/ccxt/ccxt/pull/28135)
* fix(coinbaseexchange): edit parsers to use string math by [@Dan-krm](https://github.com/Dan-krm) in [#28136](https://github.com/ccxt/ccxt/pull/28136)
* fix: kucoin ws balance missing marginV2 account type mapping by [@Shiven0504](https://github.com/Shiven0504) in [#28141](https://github.com/ccxt/ccxt/pull/28141)
* fix(cli): don't assume params.length === 0 means usage print by [@carlosmiei](https://github.com/carlosmiei) in [#28145](https://github.com/ccxt/ccxt/pull/28145)
* fix(hyperliquid): php hip3 dexes ids by [@carlosmiei](https://github.com/carlosmiei) in [#28146](https://github.com/ccxt/ccxt/pull/28146)
* fix(cli): props with --table by [@carlosmiei](https://github.com/carlosmiei) in [#28149](https://github.com/ccxt/ccxt/pull/28149)
* chore: verify ccxt repo on context7 by [@pcriadoperez](https://github.com/pcriadoperez) in [#28151](https://github.com/ccxt/ccxt/pull/28151)
* fix(hyperliquid): parseIncome doesn't handle HIP-3 markets by [@colin-nl](https://github.com/colin-nl) in [#28147](https://github.com/ccxt/ccxt/pull/28147)
* Add llms.txt and AI assistant discoverability by [@pcriadoperez](https://github.com/pcriadoperez) in [#28152](https://github.com/ccxt/ccxt/pull/28152)
* test: await base language specific tests by [@ttodua](https://github.com/ttodua) in [#28143](https://github.com/ccxt/ccxt/pull/28143)
* hitbtc rollingWindowSize by [@caoilainnl](https://github.com/caoilainnl) in [#28120](https://github.com/ccxt/ccxt/pull/28120)
* bitvavo rollingWindowSize by [@caoilainnl](https://github.com/caoilainnl) in [#28119](https://github.com/ccxt/ccxt/pull/28119)
* kraken rolling window size by [@caoilainnl](https://github.com/caoilainnl) in [#28118](https://github.com/ccxt/ccxt/pull/28118)
* binance: split USDⓈ-M futures WS URLs into public/market/private paths by [@pcriadoperez](https://github.com/pcriadoperez) in [#28091](https://github.com/ccxt/ccxt/pull/28091)
* fix(hyperliquid): skip undefined markets in sandbox by [@carlosmiei](https://github.com/carlosmiei) in [#28155](https://github.com/ccxt/ccxt/pull/28155)
* feat(lighter): try to preLoad signer if possible by [@carlosmiei](https://github.com/carlosmiei) in [#28157](https://github.com/ccxt/ccxt/pull/28157)
* feat(whitebit): fetchFundingRateHistory added by [@yzh-pelle](https://github.com/yzh-pelle) in [#28159](https://github.com/ccxt/ccxt/pull/28159)
* fix(tests): php lang specific test return type by [@carlosmiei](https://github.com/carlosmiei) in [#28161](https://github.com/ccxt/ccxt/pull/28161)
* fix(lighter): preLoadLighterLibrary skip req by [@carlosmiei](https://github.com/carlosmiei) in [#28162](https://github.com/ccxt/ccxt/pull/28162)
* test: safeIntegerProduct fix by [@ttodua](https://github.com/ttodua) in [#28160](https://github.com/ccxt/ccxt/pull/28160)
* test: ensure defined credentials by [@ttodua](https://github.com/ttodua) in [#28165](https://github.com/ccxt/ccxt/pull/28165)
* fix(krakenfutures): fix marketId, parseOrder remove price in most cases by [@Dan-krm](https://github.com/Dan-krm) in [#28169](https://github.com/ccxt/ccxt/pull/28169)
* fix(deepcoin): swap balance by [@carlosmiei](https://github.com/carlosmiei) in [#28163](https://github.com/ccxt/ccxt/pull/28163)
* fix(gate): clientOrderId in trigger orders by [@carlosmiei](https://github.com/carlosmiei) in [#28170](https://github.com/ccxt/ccxt/pull/28170)
* fix(deribit): spot flag inside has by [@carlosmiei](https://github.com/carlosmiei) in [#28171](https://github.com/ccxt/ccxt/pull/28171)
* feat(GRVT): new exchange integration by [@ttodua](https://github.com/ttodua) in [#27441](https://github.com/ccxt/ccxt/pull/27441)
* chore: trigger dummy build by [@carlosmiei](https://github.com/carlosmiei) in [#28174](https://github.com/ccxt/ccxt/pull/28174)
* chore: fix builders table by [@carlosmiei](https://github.com/carlosmiei) in [#28175](https://github.com/ccxt/ccxt/pull/28175)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.43...v4.5.44](https://github.com/ccxt/ccxt/compare/go/v4.5.43...v4.5.44)
[Changes][v4.5.44]
# [v4.5.43](https://github.com/ccxt/ccxt/releases/tag/v4.5.43) - 2026-03-11 [#v4543---2026-03-11]
## What's Changed [#whats-changed-35]
* package: update tsBuildFile by [@sc0Vu](https://github.com/sc0Vu) in [#28074](https://github.com/ccxt/ccxt/pull/28074)
* fix(bitget): update fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#28065](https://github.com/ccxt/ccxt/pull/28065)
* fix: woo ws order parser float precision bug by [@Shiven0504](https://github.com/Shiven0504) in [#28075](https://github.com/ccxt/ccxt/pull/28075)
* feat(kucoin): createOrder and cancelOrder updated for margin hf orders by [@yzh-pelle](https://github.com/yzh-pelle) in [#28067](https://github.com/ccxt/ccxt/pull/28067)
* feat(aftermath) new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#25613](https://github.com/ccxt/ccxt/pull/25613)
* fix(htx): fetchStatus disable by [@ttodua](https://github.com/ttodua) in [#28069](https://github.com/ccxt/ccxt/pull/28069)
* fix(coinmetro): fetchcurrencies type by [@ttodua](https://github.com/ttodua) in [#28058](https://github.com/ccxt/ccxt/pull/28058)
* fix(cs): fix WS orderbook reset process by [@ttodua](https://github.com/ttodua) in [#28045](https://github.com/ccxt/ccxt/pull/28045)
* fix(paradex): watchTickers fix by [@ttodua](https://github.com/ttodua) in [#28085](https://github.com/ccxt/ccxt/pull/28085)
* chore: btcbox skip temporarily by [@ttodua](https://github.com/ttodua) in [#28080](https://github.com/ccxt/ccxt/pull/28080)
* chore: skip alpcom tests by [@ttodua](https://github.com/ttodua) in [#28079](https://github.com/ccxt/ccxt/pull/28079)
* test: lbank proxy test by [@ttodua](https://github.com/ttodua) in [#28081](https://github.com/ccxt/ccxt/pull/28081)
* bitget: add static tests by [@sc0Vu](https://github.com/sc0Vu) in [#28076](https://github.com/ccxt/ccxt/pull/28076)
* fix(coinbaseinternational): cbe spot fetchohlcv by [@ttodua](https://github.com/ttodua) in [#28086](https://github.com/ccxt/ccxt/pull/28086)
* refactor: go build optimization (separation of cli) by [@ttodua](https://github.com/ttodua) in [#27991](https://github.com/ccxt/ccxt/pull/27991)
* fix(lighter): watchLiquidations cache storage by [@carlosmiei](https://github.com/carlosmiei) in [#28096](https://github.com/ccxt/ccxt/pull/28096)
* fix(independentreserve): parsing for timeInForce and failed order status by [@simbesh](https://github.com/simbesh) in [#28097](https://github.com/ccxt/ccxt/pull/28097)
* fix(krakenfutures): ws position side detection precision by [@Shiven0504](https://github.com/Shiven0504) in [#28094](https://github.com/ccxt/ccxt/pull/28094)
* feat(bullish): fetchOpenInterest by [@samgermain](https://github.com/samgermain) in [#28071](https://github.com/ccxt/ccxt/pull/28071)
* fix(mexc): fallback to q for swap ws ohlcv volume by [@ludekdolejsky](https://github.com/ludekdolejsky) in [#28087](https://github.com/ccxt/ccxt/pull/28087)
* coinex rollingWindowSize by [@caoilainnl](https://github.com/caoilainnl) in [#28070](https://github.com/ccxt/ccxt/pull/28070)
* Bingx rolling by [@caoilainnl](https://github.com/caoilainnl) in [#28039](https://github.com/ccxt/ccxt/pull/28039)
* okx rollingWindowSize by [@caoilainnl](https://github.com/caoilainnl) in [#28038](https://github.com/ccxt/ccxt/pull/28038)
* bybit rollingWindowSize by [@caoilainnl](https://github.com/caoilainnl) in [#28027](https://github.com/ccxt/ccxt/pull/28027)
* gate rollingWindowSize by [@caoilainnl](https://github.com/caoilainnl) in [#28025](https://github.com/ccxt/ccxt/pull/28025)
* rollingWindowSize for kucoin by [@caoilainnl](https://github.com/caoilainnl) in [#28021](https://github.com/ccxt/ccxt/pull/28021)
* htx rollingWindowSize by [@caoilainnl](https://github.com/caoilainnl) in [#28028](https://github.com/ccxt/ccxt/pull/28028)
* luno rollingWindowSize by [@caoilainnl](https://github.com/caoilainnl) in [#28026](https://github.com/ccxt/ccxt/pull/28026)
* chore(gemini): fetchTicker comment by [@ttodua](https://github.com/ttodua) in [#28101](https://github.com/ccxt/ccxt/pull/28101)
* fix(bingx): assume swap inside watchPositions by [@carlosmiei](https://github.com/carlosmiei) in [#28099](https://github.com/ccxt/ccxt/pull/28099)
* faq: update for dydx by [@sc0Vu](https://github.com/sc0Vu) in [#28078](https://github.com/ccxt/ccxt/pull/28078)
* fix(cex): ws trades handling by [@ttodua](https://github.com/ttodua) in [#28044](https://github.com/ccxt/ccxt/pull/28044)
* chore: skip arkham by [@ttodua](https://github.com/ttodua) in [#28108](https://github.com/ccxt/ccxt/pull/28108)
* feat(lighter): add pagination by [@sc0Vu](https://github.com/sc0Vu) in [#28098](https://github.com/ccxt/ccxt/pull/28098)
* fix(krakenfutures): fetchOrder incorrect price and derived fields by [@Dan-krm](https://github.com/Dan-krm) in [#28110](https://github.com/ccxt/ccxt/pull/28110)
* fix(ligther): account id (int) by [@ttodua](https://github.com/ttodua) in [#28111](https://github.com/ccxt/ccxt/pull/28111)
* refactor: move go `WarmUpCache` by [@ttodua](https://github.com/ttodua) in [#28105](https://github.com/ccxt/ccxt/pull/28105)
* fix(bingx): skip positions with undefined symbol in handlePositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#28117](https://github.com/ccxt/ccxt/pull/28117)
* fix(hyperliquid): correct balance when unified margin enabled by [@sc0Vu](https://github.com/sc0Vu) in [#28106](https://github.com/ccxt/ccxt/pull/28106)
* fix(okx): fetchFundingHistory amount by [@Dan-krm](https://github.com/Dan-krm) in [#28109](https://github.com/ccxt/ccxt/pull/28109)
* fix(bithumb): remove USDT from quoteCurrencies to fix loadMarkets failure by [@forcecore](https://github.com/forcecore) in [#28123](https://github.com/ccxt/ccxt/pull/28123)
* feat(lighter): add watchMyTrades by [@slavivanov](https://github.com/slavivanov) in [#28125](https://github.com/ccxt/ccxt/pull/28125)
* fix(okx): fetchPosition, isolated linear swap initialMargin by [@Dan-krm](https://github.com/Dan-krm) in [#28126](https://github.com/ccxt/ccxt/pull/28126)
* feat(toobit): add id by [@carlosmiei](https://github.com/carlosmiei) in [#28127](https://github.com/ccxt/ccxt/pull/28127)
* fix(hyperliquid): never use spot if dex is provided by [@carlosmiei](https://github.com/carlosmiei) in [#28128](https://github.com/ccxt/ccxt/pull/28128)
## New Contributors [#new-contributors-22]
* [@Shiven0504](https://github.com/Shiven0504) made their first contribution in [#28075](https://github.com/ccxt/ccxt/pull/28075)
* [@ludekdolejsky](https://github.com/ludekdolejsky) made their first contribution in [#28087](https://github.com/ccxt/ccxt/pull/28087)
* [@forcecore](https://github.com/forcecore) made their first contribution in [#28123](https://github.com/ccxt/ccxt/pull/28123)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.42...v4.5.43](https://github.com/ccxt/ccxt/compare/v4.5.42...v4.5.43)
[Changes][v4.5.43]
# [v4.5.42](https://github.com/ccxt/ccxt/releases/tag/v4.5.42) - 2026-03-06 [#v4542---2026-03-06]
## What's Changed [#whats-changed-36]
* chore: fix type in faq by [@carlosmiei](https://github.com/carlosmiei) in [#28064](https://github.com/ccxt/ccxt/pull/28064)
* chore: fix missing lighter folder from python package by [@carlosmiei](https://github.com/carlosmiei) in [#28072](https://github.com/ccxt/ccxt/pull/28072)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.41...v4.5.42](https://github.com/ccxt/ccxt/compare/v4.5.41...v4.5.42)
[Changes][v4.5.42]
# [v4.5.41](https://github.com/ccxt/ccxt/releases/tag/v4.5.41) - 2026-03-05 [#v4541---2026-03-05]
## What's Changed [#whats-changed-37]
* fix(csharp): get value of dictionary by [@pcriadoperez](https://github.com/pcriadoperez) in [#27975](https://github.com/ccxt/ccxt/pull/27975)
* fix(bitget): update ws order status by [@sc0Vu](https://github.com/sc0Vu) in [#27986](https://github.com/ccxt/ccxt/pull/27986)
* test: sortBy2 enhancement by [@ttodua](https://github.com/ttodua) in [#27983](https://github.com/ccxt/ccxt/pull/27983)
* bitmex.has margin methods by [@samgermain](https://github.com/samgermain) in [#27984](https://github.com/ccxt/ccxt/pull/27984)
* refactor: remove unused flatten by [@ttodua](https://github.com/ttodua) in [#27980](https://github.com/ccxt/ccxt/pull/27980)
* feat(hyperliquid): support grouping positionTpsl by [@sc0Vu](https://github.com/sc0Vu) in [#27987](https://github.com/ccxt/ccxt/pull/27987)
* build(deps): bump github.com/ethereum/go-ethereum from 1.16.8 to 1.17.0 in /go/cli by [@dependabot](https://github.com/dependabot)\[bot] in [#27969](https://github.com/ccxt/ccxt/pull/27969)
* test: setMarketsFromExchange transpilable reorg by [@ttodua](https://github.com/ttodua) in [#27977](https://github.com/ccxt/ccxt/pull/27977)
* fix(go): sort method fix by [@ttodua](https://github.com/ttodua) in [#27990](https://github.com/ccxt/ccxt/pull/27990)
* fix: transpiler php multi-replace by [@ttodua](https://github.com/ttodua) in [#27994](https://github.com/ccxt/ccxt/pull/27994)
* feat: file I/O read/write/delete/exists by [@ttodua](https://github.com/ttodua) in [#27904](https://github.com/ccxt/ccxt/pull/27904)
* chore: remove NumberToLe / number\_to\_le by [@ttodua](https://github.com/ttodua) in [#28002](https://github.com/ccxt/ccxt/pull/28002)
* refactor: remove unnecessary `ordered` method by [@ttodua](https://github.com/ttodua) in [#28003](https://github.com/ccxt/ccxt/pull/28003)
* feat(ascendex): fetchOpenInterests by [@samgermain](https://github.com/samgermain) in [#28005](https://github.com/ccxt/ccxt/pull/28005)
* perf: move protobuf loading into mexc-only by [@ttodua](https://github.com/ttodua) in [#27999](https://github.com/ccxt/ccxt/pull/27999)
* test: fix set markets await by [@ttodua](https://github.com/ttodua) in [#28006](https://github.com/ccxt/ccxt/pull/28006)
* feat(krakenfutures): resolve parseTrade and parseOrder issues by [@Dan-krm](https://github.com/Dan-krm) in [#27992](https://github.com/ccxt/ccxt/pull/27992)
* build(deps): bump github.com/ethereum/go-ethereum from 1.16.8 to 1.17.0 in /go/v4 by [@dependabot](https://github.com/dependabot)\[bot] in [#27989](https://github.com/ccxt/ccxt/pull/27989)
* fix(go): unique method & add unique tests by [@ttodua](https://github.com/ttodua) in [#27981](https://github.com/ccxt/ccxt/pull/27981)
* fix(coinspot): update sign method to support versioned api by [@simbesh](https://github.com/simbesh) in [#27963](https://github.com/ccxt/ccxt/pull/27963)
* chore: remove uuidv1 by [@ttodua](https://github.com/ttodua) in [#28001](https://github.com/ccxt/ccxt/pull/28001)
* fix(mexc): remove check from parseDepositAddress by [@carlosmiei](https://github.com/carlosmiei) in [#28010](https://github.com/ccxt/ccxt/pull/28010)
* build(deps-dev): bump rollup from 2.79.2 to 2.80.0 by [@dependabot](https://github.com/dependabot)\[bot] in [#28008](https://github.com/ccxt/ccxt/pull/28008)
* build(deps-dev): bump minimatch from 3.1.2 to 3.1.5 by [@dependabot](https://github.com/dependabot)\[bot] in [#28009](https://github.com/ccxt/ccxt/pull/28009)
* fix(binance): watchTickers use miniTicker (instead of ticker) by [@ttodua](https://github.com/ttodua) in [#28007](https://github.com/ccxt/ccxt/pull/28007)
* refactor: remove unused `vwap` by [@ttodua](https://github.com/ttodua) in [#28012](https://github.com/ccxt/ccxt/pull/28012)
* build(deps-dev): bump minimatch from 3.1.2 to 3.1.5 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#28018](https://github.com/ccxt/ccxt/pull/28018)
* refactor: remove ts ordered (unused) by [@ttodua](https://github.com/ttodua) in [#28015](https://github.com/ccxt/ccxt/pull/28015)
* test: add uuid tests by [@ttodua](https://github.com/ttodua) in [#27993](https://github.com/ccxt/ccxt/pull/27993)
* feat(bingx): add watchPositions support by [@pcriadoperez](https://github.com/pcriadoperez) in [#27935](https://github.com/ccxt/ccxt/pull/27935)
* feat(Gemini) fetch open interest by [@samgermain](https://github.com/samgermain) in [#28023](https://github.com/ccxt/ccxt/pull/28023)
* gemini: missing api endpoints by [@samgermain](https://github.com/samgermain) in [#28022](https://github.com/ccxt/ccxt/pull/28022)
* fix(krakenfutures): parseOrder cost issue by [@Dan-krm](https://github.com/Dan-krm) in [#28020](https://github.com/ccxt/ccxt/pull/28020)
* fix(krakenfutures): createOrder market order price by [@Dan-krm](https://github.com/Dan-krm) in [#28030](https://github.com/ccxt/ccxt/pull/28030)
* fix(hyperliquid): HIP3 ids in PHP by [@carlosmiei](https://github.com/carlosmiei) in [#28019](https://github.com/ccxt/ccxt/pull/28019)
* refactor: remove merge (unused) by [@ttodua](https://github.com/ttodua) in [#28014](https://github.com/ccxt/ccxt/pull/28014)
* refactor: remove travis related by [@ttodua](https://github.com/ttodua) in [#28029](https://github.com/ccxt/ccxt/pull/28029)
* test: update uuid by [@ttodua](https://github.com/ttodua) in [#28034](https://github.com/ccxt/ccxt/pull/28034)
* feat(whitebit): fetchTickers updated by [@yzh-pelle](https://github.com/yzh-pelle) in [#28032](https://github.com/ccxt/ccxt/pull/28032)
* Fix typos in comments by [@04cb](https://github.com/04cb) in [#28040](https://github.com/ccxt/ccxt/pull/28040)
* fix(paradex): num instead of int by [@ttodua](https://github.com/ttodua) in [#28042](https://github.com/ccxt/ccxt/pull/28042)
* fix(cs): sort using IList instead of List by [@ttodua](https://github.com/ttodua) in [#28043](https://github.com/ccxt/ccxt/pull/28043)
* fix(python): uuid16 and uuid22 by [@ttodua](https://github.com/ttodua) in [#28046](https://github.com/ccxt/ccxt/pull/28046)
* fix(gemini): method v1/perpetuals/fundingpaymentreport/records.xlsx m… by [@samgermain](https://github.com/samgermain) in [#28052](https://github.com/ccxt/ccxt/pull/28052)
* feat(binance, gate): docstring, clientOrderId support, parseOrder reduceOnly by [@Dan-krm](https://github.com/Dan-krm) in [#28031](https://github.com/ccxt/ccxt/pull/28031)
* fix(kucoinfutures): handleOHLCV parsing by [@Sebastiaan240](https://github.com/Sebastiaan240) in [#28033](https://github.com/ccxt/ccxt/pull/28033)
* feat(lighter): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#27268](https://github.com/ccxt/ccxt/pull/27268)
* feat: trigger builds with commit message hint `[TRIGGER_BUILD]` by [@ttodua](https://github.com/ttodua) in [#28053](https://github.com/ccxt/ccxt/pull/28053)
* chore: fix dockerfile by [@carlosmiei](https://github.com/carlosmiei) in [#28055](https://github.com/ccxt/ccxt/pull/28055)
* chore: add dylib to gitatributes by [@carlosmiei](https://github.com/carlosmiei) in [#28056](https://github.com/ccxt/ccxt/pull/28056)
* test: blofin nocheck mkts by [@ttodua](https://github.com/ttodua) in [#28057](https://github.com/ccxt/ccxt/pull/28057)
* chore: skip defx by [@ttodua](https://github.com/ttodua) in [#28060](https://github.com/ccxt/ccxt/pull/28060)
## New Contributors [#new-contributors-23]
* [@04cb](https://github.com/04cb) made their first contribution in [#28040](https://github.com/ccxt/ccxt/pull/28040)
* [@Sebastiaan240](https://github.com/Sebastiaan240) made their first contribution in [#28033](https://github.com/ccxt/ccxt/pull/28033)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.40...v4.5.41](https://github.com/ccxt/ccxt/compare/v4.5.40...v4.5.41)
[Changes][v4.5.41]
# [v4.5.40](https://github.com/ccxt/ccxt/releases/tag/v4.5.40) - 2026-02-23 [#v4540---2026-02-23]
## What's Changed [#whats-changed-38]
* fix(bingx): fetchFundingRateHistory until arg by [@carlosmiei](https://github.com/carlosmiei) in [#27947](https://github.com/ccxt/ccxt/pull/27947)
* fix(go): remove duplicate sandbox prop toggling by [@ttodua](https://github.com/ttodua) in [#27946](https://github.com/ccxt/ccxt/pull/27946)
* test: add keysort base test by [@ttodua](https://github.com/ttodua) in [#27782](https://github.com/ccxt/ccxt/pull/27782)
* test: add base constants test by [@ttodua](https://github.com/ttodua) in [#27860](https://github.com/ccxt/ccxt/pull/27860)
* fix(htx): correct method name in fetchOpenInterests by [@samgermain](https://github.com/samgermain) in [#27953](https://github.com/ccxt/ccxt/pull/27953)
* feat(bitmex): fetchOpenInterest by [@samgermain](https://github.com/samgermain) in [#27954](https://github.com/ccxt/ccxt/pull/27954)
* fix(go): remove stack from CCXT error by [@carlosmiei](https://github.com/carlosmiei) in [#27956](https://github.com/ccxt/ccxt/pull/27956)
* fix(bing): update links to the documentation by [@yzh-pelle](https://github.com/yzh-pelle) in [#27957](https://github.com/ccxt/ccxt/pull/27957)
* phemex.has: margin and option methods by [@samgermain](https://github.com/samgermain) in [#27962](https://github.com/ccxt/ccxt/pull/27962)
* feat(exchange) add emulated fetch open interest by [@samgermain](https://github.com/samgermain) in [#27961](https://github.com/ccxt/ccxt/pull/27961)
* poloniex.has option methods by [@samgermain](https://github.com/samgermain) in [#27943](https://github.com/ccxt/ccxt/pull/27943)
* fix(python): futures race memory leak by [@pcriadoperez](https://github.com/pcriadoperez) in [#27871](https://github.com/ccxt/ccxt/pull/27871)
* refactor: remove unused func by [@ttodua](https://github.com/ttodua) in [#27855](https://github.com/ccxt/ccxt/pull/27855)
* fix(blofin): sort trades by [@ttodua](https://github.com/ttodua) in [#27635](https://github.com/ccxt/ccxt/pull/27635)
* perf: python sum (30%) by [@ttodua](https://github.com/ttodua) in [#27798](https://github.com/ccxt/ccxt/pull/27798)
* perf: python keysort (80%) by [@ttodua](https://github.com/ttodua) in [#27781](https://github.com/ccxt/ccxt/pull/27781)
* perf: python index\_by (10%) by [@ttodua](https://github.com/ttodua) in [#27792](https://github.com/ccxt/ccxt/pull/27792)
* perf: python extend (10%) by [@ttodua](https://github.com/ttodua) in [#27790](https://github.com/ccxt/ccxt/pull/27790)
* feat(exchanges): new ADL unified methods by [@Dan-krm](https://github.com/Dan-krm) in [#27590](https://github.com/ccxt/ccxt/pull/27590)
* refactor: remove inflate64 by [@ttodua](https://github.com/ttodua) in [#27949](https://github.com/ccxt/ccxt/pull/27949)
* feat(bitmex): fetchSettlementHistory by [@samgermain](https://github.com/samgermain) in [#27967](https://github.com/ccxt/ccxt/pull/27967)
* fix(go): make some WS structs thread-safe by [@carlosmiei](https://github.com/carlosmiei) in [#27966](https://github.com/ccxt/ccxt/pull/27966)
* fix(bitget): WS uta methods by [@ttodua](https://github.com/ttodua) in [#27968](https://github.com/ccxt/ccxt/pull/27968)
* feat(exchanges): add watchFundingRate support by [@Dan-krm](https://github.com/Dan-krm) in [#27950](https://github.com/ccxt/ccxt/pull/27950)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.39...v4.5.40](https://github.com/ccxt/ccxt/compare/go/v4.5.39...v4.5.40)
[Changes][v4.5.40]
# [v4.5.39](https://github.com/ccxt/ccxt/releases/tag/v4.5.39) - 2026-02-19 [#v4539---2026-02-19]
## What's Changed [#whats-changed-39]
* chore: delist Probit by [@carlosmiei](https://github.com/carlosmiei) in [#27897](https://github.com/ccxt/ccxt/pull/27897)
* chore(binance): change limit down to 1000 fetchohlcv by [@ttodua](https://github.com/ttodua) in [#27856](https://github.com/ccxt/ccxt/pull/27856)
* toobit.has margin and option methods by [@samgermain](https://github.com/samgermain) in [#27910](https://github.com/ccxt/ccxt/pull/27910)
* fix(okx): watchPositions for net 0 by [@pcriadoperez](https://github.com/pcriadoperez) in [#27912](https://github.com/ccxt/ccxt/pull/27912)
* fix(krakenfutures): missing order status by [@carlosmiei](https://github.com/carlosmiei) in [#27914](https://github.com/ccxt/ccxt/pull/27914)
* feat(binance): update margin websocket by [@pcriadoperez](https://github.com/pcriadoperez) in [#27873](https://github.com/ccxt/ccxt/pull/27873)
* fix(btcmarkets): invalid withdraw request param by [@simbesh](https://github.com/simbesh) in [#27920](https://github.com/ccxt/ccxt/pull/27920)
* fix(coinspot): add v2 API endpoints and update markets by [@simbesh](https://github.com/simbesh) in [#27918](https://github.com/ccxt/ccxt/pull/27918)
* bitvavo institutional endpoints by [@ndubel](https://github.com/ndubel) in [#27922](https://github.com/ccxt/ccxt/pull/27922)
* fix(bitstamp): fetchMarkets new endpoint by [@ttodua](https://github.com/ttodua) in [#27924](https://github.com/ccxt/ccxt/pull/27924)
* feat(bitstamp): implement fetchFundingRate by [@ttodua](https://github.com/ttodua) in [#27927](https://github.com/ccxt/ccxt/pull/27927)
* perf(bitmart): multi request by [@ttodua](https://github.com/ttodua) in [#27923](https://github.com/ccxt/ccxt/pull/27923)
* feat(bitstamp): add editorder by [@ttodua](https://github.com/ttodua) in [#27925](https://github.com/ccxt/ccxt/pull/27925)
* feat(bitstamp): fetchFundingRateHistory by [@ttodua](https://github.com/ttodua) in [#27926](https://github.com/ccxt/ccxt/pull/27926)
* tokocrypto.has contract methods by [@samgermain](https://github.com/samgermain) in [#27936](https://github.com/ccxt/ccxt/pull/27936)
* bitget new endpoints by [@ndubel](https://github.com/ndubel) in [#27933](https://github.com/ccxt/ccxt/pull/27933)
* fix(whitebit): added networks mapping into fetchCurrencies by [@Galllarate](https://github.com/Galllarate) in [#27932](https://github.com/ccxt/ccxt/pull/27932)
* fix(whitebit): unify Whitebit BEP20 network code by [@Galllarate](https://github.com/Galllarate) in [#27931](https://github.com/ccxt/ccxt/pull/27931)
* feat(binance): add discount buy endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#27938](https://github.com/ccxt/ccxt/pull/27938)
* fix(go): isEqual handle syn.map == nil comparisons by [@carlosmiei](https://github.com/carlosmiei) in [#27937](https://github.com/ccxt/ccxt/pull/27937)
* feat(bybit): update liquidations endpoint by [@pcriadoperez](https://github.com/pcriadoperez) in [#27941](https://github.com/ccxt/ccxt/pull/27941)
* fix(hyperliquid): deduplicate orders in fetchOrders by [@4Mathleu](https://github.com/4Mathleu) in [#27930](https://github.com/ccxt/ccxt/pull/27930)
## New Contributors [#new-contributors-24]
* [@4Mathleu](https://github.com/4Mathleu) made their first contribution in [#27930](https://github.com/ccxt/ccxt/pull/27930)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.38...v4.5.39](https://github.com/ccxt/ccxt/compare/go/v4.5.38...v4.5.39)
[Changes][v4.5.39]
# [v4.5.38](https://github.com/ccxt/ccxt/releases/tag/v4.5.38) - 2026-02-13 [#v4538---2026-02-13]
## What's Changed [#whats-changed-40]
* hyperliquid error mapping by [@ndubel](https://github.com/ndubel) in [#27882](https://github.com/ccxt/ccxt/pull/27882)
* fix: update version in go pro by [@sc0Vu](https://github.com/sc0Vu) in [#27880](https://github.com/ccxt/ccxt/pull/27880)
* test(krakenfutures): rev back static by [@ttodua](https://github.com/ttodua) in [#27884](https://github.com/ccxt/ccxt/pull/27884)
* fix(bitmex): map reduceOnly and postOnly to execInst in createOrder by [@byshing](https://github.com/byshing) in [#27883](https://github.com/ccxt/ccxt/pull/27883)
* fix(bybit): add realisedPNL to positions by [@carlosmiei](https://github.com/carlosmiei) in [#27886](https://github.com/ccxt/ccxt/pull/27886)
* fix(hyperliquid): rm empty line by [@carlosmiei](https://github.com/carlosmiei) in [#27888](https://github.com/ccxt/ccxt/pull/27888)
* fix(gate): map INVALID\_PARAM\_VALUE to badRequest by [@carlosmiei](https://github.com/carlosmiei) in [#27889](https://github.com/ccxt/ccxt/pull/27889)
* fix(binance, bitmex, bybit,gate,okx): liquidations to return ArrayCache isntead of arraycachebysymbol by [@pcriadoperez](https://github.com/pcriadoperez) in [#27891](https://github.com/ccxt/ccxt/pull/27891)
* bitstamp new endpoints by [@ndubel](https://github.com/ndubel) in [#27893](https://github.com/ccxt/ccxt/pull/27893)
* fix(hyperliquid): add builderFee to trade parsing by [@carlosmiei](https://github.com/carlosmiei) in [#27890](https://github.com/ccxt/ccxt/pull/27890)
* fix(hyperliquid): builder encoding in GO by [@carlosmiei](https://github.com/carlosmiei) in [#27898](https://github.com/ccxt/ccxt/pull/27898)
* fix(aster): private trade quantity by [@carlosmiei](https://github.com/carlosmiei) in [#27899](https://github.com/ccxt/ccxt/pull/27899)
* fix(krakenfutures): parseOrders from fetchOrder(s) by [@carlosmiei](https://github.com/carlosmiei) in [#27901](https://github.com/ccxt/ccxt/pull/27901)
* fix(whitebit): order status parsing and contract size removal from sp… by [@carlosmiei](https://github.com/carlosmiei) in [#27903](https://github.com/ccxt/ccxt/pull/27903)
## New Contributors [#new-contributors-25]
* [@byshing](https://github.com/byshing) made their first contribution in [#27883](https://github.com/ccxt/ccxt/pull/27883)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.37...v4.5.38](https://github.com/ccxt/ccxt/compare/go/v4.5.37...v4.5.38)
[Changes][v4.5.38]
# [v4.5.37](https://github.com/ccxt/ccxt/releases/tag/v4.5.37) - 2026-02-09 [#v4537---2026-02-09]
## What's Changed [#whats-changed-41]
* feat(bybit): add v5/account/set-limit-px-action by [@carlosmiei](https://github.com/carlosmiei) in [#27842](https://github.com/ccxt/ccxt/pull/27842)
* feat(mexc): futures update API domain by [@nhymxu](https://github.com/nhymxu) in [#27839](https://github.com/ccxt/ccxt/pull/27839)
* fix(whitebit): fetchTIme unit by [@carlosmiei](https://github.com/carlosmiei) in [#27846](https://github.com/ccxt/ccxt/pull/27846)
* feat(hyperliquid): add setUserAbstraction and setAgentAbstraction method by [@carlosmiei](https://github.com/carlosmiei) in [#27847](https://github.com/ccxt/ccxt/pull/27847)
* test: add precisionFromString tests by [@ttodua](https://github.com/ttodua) in [#27851](https://github.com/ccxt/ccxt/pull/27851)
* feat(kucoin): add uta endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#27852](https://github.com/ccxt/ccxt/pull/27852)
* feat(htx): fetchBalance, multiAssetMode support by [@Dan-krm](https://github.com/Dan-krm) in [#27848](https://github.com/ccxt/ccxt/pull/27848)
* perf: python precision\_from\_string 5x by [@ttodua](https://github.com/ttodua) in [#27850](https://github.com/ccxt/ccxt/pull/27850)
* chore(deps-dev): bump webpack from 5.97.1 to 5.105.0 by [@dependabot](https://github.com/dependabot)\[bot] in [#27858](https://github.com/ccxt/ccxt/pull/27858)
* feat(hyperliquid): add createTwapOrder and cancelTwapOrder by [@carlosmiei](https://github.com/carlosmiei) in [#27854](https://github.com/ccxt/ccxt/pull/27854)
* test: remove default flag by [@ttodua](https://github.com/ttodua) in [#27859](https://github.com/ccxt/ccxt/pull/27859)
* fix: Properly clamp funding rate in Kraken Futures by [@slavivanov](https://github.com/slavivanov) in [#27870](https://github.com/ccxt/ccxt/pull/27870)
* feat(go): add LastResponseHeaders by [@carlosmiei](https://github.com/carlosmiei) in [#27869](https://github.com/ccxt/ccxt/pull/27869)
* feat(ai): add support for skills to codex and gemini cli by [@pcriadoperez](https://github.com/pcriadoperez) in [#27872](https://github.com/ccxt/ccxt/pull/27872)
* feat(go): add parseTimeframe to IBaseExchange by [@carlosmiei](https://github.com/carlosmiei) in [#27875](https://github.com/ccxt/ccxt/pull/27875)
* tests: temporaty disable php test in krakenfutured by [@carlosmiei](https://github.com/carlosmiei) in [#27876](https://github.com/ccxt/ccxt/pull/27876)
* perf: python parse\_timeframe by [@ttodua](https://github.com/ttodua) in [#27853](https://github.com/ccxt/ccxt/pull/27853)
* perf: python get\_object\_value\_from\_key\_list (10%) by [@ttodua](https://github.com/ttodua) in [#27779](https://github.com/ccxt/ccxt/pull/27779)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.36...v4.5.37](https://github.com/ccxt/ccxt/compare/v4.5.36...v4.5.37)
[Changes][v4.5.37]
# [v4.5.36](https://github.com/ccxt/ccxt/releases/tag/v4.5.36) - 2026-02-03 [#v4536---2026-02-03]
## What's Changed [#whats-changed-42]
* woo fetchOHLCV fix by [@ndubel](https://github.com/ndubel) in [#27793](https://github.com/ccxt/ccxt/pull/27793)
* docs: minor fixes to fetchMarkets return type and to rateLimit exchange property descriptions by [@bryanstevensacosta](https://github.com/bryanstevensacosta) in [#27576](https://github.com/ccxt/ccxt/pull/27576)
* test(woo): fix static tests ohlcv by [@ttodua](https://github.com/ttodua) in [#27802](https://github.com/ccxt/ccxt/pull/27802)
* feat(bybit): update rl for transaction-log by [@sc0Vu](https://github.com/sc0Vu) in [#27807](https://github.com/ccxt/ccxt/pull/27807)
* chore: remove unused funcs by [@ttodua](https://github.com/ttodua) in [#27806](https://github.com/ccxt/ccxt/pull/27806)
* feat(coinbase): createOrder reduceOnly, withdraw edit parameters by [@Dan-krm](https://github.com/Dan-krm) in [#27816](https://github.com/ccxt/ccxt/pull/27816)
* chore(deps): bump protobuf from 5.29.5 to 6.33.5 by [@dependabot](https://github.com/dependabot)\[bot] in [#27820](https://github.com/ccxt/ccxt/pull/27820)
* perf: python filter\_by (90%) by [@ttodua](https://github.com/ttodua) in [#27777](https://github.com/ccxt/ccxt/pull/27777)
* perf: python group\_by (80%) by [@ttodua](https://github.com/ttodua) in [#27778](https://github.com/ccxt/ccxt/pull/27778)
* test: add aggregate by [@ttodua](https://github.com/ttodua) in [#27800](https://github.com/ccxt/ccxt/pull/27800)
* fix(aster): Messages dropped in Aster private WS methods by [@colin-nl](https://github.com/colin-nl) in [#27821](https://github.com/ccxt/ccxt/pull/27821)
* test: add binaryToBase64 test by [@ttodua](https://github.com/ttodua) in [#27817](https://github.com/ccxt/ccxt/pull/27817)
* perf: python aggregate (25%) by [@ttodua](https://github.com/ttodua) in [#27801](https://github.com/ccxt/ccxt/pull/27801)
* test: add urlencodeToBase64 test by [@ttodua](https://github.com/ttodua) in [#27819](https://github.com/ccxt/ccxt/pull/27819)
* refactor: remove unused rfc2616 by [@ttodua](https://github.com/ttodua) in [#27811](https://github.com/ccxt/ccxt/pull/27811)
* test: add extractParams test by [@ttodua](https://github.com/ttodua) in [#27794](https://github.com/ccxt/ccxt/pull/27794)
* perf(js): deepExtend optimization (2x) by [@ttodua](https://github.com/ttodua) in [#27737](https://github.com/ccxt/ccxt/pull/27737)
* fix(binance,bybit, okx,gate,bitmex): fix watchLiquidations and watchmyLiquidations with newUpdates = false by [@pcriadoperez](https://github.com/pcriadoperez) in [#27825](https://github.com/ccxt/ccxt/pull/27825)
* perf: python iso8601 (80%) by [@ttodua](https://github.com/ttodua) in [#27810](https://github.com/ccxt/ccxt/pull/27810)
* fix(bybit): oco order only tp or sl by [@hoangbn](https://github.com/hoangbn) in [#27822](https://github.com/ccxt/ccxt/pull/27822)
* feat(ai): add installable ai skills by [@pcriadoperez](https://github.com/pcriadoperez) in [#27824](https://github.com/ccxt/ccxt/pull/27824)
* perf: python extractParams (80%) by [@ttodua](https://github.com/ttodua) in [#27795](https://github.com/ccxt/ccxt/pull/27795)
* perf: python parse8601 (190%) by [@ttodua](https://github.com/ttodua) in [#27813](https://github.com/ccxt/ccxt/pull/27813)
* perf: python urlencode\_with\_array\_repeat by [@ttodua](https://github.com/ttodua) in [#27796](https://github.com/ccxt/ccxt/pull/27796)
* fix(bydfi): findMessageHashes removed from `handle...` methods by [@yzh-pelle](https://github.com/yzh-pelle) in [#27826](https://github.com/ccxt/ccxt/pull/27826)
* chore: remove aggregate from old test by [@ttodua](https://github.com/ttodua) in [#27827](https://github.com/ccxt/ccxt/pull/27827)
* chore: python remove unused funcs by [@ttodua](https://github.com/ttodua) in [#27828](https://github.com/ccxt/ccxt/pull/27828)
* fix(krakenfutures): parseLeverageTiers for inverse/futures contracts by [@carlosmiei](https://github.com/carlosmiei) in [#27831](https://github.com/ccxt/ccxt/pull/27831)
* test: fix urlencodeBase64 by [@ttodua](https://github.com/ttodua) in [#27830](https://github.com/ccxt/ccxt/pull/27830)
* test: aggregate fix by [@ttodua](https://github.com/ttodua) in [#27829](https://github.com/ccxt/ccxt/pull/27829)
* feat(coinex): add futures/ cancel position tp/sl endpoints by [@carlosmiei](https://github.com/carlosmiei) in [#27833](https://github.com/ccxt/ccxt/pull/27833)
* refactor(python): remove unused pluck by [@ttodua](https://github.com/ttodua) in [#27797](https://github.com/ccxt/ccxt/pull/27797)
* perf: python parse\_date (90%) by [@ttodua](https://github.com/ttodua) in [#27812](https://github.com/ccxt/ccxt/pull/27812)
* test: add indexBy tests by [@ttodua](https://github.com/ttodua) in [#27791](https://github.com/ccxt/ccxt/pull/27791)
* perf: python capitalize (30%) by [@ttodua](https://github.com/ttodua) in [#27780](https://github.com/ccxt/ccxt/pull/27780)
* perf: python milliseconds & microseconds (10%) by [@ttodua](https://github.com/ttodua) in [#27809](https://github.com/ccxt/ccxt/pull/27809)
* perf: python urlencodeBase64 (50%) by [@ttodua](https://github.com/ttodua) in [#27818](https://github.com/ccxt/ccxt/pull/27818)
## New Contributors [#new-contributors-26]
* [@bryanstevensacosta](https://github.com/bryanstevensacosta) made their first contribution in [#27576](https://github.com/ccxt/ccxt/pull/27576)
* [@colin-nl](https://github.com/colin-nl) made their first contribution in [#27821](https://github.com/ccxt/ccxt/pull/27821)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.35...v4.5.36](https://github.com/ccxt/ccxt/compare/go/v4.5.35...v4.5.36)
[Changes][v4.5.36]
# [v4.5.35](https://github.com/ccxt/ccxt/releases/tag/v4.5.35) - 2026-01-29 [#v4535---2026-01-29]
## What's Changed [#whats-changed-43]
* fix(go): response headers in base by [@ttodua](https://github.com/ttodua) in [#27719](https://github.com/ccxt/ccxt/pull/27719)
* feat(bybit): fetchMarginMode added by [@yzh-pelle](https://github.com/yzh-pelle) in [#27721](https://github.com/ccxt/ccxt/pull/27721)
* fix(bybit): fetchMarginMode - symbol added to the response by [@yzh-pelle](https://github.com/yzh-pelle) in [#27722](https://github.com/ccxt/ccxt/pull/27722)
* feat(okx): update ws to use instidcode by [@pcriadoperez](https://github.com/pcriadoperez) in [#27729](https://github.com/ccxt/ccxt/pull/27729)
* perf(base): safeBool, safeList, safeDict optimization (\~70% reduction) by [@ttodua](https://github.com/ttodua) in [#27375](https://github.com/ccxt/ccxt/pull/27375)
* build(deps-dev): bump lodash from 4.17.21 to 4.17.23 by [@dependabot](https://github.com/dependabot)\[bot] in [#27728](https://github.com/ccxt/ccxt/pull/27728)
* fix(go): getArrayLength and isArray by [@carlosmiei](https://github.com/carlosmiei) in [#27734](https://github.com/ccxt/ccxt/pull/27734)
* feat: add fetchFundingHistory for BingX by [@slavivanov](https://github.com/slavivanov) in [#27735](https://github.com/ccxt/ccxt/pull/27735)
* fix(go): mathPow by [@carlosmiei](https://github.com/carlosmiei) in [#27739](https://github.com/ccxt/ccxt/pull/27739)
* fix(binance): default type inside fetchPositionsWs by [@carlosmiei](https://github.com/carlosmiei) in [#27748](https://github.com/ccxt/ccxt/pull/27748)
* fix(krakenfutures): orderIds encoding in python by [@carlosmiei](https://github.com/carlosmiei) in [#27751](https://github.com/ccxt/ccxt/pull/27751)
* fix(xt): baseVolume and quoteVolume in ticker by [@carlosmiei](https://github.com/carlosmiei) in [#27753](https://github.com/ccxt/ccxt/pull/27753)
* chore(skips): bigone, bitrue retrigger tests ^ by [@ttodua](https://github.com/ttodua) in [#27754](https://github.com/ccxt/ccxt/pull/27754)
* fix(htx): use .vn hostname instead by [@carlosmiei](https://github.com/carlosmiei) in [#27762](https://github.com/ccxt/ccxt/pull/27762)
* chore(cryptomus): skip & trigger spread tests on build ^ by [@ttodua](https://github.com/ttodua) in [#27757](https://github.com/ccxt/ccxt/pull/27757)
* test(deepExtend): base tests by [@ttodua](https://github.com/ttodua) in [#27750](https://github.com/ccxt/ccxt/pull/27750)
* fix(lbank): ws sorted trades ^ by [@ttodua](https://github.com/ttodua) in [#27755](https://github.com/ccxt/ccxt/pull/27755)
* bybit error mapping by [@ndubel](https://github.com/ndubel) in [#27765](https://github.com/ccxt/ccxt/pull/27765)
* kucoin error mapping by [@ndubel](https://github.com/ndubel) in [#27768](https://github.com/ccxt/ccxt/pull/27768)
* fix(bitget): ticker percentage bug by [@ttodua](https://github.com/ttodua) in [#27764](https://github.com/ccxt/ccxt/pull/27764)
* test(currency): allow numeric id too by [@ttodua](https://github.com/ttodua) in [#27769](https://github.com/ccxt/ccxt/pull/27769)
* fix(toobit): ws listen key by [@ttodua](https://github.com/ttodua) in [#27771](https://github.com/ccxt/ccxt/pull/27771)
* fix(go): add FeatureValue method by [@ttodua](https://github.com/ttodua) in [#27775](https://github.com/ccxt/ccxt/pull/27775)
* chore(dydx): retest & skip spread by [@ttodua](https://github.com/ttodua) in [#27770](https://github.com/ccxt/ccxt/pull/27770)
* chore(xt): skip qv/bv comparison by [@ttodua](https://github.com/ttodua) in [#27767](https://github.com/ccxt/ccxt/pull/27767)
* chore(test): watchOb spread by [@ttodua](https://github.com/ttodua) in [#27756](https://github.com/ccxt/ccxt/pull/27756)
* feat(hyperliquid): add allMids support to watchTickers by [@carlosmiei](https://github.com/carlosmiei) in [#27776](https://github.com/ccxt/ccxt/pull/27776)
* chore(deps): bump next from 15.4.10 to 16.1.5 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#27786](https://github.com/ccxt/ccxt/pull/27786)
* feat(krakenfutures): trigger orders inside fetchClosedOrders/fetchCanceled by [@carlosmiei](https://github.com/carlosmiei) in [#27784](https://github.com/ccxt/ccxt/pull/27784)
* feat(coinbase): withdraw, documentation link, network param description by [@Dan-krm](https://github.com/Dan-krm) in [#27788](https://github.com/ccxt/ccxt/pull/27788)
* fix(python): add NumType by [@carlosmiei](https://github.com/carlosmiei) in [#27785](https://github.com/ccxt/ccxt/pull/27785)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#27766](https://github.com/ccxt/ccxt/pull/27766)
* go: update ToFloat64 by [@sc0Vu](https://github.com/sc0Vu) in [#27789](https://github.com/ccxt/ccxt/pull/27789)
* fix(php): exception\_message by [@ttodua](https://github.com/ttodua) in [#27774](https://github.com/ccxt/ccxt/pull/27774)
* test: add capitalize base test by [@ttodua](https://github.com/ttodua) in [#27783](https://github.com/ccxt/ccxt/pull/27783)
* fix(bybit): use dynamic funding interval for fetchFundingRateHistory by [@danyalzaki000](https://github.com/danyalzaki000) in [#27749](https://github.com/ccxt/ccxt/pull/27749)
* perf(python): deep\_extend by [@ttodua](https://github.com/ttodua) in [#27736](https://github.com/ccxt/ccxt/pull/27736)
## New Contributors [#new-contributors-27]
* [@danyalzaki000](https://github.com/danyalzaki000) made their first contribution in [#27749](https://github.com/ccxt/ccxt/pull/27749)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.34...v4.5.35](https://github.com/ccxt/ccxt/compare/go/v4.5.34...v4.5.35)
[Changes][v4.5.35]
# [v4.5.34](https://github.com/ccxt/ccxt/releases/tag/v4.5.34) - 2026-01-20 [#v4534---2026-01-20]
## What's Changed [#whats-changed-44]
* fix(bitget): UTA fixes by [@luca-nardelli](https://github.com/luca-nardelli) in [#27651](https://github.com/ccxt/ccxt/pull/27651)
* chore(backpack): skip test ^ by [@ttodua](https://github.com/ttodua) in [#27677](https://github.com/ccxt/ccxt/pull/27677)
* test(foxbit): ohlcv tests ^ by [@ttodua](https://github.com/ttodua) in [#27678](https://github.com/ccxt/ccxt/pull/27678)
* chore(paradex): skip broken ^ by [@ttodua](https://github.com/ttodua) in [#27679](https://github.com/ccxt/ccxt/pull/27679)
* feat(alp): migrate btc-alpha to alp.com by [@ttodua](https://github.com/ttodua) in [#27571](https://github.com/ccxt/ccxt/pull/27571)
* chore(backpack): tests & skip3 ^ by [@ttodua](https://github.com/ttodua) in [#27683](https://github.com/ccxt/ccxt/pull/27683)
* fix(apex): watchOHLCV by [@ttodua](https://github.com/ttodua) in [#27685](https://github.com/ccxt/ccxt/pull/27685)
* chore(apex): missing multi has by [@ttodua](https://github.com/ttodua) in [#27686](https://github.com/ccxt/ccxt/pull/27686)
* feat(binance): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27690](https://github.com/ccxt/ccxt/pull/27690)
* feat(bybit): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27691](https://github.com/ccxt/ccxt/pull/27691)
* feat(bingx): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27692](https://github.com/ccxt/ccxt/pull/27692)
* feat(htx): add v5 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#27616](https://github.com/ccxt/ccxt/pull/27616)
* fix(whitebit): updated parseTransactions tag(memo) mapping by [@Galllarate](https://github.com/Galllarate) in [#27684](https://github.com/ccxt/ccxt/pull/27684)
* test(arkham): select more active symbol to avoid timeouts by [@ttodua](https://github.com/ttodua) in [#27687](https://github.com/ccxt/ccxt/pull/27687)
* fix(coinbase): protect fetchTickerV3/fetchAccountsV3 against empty list by [@carlosmiei](https://github.com/carlosmiei) in [#27695](https://github.com/ccxt/ccxt/pull/27695)
* fix(aster): nonce generation for Aster API by [@slavivanov](https://github.com/slavivanov) in [#27682](https://github.com/ccxt/ccxt/pull/27682)
* fix(hyperliquid): read filled amount correctly by [@carlosmiei](https://github.com/carlosmiei) in [#27698](https://github.com/ccxt/ccxt/pull/27698)
* feat(aster): private WS methods implementation by [@yzh-pelle](https://github.com/yzh-pelle) in [#27689](https://github.com/ccxt/ccxt/pull/27689)
* feat(gate): add otc apis by [@sc0Vu](https://github.com/sc0Vu) in [#27702](https://github.com/ccxt/ccxt/pull/27702)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.13 to 1.16.8 in /go/tests/profile by [@dependabot](https://github.com/dependabot)\[bot] in [#27665](https://github.com/ccxt/ccxt/pull/27665)
* chore: add builderCodes table by [@carlosmiei](https://github.com/carlosmiei) in [#27704](https://github.com/ccxt/ccxt/pull/27704)
* fix(bybit): rm marginMode inference from position by [@carlosmiei](https://github.com/carlosmiei) in [#27708](https://github.com/ccxt/ccxt/pull/27708)
* fix!(bitfinex): currency id (instead of 'f' + id) by [@ttodua](https://github.com/ttodua) in [#27696](https://github.com/ccxt/ccxt/pull/27696)
* feat(cryptocom): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27713](https://github.com/ccxt/ccxt/pull/27713)
* feat(bybit): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27711](https://github.com/ccxt/ccxt/pull/27711)
* fix(bybit): load missing options (DOGE/XRP/MNT) by [@carlosmiei](https://github.com/carlosmiei) in [#27710](https://github.com/ccxt/ccxt/pull/27710)
* fix(okx): watchOrders in c# by [@carlosmiei](https://github.com/carlosmiei) in [#27714](https://github.com/ccxt/ccxt/pull/27714)
* feat(bybit): fix fetchPosition inverse notional value by [@Dan-krm](https://github.com/Dan-krm) in [#27715](https://github.com/ccxt/ccxt/pull/27715)
* fix(okx): fetchPosition, isolated inverse initialMargin value by [@Dan-krm](https://github.com/Dan-krm) in [#27716](https://github.com/ccxt/ccxt/pull/27716)
* docs: replace margin & ledger structure link by [@sc0Vu](https://github.com/sc0Vu) in [#27712](https://github.com/ccxt/ccxt/pull/27712)
* fix(go): update setMarketsFromExchange example by [@carlosmiei](https://github.com/carlosmiei) in [#27717](https://github.com/ccxt/ccxt/pull/27717)
* fix(go): remove NaN from types and use (\*float64)(nil) instead by [@carlosmiei](https://github.com/carlosmiei) in [#27718](https://github.com/ccxt/ccxt/pull/27718)
## New Contributors [#new-contributors-28]
* [@slavivanov](https://github.com/slavivanov) made their first contribution in [#27682](https://github.com/ccxt/ccxt/pull/27682)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.33...v4.5.34](https://github.com/ccxt/ccxt/compare/v4.5.33...v4.5.34)
[Changes][v4.5.34]
# [v4.5.33](https://github.com/ccxt/ccxt/releases/tag/v4.5.33) - 2026-01-14 [#v4533---2026-01-14]
## What's Changed [#whats-changed-45]
* fix(aster): dex flag by [@carlosmiei](https://github.com/carlosmiei) in [#27647](https://github.com/ccxt/ccxt/pull/27647)
* fix(flag): missing flag by [@carlosmiei](https://github.com/carlosmiei) in [#27648](https://github.com/ccxt/ccxt/pull/27648)
* fix(go): Fix tags of ccxt.pro for golang - merge PRO into base module (single module) by [@pcriadoperez](https://github.com/pcriadoperez) in [#27646](https://github.com/ccxt/ccxt/pull/27646)
* fix(backpack): ws trades sort by [@ttodua](https://github.com/ttodua) in [#27636](https://github.com/ccxt/ccxt/pull/27636)
* feat(paradex): add watchOrders by [@carlosmiei](https://github.com/carlosmiei) in [#27650](https://github.com/ccxt/ccxt/pull/27650)
* refactor(static-updater): move to ts by [@ttodua](https://github.com/ttodua) in [#27649](https://github.com/ccxt/ccxt/pull/27649)
* fix(htx): use .vn hostname to fix ssl issue by [@carlosmiei](https://github.com/carlosmiei) in [#27652](https://github.com/ccxt/ccxt/pull/27652)
* fix(bitget): fix unwatchOrderBook by [@pcriadoperez](https://github.com/pcriadoperez) in [#27655](https://github.com/ccxt/ccxt/pull/27655)
* fix(okx): fix unwatchTrades, fix [#27645](https://github.com/ccxt/ccxt/issues/27645) by [@pcriadoperez](https://github.com/pcriadoperez) in [#27654](https://github.com/ccxt/ccxt/pull/27654)
* feat(go): add Close() to interface by [@carlosmiei](https://github.com/carlosmiei) in [#27659](https://github.com/ccxt/ccxt/pull/27659)
* fix(whitebit): fix withdraw response handling by [@Galllarate](https://github.com/Galllarate) in [#27657](https://github.com/ccxt/ccxt/pull/27657)
* fix(whitebit): fix fetchWithdrawals response by patching uniqueId to id by [@Galllarate](https://github.com/Galllarate) in [#27658](https://github.com/ccxt/ccxt/pull/27658)
* fix(krakenfutures): ohlcv limit and add fetchOrders/fetchOrder by [@carlosmiei](https://github.com/carlosmiei) in [#27662](https://github.com/ccxt/ccxt/pull/27662)
* fix(bybit): parsePosition `side` for hedged mode fixed by [@yzh-pelle](https://github.com/yzh-pelle) in [#27664](https://github.com/ccxt/ccxt/pull/27664)
* feat(binance): add apis by [@mshavliuk](https://github.com/mshavliuk) in [#27669](https://github.com/ccxt/ccxt/pull/27669)
* build(deps): bump github.com/ethereum/go-ethereum from 1.16.5 to 1.16.8 in /go/v4 by [@dependabot](https://github.com/dependabot)\[bot] in [#27668](https://github.com/ccxt/ccxt/pull/27668)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.13 to 1.16.8 in /go/tests/types by [@dependabot](https://github.com/dependabot)\[bot] in [#27667](https://github.com/ccxt/ccxt/pull/27667)
* build(deps): bump github.com/ethereum/go-ethereum from 1.16.5 to 1.16.8 in /go/cli by [@dependabot](https://github.com/dependabot)\[bot] in [#27666](https://github.com/ccxt/ccxt/pull/27666)
* fix(aster): watchOrderBook crash by [@carlosmiei](https://github.com/carlosmiei) in [#27672](https://github.com/ccxt/ccxt/pull/27672)
* fix(gate): non ascii symbols by [@carlosmiei](https://github.com/carlosmiei) in [#27673](https://github.com/ccxt/ccxt/pull/27673)
* fix(bitget): editOrder check if amount is defined by [@carlosmiei](https://github.com/carlosmiei) in [#27674](https://github.com/ccxt/ccxt/pull/27674)
* chore: include dydx\_v4\_client folder by [@carlosmiei](https://github.com/carlosmiei) in [#27675](https://github.com/ccxt/ccxt/pull/27675)
## New Contributors [#new-contributors-29]
* [@Galllarate](https://github.com/Galllarate) made their first contribution in [#27657](https://github.com/ccxt/ccxt/pull/27657)
* [@mshavliuk](https://github.com/mshavliuk) made their first contribution in [#27669](https://github.com/ccxt/ccxt/pull/27669)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.32...v4.5.33](https://github.com/ccxt/ccxt/compare/v4.5.32...v4.5.33)
[Changes][v4.5.33]
# [v4.5.32](https://github.com/ccxt/ccxt/releases/tag/v4.5.32) - 2026-01-08 [#v4532---2026-01-08]
## What's Changed [#whats-changed-46]
* feat(eth-keys): getEthWalletAddressFromPrivateKey by [@ttodua](https://github.com/ttodua) in [#27624](https://github.com/ccxt/ccxt/pull/27624)
* fix(cryptomus): fetchCurrencies false by [@ttodua](https://github.com/ttodua) in [#27634](https://github.com/ccxt/ccxt/pull/27634)
* fix(bigone): ticker values by [@ttodua](https://github.com/ttodua) in [#27633](https://github.com/ccxt/ccxt/pull/27633)
* chore(dydx): skip bidask compare by [@ttodua](https://github.com/ttodua) in [#27637](https://github.com/ccxt/ccxt/pull/27637)
* chore: try to cache go modules by [@carlosmiei](https://github.com/carlosmiei) in [#27638](https://github.com/ccxt/ccxt/pull/27638)
* chore(backpack): skip1 by [@ttodua](https://github.com/ttodua) in [#27631](https://github.com/ccxt/ccxt/pull/27631)
* feat(binance): add eapiPrivateGetComission by [@carlosmiei](https://github.com/carlosmiei) in [#27641](https://github.com/ccxt/ccxt/pull/27641)
* feat(bingx): fetchMarketLeverageTiers added by [@yzh-pelle](https://github.com/yzh-pelle) in [#27640](https://github.com/ccxt/ccxt/pull/27640)
* fix(okx): omit sz when closeFraction is provided by [@carlosmiei](https://github.com/carlosmiei) in [#27643](https://github.com/ccxt/ccxt/pull/27643)
* feat(aster): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#26579](https://github.com/ccxt/ccxt/pull/26579)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.31...v4.5.32](https://github.com/ccxt/ccxt/compare/v4.5.31...v4.5.32)
[Changes][v4.5.32]
# [v4.5.31](https://github.com/ccxt/ccxt/releases/tag/v4.5.31) - 2026-01-06 [#v4531---2026-01-06]
## What's Changed [#whats-changed-47]
* fix(dydx): correct import by [@sc0Vu](https://github.com/sc0Vu) in [#27602](https://github.com/ccxt/ccxt/pull/27602)
* fix(bybit, apex, hyperliquid, p2b): handlePong set timestamp fix [#27450](https://github.com/ccxt/ccxt/issues/27450) by [@pcriadoperez](https://github.com/pcriadoperez) in [#27604](https://github.com/ccxt/ccxt/pull/27604)
* feat(exceptionMessage): py,php,js,cs,go by [@ttodua](https://github.com/ttodua) in [#27584](https://github.com/ccxt/ccxt/pull/27584)
* fix(gate): handle microsecond ts in order by [@carlosmiei](https://github.com/carlosmiei) in [#27613](https://github.com/ccxt/ccxt/pull/27613)
* chore: remove oceanex exchange by [@carlosmiei](https://github.com/carlosmiei) in [#27614](https://github.com/ccxt/ccxt/pull/27614)
* feat(base): loadMarketsAndSignIn by [@ttodua](https://github.com/ttodua) in [#27622](https://github.com/ccxt/ccxt/pull/27622)
* fix(Exchange): add base fetchCanceledOrders by [@carlosmiei](https://github.com/carlosmiei) in [#27623](https://github.com/ccxt/ccxt/pull/27623)
* fix(hyperliquid): spot currency mapping by [@mingjie-li](https://github.com/mingjie-li) in [#27628](https://github.com/ccxt/ccxt/pull/27628)
* Kucoin add route by [@Nirator78](https://github.com/Nirator78) in [#27626](https://github.com/ccxt/ccxt/pull/27626)
* fix(Exchange): handle binary msgs in browser and load protobufjs by [@carlosmiei](https://github.com/carlosmiei) in [#27629](https://github.com/ccxt/ccxt/pull/27629)
* feat(kucoin): transfer() updated for new universal endpoint by [@yzh-pelle](https://github.com/yzh-pelle) in [#27591](https://github.com/ccxt/ccxt/pull/27591)
## New Contributors [#new-contributors-30]
* [@mingjie-li](https://github.com/mingjie-li) made their first contribution in [#27628](https://github.com/ccxt/ccxt/pull/27628)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.30...v4.5.31](https://github.com/ccxt/ccxt/compare/go/v4.5.30...v4.5.31)
[Changes][v4.5.31]
# [v4.5.30](https://github.com/ccxt/ccxt/releases/tag/v4.5.30) - 2025-12-29 [#v4530---2025-12-29]
## What's Changed [#whats-changed-48]
* test(ticker): don't test inactive ticker by [@ttodua](https://github.com/ttodua) in [#27568](https://github.com/ccxt/ccxt/pull/27568)
* chore(bitget): incative curr pcnt by [@ttodua](https://github.com/ttodua) in [#27569](https://github.com/ccxt/ccxt/pull/27569)
* chore(exmo): test skip2 by [@ttodua](https://github.com/ttodua) in [#27574](https://github.com/ccxt/ccxt/pull/27574)
* feat(coinbase): Add fetchDepositAddresses method by [@DevPatel-11](https://github.com/DevPatel-11) in [#27572](https://github.com/ccxt/ccxt/pull/27572)
* fix(toobit): withdraw clientorderid by [@ttodua](https://github.com/ttodua) in [#27577](https://github.com/ccxt/ccxt/pull/27577)
* fix: 27566 load KeyError 'fetchPositionsSnapshot' by [@pcriadoperez](https://github.com/pcriadoperez) in [#27580](https://github.com/ccxt/ccxt/pull/27580)
* fix(dydx): markets & tests by [@ttodua](https://github.com/ttodua) in [#27573](https://github.com/ccxt/ccxt/pull/27573)
* chore(cryptomus): skip by [@ttodua](https://github.com/ttodua) in [#27585](https://github.com/ccxt/ccxt/pull/27585)
* test(bullish): add proxies by [@ttodua](https://github.com/ttodua) in [#27582](https://github.com/ccxt/ccxt/pull/27582)
* bybit errors mapping by [@ndubel](https://github.com/ndubel) in [#27587](https://github.com/ccxt/ccxt/pull/27587)
* gate errors mapping by [@ndubel](https://github.com/ndubel) in [#27586](https://github.com/ccxt/ccxt/pull/27586)
* feat(kucoin): add fetchTransfers method by [@DevPatel-11](https://github.com/DevPatel-11) in [#27588](https://github.com/ccxt/ccxt/pull/27588)
* fix(hyperliquid): hip3 markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#27592](https://github.com/ccxt/ccxt/pull/27592)
* fix(bingx): `"status": "6"` should be mapped to `"ok"` by [@igor-ramazanov](https://github.com/igor-ramazanov) in [#27594](https://github.com/ccxt/ccxt/pull/27594)
* bydfi exchange integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#27554](https://github.com/ccxt/ccxt/pull/27554)
* fix(hyperliquid.go): setLeverage msg encoding by [@carlosmiei](https://github.com/carlosmiei) in [#27598](https://github.com/ccxt/ccxt/pull/27598)
* fix(dydx): include wordlist in package by [@carlosmiei](https://github.com/carlosmiei) in [#27599](https://github.com/ccxt/ccxt/pull/27599)
## New Contributors [#new-contributors-31]
* [@DevPatel-11](https://github.com/DevPatel-11) made their first contribution in [#27572](https://github.com/ccxt/ccxt/pull/27572)
* [@igor-ramazanov](https://github.com/igor-ramazanov) made their first contribution in [#27594](https://github.com/ccxt/ccxt/pull/27594)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.29...v4.5.30](https://github.com/ccxt/ccxt/compare/go/v4.5.29...v4.5.30)
[Changes][v4.5.30]
# [v4.5.29](https://github.com/ccxt/ccxt/releases/tag/v4.5.29) - 2025-12-22 [#v4529---2025-12-22]
## What's Changed [#whats-changed-49]
* fix(exchange-markets): closing tag by [@carlosmiei](https://github.com/carlosmiei) in [#27517](https://github.com/ccxt/ccxt/pull/27517)
* chore(transpiler): base transpiling \* by [@ttodua](https://github.com/ttodua) in [#27529](https://github.com/ccxt/ccxt/pull/27529)
* chore(transpiler): base transpiling by [@ttodua](https://github.com/ttodua) in [#27533](https://github.com/ccxt/ccxt/pull/27533)
* refactor(woofipro): hasStopLoss & hasTakeProfit by [@ttodua](https://github.com/ttodua) in [#27526](https://github.com/ccxt/ccxt/pull/27526)
* refactor(toobit): hasStopLoss & hasTakeProfit by [@ttodua](https://github.com/ttodua) in [#27524](https://github.com/ccxt/ccxt/pull/27524)
* refactor(woo): hasStopLoss & hasTakeProfit by [@ttodua](https://github.com/ttodua) in [#27525](https://github.com/ccxt/ccxt/pull/27525)
* refactor(phemex): hasStopLoss & hasTakeProfit by [@ttodua](https://github.com/ttodua) in [#27523](https://github.com/ccxt/ccxt/pull/27523)
* refactor(okx): hasStopLoss & hasTakeProfit by [@ttodua](https://github.com/ttodua) in [#27522](https://github.com/ccxt/ccxt/pull/27522)
* refactor(modetrade): hasStopLoss & hasTakeProfit by [@ttodua](https://github.com/ttodua) in [#27521](https://github.com/ccxt/ccxt/pull/27521)
* refactor(kucoinfutures): hasStopLoss & hasTakeProfit by [@ttodua](https://github.com/ttodua) in [#27520](https://github.com/ccxt/ccxt/pull/27520)
* zaif.has contract methods by [@samgermain](https://github.com/samgermain) in [#27535](https://github.com/ccxt/ccxt/pull/27535)
* docs(ccxt): replace ccxt docs link by [@sc0Vu](https://github.com/sc0Vu) in [#27537](https://github.com/ccxt/ccxt/pull/27537)
* docs(woofipro): update [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#27536](https://github.com/ccxt/ccxt/pull/27536)
* fix: encoding hex binary instead of string by [@sc0Vu](https://github.com/sc0Vu) in [#27531](https://github.com/ccxt/ccxt/pull/27531)
* refactor(hyperliquid): hasStopLoss & hasTakeProfit by [@ttodua](https://github.com/ttodua) in [#27518](https://github.com/ccxt/ccxt/pull/27518)
* zebpay.has margin methods by [@samgermain](https://github.com/samgermain) in [#27538](https://github.com/ccxt/ccxt/pull/27538)
* docs(onetrading): update [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#27541](https://github.com/ccxt/ccxt/pull/27541)
* docs(paymium): update [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#27539](https://github.com/ccxt/ccxt/pull/27539)
* docs(paradex): update [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#27540](https://github.com/ccxt/ccxt/pull/27540)
* feat(bitmart): update with unWatch methods by [@yzh-pelle](https://github.com/yzh-pelle) in [#27534](https://github.com/ccxt/ccxt/pull/27534)
* feature(Exchange): rolling window rate limiter by [@caoilainnl](https://github.com/caoilainnl) in [#25423](https://github.com/ccxt/ccxt/pull/25423)
* Throttler divide by 0 fix by [@caoilainnl](https://github.com/caoilainnl) in [#27547](https://github.com/ccxt/ccxt/pull/27547)
* bitbank rate limit values by [@caoilainnl](https://github.com/caoilainnl) in [#27546](https://github.com/ccxt/ccxt/pull/27546)
* btcalpha rate limits by [@caoilainnl](https://github.com/caoilainnl) in [#27548](https://github.com/ccxt/ccxt/pull/27548)
* bitmart#unWatchOrderBookForSymbols docstring, correct exchange name by [@caoilainnl](https://github.com/caoilainnl) in [#27545](https://github.com/ccxt/ccxt/pull/27545)
* wavesexchange rate limits by [@caoilainnl](https://github.com/caoilainnl) in [#27549](https://github.com/ccxt/ccxt/pull/27549)
* xt.has option methods by [@samgermain](https://github.com/samgermain) in [#27550](https://github.com/ccxt/ccxt/pull/27550)
* woofipro.has margin and option methods by [@samgermain](https://github.com/samgermain) in [#27551](https://github.com/ccxt/ccxt/pull/27551)
* fix(gate): use base cleanCache and avoid crash by [@carlosmiei](https://github.com/carlosmiei) in [#27562](https://github.com/ccxt/ccxt/pull/27562)
* feat(hyperliquid): private unWatch methods by [@yzh-pelle](https://github.com/yzh-pelle) in [#27559](https://github.com/ccxt/ccxt/pull/27559)
* fix(throttlerPerformance.go): use dynamically created exchange by [@carlosmiei](https://github.com/carlosmiei) in [#27564](https://github.com/ccxt/ccxt/pull/27564)
* feat(hyperliquid): add createSubAccount by [@carlosmiei](https://github.com/carlosmiei) in [#27558](https://github.com/ccxt/ccxt/pull/27558)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.28...v4.5.29](https://github.com/ccxt/ccxt/compare/v4.5.28...v4.5.29)
[Changes][v4.5.29]
# [v4.5.28](https://github.com/ccxt/ccxt/releases/tag/v4.5.28) - 2025-12-15 [#v4528---2025-12-15]
## What's Changed [#whats-changed-50]
* build(deps): bump next from 15.4.9 to 15.4.10 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#27501](https://github.com/ccxt/ccxt/pull/27501)
* fix(bybit): don't omit 'tpslMode' from params by [@carlosmiei](https://github.com/carlosmiei) in [#27505](https://github.com/ccxt/ccxt/pull/27505)
* feat(binance): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27511](https://github.com/ccxt/ccxt/pull/27511)
* refactor(coincatch): hasTakeProfit/hasStopLoss by [@ttodua](https://github.com/ttodua) in [#27509](https://github.com/ccxt/ccxt/pull/27509)
* refactor(bingx): hasstoploss/hastakeprofit by [@ttodua](https://github.com/ttodua) in [#27506](https://github.com/ccxt/ccxt/pull/27506)
* refactor(blofin): hasStopLoss/hasTakeProfit by [@ttodua](https://github.com/ttodua) in [#27508](https://github.com/ccxt/ccxt/pull/27508)
* refactor(bitget): hasStopLoss/hasTakeProfit by [@ttodua](https://github.com/ttodua) in [#27507](https://github.com/ccxt/ccxt/pull/27507)
* feat(coinex): editOrders method added by [@yzh-pelle](https://github.com/yzh-pelle) in [#27483](https://github.com/ccxt/ccxt/pull/27483)
* fix(bitmex): support FFSCSX markets by [@carlosmiei](https://github.com/carlosmiei) in [#27515](https://github.com/ccxt/ccxt/pull/27515)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.27...v4.5.28](https://github.com/ccxt/ccxt/compare/go/v4.5.27...v4.5.28)
[Changes][v4.5.28]
# [v4.5.27](https://github.com/ccxt/ccxt/releases/tag/v4.5.27) - 2025-12-12 [#v4527---2025-12-12]
## What's Changed [#whats-changed-51]
* feat(coinmate): add fetchTime by [@sc0Vu](https://github.com/sc0Vu) in [#27470](https://github.com/ccxt/ccxt/pull/27470)
* feat(cryptocom): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27477](https://github.com/ccxt/ccxt/pull/27477)
* binance error mapping by [@ndubel](https://github.com/ndubel) in [#27473](https://github.com/ccxt/ccxt/pull/27473)
* bitget error mapping by [@ndubel](https://github.com/ndubel) in [#27472](https://github.com/ccxt/ccxt/pull/27472)
* feat(coinex): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27469](https://github.com/ccxt/ccxt/pull/27469)
* feat(coinsph): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27471](https://github.com/ccxt/ccxt/pull/27471)
* feat(whitebit): add default nonceWindow parameter for authenticated calls by [@carlosmiei](https://github.com/carlosmiei) in [#27478](https://github.com/ccxt/ccxt/pull/27478)
* feat(gate): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27479](https://github.com/ccxt/ccxt/pull/27479)
* feat(whitebit): change default rate limiter setting value by [@vladyslavbilotserkovskyi-whitebit](https://github.com/vladyslavbilotserkovskyi-whitebit) in [#27480](https://github.com/ccxt/ccxt/pull/27480)
* fix(binance): unify order type by [@carlosmiei](https://github.com/carlosmiei) in [#27481](https://github.com/ccxt/ccxt/pull/27481)
* fix(coincatch): infer market type inside fetchTickers by [@carlosmiei](https://github.com/carlosmiei) in [#27487](https://github.com/ccxt/ccxt/pull/27487)
* fix(hyperliquid): avoid error when loading hip3 dexes by [@carlosmiei](https://github.com/carlosmiei) in [#27488](https://github.com/ccxt/ccxt/pull/27488)
* fix(Exchange.py): remove check\_conflicting\_proxies camelCase by [@carlosmiei](https://github.com/carlosmiei) in [#27485](https://github.com/ccxt/ccxt/pull/27485)
* fix(binance):unify algo service order type by [@carlosmiei](https://github.com/carlosmiei) in [#27492](https://github.com/ccxt/ccxt/pull/27492)
* fix(example): import folder by [@carlosmiei](https://github.com/carlosmiei) in [#27493](https://github.com/ccxt/ccxt/pull/27493)
* build(deps): bump next from 15.4.8 to 15.4.9 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#27494](https://github.com/ccxt/ccxt/pull/27494)
* fix(exchange): replace safeNumber with safeFloat in parseBidAsk by [@sc0Vu](https://github.com/sc0Vu) in [#27403](https://github.com/ccxt/ccxt/pull/27403)
* fix(binance): parseOrderType type by [@carlosmiei](https://github.com/carlosmiei) in [#27496](https://github.com/ccxt/ccxt/pull/27496)
* fix(bybit): tp & sl orders by [@ttodua](https://github.com/ttodua) in [#27437](https://github.com/ccxt/ccxt/pull/27437)
* feat: add Zebpay Exchange by [@carlosmiei](https://github.com/carlosmiei) in [#26818](https://github.com/ccxt/ccxt/pull/26818)
* fix(zebpay): update url by [@carlosmiei](https://github.com/carlosmiei) in [#27497](https://github.com/ccxt/ccxt/pull/27497)
* fix(zebpay): headers by [@carlosmiei](https://github.com/carlosmiei) in [#27498](https://github.com/ccxt/ccxt/pull/27498)
* fix(zebpay): json sig encode by [@carlosmiei](https://github.com/carlosmiei) in [#27499](https://github.com/ccxt/ccxt/pull/27499)
## New Contributors [#new-contributors-32]
* [@vladyslavbilotserkovskyi-whitebit](https://github.com/vladyslavbilotserkovskyi-whitebit) made their first contribution in [#27480](https://github.com/ccxt/ccxt/pull/27480)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.26...v4.5.27](https://github.com/ccxt/ccxt/compare/go/v4.5.26...v4.5.27)
[Changes][v4.5.27]
# [v4.5.26](https://github.com/ccxt/ccxt/releases/tag/v4.5.26) - 2025-12-08 [#v4526---2025-12-08]
## What's Changed [#whats-changed-52]
* fix(bitmart): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#27464](https://github.com/ccxt/ccxt/pull/27464)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.25...v4.5.26](https://github.com/ccxt/ccxt/compare/v4.5.25...v4.5.26)
[Changes][v4.5.26]
# [v4.5.25](https://github.com/ccxt/ccxt/releases/tag/v4.5.25) - 2025-12-07 [#v4525---2025-12-07]
## What's Changed [#whats-changed-53]
* build(deps): bump next from 15.4.7 to 15.4.8 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#27446](https://github.com/ccxt/ccxt/pull/27446)
* feat(FAQ): amount precision error explanation by [@Dan-krm](https://github.com/Dan-krm) in [#27448](https://github.com/ccxt/ccxt/pull/27448)
* fix(mexc): c# restore decompress binary var by [@carlosmiei](https://github.com/carlosmiei) in [#27454](https://github.com/ccxt/ccxt/pull/27454)
* feat(mexc): fetchOHLCV since and until calculation updated by [@yzh-pelle](https://github.com/yzh-pelle) in [#27457](https://github.com/ccxt/ccxt/pull/27457)
* htx errors mapping by [@ndubel](https://github.com/ndubel) in [#27459](https://github.com/ccxt/ccxt/pull/27459)
* bitmart handleErrors fix by [@ndubel](https://github.com/ndubel) in [#27462](https://github.com/ccxt/ccxt/pull/27462)
* fix(hyperliquid): ucoin/usdc removal from markets and fetchPositions fix by [@carlosmiei](https://github.com/carlosmiei) in [#27458](https://github.com/ccxt/ccxt/pull/27458)
* fix(hyperliquid): automatic mapping by [@ttodua](https://github.com/ttodua) in [#27455](https://github.com/ccxt/ccxt/pull/27455)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.24...v4.5.25](https://github.com/ccxt/ccxt/compare/v4.5.24...v4.5.25)
[Changes][v4.5.25]
# [v4.5.24](https://github.com/ccxt/ccxt/releases/tag/v4.5.24) - 2025-12-03 [#v4524---2025-12-03]
## What's Changed [#whats-changed-54]
* feat(bybit): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27440](https://github.com/ccxt/ccxt/pull/27440)
* test(skip): some exchanges by [@ttodua](https://github.com/ttodua) in [#27439](https://github.com/ccxt/ccxt/pull/27439)
* fix(deepcoin): resize logo by [@carlosmiei](https://github.com/carlosmiei) in [#27442](https://github.com/ccxt/ccxt/pull/27442)
* refactor(binance): safePosition by [@ttodua](https://github.com/ttodua) in [#27427](https://github.com/ccxt/ccxt/pull/27427)
* refactor(ts): import type by [@ttodua](https://github.com/ttodua) in [#27255](https://github.com/ccxt/ccxt/pull/27255)
* perf(python): no extra checks by [@ttodua](https://github.com/ttodua) in [#27378](https://github.com/ccxt/ccxt/pull/27378)
* fix(hyperliquid): protect against non available hip3 markets by [@carlosmiei](https://github.com/carlosmiei) in [#27444](https://github.com/ccxt/ccxt/pull/27444)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.23...v4.5.24](https://github.com/ccxt/ccxt/compare/v4.5.23...v4.5.24)
[Changes][v4.5.24]
# [v4.5.23](https://github.com/ccxt/ccxt/releases/tag/v4.5.23) - 2025-12-02 [#v4523---2025-12-02]
## What's Changed [#whats-changed-55]
* feat(bingx): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27377](https://github.com/ccxt/ccxt/pull/27377)
* fix(exchange): error message for retring in python by [@sc0Vu](https://github.com/sc0Vu) in [#27380](https://github.com/ccxt/ccxt/pull/27380)
* feat(paradex): add fetchFundingRateHistory by [@carlosmiei](https://github.com/carlosmiei) in [#27384](https://github.com/ccxt/ccxt/pull/27384)
* feat(okx): add apis & update rate limit by [@sc0Vu](https://github.com/sc0Vu) in [#27370](https://github.com/ccxt/ccxt/pull/27370)
* build(deps): bump golang.org/x/crypto from 0.36.0 to 0.45.0 in /go/v4/pro by [@dependabot](https://github.com/dependabot)\[bot] in [#27359](https://github.com/ccxt/ccxt/pull/27359)
* Remove 'WIN' from commonCurrencies by [@Chord-Labs](https://github.com/Chord-Labs) in [#27382](https://github.com/ccxt/ccxt/pull/27382)
* remove ccxt prefix from tests.init by [@caoilainnl](https://github.com/caoilainnl) in [#27376](https://github.com/ccxt/ccxt/pull/27376)
* test(json): enable json tests by [@ttodua](https://github.com/ttodua) in [#27399](https://github.com/ccxt/ccxt/pull/27399)
* feat(kucoin): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27397](https://github.com/ccxt/ccxt/pull/27397)
* feat(mexc): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27396](https://github.com/ccxt/ccxt/pull/27396)
* feat(binance): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27395](https://github.com/ccxt/ccxt/pull/27395)
* fix(upbit): Ws resolve with symbol instead of marketId by [@ttodua](https://github.com/ttodua) in [#27390](https://github.com/ccxt/ccxt/pull/27390)
* fix(php): fix Array.isArray by [@ttodua](https://github.com/ttodua) in [#27388](https://github.com/ccxt/ccxt/pull/27388)
* Remove outdated installation details from Install.md by [@frosty00](https://github.com/frosty00) in [#27401](https://github.com/ccxt/ccxt/pull/27401)
* chore(package): incorrect REST transpile command by [@ttodua](https://github.com/ttodua) in [#27411](https://github.com/ccxt/ccxt/pull/27411)
* fix(hyperliquid): handle non usdc hip3 markets by [@carlosmiei](https://github.com/carlosmiei) in [#27408](https://github.com/ccxt/ccxt/pull/27408)
* feat(paradex): unified price type inside ohlcv by [@carlosmiei](https://github.com/carlosmiei) in [#27406](https://github.com/ccxt/ccxt/pull/27406)
* bitmart error mapping by [@ndubel](https://github.com/ndubel) in [#27416](https://github.com/ccxt/ccxt/pull/27416)
* gate error mapping by [@ndubel](https://github.com/ndubel) in [#27417](https://github.com/ccxt/ccxt/pull/27417)
* feat(binance): watchOrderBook add rpi by [@sc0Vu](https://github.com/sc0Vu) in [#27402](https://github.com/ccxt/ccxt/pull/27402)
* fix(bingx): parse transaction status 6=pending by [@carlosmiei](https://github.com/carlosmiei) in [#27419](https://github.com/ccxt/ccxt/pull/27419)
* fix(coinbase): watchOrders parseOrderStatus by [@carlosmiei](https://github.com/carlosmiei) in [#27420](https://github.com/ccxt/ccxt/pull/27420)
* test(base): turn into async by [@ttodua](https://github.com/ttodua) in [#27400](https://github.com/ccxt/ccxt/pull/27400)
* fix(binance): canceloOrderWs string id by [@carlosmiei](https://github.com/carlosmiei) in [#27424](https://github.com/ccxt/ccxt/pull/27424)
* feat(hyperliquid): add fetchTime and fetchStatus by [@carlosmiei](https://github.com/carlosmiei) in [#27425](https://github.com/ccxt/ccxt/pull/27425)
* refactor(binance): parsePosition into parseOptionPosition by [@ttodua](https://github.com/ttodua) in [#27426](https://github.com/ccxt/ccxt/pull/27426)
* fix(coinbase): watchOrders side unification by [@carlosmiei](https://github.com/carlosmiei) in [#27421](https://github.com/ccxt/ccxt/pull/27421)
* feat(binance): add linear swap conditional order support by [@Dan-krm](https://github.com/Dan-krm) in [#27331](https://github.com/ccxt/ccxt/pull/27331)
* htx error mapping by [@ndubel](https://github.com/ndubel) in [#27431](https://github.com/ccxt/ccxt/pull/27431)
* fix(hyperliquid): handleWsTickers market symbol error fixed by [@yzh-pelle](https://github.com/yzh-pelle) in [#27430](https://github.com/ccxt/ccxt/pull/27430)
* fix(htx): skip price on market fok orders by [@carlosmiei](https://github.com/carlosmiei) in [#27432](https://github.com/ccxt/ccxt/pull/27432)
* fix(base): marketOrNull signature by [@ttodua](https://github.com/ttodua) in [#27433](https://github.com/ccxt/ccxt/pull/27433)
* fix(transpiler): marketOrNull py by [@ttodua](https://github.com/ttodua) in [#27434](https://github.com/ccxt/ccxt/pull/27434)
* fix(binance): cancelOrderWs algoOrder by [@carlosmiei](https://github.com/carlosmiei) in [#27436](https://github.com/ccxt/ccxt/pull/27436)
* refactor(bybit): unify var names by [@ttodua](https://github.com/ttodua) in [#27429](https://github.com/ccxt/ccxt/pull/27429)
* Bullish exchange integration by [@AresArtemius](https://github.com/AresArtemius) in [#25884](https://github.com/ccxt/ccxt/pull/25884)
* perf(python): plain operators by [@ttodua](https://github.com/ttodua) in [#27372](https://github.com/ccxt/ccxt/pull/27372)
## New Contributors [#new-contributors-33]
* [@Chord-Labs](https://github.com/Chord-Labs) made their first contribution in [#27382](https://github.com/ccxt/ccxt/pull/27382)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.22...v4.5.23](https://github.com/ccxt/ccxt/compare/go/v4.5.22...v4.5.23)
[Changes][v4.5.23]
# [v4.5.22](https://github.com/ccxt/ccxt/releases/tag/v4.5.22) - 2025-11-25 [#v4522---2025-11-25]
## What's Changed [#whats-changed-56]
* update: Upbit Docs Link for all methods by [@LambdaBen](https://github.com/LambdaBen) in [#27364](https://github.com/ccxt/ccxt/pull/27364)
* feat(FAQ): How do trailing orders work? by [@Dan-krm](https://github.com/Dan-krm) in [#27367](https://github.com/ccxt/ccxt/pull/27367)
* fix(deepcoin): funding rate endpoint are public by [@kilianjanssen](https://github.com/kilianjanssen) in [#27369](https://github.com/ccxt/ccxt/pull/27369)
* gate parseTrade fee currency fix by [@ndubel](https://github.com/ndubel) in [#27371](https://github.com/ccxt/ccxt/pull/27371)
* fix(xt): handleSubscriptionStatus updated [#27282](https://github.com/ccxt/ccxt/issues/27282) by [@rayBastard](https://github.com/rayBastard) in [#27362](https://github.com/ccxt/ccxt/pull/27362)
* update: Add TestOrder logic on Upbit by [@LambdaBen](https://github.com/LambdaBen) in [#27366](https://github.com/ccxt/ccxt/pull/27366)
* fix(python): lock\_id missing self by [@carlosmiei](https://github.com/carlosmiei) in [#27373](https://github.com/ccxt/ccxt/pull/27373)
* fix(bybit): fix default swap limit orderbook by [@carlosmiei](https://github.com/carlosmiei) in [#27374](https://github.com/ccxt/ccxt/pull/27374)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.21...v4.5.22](https://github.com/ccxt/ccxt/compare/v4.5.21...v4.5.22)
[Changes][v4.5.22]
# [v4.5.21](https://github.com/ccxt/ccxt/releases/tag/v4.5.21) - 2025-11-24 [#v4521---2025-11-24]
## What's Changed [#whats-changed-57]
* fix(upbit): multiple streams by [@ttodua](https://github.com/ttodua) in [#26954](https://github.com/ccxt/ccxt/pull/26954)
* bitflyer.has margin and option methods by [@samgermain](https://github.com/samgermain) in [#27339](https://github.com/ccxt/ccxt/pull/27339)
* fix(gate): lock request id to avoid data races by [@carlosmiei](https://github.com/carlosmiei) in [#27335](https://github.com/ccxt/ccxt/pull/27335)
* bitfinex.has option methods by [@samgermain](https://github.com/samgermain) in [#27327](https://github.com/ccxt/ccxt/pull/27327)
* build(deps): bump golang.org/x/crypto from 0.35.0 to 0.45.0 in /go/tests/types by [@dependabot](https://github.com/dependabot)\[bot] in [#27336](https://github.com/ccxt/ccxt/pull/27336)
* build(deps): bump golang.org/x/crypto from 0.35.0 to 0.45.0 in /go/tests/profile by [@dependabot](https://github.com/dependabot)\[bot] in [#27337](https://github.com/ccxt/ccxt/pull/27337)
* build(deps): bump golang.org/x/crypto from 0.36.0 to 0.45.0 in /go/v4 by [@dependabot](https://github.com/dependabot)\[bot] in [#27338](https://github.com/ccxt/ccxt/pull/27338)
* fix(exchange): fix loadorderbook in go by [@pcriadoperez](https://github.com/pcriadoperez) in [#27342](https://github.com/ccxt/ccxt/pull/27342)
* build(deps): bump golang.org/x/crypto from 0.36.0 to 0.45.0 in /go/cli by [@dependabot](https://github.com/dependabot)\[bot] in [#27343](https://github.com/ccxt/ccxt/pull/27343)
* fix(bybit): handle clientOrderId inside editOrder by [@carlosmiei](https://github.com/carlosmiei) in [#27345](https://github.com/ccxt/ccxt/pull/27345)
* feat(hyperliquid): index hip3 dex name from symbol by [@carlosmiei](https://github.com/carlosmiei) in [#27346](https://github.com/ccxt/ccxt/pull/27346)
* fix(paradex): set public key to hex string by [@sc0Vu](https://github.com/sc0Vu) in [#27347](https://github.com/ccxt/ccxt/pull/27347)
* fix(go): fix safeValueN for map strings and array cache by [@pcriadoperez](https://github.com/pcriadoperez) in [#27344](https://github.com/ccxt/ccxt/pull/27344)
* update: Upbit describe by [@LambdaBen](https://github.com/LambdaBen) in [#27356](https://github.com/ccxt/ccxt/pull/27356)
* ascendex.has fetchBorrowRates by [@samgermain](https://github.com/samgermain) in [#27348](https://github.com/ccxt/ccxt/pull/27348)
* feat(deribit): add fetchOpenInterest by [@Dan-krm](https://github.com/Dan-krm) in [#27341](https://github.com/ccxt/ccxt/pull/27341)
* feat(bingx): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27354](https://github.com/ccxt/ccxt/pull/27354)
* feat(bitget): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27355](https://github.com/ccxt/ccxt/pull/27355)
* perf(python): optimization of safe\_float, safe\_integer, safe\_string, safe\_value (50% - 70%) by [@ttodua](https://github.com/ttodua) in [#27334](https://github.com/ccxt/ccxt/pull/27334)
* fix(xt): ohlcv, trades, orderbook parameters in unWatch methods fix [#27282](https://github.com/ccxt/ccxt/issues/27282) by [@rayBastard](https://github.com/rayBastard) in [#27329](https://github.com/ccxt/ccxt/pull/27329)
* feat(binance): add symbolAdlRisk endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#27357](https://github.com/ccxt/ccxt/pull/27357)
* fix(hyperliquid): clientOrderId encoding in go by [@carlosmiei](https://github.com/carlosmiei) in [#27352](https://github.com/ccxt/ccxt/pull/27352)
* fix(paradex): stark\_sign by [@sc0Vu](https://github.com/sc0Vu) in [#27358](https://github.com/ccxt/ccxt/pull/27358)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.20...v4.5.21](https://github.com/ccxt/ccxt/compare/v4.5.20...v4.5.21)
[Changes][v4.5.21]
# [v4.5.20](https://github.com/ccxt/ccxt/releases/tag/v4.5.20) - 2025-11-18 [#v4520---2025-11-18]
## What's Changed [#whats-changed-58]
* fix(dydx): dex flag by [@carlosmiei](https://github.com/carlosmiei) in [#27309](https://github.com/ccxt/ccxt/pull/27309)
* chore: fix go module by [@carlosmiei](https://github.com/carlosmiei) in [#27312](https://github.com/ccxt/ccxt/pull/27312)
* build(deps-dev): bump js-yaml from 4.1.0 to 4.1.1 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#27306](https://github.com/ccxt/ccxt/pull/27306)
* feat(bybit): update borrowCrossMargin, repayCrossMargin by [@Dan-krm](https://github.com/Dan-krm) in [#27308](https://github.com/ccxt/ccxt/pull/27308)
* chore(cli): remove extra print by [@ttodua](https://github.com/ttodua) in [#27303](https://github.com/ccxt/ccxt/pull/27303)
* fix(ws/Client) onPingInterval log by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#27315](https://github.com/ccxt/ccxt/pull/27315)
* feat(binance): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27316](https://github.com/ccxt/ccxt/pull/27316)
* fix(mexc): fetchOpenOrders no symbol by [@carlosmiei](https://github.com/carlosmiei) in [#27317](https://github.com/ccxt/ccxt/pull/27317)
* build(deps-dev): bump js-yaml from 4.1.0 to 4.1.1 by [@dependabot](https://github.com/dependabot)\[bot] in [#27313](https://github.com/ccxt/ccxt/pull/27313)
* perf(base): safeMarket optimize by [@ttodua](https://github.com/ttodua) in [#27320](https://github.com/ccxt/ccxt/pull/27320)
* feat(hyperliquid): add hip-3 tokens by [@sc0Vu](https://github.com/sc0Vu) in [#27201](https://github.com/ccxt/ccxt/pull/27201)
* fix(python): key\_exists opt 2x by [@ttodua](https://github.com/ttodua) in [#27318](https://github.com/ccxt/ccxt/pull/27318)
* fix(gate): assume vip0 fees by [@carlosmiei](https://github.com/carlosmiei) in [#27325](https://github.com/ccxt/ccxt/pull/27325)
* fix(js): remove direct protobufjs import from dydx helper by [@carlosmiei](https://github.com/carlosmiei) in [#27324](https://github.com/ccxt/ccxt/pull/27324)
* fix(xt): watchTickers cast in c# by [@carlosmiei](https://github.com/carlosmiei) in [#27326](https://github.com/ccxt/ccxt/pull/27326)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.19...v4.5.20](https://github.com/ccxt/ccxt/compare/go/v4.5.19...v4.5.20)
[Changes][v4.5.20]
# [v4.5.19](https://github.com/ccxt/ccxt/releases/tag/v4.5.19) - 2025-11-14 [#v4519---2025-11-14]
## What's Changed [#whats-changed-59]
* fix(client.py): fixes race condition when sending a message over ws when connection has been closed by [@pcriadoperez](https://github.com/pcriadoperez) in [#27275](https://github.com/ccxt/ccxt/pull/27275)
* refactor(bitget): cancelAllOrders by [@ttodua](https://github.com/ttodua) in [#26980](https://github.com/ccxt/ccxt/pull/26980)
* feat(bitget): edit spot orders by [@carlosmiei](https://github.com/carlosmiei) in [#27277](https://github.com/ccxt/ccxt/pull/27277)
* fix(deribit): add limit to fetchClosedOrders by [@carlosmiei](https://github.com/carlosmiei) in [#27278](https://github.com/ccxt/ccxt/pull/27278)
* fix(toobit): logo by [@carlosmiei](https://github.com/carlosmiei) in [#27279](https://github.com/ccxt/ccxt/pull/27279)
* feat(kucoin): add public uta support by [@Dan-krm](https://github.com/Dan-krm) in [#27205](https://github.com/ccxt/ccxt/pull/27205)
* fix(javascript): intellisense for common js by [@pcriadoperez](https://github.com/pcriadoperez) in [#27287](https://github.com/ccxt/ccxt/pull/27287)
* fix(go) Greeks struct and NewGreeks by [@Fiboniak](https://github.com/Fiboniak) in [#27283](https://github.com/ccxt/ccxt/pull/27283)
* fix(go) MarketInterface - data could be nil by [@Fiboniak](https://github.com/Fiboniak) in [#27284](https://github.com/ccxt/ccxt/pull/27284)
* fix(hibachi): assume default taker/maker values by [@carlosmiei](https://github.com/carlosmiei) in [#27289](https://github.com/ccxt/ccxt/pull/27289)
* fix(python): coincurve versions by [@ttodua](https://github.com/ttodua) in [#27280](https://github.com/ccxt/ccxt/pull/27280)
* fix(bitget): add 3min mapping to timeframes by [@carlosmiei](https://github.com/carlosmiei) in [#27290](https://github.com/ccxt/ccxt/pull/27290)
* fix(setMarketsFromExchange): add currencies by id by [@carlosmiei](https://github.com/carlosmiei) in [#27295](https://github.com/ccxt/ccxt/pull/27295)
* bingx.has margin and option methods by [@samgermain](https://github.com/samgermain) in [#27298](https://github.com/ccxt/ccxt/pull/27298)
* fix(bitget): 2h max days and cap until by [@carlosmiei](https://github.com/carlosmiei) in [#27302](https://github.com/ccxt/ccxt/pull/27302)
* fix(kraken): watchOrders handle message with no symbol by [@carlosmiei](https://github.com/carlosmiei) in [#27300](https://github.com/ccxt/ccxt/pull/27300)
* fix(OrderBook.cs): check if reset snapshot is available by [@carlosmiei](https://github.com/carlosmiei) in [#27301](https://github.com/ccxt/ccxt/pull/27301)
* fix(binance): recurring unwatch & watch by [@ttodua](https://github.com/ttodua) in [#27292](https://github.com/ccxt/ccxt/pull/27292)
* feat(dydx): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#26456](https://github.com/ccxt/ccxt/pull/26456)
* XT exchange update with unWatch methods by [@rayBastard](https://github.com/rayBastard) in [#27291](https://github.com/ccxt/ccxt/pull/27291)
* fix(dydx): link and flag by [@carlosmiei](https://github.com/carlosmiei) in [#27304](https://github.com/ccxt/ccxt/pull/27304)
* fix(dydx): ref link by [@carlosmiei](https://github.com/carlosmiei) in [#27305](https://github.com/ccxt/ccxt/pull/27305)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.18...v4.5.19](https://github.com/ccxt/ccxt/compare/v4.5.18...v4.5.19)
[Changes][v4.5.19]
# [v4.5.18](https://github.com/ccxt/ccxt/releases/tag/v4.5.18) - 2025-11-10 [#v4518---2025-11-10]
## What's Changed [#whats-changed-60]
* fix(apex): unify takeProfitPrice/stopLossPrice type 2 orders by [@carlosmiei](https://github.com/carlosmiei) in [#27251](https://github.com/ccxt/ccxt/pull/27251)
* Bigone has by [@samgermain](https://github.com/samgermain) in [#27249](https://github.com/ccxt/ccxt/pull/27249)
* fix(ascendex): custom ob by [@ttodua](https://github.com/ttodua) in [#27248](https://github.com/ccxt/ccxt/pull/27248)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#27256](https://github.com/ccxt/ccxt/pull/27256)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#27257](https://github.com/ccxt/ccxt/pull/27257)
* feat(blofin): watchOrders, add trigger support by [@Dan-krm](https://github.com/Dan-krm) in [#27260](https://github.com/ccxt/ccxt/pull/27260)
* fix(binance): pro docs by [@carlosmiei](https://github.com/carlosmiei) in [#27263](https://github.com/ccxt/ccxt/pull/27263)
* fix(types): version comparison in python by [@carlosmiei](https://github.com/carlosmiei) in [#27262](https://github.com/ccxt/ccxt/pull/27262)
* fix(kraken): watchOHLCV in python by [@carlosmiei](https://github.com/carlosmiei) in [#27264](https://github.com/ccxt/ccxt/pull/27264)
* fix(go): conversation from ws cache to proper types by [@carlosmiei](https://github.com/carlosmiei) in [#27265](https://github.com/ccxt/ccxt/pull/27265)
* refactor(ts): websocket extra log by [@ttodua](https://github.com/ttodua) in [#27254](https://github.com/ccxt/ccxt/pull/27254)
* binanceus.has = false by [@samgermain](https://github.com/samgermain) in [#27229](https://github.com/ccxt/ccxt/pull/27229)
* chore(deps): bump github.com/consensys/gnark-crypto from 0.12.1 to 0.18.1 in /go/v4/pro by [@dependabot](https://github.com/dependabot)\[bot] in [#27220](https://github.com/ccxt/ccxt/pull/27220)
* feat(go,mexc): add protobufs support by [@carlosmiei](https://github.com/carlosmiei) in [#27269](https://github.com/ccxt/ccxt/pull/27269)
* Deepcoin integration by [@rayBastard](https://github.com/rayBastard) in [#27030](https://github.com/ccxt/ccxt/pull/27030)
* feat(bybit): Add earn route bybit by [@Nirator78](https://github.com/Nirator78) in [#27270](https://github.com/ccxt/ccxt/pull/27270)
* feat(binance): add unWatchMarkPrice(s) and fix unWatchTickers by [@carlosmiei](https://github.com/carlosmiei) in [#27271](https://github.com/ccxt/ccxt/pull/27271)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.17...v4.5.18](https://github.com/ccxt/ccxt/compare/v4.5.17...v4.5.18)
[Changes][v4.5.18]
# [v4.5.17](https://github.com/ccxt/ccxt/releases/tag/v4.5.17) - 2025-11-06 [#v4517---2025-11-06]
## What's Changed [#whats-changed-61]
* Arkham has by [@samgermain](https://github.com/samgermain) in [#27241](https://github.com/ccxt/ccxt/pull/27241)
* feat: update link id by [@carlosmiei](https://github.com/carlosmiei) in [#27244](https://github.com/ccxt/ccxt/pull/27244)
* fix(kucoin): add Order not exist or not allow to be cancelled error by [@carlosmiei](https://github.com/carlosmiei) in [#27242](https://github.com/ccxt/ccxt/pull/27242)
* python: downgrade coincurve version to ==20 by [@carlosmiei](https://github.com/carlosmiei) in [#27247](https://github.com/ccxt/ccxt/pull/27247)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.16...v4.5.17](https://github.com/ccxt/ccxt/compare/go/v4.5.16...v4.5.17)
[Changes][v4.5.17]
# [v4.5.16](https://github.com/ccxt/ccxt/releases/tag/v4.5.16) - 2025-11-05 [#v4516---2025-11-05]
## What's Changed [#whats-changed-62]
* feat(python): implement coincurve to improve performance on ecdsa signing by [@pcriadoperez](https://github.com/pcriadoperez) in [#26686](https://github.com/ccxt/ccxt/pull/26686)
* feat(bybit): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27223](https://github.com/ccxt/ccxt/pull/27223)
* fix(upbit): fix multiple concurrent private channel subscriptions by [@irresi](https://github.com/irresi) in [#27219](https://github.com/ccxt/ccxt/pull/27219)
* feat(delta): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27212](https://github.com/ccxt/ccxt/pull/27212)
* feat(woo): update v3 fetchBalance route by [@glenn-woo](https://github.com/glenn-woo) in [#27221](https://github.com/ccxt/ccxt/pull/27221)
* feat(Exchange.ts): added order methods by client order ID by [@AresArtemius](https://github.com/AresArtemius) in [#27076](https://github.com/ccxt/ccxt/pull/27076)
* feat(woo): update transfer from v1 API to v3 API by [@glenn-woo](https://github.com/glenn-woo) in [#27172](https://github.com/ccxt/ccxt/pull/27172)
* feat(woo): update withdraw API from v1 to v3 by [@glenn-woo](https://github.com/glenn-woo) in [#27173](https://github.com/ccxt/ccxt/pull/27173)
* mexc error mapping by [@ndubel](https://github.com/ndubel) in [#27226](https://github.com/ccxt/ccxt/pull/27226)
* feat(kraken): add createOrders by [@carlosmiei](https://github.com/carlosmiei) in [#27230](https://github.com/ccxt/ccxt/pull/27230)
* new example: Fetch balance across all exchanges asynchronously by [@samgermain](https://github.com/samgermain) in [#27231](https://github.com/ccxt/ccxt/pull/27231)
* chore: improve takeProfit/stopLoss orders docs by [@carlosmiei](https://github.com/carlosmiei) in [#27236](https://github.com/ccxt/ccxt/pull/27236)
* feat(cli): remove usage of NewBinanceCore in go cli by [@sc0Vu](https://github.com/sc0Vu) in [#27237](https://github.com/ccxt/ccxt/pull/27237)
* fix(hyperliquid): correct edit order message by [@sc0Vu](https://github.com/sc0Vu) in [#27238](https://github.com/ccxt/ccxt/pull/27238)
* fix(blofin): create order tpsl response by [@hoangbn](https://github.com/hoangbn) in [#27228](https://github.com/ccxt/ccxt/pull/27228)
* fix(python): socks5h support & minor change by [@ttodua](https://github.com/ttodua) in [#26703](https://github.com/ccxt/ccxt/pull/26703)
* fix(bybit): market tpsl create order by [@hoangbn](https://github.com/hoangbn) in [#27233](https://github.com/ccxt/ccxt/pull/27233)
## New Contributors [#new-contributors-34]
* [@glenn-woo](https://github.com/glenn-woo) made their first contribution in [#27221](https://github.com/ccxt/ccxt/pull/27221)
* [@hoangbn](https://github.com/hoangbn) made their first contribution in [#27228](https://github.com/ccxt/ccxt/pull/27228)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.15...v4.5.16](https://github.com/ccxt/ccxt/compare/v4.5.15...v4.5.16)
[Changes][v4.5.16]
# [v4.5.15](https://github.com/ccxt/ccxt/releases/tag/v4.5.15) - 2025-11-03 [#v4515---2025-11-03]
## What's Changed [#whats-changed-63]
* chore: update order struct in DOCS by [@carlosmiei](https://github.com/carlosmiei) in [#27179](https://github.com/ccxt/ccxt/pull/27179)
* kucoin error mapping by [@ndubel](https://github.com/ndubel) in [#27185](https://github.com/ccxt/ccxt/pull/27185)
* fix(binance): Ws signature for non-ascii symbols by [@carlosmiei](https://github.com/carlosmiei) in [#27182](https://github.com/ccxt/ccxt/pull/27182)
* ascendex/backpack.has: option methods = false by [@samgermain](https://github.com/samgermain) in [#27181](https://github.com/ccxt/ccxt/pull/27181)
* test(hyperliquid): fetchPositions, isolated margin by [@Dan-krm](https://github.com/Dan-krm) in [#27184](https://github.com/ccxt/ccxt/pull/27184)
* htx transaction status by [@ndubel](https://github.com/ndubel) in [#27186](https://github.com/ccxt/ccxt/pull/27186)
* chore(deps): bump github.com/consensys/gnark-crypto from 0.12.1 to 0.18.1 in /go/v4 by [@dependabot](https://github.com/dependabot)\[bot] in [#27190](https://github.com/ccxt/ccxt/pull/27190)
* build(deps): bump golang.org/x/net from 0.24.0 to 0.38.0 in /go/v4/pro by [@dependabot](https://github.com/dependabot)\[bot] in [#27012](https://github.com/ccxt/ccxt/pull/27012)
* chore(deps): bump github.com/consensys/gnark-crypto from 0.12.1 to 0.18.1 in /go/cli by [@dependabot](https://github.com/dependabot)\[bot] in [#27191](https://github.com/ccxt/ccxt/pull/27191)
* fix(kraken): ws handleOHLCV php ^ by [@ttodua](https://github.com/ttodua) in [#27189](https://github.com/ccxt/ccxt/pull/27189)
* Revert "chore(deps): bump github.com/consensys/gnark-crypto from 0.12… by [@carlosmiei](https://github.com/carlosmiei) in [#27196](https://github.com/ccxt/ccxt/pull/27196)
* feat(bingx): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27195](https://github.com/ccxt/ccxt/pull/27195)
* fix(go): upgrade go-ethereum to v1.16.5 by [@sc0Vu](https://github.com/sc0Vu) in [#27199](https://github.com/ccxt/ccxt/pull/27199)
* fix(poloniex): handle nonAscii symbol by [@carlosmiei](https://github.com/carlosmiei) in [#27197](https://github.com/ccxt/ccxt/pull/27197)
* fix(backpack): withdraw error fix by [@yzh-pelle](https://github.com/yzh-pelle) in [#27206](https://github.com/ccxt/ccxt/pull/27206)
* fix(phemex): default spot endpoint and filter tarde type for linear c… by [@carlosmiei](https://github.com/carlosmiei) in [#27198](https://github.com/ccxt/ccxt/pull/27198)
* fix(Liquidation): add missing types by [@carlosmiei](https://github.com/carlosmiei) in [#27208](https://github.com/ccxt/ccxt/pull/27208)
* fix(go) Greeks type does not match to documentation by [@Fiboniak](https://github.com/Fiboniak) in [#27211](https://github.com/ccxt/ccxt/pull/27211)
* fix(okx): empty markets by [@ttodua](https://github.com/ttodua) in [#27216](https://github.com/ccxt/ccxt/pull/27216)
* fix(go) Liquidation type do not match to documentation by [@Fiboniak](https://github.com/Fiboniak) in [#27204](https://github.com/ccxt/ccxt/pull/27204)
* fix(bitget): chainsLength fix by [@carlosmiei](https://github.com/carlosmiei) in [#27217](https://github.com/ccxt/ccxt/pull/27217)
* fix(hyperliquid): add TriggerSpec and OrderKind to Order struct by [@ninja0404](https://github.com/ninja0404) in [#27214](https://github.com/ccxt/ccxt/pull/27214)
* fix(binance): cancelOrders with non ascii symbol by [@carlosmiei](https://github.com/carlosmiei) in [#27218](https://github.com/ccxt/ccxt/pull/27218)
## New Contributors [#new-contributors-35]
* [@ninja0404](https://github.com/ninja0404) made their first contribution in [#27214](https://github.com/ccxt/ccxt/pull/27214)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.14...v4.5.15](https://github.com/ccxt/ccxt/compare/go/v4.5.14...v4.5.15)
[Changes][v4.5.15]
# [v4.5.14](https://github.com/ccxt/ccxt/releases/tag/v4.5.14) - 2025-10-29 [#v4514---2025-10-29]
## What's Changed [#whats-changed-64]
* fix(arkham): logo and pro flag by [@carlosmiei](https://github.com/carlosmiei) in [#27154](https://github.com/ccxt/ccxt/pull/27154)
* fix(toobit): pro true ^ by [@ttodua](https://github.com/ttodua) in [#27151](https://github.com/ccxt/ccxt/pull/27151)
* cryptocom trading fees by [@ndubel](https://github.com/ndubel) in [#27161](https://github.com/ccxt/ccxt/pull/27161)
* feat(binance): add papiV2GetUmAccount by [@carlosmiei](https://github.com/carlosmiei) in [#27162](https://github.com/ccxt/ccxt/pull/27162)
* fixed incorrect types on base exchange by [@caoilainnl](https://github.com/caoilainnl) in [#27153](https://github.com/ccxt/ccxt/pull/27153)
* fix(hyperliquid): fix fetchOHLCV by [@sc0Vu](https://github.com/sc0Vu) in [#27164](https://github.com/ccxt/ccxt/pull/27164)
* fix(binance): signParams in ws by [@sc0Vu](https://github.com/sc0Vu) in [#27163](https://github.com/ccxt/ccxt/pull/27163)
* fix(go): prevent precision loss in Binance order IDs and other large integers by [@tttpeng](https://github.com/tttpeng) in [#26557](https://github.com/ccxt/ccxt/pull/26557)
* fix(htx): watchOrderBook limit fix by [@carlosmiei](https://github.com/carlosmiei) in [#27167](https://github.com/ccxt/ccxt/pull/27167)
* feat(kucoin): add new endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#27174](https://github.com/ccxt/ccxt/pull/27174)
* feat(bitget): fetchFundingIntervals updated by [@yzh-pelle](https://github.com/yzh-pelle) in [#27165](https://github.com/ccxt/ccxt/pull/27165)
* fix(hyperliquid): adjust initialMargin value by [@Dan-krm](https://github.com/Dan-krm) in [#27159](https://github.com/ccxt/ccxt/pull/27159)
* fix(hyperliquid): ambigous spot symbols (BTC/USDC and UBTC/USDC support) by [@carlosmiei](https://github.com/carlosmiei) in [#27175](https://github.com/ccxt/ccxt/pull/27175)
* feat(gate): add apis, mark deprecated by [@sc0Vu](https://github.com/sc0Vu) in [#27146](https://github.com/ccxt/ccxt/pull/27146)
* fix(binance): watchMyTrades/Orders inverse perps by [@carlosmiei](https://github.com/carlosmiei) in [#27177](https://github.com/ccxt/ccxt/pull/27177)
* fix(bitfinex): protect watchOrderBook client.sub access by [@carlosmiei](https://github.com/carlosmiei) in [#27178](https://github.com/ccxt/ccxt/pull/27178)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.13...v4.5.14](https://github.com/ccxt/ccxt/compare/v4.5.13...v4.5.14)
[Changes][v4.5.14]
# [v4.5.13](https://github.com/ccxt/ccxt/releases/tag/v4.5.13) - 2025-10-27 [#v4513---2025-10-27]
## What's Changed [#whats-changed-65]
* feat(bybit): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#27121](https://github.com/ccxt/ccxt/pull/27121)
* fix(hibachi): sign by [@sc0Vu](https://github.com/sc0Vu) in [#27119](https://github.com/ccxt/ccxt/pull/27119)
* fix(okx): add AUD fiat fallback currency by [@simbesh](https://github.com/simbesh) in [#27125](https://github.com/ccxt/ccxt/pull/27125)
* feat(krakenfutures): parseFundingRate, add funding rate caps by [@Dan-krm](https://github.com/Dan-krm) in [#27117](https://github.com/ccxt/ccxt/pull/27117)
* feat(bitmart): parseFundingRate, add fundingTimestamp by [@Dan-krm](https://github.com/Dan-krm) in [#27127](https://github.com/ccxt/ccxt/pull/27127)
* fix(bitmart): futuresMessages parsing by [@carlosmiei](https://github.com/carlosmiei) in [#27128](https://github.com/ccxt/ccxt/pull/27128)
* fix(toobit): ws trade marketid by [@ttodua](https://github.com/ttodua) in [#27131](https://github.com/ccxt/ccxt/pull/27131)
* fix(defx): parseFundingRate, divide by 100 by [@Dan-krm](https://github.com/Dan-krm) in [#27126](https://github.com/ccxt/ccxt/pull/27126)
* fix(c#): toArray support concurrentDict by [@carlosmiei](https://github.com/carlosmiei) in [#27130](https://github.com/ccxt/ccxt/pull/27130)
* chore(bitrue): skip inactive by [@ttodua](https://github.com/ttodua) in [#27134](https://github.com/ccxt/ccxt/pull/27134)
* chore(bigone): negative open ^ by [@ttodua](https://github.com/ttodua) in [#27135](https://github.com/ccxt/ccxt/pull/27135)
* fix(hyperliquid): place order with tp/sl through createOrderWithTakeP… by [@carlosmiei](https://github.com/carlosmiei) in [#27132](https://github.com/ccxt/ccxt/pull/27132)
* fix(upbit): decompress binary messages in c# by [@carlosmiei](https://github.com/carlosmiei) in [#27136](https://github.com/ccxt/ccxt/pull/27136)
* fix(deribit): ws auth in PHP by [@carlosmiei](https://github.com/carlosmiei) in [#27145](https://github.com/ccxt/ccxt/pull/27145)
* feat(bithumb): Implement new private WebSocket API by [@irresi](https://github.com/irresi) in [#27138](https://github.com/ccxt/ccxt/pull/27138)
* okx parseMarket fixes by [@ndubel](https://github.com/ndubel) in [#27149](https://github.com/ccxt/ccxt/pull/27149)
* feat(arkham): new exchange integration by [@ttodua](https://github.com/ttodua) in [#26494](https://github.com/ccxt/ccxt/pull/26494)
* feat(hyperliquid): update fetchSpotMarkets, add spot currencies mapping by [@sc0Vu](https://github.com/sc0Vu) in [#27147](https://github.com/ccxt/ccxt/pull/27147)
* fix(arkham): docs by [@carlosmiei](https://github.com/carlosmiei) in [#27150](https://github.com/ccxt/ccxt/pull/27150)
* Go \[bugfix]: Deadlock in WebSocket Client's LastPong Lock Mechanism [#27133](https://github.com/ccxt/ccxt/issues/27133) by [@Fiboniak](https://github.com/Fiboniak) in [#27139](https://github.com/ccxt/ccxt/pull/27139)
## New Contributors [#new-contributors-36]
* [@Fiboniak](https://github.com/Fiboniak) made their first contribution in [#27139](https://github.com/ccxt/ccxt/pull/27139)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.12...v4.5.13](https://github.com/ccxt/ccxt/compare/v4.5.12...v4.5.13)
[Changes][v4.5.13]
# [v4.5.12](https://github.com/ccxt/ccxt/releases/tag/v4.5.12) - 2025-10-22 [#v4512---2025-10-22]
## What's Changed [#whats-changed-66]
* Manual updates by [@samgermain](https://github.com/samgermain) in [#27066](https://github.com/ccxt/ccxt/pull/27066)
* fix(okx): fetchohlcv max limits by [@ttodua](https://github.com/ttodua) in [#27013](https://github.com/ccxt/ccxt/pull/27013)
* fix(bybit): stoploss & tp order by [@ttodua](https://github.com/ttodua) in [#27068](https://github.com/ccxt/ccxt/pull/27068)
* docs: fetchPositionMode, edit docs for setPositionMode by [@samgermain](https://github.com/samgermain) in [#27072](https://github.com/ccxt/ccxt/pull/27072)
* feat(bitget): add enableDemoTrading by [@carlosmiei](https://github.com/carlosmiei) in [#27070](https://github.com/ccxt/ccxt/pull/27070)
* docs(capacity): max capacity by [@ttodua](https://github.com/ttodua) in [#26453](https://github.com/ccxt/ccxt/pull/26453)
* test(cs): run separate tests in github actions by [@ttodua](https://github.com/ttodua) in [#27073](https://github.com/ccxt/ccxt/pull/27073)
* failure tests - catch by [@ttodua](https://github.com/ttodua) in [#24671](https://github.com/ccxt/ccxt/pull/24671)
* fix(binance): fix [#27064](https://github.com/ccxt/ccxt/issues/27064) by [@pcriadoperez](https://github.com/pcriadoperez) in [#27080](https://github.com/ccxt/ccxt/pull/27080)
* fix(xt): add apiKeyId version by [@carlosmiei](https://github.com/carlosmiei) in [#27087](https://github.com/ccxt/ccxt/pull/27087)
* fix(bitmart): active flags in market by [@carlosmiei](https://github.com/carlosmiei) in [#27088](https://github.com/ccxt/ccxt/pull/27088)
* fix(hyperliquid): save tickers in cache by [@carlosmiei](https://github.com/carlosmiei) in [#27094](https://github.com/ccxt/ccxt/pull/27094)
* chore: fix granular go build by [@carlosmiei](https://github.com/carlosmiei) in [#27097](https://github.com/ccxt/ccxt/pull/27097)
* fix(coinbase): ws orders by [@carlosmiei](https://github.com/carlosmiei) in [#27096](https://github.com/ccxt/ccxt/pull/27096)
* test(coincatch): fetchCurrencies & static tests all by [@ttodua](https://github.com/ttodua) in [#25986](https://github.com/ccxt/ccxt/pull/25986)
* alpaca pro has watch methods by [@samgermain](https://github.com/samgermain) in [#27101](https://github.com/ccxt/ccxt/pull/27101)
* apex has false for margin/option methods by [@samgermain](https://github.com/samgermain) in [#27100](https://github.com/ccxt/ccxt/pull/27100)
* fix(coincatch): fix failing static test, add Optimism network by [@pcriadoperez](https://github.com/pcriadoperez) in [#27102](https://github.com/ccxt/ccxt/pull/27102)
* test(market): minor fields ^ by [@ttodua](https://github.com/ttodua) in [#27098](https://github.com/ccxt/ccxt/pull/27098)
* fix(krakenfutures): missing order fields by [@carlosmiei](https://github.com/carlosmiei) in [#27104](https://github.com/ccxt/ccxt/pull/27104)
* fix(woo): order timestamps by [@carlosmiei](https://github.com/carlosmiei) in [#27095](https://github.com/ccxt/ccxt/pull/27095)
* fix(bitget): unWatch futures reject by [@carlosmiei](https://github.com/carlosmiei) in [#27105](https://github.com/ccxt/ccxt/pull/27105)
* fix(woo): parse ws order by [@carlosmiei](https://github.com/carlosmiei) in [#27106](https://github.com/ccxt/ccxt/pull/27106)
* fix(okx): add fiat fallback currencies by [@carlosmiei](https://github.com/carlosmiei) in [#27110](https://github.com/ccxt/ccxt/pull/27110)
* fix(cs): throttler by [@ttodua](https://github.com/ttodua) in [#27111](https://github.com/ccxt/ccxt/pull/27111)
* fix(bybit): parsePosition, initialMargin value by [@Dan-krm](https://github.com/Dan-krm) in [#27114](https://github.com/ccxt/ccxt/pull/27114)
* Fix ApeX ws not replying to pings from server by [@roelvv](https://github.com/roelvv) in [#27112](https://github.com/ccxt/ccxt/pull/27112)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.11...v4.5.12](https://github.com/ccxt/ccxt/compare/go/v4.5.11...v4.5.12)
[Changes][v4.5.12]
# [v4.5.11](https://github.com/ccxt/ccxt/releases/tag/v4.5.11) - 2025-10-15 [#v4511---2025-10-15]
## What's Changed [#whats-changed-67]
* remove go warnings by [@caoilainnl](https://github.com/caoilainnl) in [#27034](https://github.com/ccxt/ccxt/pull/27034)
* feat(kraken): update watch methods to v2 by [@Dan-krm](https://github.com/Dan-krm) in [#27032](https://github.com/ccxt/ccxt/pull/27032)
* fetchOHLCV/watchOHLCV timeframe param type by [@caoilainnl](https://github.com/caoilainnl) in [#27041](https://github.com/ccxt/ccxt/pull/27041)
* fix(mexc): ws parse trades by [@ttodua](https://github.com/ttodua) in [#27043](https://github.com/ccxt/ccxt/pull/27043)
* add missing param and return types to fetchCurrenciesWs, cancelUnifiedOrder by [@caoilainnl](https://github.com/caoilainnl) in [#27042](https://github.com/ccxt/ccxt/pull/27042)
* chore: added cancelOrders to the base exchange class by [@mehrab-hn](https://github.com/mehrab-hn) in [#27040](https://github.com/ccxt/ccxt/pull/27040)
* Add key\_permissions endpoint to Coinbase brokerage permissions by [@Nirator78](https://github.com/Nirator78) in [#27038](https://github.com/ccxt/ccxt/pull/27038)
* fix(bitget): c# subtract fix by [@carlosmiei](https://github.com/carlosmiei) in [#27044](https://github.com/ccxt/ccxt/pull/27044)
* test(probit): fetchtickers skip symb & dummy trigger by [@ttodua](https://github.com/ttodua) in [#27028](https://github.com/ccxt/ccxt/pull/27028)
* chore(okcoin): delist by [@ttodua](https://github.com/ttodua) in [#27026](https://github.com/ccxt/ccxt/pull/27026)
* fix(featureValue): return defaults by [@ttodua](https://github.com/ttodua) in [#27023](https://github.com/ccxt/ccxt/pull/27023)
* fix(bitget): fetchPositions empty array by [@carlosmiei](https://github.com/carlosmiei) in [#27051](https://github.com/ccxt/ccxt/pull/27051)
* doc(bitget): plan order ^ by [@ttodua](https://github.com/ttodua) in [#27049](https://github.com/ccxt/ccxt/pull/27049)
* latoken transaction status by [@ndubel](https://github.com/ndubel) in [#27046](https://github.com/ccxt/ccxt/pull/27046)
* fix(htx): ws order datas by [@ttodua](https://github.com/ttodua) in [#27050](https://github.com/ccxt/ccxt/pull/27050)
* fix(mexc): ws & rest update timestamp by [@ttodua](https://github.com/ttodua) in [#27045](https://github.com/ccxt/ccxt/pull/27045)
* fix(js): cancelOrder args and return type by [@carlosmiei](https://github.com/carlosmiei) in [#27053](https://github.com/ccxt/ccxt/pull/27053)
* feat(Exchange): add unWatchMarkprices to base and fix build by [@carlosmiei](https://github.com/carlosmiei) in [#27054](https://github.com/ccxt/ccxt/pull/27054)
* feat(phemex): add risk-unit endpoint by [@kilianjanssen](https://github.com/kilianjanssen) in [#27056](https://github.com/ccxt/ccxt/pull/27056)
* fix(deribit): fetchCUrrencies fix by [@ttodua](https://github.com/ttodua) in [#27024](https://github.com/ccxt/ccxt/pull/27024)
* doc(manual): recv\_window by [@ttodua](https://github.com/ttodua) in [#27057](https://github.com/ccxt/ccxt/pull/27057)
* feat(bingx): withdraw, switch default account by [@Dan-krm](https://github.com/Dan-krm) in [#27058](https://github.com/ccxt/ccxt/pull/27058)
* fix(kucoin): fetchDepositWithdrawFees by [@carlosmiei](https://github.com/carlosmiei) in [#27060](https://github.com/ccxt/ccxt/pull/27060)
* chore: fix response tests by [@carlosmiei](https://github.com/carlosmiei) in [#27062](https://github.com/ccxt/ccxt/pull/27062)
## New Contributors [#new-contributors-37]
* [@kilianjanssen](https://github.com/kilianjanssen) made their first contribution in [#27056](https://github.com/ccxt/ccxt/pull/27056)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.10...v4.5.11](https://github.com/ccxt/ccxt/compare/v4.5.10...v4.5.11)
[Changes][v4.5.11]
# [v4.5.10](https://github.com/ccxt/ccxt/releases/tag/v4.5.10) - 2025-10-11 [#v4510---2025-10-11]
## What's Changed [#whats-changed-68]
* fix(py,php): add reusableFuture wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#27033](https://github.com/ccxt/ccxt/pull/27033)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.9...v4.5.10](https://github.com/ccxt/ccxt/compare/v4.5.9...v4.5.10)
[Changes][v4.5.10]
# [v4.5.9](https://github.com/ccxt/ccxt/releases/tag/v4.5.9) - 2025-10-10 [#v459---2025-10-10]
## What's Changed [#whats-changed-69]
* latoken transaction status by [@ndubel](https://github.com/ndubel) in [#26984](https://github.com/ccxt/ccxt/pull/26984)
* fix(coinex): watchTickers return type by [@carlosmiei](https://github.com/carlosmiei) in [#26993](https://github.com/ccxt/ccxt/pull/26993)
* fix(bitvavo): has dict correction by [@mehrab-hn](https://github.com/mehrab-hn) in [#26990](https://github.com/ccxt/ccxt/pull/26990)
* coinbaseexchange: add GET conversions by [@Nirator78](https://github.com/Nirator78) in [#26991](https://github.com/ccxt/ccxt/pull/26991)
* fix(phemex): setMarginMode for usd contracts by [@ttodua](https://github.com/ttodua) in [#26983](https://github.com/ccxt/ccxt/pull/26983)
* fix(paradex): update starknet sign by [@sc0Vu](https://github.com/sc0Vu) in [#26992](https://github.com/ccxt/ccxt/pull/26992)
* fix(cs): null check by [@ttodua](https://github.com/ttodua) in [#27004](https://github.com/ccxt/ccxt/pull/27004)
* Added the all loan route for CoinbaseExchange by [@Nirator78](https://github.com/Nirator78) in [#26997](https://github.com/ccxt/ccxt/pull/26997)
* fix(kraken): requestid should be number by [@sc0Vu](https://github.com/sc0Vu) in [#26994](https://github.com/ccxt/ccxt/pull/26994)
* fix(kraken): use safeString for reqid by [@sc0Vu](https://github.com/sc0Vu) in [#27005](https://github.com/ccxt/ccxt/pull/27005)
* fix(bitget): fix fetchBalance v2 by [@ttodua](https://github.com/ttodua) in [#26975](https://github.com/ccxt/ccxt/pull/26975)
* fix(c#): substract double vs int err by [@carlosmiei](https://github.com/carlosmiei) in [#27006](https://github.com/ccxt/ccxt/pull/27006)
* feat(go): add Websockets(WS) support by [@caoilainnl](https://github.com/caoilainnl) in [#26440](https://github.com/ccxt/ccxt/pull/26440)
* fix(hyperliquid): remove vaultAddress from transfer by [@sc0Vu](https://github.com/sc0Vu) in [#27016](https://github.com/ccxt/ccxt/pull/27016)
* fix(c#): uncaught exception for non-json by [@ttodua](https://github.com/ttodua) in [#27011](https://github.com/ccxt/ccxt/pull/27011)
* feat(featureValue): simplification by [@ttodua](https://github.com/ttodua) in [#27014](https://github.com/ccxt/ccxt/pull/27014)
* chore(ts): orderType\[] by [@ttodua](https://github.com/ttodua) in [#27019](https://github.com/ccxt/ccxt/pull/27019)
* fix\*hyperliquid): add SubAccountTransferMessage in go by [@sc0Vu](https://github.com/sc0Vu) in [#27018](https://github.com/ccxt/ccxt/pull/27018)
* chore: fix build by [@carlosmiei](https://github.com/carlosmiei) in [#27022](https://github.com/ccxt/ccxt/pull/27022)
## New Contributors [#new-contributors-38]
* [@Nirator78](https://github.com/Nirator78) made their first contribution in [#26991](https://github.com/ccxt/ccxt/pull/26991)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.8...v4.5.9](https://github.com/ccxt/ccxt/compare/v4.5.8...v4.5.9)
[Changes][v4.5.9]
# [v4.5.8](https://github.com/ccxt/ccxt/releases/tag/v4.5.8) - 2025-10-07 [#v458---2025-10-07]
## What's Changed [#whats-changed-70]
* phemex pro safeTicker by [@caoilainnl](https://github.com/caoilainnl) in [#26947](https://github.com/ccxt/ccxt/pull/26947)
* Precise Reduce, String: int64 handling by [@caoilainnl](https://github.com/caoilainnl) in [#26948](https://github.com/ccxt/ccxt/pull/26948)
* fix(backpack): handle delta by [@carlosmiei](https://github.com/carlosmiei) in [#26949](https://github.com/ccxt/ccxt/pull/26949)
* chore: granular-go-build on pipeline by [@carlosmiei](https://github.com/carlosmiei) in [#26950](https://github.com/ccxt/ccxt/pull/26950)
* feat(exchanges): createOrder,unify selfTradePrevention by [@Dan-krm](https://github.com/Dan-krm) in [#26912](https://github.com/ccxt/ccxt/pull/26912)
* fix (lbank): fetchCurrencies undefined networks bug fixed by [@rayBastard](https://github.com/rayBastard) in [#26953](https://github.com/ccxt/ccxt/pull/26953)
* feat(upbit): new argument for order, orderbook by [@irresi](https://github.com/irresi) in [#26902](https://github.com/ccxt/ccxt/pull/26902)
* fix(hibachi): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#26898](https://github.com/ccxt/ccxt/pull/26898)
* refactor(coinbase): explanation message by [@ttodua](https://github.com/ttodua) in [#26927](https://github.com/ccxt/ccxt/pull/26927)
* Add fetchTickers-maxIncrease option for upbit in skip-tests.json by [@irresi](https://github.com/irresi) in [#26957](https://github.com/ccxt/ccxt/pull/26957)
* feat(htx): add unWatch methods by [@AresArtemius](https://github.com/AresArtemius) in [#26940](https://github.com/ccxt/ccxt/pull/26940)
* feat(whitebit): support for new endpoints was added by [@carlosmiei](https://github.com/carlosmiei) in [#26959](https://github.com/ccxt/ccxt/pull/26959)
* fix(bithumb): add usdt to quote currency option by [@irresi](https://github.com/irresi) in [#26961](https://github.com/ccxt/ccxt/pull/26961)
* fix(c#): uncaught exeptions by [@ttodua](https://github.com/ttodua) in [#26962](https://github.com/ccxt/ccxt/pull/26962)
* fix(js): react app compatibility fix by [@ttodua](https://github.com/ttodua) in [#26939](https://github.com/ccxt/ccxt/pull/26939)
* feat(htx): fixed naming in unWatchOHLCV method by [@AresArtemius](https://github.com/AresArtemius) in [#26966](https://github.com/ccxt/ccxt/pull/26966)
* feat(hyperliquid): add vaultAddress in deposits / withdrawals by [@sc0Vu](https://github.com/sc0Vu) in [#26970](https://github.com/ccxt/ccxt/pull/26970)
* feat(Exchange.ts): bidsasks added to `cleanCache` by [@yzh-pelle](https://github.com/yzh-pelle) in [#26965](https://github.com/ccxt/ccxt/pull/26965)
* feat(woo): public unWatch methods by [@yzh-pelle](https://github.com/yzh-pelle) in [#26963](https://github.com/ccxt/ccxt/pull/26963)
* fix(buildOHLCV): add options & skip zero price by [@ttodua](https://github.com/ttodua) in [#26974](https://github.com/ccxt/ccxt/pull/26974)
* fix(okx): increase RL coefficient by [@ttodua](https://github.com/ttodua) in [#26973](https://github.com/ccxt/ccxt/pull/26973)
* fix(coinex): watchOrderBook multiple subscriptions by [@carlosmiei](https://github.com/carlosmiei) in [#26982](https://github.com/ccxt/ccxt/pull/26982)
* fix(coinex): wildcard watchTickers subscription by [@carlosmiei](https://github.com/carlosmiei) in [#26978](https://github.com/ccxt/ccxt/pull/26978)
* fix(phemex): handle empty arrays by [@carlosmiei](https://github.com/carlosmiei) in [#26981](https://github.com/ccxt/ccxt/pull/26981)
## New Contributors [#new-contributors-39]
* [@irresi](https://github.com/irresi) made their first contribution in [#26902](https://github.com/ccxt/ccxt/pull/26902)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.7...v4.5.8](https://github.com/ccxt/ccxt/compare/go/v4.5.7...v4.5.8)
[Changes][v4.5.8]
# [v4.5.7](https://github.com/ccxt/ccxt/releases/tag/v4.5.7) - 2025-10-01 [#v457---2025-10-01]
## What's Changed [#whats-changed-71]
* fix(kraken): withdraw address is optional ([#26895](https://github.com/ccxt/ccxt/issues/26895)) by [@ron7684](https://github.com/ron7684) in [#26914](https://github.com/ccxt/ccxt/pull/26914)
* feat(okx): cancelOrders, add new algoClOrdId support by [@Dan-krm](https://github.com/Dan-krm) in [#26921](https://github.com/ccxt/ccxt/pull/26921)
* fix(apex): watchTrades order by [@ttodua](https://github.com/ttodua) in [#26920](https://github.com/ccxt/ccxt/pull/26920)
* fix(digifinex): chain id for coin by [@ttodua](https://github.com/ttodua) in [#26919](https://github.com/ccxt/ccxt/pull/26919)
* fix(fetchCurrencies): false by [@ttodua](https://github.com/ttodua) in [#26918](https://github.com/ccxt/ccxt/pull/26918)
* fix(deribit): add size and unrpnl to position by [@carlosmiei](https://github.com/carlosmiei) in [#26915](https://github.com/ccxt/ccxt/pull/26915)
* fix(indodax): market id in methods ^ by [@ttodua](https://github.com/ttodua) in [#26887](https://github.com/ccxt/ccxt/pull/26887)
* fix(gemini): fetchMarkets inarray fix by [@ttodua](https://github.com/ttodua) in [#26929](https://github.com/ccxt/ccxt/pull/26929)
* test(apex): sort skip by [@ttodua](https://github.com/ttodua) in [#26928](https://github.com/ccxt/ccxt/pull/26928)
* fix(apex): fetchOHLCV by [@ttodua](https://github.com/ttodua) in [#26930](https://github.com/ccxt/ccxt/pull/26930)
* fix(htx): fix ws trades by [@ttodua](https://github.com/ttodua) in [#26932](https://github.com/ccxt/ccxt/pull/26932)
* Clarify symbol parameter in cancelAllOrders documentation for Kraken by [@rayBastard](https://github.com/rayBastard) in [#26933](https://github.com/ccxt/ccxt/pull/26933)
* feat(kraken): add commonCurrencies with x and z prefixes by [@Dan-krm](https://github.com/Dan-krm) in [#26937](https://github.com/ccxt/ccxt/pull/26937)
* fix(bitvavo): markets parsing by [@ttodua](https://github.com/ttodua) in [#26935](https://github.com/ccxt/ccxt/pull/26935)
* gate - `taker/maker` rate removal from fetchMarkets by [@ttodua](https://github.com/ttodua) in [#14271](https://github.com/ccxt/ccxt/pull/14271)
* fix(mexc): upgrade fetchTransfers to v3 by [@carlosmiei](https://github.com/carlosmiei) in [#26936](https://github.com/ccxt/ccxt/pull/26936)
* feat(Bingx): add unWatch methods by [@yzh-pelle](https://github.com/yzh-pelle) in [#26931](https://github.com/ccxt/ccxt/pull/26931)
* fix(binance): throw error for futures+sandbox access by [@carlosmiei](https://github.com/carlosmiei) in [#26941](https://github.com/ccxt/ccxt/pull/26941)
* fix(backpack): watchOrderBook nonce handling by [@carlosmiei](https://github.com/carlosmiei) in [#26943](https://github.com/ccxt/ccxt/pull/26943)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.6...v4.5.7](https://github.com/ccxt/ccxt/compare/v4.5.6...v4.5.7)
[Changes][v4.5.7]
# [v4.5.6](https://github.com/ccxt/ccxt/releases/tag/v4.5.6) - 2025-09-26 [#v456---2025-09-26]
## What's Changed [#whats-changed-72]
* test(kucoinfutures): static, createOrder with a hedged param by [@Dan-krm](https://github.com/Dan-krm) in [#26855](https://github.com/ccxt/ccxt/pull/26855)
* fix(mexc) - watchBalance spot by [@ttodua](https://github.com/ttodua) in [#26852](https://github.com/ccxt/ccxt/pull/26852)
* feat(phemex): add positionId by [@carlosmiei](https://github.com/carlosmiei) in [#26860](https://github.com/ccxt/ccxt/pull/26860)
* fix(kraken): setMarketsFromExchange helpers loading by [@carlosmiei](https://github.com/carlosmiei) in [#26859](https://github.com/ccxt/ccxt/pull/26859)
* fix(hyperliquid): throw error in fetchDeposits by [@sc0Vu](https://github.com/sc0Vu) in [#26857](https://github.com/ccxt/ccxt/pull/26857)
* feat(bybit): new fee responses for order endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#26821](https://github.com/ccxt/ccxt/pull/26821)
* fix(proxies): migration by [@ttodua](https://github.com/ttodua) in [#26863](https://github.com/ccxt/ccxt/pull/26863)
* chore: add granular go build script by [@carlosmiei](https://github.com/carlosmiei) in [#26866](https://github.com/ccxt/ccxt/pull/26866)
* delist(tradeogre): by [@ttodua](https://github.com/ttodua) in [#26865](https://github.com/ccxt/ccxt/pull/26865)
* chore: minor updates in docs and comments by [@mehrab-hn](https://github.com/mehrab-hn) in [#26868](https://github.com/ccxt/ccxt/pull/26868)
* fix(bigone): enable swap ^ by [@ttodua](https://github.com/ttodua) in [#26869](https://github.com/ccxt/ccxt/pull/26869)
* fix(exchange): delimiter from non-transpilable files by [@carlosmiei](https://github.com/carlosmiei) in [#26870](https://github.com/ccxt/ccxt/pull/26870)
* feat(binance): add support for subscribe user data stream using websockets api by [@pcriadoperez](https://github.com/pcriadoperez) in [#26847](https://github.com/ccxt/ccxt/pull/26847)
* fix(apex): last pong timestamp by [@carlosmiei](https://github.com/carlosmiei) in [#26876](https://github.com/ccxt/ccxt/pull/26876)
* fix(c#): websocket pingloop by [@ttodua](https://github.com/ttodua) in [#26853](https://github.com/ccxt/ccxt/pull/26853)
* feat(bitget): watchBalance, watchPositions, watchOrders uta support by [@Dan-krm](https://github.com/Dan-krm) in [#26809](https://github.com/ccxt/ccxt/pull/26809)
* feat(okx): subscribe / unsubscribe trades-all topic by [@sc0Vu](https://github.com/sc0Vu) in [#26796](https://github.com/ccxt/ccxt/pull/26796)
* fix(php): transpiled parts by [@ttodua](https://github.com/ttodua) in [#26877](https://github.com/ccxt/ccxt/pull/26877)
* webpack - fix retro compatibility issue - publicPath by [@vd3d](https://github.com/vd3d) in [#26872](https://github.com/ccxt/ccxt/pull/26872)
* feat(Exchange): fetchCurrencies return type by [@caoilainnl](https://github.com/caoilainnl) in [#26789](https://github.com/ccxt/ccxt/pull/26789)
* fix(c#) - undefined currencies by [@ttodua](https://github.com/ttodua) in [#25473](https://github.com/ccxt/ccxt/pull/25473)
* fix(base): currencies check by [@ttodua](https://github.com/ttodua) in [#26878](https://github.com/ccxt/ccxt/pull/26878)
* feat(binance): spot trailingPercent market order support by [@Dan-krm](https://github.com/Dan-krm) in [#26882](https://github.com/ccxt/ccxt/pull/26882)
* chore(binance): test key ^ by [@ttodua](https://github.com/ttodua) in [#26881](https://github.com/ccxt/ccxt/pull/26881)
* feat(binance): add demo trading with enableDemoTrading by [@carlosmiei](https://github.com/carlosmiei) in [#26883](https://github.com/ccxt/ccxt/pull/26883)
* supported features & snippets by [@ttodua](https://github.com/ttodua) in [#24706](https://github.com/ccxt/ccxt/pull/24706)
* chore(skips): different exchanges ^ by [@ttodua](https://github.com/ttodua) in [#26885](https://github.com/ccxt/ccxt/pull/26885)
* chore(backpack): inactive currencies ^ by [@ttodua](https://github.com/ttodua) in [#26889](https://github.com/ccxt/ccxt/pull/26889)
* chore(gemini): skip active check ^ by [@ttodua](https://github.com/ttodua) in [#26888](https://github.com/ccxt/ccxt/pull/26888)
* fix(bitget): createStopLoss/createTakeProfitOrder side inference by [@carlosmiei](https://github.com/carlosmiei) in [#26891](https://github.com/ccxt/ccxt/pull/26891)
* chore: test binance vps by [@carlosmiei](https://github.com/carlosmiei) in [#26892](https://github.com/ccxt/ccxt/pull/26892)
* feat(features): fetchCurrencies private by [@ttodua](https://github.com/ttodua) in [#26884](https://github.com/ccxt/ccxt/pull/26884)
* fix(kraken): withdraw address is optional by [@carlosmiei](https://github.com/carlosmiei) in [#26895](https://github.com/ccxt/ccxt/pull/26895)
* Only exceptions fix by [@ttodua](https://github.com/ttodua) in [#26899](https://github.com/ccxt/ccxt/pull/26899)
* chore(actions): runner ip (temp enable) by [@ttodua](https://github.com/ttodua) in [#26893](https://github.com/ccxt/ccxt/pull/26893)
* refactor(bigone): ohlcv error by [@ttodua](https://github.com/ttodua) in [#26896](https://github.com/ccxt/ccxt/pull/26896)
* fix(backpack): test watchTrades & skip ^ by [@ttodua](https://github.com/ttodua) in [#26897](https://github.com/ccxt/ccxt/pull/26897)
* feat(toobit): new exchange integration by [@ttodua](https://github.com/ttodua) in [#26674](https://github.com/ccxt/ccxt/pull/26674)
* fix(kucoin): isFiat logic ^ by [@ttodua](https://github.com/ttodua) in [#26886](https://github.com/ccxt/ccxt/pull/26886)
* feat(okx): changelog, September 23, 2025 by [@Dan-krm](https://github.com/Dan-krm) in [#26903](https://github.com/ccxt/ccxt/pull/26903)
* chore: fix js docs by [@carlosmiei](https://github.com/carlosmiei) in [#26904](https://github.com/ccxt/ccxt/pull/26904)
* chore: add build-docs to pipeline by [@carlosmiei](https://github.com/carlosmiei) in [#26905](https://github.com/ccxt/ccxt/pull/26905)
* fix(okx): sl tp order with trigger by [@ttodua](https://github.com/ttodua) in [#26907](https://github.com/ccxt/ccxt/pull/26907)
* fix: okx watchTrades docstring watchTradesForSymbols duplicate removed by [@caoilainnl](https://github.com/caoilainnl) in [#26908](https://github.com/ccxt/ccxt/pull/26908)
* fix(bybit): withdraw account type inference by [@carlosmiei](https://github.com/carlosmiei) in [#26909](https://github.com/ccxt/ccxt/pull/26909)
* chore: disable toobit response test in go by [@carlosmiei](https://github.com/carlosmiei) in [#26911](https://github.com/ccxt/ccxt/pull/26911)
## New Contributors [#new-contributors-40]
* [@vd3d](https://github.com/vd3d) made their first contribution in [#26872](https://github.com/ccxt/ccxt/pull/26872)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.5.5...v4.5.6](https://github.com/ccxt/ccxt/compare/go/v4.5.5...v4.5.6)
[Changes][v4.5.6]
# [v4.5.5](https://github.com/ccxt/ccxt/releases/tag/v4.5.5) - 2025-09-17 [#v455---2025-09-17]
## What's Changed [#whats-changed-73]
* eslintrc for Exchange.ts by [@caoilainnl](https://github.com/caoilainnl) in [#26752](https://github.com/ccxt/ccxt/pull/26752)
* Revert "eslintrc for Exchange.ts ([#26752](https://github.com/ccxt/ccxt/issues/26752))" by [@carlosmiei](https://github.com/carlosmiei) in [#26811](https://github.com/ccxt/ccxt/pull/26811)
* feat(Exchange.ts): add types and eslint rules to non-transpilable section by [@caoilainnl](https://github.com/caoilainnl) in [#26747](https://github.com/ccxt/ccxt/pull/26747)
* fix(okx): createOrder SL & TP attached by [@ttodua](https://github.com/ttodua) in [#26680](https://github.com/ccxt/ccxt/pull/26680)
* test(cs): fix exception ^ by [@ttodua](https://github.com/ttodua) in [#26812](https://github.com/ccxt/ccxt/pull/26812)
* feat(xt): add pagination to fetchFundingRateHistory by [@carlosmiei](https://github.com/carlosmiei) in [#26817](https://github.com/ccxt/ccxt/pull/26817)
* fix(Coincatch): exchange fetchPosition updated by [@yzh-pelle](https://github.com/yzh-pelle) in [#26823](https://github.com/ccxt/ccxt/pull/26823)
* fix(coinmetro): load markets by [@carlosmiei](https://github.com/carlosmiei) in [#26830](https://github.com/ccxt/ccxt/pull/26830)
* fix(onetrading): markets loading and fetchTradingFees by [@carlosmiei](https://github.com/carlosmiei) in [#26832](https://github.com/ccxt/ccxt/pull/26832)
* chore: fix Document typos by [@mehrab-hn](https://github.com/mehrab-hn) in [#26831](https://github.com/ccxt/ccxt/pull/26831)
* fix(krakenfutures): add active flag to markets by [@carlosmiei](https://github.com/carlosmiei) in [#26836](https://github.com/ccxt/ccxt/pull/26836)
* feat(kucoinfutures): setPositionMode by [@Dan-krm](https://github.com/Dan-krm) in [#26822](https://github.com/ccxt/ccxt/pull/26822)
* fix(gate): properly parse swap/marginMode in fetchBalance by [@carlosmiei](https://github.com/carlosmiei) in [#26841](https://github.com/ccxt/ccxt/pull/26841)
* feat(coinbase): add unWatch methods by [@carlosmiei](https://github.com/carlosmiei) in [#26833](https://github.com/ccxt/ccxt/pull/26833)
* fix(go): parseLastPrice base method by [@ttodua](https://github.com/ttodua) in [#26846](https://github.com/ccxt/ccxt/pull/26846)
* Chore: fix typos in ccxt.pro.manual.md by [@mehrab-hn](https://github.com/mehrab-hn) in [#26844](https://github.com/ccxt/ccxt/pull/26844)
* feat(bitget): fetchPositions, uta support by [@Dan-krm](https://github.com/Dan-krm) in [#26845](https://github.com/ccxt/ccxt/pull/26845)
* fix(phemex): realised pnl in positions by [@carlosmiei](https://github.com/carlosmiei) in [#26842](https://github.com/ccxt/ccxt/pull/26842)
* feat(binance): add support for external lock balance update by [@pcriadoperez](https://github.com/pcriadoperez) in [#26848](https://github.com/ccxt/ccxt/pull/26848)
* feat(bitget): watchOrderBook, uta support by [@Dan-krm](https://github.com/Dan-krm) in [#26709](https://github.com/ccxt/ccxt/pull/26709)
* fix(gemini): broken symbols by [@ttodua](https://github.com/ttodua) in [#26687](https://github.com/ccxt/ccxt/pull/26687)
* yobit.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26681](https://github.com/ccxt/ccxt/pull/26681)
* fix(kucoinfutures): properly parse perps with expiry date by [@carlosmiei](https://github.com/carlosmiei) in [#26851](https://github.com/ccxt/ccxt/pull/26851)
* fix(bybit): require symbol in createOrderWs by [@carlosmiei](https://github.com/carlosmiei) in [#26850](https://github.com/ccxt/ccxt/pull/26850)
* feat: add Backpack exchange by [@AresArtemius](https://github.com/AresArtemius) in [#26449](https://github.com/ccxt/ccxt/pull/26449)
## New Contributors [#new-contributors-41]
* [@mehrab-hn](https://github.com/mehrab-hn) made their first contribution in [#26831](https://github.com/ccxt/ccxt/pull/26831)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.4...v4.5.5](https://github.com/ccxt/ccxt/compare/v4.5.4...v4.5.5)
[Changes][v4.5.5]
# [v4.5.4](https://github.com/ccxt/ccxt/releases/tag/v4.5.4) - 2025-09-11 [#v454---2025-09-11]
## What's Changed [#whats-changed-74]
* feat(okx): 2025-09-02 changelog by [@Dan-krm](https://github.com/Dan-krm) in [#26769](https://github.com/ccxt/ccxt/pull/26769)
* remove duplicate folders from repo by [@ttodua](https://github.com/ttodua) in [#26768](https://github.com/ccxt/ccxt/pull/26768)
* feat(parseWsTrades): parseTrades reorg by [@ttodua](https://github.com/ttodua) in [#26780](https://github.com/ccxt/ccxt/pull/26780)
* feat(handleTriggerPrices): implement by [@ttodua](https://github.com/ttodua) in [#26749](https://github.com/ccxt/ccxt/pull/26749)
* fix: binance setPositionMode by [@caoilainnl](https://github.com/caoilainnl) in [#26783](https://github.com/ccxt/ccxt/pull/26783)
* fix(kucoinfutures): add 100001 and 330008 errors by [@carlosmiei](https://github.com/carlosmiei) in [#26777](https://github.com/ccxt/ccxt/pull/26777)
* fix(bitvavo): check operatorId in cancelAllOrders by [@carlosmiei](https://github.com/carlosmiei) in [#26774](https://github.com/ccxt/ccxt/pull/26774)
* feat(bitget): watchMyTrades, uta support by [@Dan-krm](https://github.com/Dan-krm) in [#26755](https://github.com/ccxt/ccxt/pull/26755)
* fix(cs): websockets fix by [@ttodua](https://github.com/ttodua) in [#26775](https://github.com/ccxt/ccxt/pull/26775)
* fix(bitget): watchMyTrades spot type by [@carlosmiei](https://github.com/carlosmiei) in [#26791](https://github.com/ccxt/ccxt/pull/26791)
* test(python): fix path by [@ttodua](https://github.com/ttodua) in [#26781](https://github.com/ccxt/ccxt/pull/26781)
* fix(coinbase): signature in GO by adding p256 curve to ecdsa and fixing jwt options by [@carlosmiei](https://github.com/carlosmiei) in [#26790](https://github.com/ccxt/ccxt/pull/26790)
* fix(delta): assets request by [@ttodua](https://github.com/ttodua) in [#26797](https://github.com/ccxt/ccxt/pull/26797)
* coincatch exchange - update createOrder by [@yzh-pelle](https://github.com/yzh-pelle) in [#26801](https://github.com/ccxt/ccxt/pull/26801)
* go cli fix by [@caoilainnl](https://github.com/caoilainnl) in [#26805](https://github.com/ccxt/ccxt/pull/26805)
* fix(handleTriggerPrices): quick by [@ttodua](https://github.com/ttodua) in [#26806](https://github.com/ccxt/ccxt/pull/26806)
* feat: allow sharing markets between exchanges by [@pcriadoperez](https://github.com/pcriadoperez) in [#26685](https://github.com/ccxt/ccxt/pull/26685)
* fix(coinex): correct type in watchOrderBookForSymbols by [@sc0Vu](https://github.com/sc0Vu) in [#26808](https://github.com/ccxt/ccxt/pull/26808)
* feat(coinbase): add Ed25519 support by [@carlosmiei](https://github.com/carlosmiei) in [#26803](https://github.com/ccxt/ccxt/pull/26803)
* feat(bybit): watchMyTrades, add fast.execution by [@Dan-krm](https://github.com/Dan-krm) in [#26795](https://github.com/ccxt/ccxt/pull/26795)
* fix(ws): unsubscribe futures cleanup by [@pcriadoperez](https://github.com/pcriadoperez) in [#26785](https://github.com/ccxt/ccxt/pull/26785)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.3...v4.5.4](https://github.com/ccxt/ccxt/compare/v4.5.3...v4.5.4)
[Changes][v4.5.4]
# [v4.5.3](https://github.com/ccxt/ccxt/releases/tag/v4.5.3) - 2025-09-03 [#v453---2025-09-03]
## What's Changed [#whats-changed-75]
* fix(okx): default limit for history market candles by [@carlosmiei](https://github.com/carlosmiei) in [#26723](https://github.com/ccxt/ccxt/pull/26723)
* chore: skip changelog workflow run by [@carlosmiei](https://github.com/carlosmiei) in [#26722](https://github.com/ccxt/ccxt/pull/26722)
* feat(okx): createOrder, add trailingPrice support by [@Dan-krm](https://github.com/Dan-krm) in [#26721](https://github.com/ccxt/ccxt/pull/26721)
* fix(mexc): update timestamp for spot ticker by [@sc0Vu](https://github.com/sc0Vu) in [#26726](https://github.com/ccxt/ccxt/pull/26726)
* export-exchanges.js error indicator by [@caoilainnl](https://github.com/caoilainnl) in [#26730](https://github.com/ccxt/ccxt/pull/26730)
* fix(mexc): watch balance by [@ttodua](https://github.com/ttodua) in [#26734](https://github.com/ccxt/ccxt/pull/26734)
* feat(exchange): ws close put sleep to allow other futures to run by [@pcriadoperez](https://github.com/pcriadoperez) in [#26733](https://github.com/ccxt/ccxt/pull/26733)
* fix(binance): ws cancelAllOrdersWs by [@pcriadoperez](https://github.com/pcriadoperez) in [#26735](https://github.com/ccxt/ccxt/pull/26735)
* chore(bitget): inactive currencies pctn by [@ttodua](https://github.com/ttodua) in [#26743](https://github.com/ccxt/ccxt/pull/26743)
* feat(bitget): watchTrades, add uta support by [@Dan-krm](https://github.com/Dan-krm) in [#26745](https://github.com/ccxt/ccxt/pull/26745)
* chore(gemini): tmp symbol issues by [@ttodua](https://github.com/ttodua) in [#26744](https://github.com/ccxt/ccxt/pull/26744)
* feat(mexc): internal withdraw by [@ttodua](https://github.com/ttodua) in [#26741](https://github.com/ccxt/ccxt/pull/26741)
* feat(base): marketOrNull by [@ttodua](https://github.com/ttodua) in [#26742](https://github.com/ccxt/ccxt/pull/26742)
* fix(cli): reverse args if it's partial function by [@sc0Vu](https://github.com/sc0Vu) in [#26739](https://github.com/ccxt/ccxt/pull/26739)
* feat(base): add unWatch ticker by [@carlosmiei](https://github.com/carlosmiei) in [#26738](https://github.com/ccxt/ccxt/pull/26738)
* chore(deps): bump next from 15.2.4 to 15.4.7 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot)\[bot] in [#26746](https://github.com/ccxt/ccxt/pull/26746)
* exchange ohlcv timeframe types by [@caoilainnl](https://github.com/caoilainnl) in [#26748](https://github.com/ccxt/ccxt/pull/26748)
* fix(kucoinfutures): fetchFundingRateHistory empty res and rm some saf… by [@carlosmiei](https://github.com/carlosmiei) in [#26758](https://github.com/ccxt/ccxt/pull/26758)
* feat(kucoin): add unWatchTicker and unWatchOHLCV by [@carlosmiei](https://github.com/carlosmiei) in [#26761](https://github.com/ccxt/ccxt/pull/26761)
* Clear orderbook if `loadOrderBook` was not successful ([#26753](https://github.com/ccxt/ccxt/issues/26753) ) by [@yzh-pelle](https://github.com/yzh-pelle) in [#26754](https://github.com/ccxt/ccxt/pull/26754)
* feat(bitfinex): add unWatch by [@carlosmiei](https://github.com/carlosmiei) in [#26762](https://github.com/ccxt/ccxt/pull/26762)
* fix(gate): sandbox loading by [@carlosmiei](https://github.com/carlosmiei) in [#26764](https://github.com/ccxt/ccxt/pull/26764)
* fix(coincatch): fetchCurrencies parsing by [@carlosmiei](https://github.com/carlosmiei) in [#26765](https://github.com/ccxt/ccxt/pull/26765)
* htx rate limits by [@ndubel](https://github.com/ndubel) in [#26740](https://github.com/ccxt/ccxt/pull/26740)
* fix(binance): Use string for Binance PM quantity precision in order creation by [@JakkuSakura](https://github.com/JakkuSakura) in [#26737](https://github.com/ccxt/ccxt/pull/26737)
* chore: tmp disable multi thread test in c# by [@carlosmiei](https://github.com/carlosmiei) in [#26767](https://github.com/ccxt/ccxt/pull/26767)
## New Contributors [#new-contributors-42]
* [@JakkuSakura](https://github.com/JakkuSakura) made their first contribution in [#26737](https://github.com/ccxt/ccxt/pull/26737)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.2...v4.5.3](https://github.com/ccxt/ccxt/compare/v4.5.2...v4.5.3)
[Changes][v4.5.3]
# [v4.5.2](https://github.com/ccxt/ccxt/releases/tag/v4.5.2) - 2025-08-25 [#v452---2025-08-25]
## What's Changed [#whats-changed-76]
* change okx broker code by [@frosty00](https://github.com/frosty00) in [#26689](https://github.com/ccxt/ccxt/pull/26689)
* fix(okx): fix test by [@ttodua](https://github.com/ttodua) in [#26694](https://github.com/ccxt/ccxt/pull/26694)
* exceptionMessage c# fix by [@ttodua](https://github.com/ttodua) in [#22251](https://github.com/ccxt/ccxt/pull/22251)
* feat(bitget): watchOHLCV add uta support by [@Dan-krm](https://github.com/Dan-krm) in [#26678](https://github.com/ccxt/ccxt/pull/26678)
* chore(poloniex): max inactive currencies by [@ttodua](https://github.com/ttodua) in [#26693](https://github.com/ccxt/ccxt/pull/26693)
* fix!(ellipx): delist by [@ttodua](https://github.com/ttodua) in [#26692](https://github.com/ccxt/ccxt/pull/26692)
* fix!(vertex): delist by [@ttodua](https://github.com/ttodua) in [#26691](https://github.com/ccxt/ccxt/pull/26691)
* chore: add post-release workflow by [@carlosmiei](https://github.com/carlosmiei) in [#26698](https://github.com/ccxt/ccxt/pull/26698)
* chore(ascendex): inactive symbols skip by [@ttodua](https://github.com/ttodua) in [#26690](https://github.com/ccxt/ccxt/pull/26690)
* test(gemini): retest ws by [@ttodua](https://github.com/ttodua) in [#26688](https://github.com/ccxt/ccxt/pull/26688)
* fix(watchTests): make them go transpilable by [@carlosmiei](https://github.com/carlosmiei) in [#26700](https://github.com/ccxt/ccxt/pull/26700)
* fix(ohlcv): move timeframes to the correct place by [@carlosmiei](https://github.com/carlosmiei) in [#26702](https://github.com/ccxt/ccxt/pull/26702)
* zonda.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26701](https://github.com/ccxt/ccxt/pull/26701)
* base & binance - fix currency\_to\_precision by [@ttodua](https://github.com/ttodua) in [#18527](https://github.com/ccxt/ccxt/pull/18527)
* chore(bitmart): skip ^ by [@ttodua](https://github.com/ttodua) in [#26711](https://github.com/ccxt/ccxt/pull/26711)
* fix(kraken): ws error handling by [@carlosmiei](https://github.com/carlosmiei) in [#26714](https://github.com/ccxt/ccxt/pull/26714)
* fix(binance): cancelOrders with clientOrderIds by [@carlosmiei](https://github.com/carlosmiei) in [#26715](https://github.com/ccxt/ccxt/pull/26715)
* fix(hyperliquid): createOrderWs protect empty response by [@carlosmiei](https://github.com/carlosmiei) in [#26717](https://github.com/ccxt/ccxt/pull/26717)
* fix(bitget): active markets in go by [@carlosmiei](https://github.com/carlosmiei) in [#26719](https://github.com/ccxt/ccxt/pull/26719)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.1...v4.5.2](https://github.com/ccxt/ccxt/compare/v4.5.1...v4.5.2)
[Changes][v4.5.2]
# [v4.5.1](https://github.com/ccxt/ccxt/releases/tag/v4.5.1) - 2025-08-19 [#v451---2025-08-19]
## What's Changed [#whats-changed-77]
* feat(hibachi): add client header by [@gaoyuan-hibachi-xyz](https://github.com/gaoyuan-hibachi-xyz) in [#26649](https://github.com/ccxt/ccxt/pull/26649)
* lbank watchBalance adding by [@rayBastard](https://github.com/rayBastard) in [#26648](https://github.com/ccxt/ccxt/pull/26648)
* identify BadSymbol error by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#26651](https://github.com/ccxt/ccxt/pull/26651)
* tradeogre.has leverage markets by [@samgermain](https://github.com/samgermain) in [#26650](https://github.com/ccxt/ccxt/pull/26650)
* fix(mexc): fetchPositions symbol inference by [@carlosmiei](https://github.com/carlosmiei) in [#26647](https://github.com/ccxt/ccxt/pull/26647)
* timex.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26646](https://github.com/ccxt/ccxt/pull/26646)
* test(php): fix empty by [@ttodua](https://github.com/ttodua) in [#26653](https://github.com/ccxt/ccxt/pull/26653)
* fix(mexc): fix orderId parsing in watchOrders by [@ywallis](https://github.com/ywallis) in [#26652](https://github.com/ccxt/ccxt/pull/26652)
* fix(hyperliquid): process unknown orders correctly by [@carlosmiei](https://github.com/carlosmiei) in [#26656](https://github.com/ccxt/ccxt/pull/26656)
* fix(coinbase): ticker base & quote volume by [@ttodua](https://github.com/ttodua) in [#26657](https://github.com/ccxt/ccxt/pull/26657)
* feat(bitget): watchTicker(s) watchBidsAsks uta by [@Dan-krm](https://github.com/Dan-krm) in [#26654](https://github.com/ccxt/ccxt/pull/26654)
* feat(base): arraysConcat by [@ttodua](https://github.com/ttodua) in [#26658](https://github.com/ccxt/ccxt/pull/26658)
* fix(ws): throw exchange closed by user by [@pcriadoperez](https://github.com/pcriadoperez) in [#26661](https://github.com/ccxt/ccxt/pull/26661)
* fix(bybit): watchOrderBook new limits by [@ttodua](https://github.com/ttodua) in [#26660](https://github.com/ccxt/ccxt/pull/26660)
* test(currencies): max inactive amount by [@ttodua](https://github.com/ttodua) in [#26659](https://github.com/ccxt/ccxt/pull/26659)
* fix(gate): fetchOrderBook limits & watchOrderBook docs by [@ttodua](https://github.com/ttodua) in [#26664](https://github.com/ccxt/ccxt/pull/26664)
* fix(coinbase): protect against empty bids/asks by [@carlosmiei](https://github.com/carlosmiei) in [#26666](https://github.com/ccxt/ccxt/pull/26666)
* mexc networksById by [@ndubel](https://github.com/ndubel) in [#26667](https://github.com/ccxt/ccxt/pull/26667)
* feat(gate): loadMarkets options by [@ttodua](https://github.com/ttodua) in [#26574](https://github.com/ccxt/ccxt/pull/26574)
* fix(go): Currencies empty type and type LoadMarkets by [@carlosmiei](https://github.com/carlosmiei) in [#26668](https://github.com/ccxt/ccxt/pull/26668)
* docs(krakenfutures): renew all doc links by [@ttodua](https://github.com/ttodua) in [#26670](https://github.com/ccxt/ccxt/pull/26670)
* wavesexchange.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26673](https://github.com/ccxt/ccxt/pull/26673)
* fix(gemini): parse usdc markets by [@carlosmiei](https://github.com/carlosmiei) in [#26676](https://github.com/ccxt/ccxt/pull/26676)
* fix(hyperliquid): read id from ws message by [@carlosmiei](https://github.com/carlosmiei) in [#26677](https://github.com/ccxt/ccxt/pull/26677)
* fix(kraken) fixed currency renaming by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#26669](https://github.com/ccxt/ccxt/pull/26669)
## New Contributors [#new-contributors-43]
* [@gaoyuan-hibachi-xyz](https://github.com/gaoyuan-hibachi-xyz) made their first contribution in [#26649](https://github.com/ccxt/ccxt/pull/26649)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.5.0...v4.5.1](https://github.com/ccxt/ccxt/compare/v4.5.0...v4.5.1)
[Changes][v4.5.1]
# [v4.5.0](https://github.com/ccxt/ccxt/releases/tag/v4.5.0) - 2025-08-13 [#v450---2025-08-13]
## What's Changed [#whats-changed-78]
* chore(deps): bump protobuf from 5.29.3 to 5.29.5 by [@dependabot](https://github.com/dependabot)\[bot] in [#26639](https://github.com/ccxt/ccxt/pull/26639)
* feat(bitget): remove disabled from cancelOrder response test by [@Dan-krm](https://github.com/Dan-krm) in [#26638](https://github.com/ccxt/ccxt/pull/26638)
* fix(exchange): restore getHttpAgentIfNeeded by [@carlosmiei](https://github.com/carlosmiei) in [#26640](https://github.com/ccxt/ccxt/pull/26640)
* Revert "mexc(fix): add missing awaits ([#26401](https://github.com/ccxt/ccxt/issues/26401))" by [@carlosmiei](https://github.com/carlosmiei) in [#26642](https://github.com/ccxt/ccxt/pull/26642)
* chore: add smart-bump to release by [@carlosmiei](https://github.com/carlosmiei) in [#26643](https://github.com/ccxt/ccxt/pull/26643)
* fix(mexc): swap orderbooks by [@carlosmiei](https://github.com/carlosmiei) in [#26644](https://github.com/ccxt/ccxt/pull/26644)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.4.100...v4.5.0](https://github.com/ccxt/ccxt/compare/v4.4.100...v4.5.0)
[Changes][v4.5.0]
# [v4.4.100](https://github.com/ccxt/ccxt/releases/tag/v4.4.100) - 2025-08-12 [#v44100---2025-08-12]
## What's Changed [#whats-changed-79]
* onetrading.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26586](https://github.com/ccxt/ccxt/pull/26586)
* fix a typo by [@zhiqiangxu](https://github.com/zhiqiangxu) in [#26584](https://github.com/ccxt/ccxt/pull/26584)
* feat(bybit): add static test by [@carlosmiei](https://github.com/carlosmiei) in [#26588](https://github.com/ccxt/ccxt/pull/26588)
* feat(hyperliquid): add reserveRequestWeight by [@carlosmiei](https://github.com/carlosmiei) in [#26589](https://github.com/ccxt/ccxt/pull/26589)
* build fixes by [@caoilainnl](https://github.com/caoilainnl) in [#25218](https://github.com/ccxt/ccxt/pull/25218)
* ts type fixes by [@caoilainnl](https://github.com/caoilainnl) in [#26237](https://github.com/ccxt/ccxt/pull/26237)
* fix(c#): build warnings by [@carlosmiei](https://github.com/carlosmiei) in [#26590](https://github.com/ccxt/ccxt/pull/26590)
* ast-transpiler bump by [@caoilainnl](https://github.com/caoilainnl) in [#26580](https://github.com/ccxt/ccxt/pull/26580)
* fix(go): extend headers from options by [@carlosmiei](https://github.com/carlosmiei) in [#26594](https://github.com/ccxt/ccxt/pull/26594)
* p2b.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26601](https://github.com/ccxt/ccxt/pull/26601)
* probit.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26602](https://github.com/ccxt/ccxt/pull/26602)
* fix(hyperliquid): handle dynamic order status suffixes by [@gaugau3000](https://github.com/gaugau3000) in [#26598](https://github.com/ccxt/ccxt/pull/26598)
* feat(foxbit): adding quoteVolume field to ticker list and update logo by [@matheus-alcuri-foxbit](https://github.com/matheus-alcuri-foxbit) in [#26600](https://github.com/ccxt/ccxt/pull/26600)
* feat(hyperliquid): add support for cancelOrdersWs and cancelOrderWs, fixes error handling for createOrderWs by [@pcriadoperez](https://github.com/pcriadoperez) in [#26625](https://github.com/ccxt/ccxt/pull/26625)
* Mexc: unified network names by [@profyverya](https://github.com/profyverya) in [#26610](https://github.com/ccxt/ccxt/pull/26610)
* fix(lbank): ob spot order by [@carlosmiei](https://github.com/carlosmiei) in [#26632](https://github.com/ccxt/ccxt/pull/26632)
* fix(go): add market-related getters to IBaseExchange by [@carlosmiei](https://github.com/carlosmiei) in [#26631](https://github.com/ccxt/ccxt/pull/26631)
* fix(bitget): support fetching order with clientOrderId by [@carlosmiei](https://github.com/carlosmiei) in [#26617](https://github.com/ccxt/ccxt/pull/26617)
* Bingx: add fund/v1/account/balance by [@profyverya](https://github.com/profyverya) in [#26628](https://github.com/ccxt/ccxt/pull/26628)
* doc(kucoinfutures): fetchBalance jsdoc by [@ttodua](https://github.com/ttodua) in [#26608](https://github.com/ccxt/ccxt/pull/26608)
* Bingx: unified networks by [@profyverya](https://github.com/profyverya) in [#26611](https://github.com/ccxt/ccxt/pull/26611)
* fix(ws): handle errors in ws php failing in several exchanges by [@pcriadoperez](https://github.com/pcriadoperez) in [#26626](https://github.com/ccxt/ccxt/pull/26626)
* fix: account-log endpoint defined as private by [@not-peter](https://github.com/not-peter) in [#26604](https://github.com/ccxt/ccxt/pull/26604)
* fix: add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#26636](https://github.com/ccxt/ccxt/pull/26636)
* feat(bitget): cancelOrder, add clientOrderId support by [@Dan-krm](https://github.com/Dan-krm) in [#26620](https://github.com/ccxt/ccxt/pull/26620)
* feat(mexc): protobuf support by [@carlosmiei](https://github.com/carlosmiei) in [#26606](https://github.com/ccxt/ccxt/pull/26606)
* enhancement: added side to watchLiquidations Binance, bybit, okx by [@lucasjamar](https://github.com/lucasjamar) in [#26622](https://github.com/ccxt/ccxt/pull/26622)
* chore: fix php action and ob fix by [@carlosmiei](https://github.com/carlosmiei) in [#26637](https://github.com/ccxt/ccxt/pull/26637)
## New Contributors [#new-contributors-44]
* [@zhiqiangxu](https://github.com/zhiqiangxu) made their first contribution in [#26584](https://github.com/ccxt/ccxt/pull/26584)
* [@gaugau3000](https://github.com/gaugau3000) made their first contribution in [#26598](https://github.com/ccxt/ccxt/pull/26598)
* [@matheus-alcuri-foxbit](https://github.com/matheus-alcuri-foxbit) made their first contribution in [#26600](https://github.com/ccxt/ccxt/pull/26600)
* [@not-peter](https://github.com/not-peter) made their first contribution in [#26604](https://github.com/ccxt/ccxt/pull/26604)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.4.99...v4.4.100](https://github.com/ccxt/ccxt/compare/v4.4.99...v4.4.100)
[Changes][v4.4.100]
# [v4.4.99](https://github.com/ccxt/ccxt/releases/tag/v4.4.99) - 2025-08-06 [#v4499---2025-08-06]
## What's Changed [#whats-changed-80]
* feat(bitget): unified trading account support by [@Dan-krm](https://github.com/Dan-krm) in [#26272](https://github.com/ccxt/ccxt/pull/26272)
* fix transpileCryptoTestsToGo with new ast-transpiler by [@caoilainnl](https://github.com/caoilainnl) in [#26548](https://github.com/ccxt/ccxt/pull/26548)
* Gate(fix): update MATIC chain name by [@profyverya](https://github.com/profyverya) in [#26559](https://github.com/ccxt/ccxt/pull/26559)
* Coinex(fix): parse network names by [@profyverya](https://github.com/profyverya) in [#26553](https://github.com/ccxt/ccxt/pull/26553)
* fix(example): first timestamp check by [@ttodua](https://github.com/ttodua) in [#26551](https://github.com/ccxt/ccxt/pull/26551)
* Bitget(fix): BEP20 network name by [@profyverya](https://github.com/profyverya) in [#26552](https://github.com/ccxt/ccxt/pull/26552)
* fix(bybit): increase max pagination calls for bybit leverage tiers by [@xmatthias](https://github.com/xmatthias) in [#26561](https://github.com/ccxt/ccxt/pull/26561)
* fix(bitget): throw if order not found by [@carlosmiei](https://github.com/carlosmiei) in [#26565](https://github.com/ccxt/ccxt/pull/26565)
* handleErrorMessage return type, watchLiquidationsForSymbols unification by [@caoilainnl](https://github.com/caoilainnl) in [#26558](https://github.com/ccxt/ccxt/pull/26558)
* transpiler fix typescript errors by [@caoilainnl](https://github.com/caoilainnl) in [#26568](https://github.com/ccxt/ccxt/pull/26568)
* \`novadax.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26567](https://github.com/ccxt/ccxt/pull/26567)
* generateImplicitApi typescript errors by [@caoilainnl](https://github.com/caoilainnl) in [#26571](https://github.com/ccxt/ccxt/pull/26571)
* chore: improve go action by [@carlosmiei](https://github.com/carlosmiei) in [#26566](https://github.com/ccxt/ccxt/pull/26566)
* feat(bybit): withdraw endpoint accountType update by [@Dan-krm](https://github.com/Dan-krm) in [#26555](https://github.com/ccxt/ccxt/pull/26555)
* fix(binance): market by [@sc0Vu](https://github.com/sc0Vu) in [#26570](https://github.com/ccxt/ccxt/pull/26570)
* fix go warnings by [@caoilainnl](https://github.com/caoilainnl) in [#26572](https://github.com/ccxt/ccxt/pull/26572)
* fix(cryptocom): fetchOrderBook limit by [@ttodua](https://github.com/ttodua) in [#26563](https://github.com/ccxt/ccxt/pull/26563)
* Coinex: implement fetchDepositWithdrawFees method by [@profyverya](https://github.com/profyverya) in [#26576](https://github.com/ccxt/ccxt/pull/26576)
* chore: rm command from package.json by [@carlosmiei](https://github.com/carlosmiei) in [#26578](https://github.com/ccxt/ccxt/pull/26578)
* feat: add Hibachi exchange by [@carlosmiei](https://github.com/carlosmiei) in [#26550](https://github.com/ccxt/ccxt/pull/26550)
* fix(gate): rm network key polygon by [@carlosmiei](https://github.com/carlosmiei) in [#26582](https://github.com/ccxt/ccxt/pull/26582)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.4.98...v4.4.99](https://github.com/ccxt/ccxt/compare/v4.4.98...v4.4.99)
[Changes][v4.4.99]
# [v4.4.98](https://github.com/ccxt/ccxt/releases/tag/v4.4.98) - 2025-08-01 [#v4498---2025-08-01]
## What's Changed [#whats-changed-81]
* chore: update-js-only release by [@carlosmiei](https://github.com/carlosmiei) in [#26536](https://github.com/ccxt/ccxt/pull/26536)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#26540](https://github.com/ccxt/ccxt/pull/26540)
* Ndax has by [@samgermain](https://github.com/samgermain) in [#26538](https://github.com/ccxt/ccxt/pull/26538)
* fix(c#): aggregate implementation by [@carlosmiei](https://github.com/carlosmiei) in [#26541](https://github.com/ccxt/ccxt/pull/26541)
* feat(bitget): use "recent" endpoints for mark/index candles by [@xmatthias](https://github.com/xmatthias) in [#26537](https://github.com/ccxt/ccxt/pull/26537)
* okx error mapping by [@ndubel](https://github.com/ndubel) in [#26542](https://github.com/ccxt/ccxt/pull/26542)
* chore: revert accidental bybit comment typo by [@xmatthias](https://github.com/xmatthias) in [#26544](https://github.com/ccxt/ccxt/pull/26544)
* fix different build issues by [@ttodua](https://github.com/ttodua) in [#26543](https://github.com/ccxt/ccxt/pull/26543)
* fix(python): decimalToPrecision - precision arg by [@ttodua](https://github.com/ttodua) in [#26547](https://github.com/ccxt/ccxt/pull/26547)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.4.97...v4.4.98](https://github.com/ccxt/ccxt/compare/v4.4.97...v4.4.98)
[Changes][v4.4.98]
# [v4.4.97](https://github.com/ccxt/ccxt/releases/tag/v4.4.97) - 2025-07-30 [#v4497---2025-07-30]
## What's Changed [#whats-changed-82]
* feat(base) - calculateFeeWithRate by [@ttodua](https://github.com/ttodua) in [#23439](https://github.com/ccxt/ccxt/pull/23439)
* docs(template): shorter preamble by [@ttodua](https://github.com/ttodua) in [#26286](https://github.com/ccxt/ccxt/pull/26286)
* hashkey.has - leverage methods by [@samgermain](https://github.com/samgermain) in [#26488](https://github.com/ccxt/ccxt/pull/26488)
* fix(base): types for fetchDepositWithdrawFee && fetchDepositWithdrawFees by [@ttodua](https://github.com/ttodua) in [#26486](https://github.com/ccxt/ccxt/pull/26486)
* fix(binance): fetchMarkets options by [@ttodua](https://github.com/ttodua) in [#26463](https://github.com/ccxt/ccxt/pull/26463)
* fix(foxbit): update logo by [@carlosmiei](https://github.com/carlosmiei) in [#26490](https://github.com/ccxt/ccxt/pull/26490)
* fix(gate): fetchWithdrawals until parsing by [@carlosmiei](https://github.com/carlosmiei) in [#26497](https://github.com/ccxt/ccxt/pull/26497)
* independentreserve.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26495](https://github.com/ccxt/ccxt/pull/26495)
* feat: test prod env by [@carlosmiei](https://github.com/carlosmiei) in [#26500](https://github.com/ccxt/ccxt/pull/26500)
* feat: actions, use prod env by [@carlosmiei](https://github.com/carlosmiei) in [#26501](https://github.com/ccxt/ccxt/pull/26501)
* Rm prod test by [@carlosmiei](https://github.com/carlosmiei) in [#26502](https://github.com/ccxt/ccxt/pull/26502)
* feat(cryptocom): add fetchFundingRate by [@lucasjamar](https://github.com/lucasjamar) in [#26498](https://github.com/ccxt/ccxt/pull/26498)
* Add USDC support, add new endpoint PUT /g-orders/create by [@marioarranzr](https://github.com/marioarranzr) in [#26507](https://github.com/ccxt/ccxt/pull/26507)
* chore: remove dev dep esmify by [@carlosmiei](https://github.com/carlosmiei) in [#26511](https://github.com/ccxt/ccxt/pull/26511)
* Update package log 3 by [@carlosmiei](https://github.com/carlosmiei) in [#26512](https://github.com/ccxt/ccxt/pull/26512)
* feat(hyperliquid): support non-usdc tokens for subaccount transfer by [@zlfn](https://github.com/zlfn) in [#26499](https://github.com/ccxt/ccxt/pull/26499)
* fix(go): exclude BrokerCode from msgpack in OrderMessage to fix Hyperliquid order signature error by [@tttpeng](https://github.com/tttpeng) in [#26521](https://github.com/ccxt/ccxt/pull/26521)
* luno.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26518](https://github.com/ccxt/ccxt/pull/26518)
* fetchPaginatedCallDynamic until param spelling by [@caoilainnl](https://github.com/caoilainnl) in [#26514](https://github.com/ccxt/ccxt/pull/26514)
* latoken.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26513](https://github.com/ccxt/ccxt/pull/26513)
* Make TARA network uppercase in Kucoin, unify optimism name in gate and kucoin by [@profyverya](https://github.com/profyverya) in [#26523](https://github.com/ccxt/ccxt/pull/26523)
* indodax.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26510](https://github.com/ccxt/ccxt/pull/26510)
* refactor(defaultTradeId): move to base by [@ttodua](https://github.com/ttodua) in [#26478](https://github.com/ccxt/ccxt/pull/26478)
* feat(bybit): unWatchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#26519](https://github.com/ccxt/ccxt/pull/26519)
* decimalToPrecision - update all langs by [@ttodua](https://github.com/ttodua) in [#26289](https://github.com/ccxt/ccxt/pull/26289)
* fix(exmo): correct from parameter by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#26524](https://github.com/ccxt/ccxt/pull/26524)
* feat(binance): add apis by [@sc0Vu](https://github.com/sc0Vu) in [#26530](https://github.com/ccxt/ccxt/pull/26530)
* fix(go): omitempty builder by [@sc0Vu](https://github.com/sc0Vu) in [#26531](https://github.com/ccxt/ccxt/pull/26531)
* mercado.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26532](https://github.com/ccxt/ccxt/pull/26532)
* fix(python): socksProxy by [@ttodua](https://github.com/ttodua) in [#26527](https://github.com/ccxt/ccxt/pull/26527)
* fix(binance): fetchTickers for rolling window by [@ttodua](https://github.com/ttodua) in [#26528](https://github.com/ccxt/ccxt/pull/26528)
* fix(c#): stackoverflow and concurrency issue by [@carlosmiei](https://github.com/carlosmiei) in [#26534](https://github.com/ccxt/ccxt/pull/26534)
## New Contributors [#new-contributors-45]
* [@lucasjamar](https://github.com/lucasjamar) made their first contribution in [#26498](https://github.com/ccxt/ccxt/pull/26498)
* [@marioarranzr](https://github.com/marioarranzr) made their first contribution in [#26507](https://github.com/ccxt/ccxt/pull/26507)
* [@zlfn](https://github.com/zlfn) made their first contribution in [#26499](https://github.com/ccxt/ccxt/pull/26499)
* [@tttpeng](https://github.com/tttpeng) made their first contribution in [#26521](https://github.com/ccxt/ccxt/pull/26521)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.96...v4.4.97](https://github.com/ccxt/ccxt/compare/go/v4.4.96...v4.4.97)
[Changes][v4.4.97]
# [v4.4.96](https://github.com/ccxt/ccxt/releases/tag/v4.4.96) - 2025-07-23 [#v4496---2025-07-23]
## What's Changed [#whats-changed-83]
* coinspot.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26437](https://github.com/ccxt/ccxt/pull/26437)
* feat: give option to return exchange headers in request by [@pcriadoperez](https://github.com/pcriadoperez) in [#26403](https://github.com/ccxt/ccxt/pull/26403)
* fix(future): handle exception when future is cancelled by [@carlosmiei](https://github.com/carlosmiei) in [#26442](https://github.com/ccxt/ccxt/pull/26442)
* fix(tests): rm returnResponseheaders test by [@carlosmiei](https://github.com/carlosmiei) in [#26444](https://github.com/ccxt/ccxt/pull/26444)
* fix(hyperliquid): refix limit rate by [@ttodua](https://github.com/ttodua) in [#26445](https://github.com/ccxt/ccxt/pull/26445)
* fix(cs): add throttler Lock by [@carlosmiei](https://github.com/carlosmiei) in [#26452](https://github.com/ccxt/ccxt/pull/26452)
* fix different issues by [@ttodua](https://github.com/ttodua) in [#26459](https://github.com/ccxt/ccxt/pull/26459)
* Bitget - fix 2 by [@ttodua](https://github.com/ttodua) in [#26454](https://github.com/ccxt/ccxt/pull/26454)
* GO-lang: reduce lib size by [@ttodua](https://github.com/ttodua) in [#26070](https://github.com/ccxt/ccxt/pull/26070)
* bybit, okx - unify fetchMarkets options by [@ttodua](https://github.com/ttodua) in [#26391](https://github.com/ccxt/ccxt/pull/26391)
* Cryptomus has by [@samgermain](https://github.com/samgermain) in [#26461](https://github.com/ccxt/ccxt/pull/26461)
* chore(exchange): add test for invalid state for python future by [@pcriadoperez](https://github.com/pcriadoperez) in [#26457](https://github.com/ccxt/ccxt/pull/26457)
* fix(bitrue): fetchMarkets options by [@ttodua](https://github.com/ttodua) in [#26462](https://github.com/ccxt/ccxt/pull/26462)
* mexc parseTransaction fix by [@ndubel](https://github.com/ndubel) in [#26470](https://github.com/ccxt/ccxt/pull/26470)
* feat(go): add typed interface by [@carlosmiei](https://github.com/carlosmiei) in [#26466](https://github.com/ccxt/ccxt/pull/26466)
* removed delisted exchange cs and go files by [@caoilainnl](https://github.com/caoilainnl) in [#26476](https://github.com/ccxt/ccxt/pull/26476)
* Elippx has by [@samgermain](https://github.com/samgermain) in [#26474](https://github.com/ccxt/ccxt/pull/26474)
* fix(go): transpiler single exchange by [@carlosmiei](https://github.com/carlosmiei) in [#26479](https://github.com/ccxt/ccxt/pull/26479)
* feat: add FoxBit by [@carlosmiei](https://github.com/carlosmiei) in [#26477](https://github.com/ccxt/ccxt/pull/26477)
* fix(go): return pointer instead of struct with NewX() by [@carlosmiei](https://github.com/carlosmiei) in [#26481](https://github.com/ccxt/ccxt/pull/26481)
* fix(cli): make import error more clear by [@carlosmiei](https://github.com/carlosmiei) in [#26482](https://github.com/ccxt/ccxt/pull/26482)
* feat(paradex): add cancelReason by [@carlosmiei](https://github.com/carlosmiei) in [#26485](https://github.com/ccxt/ccxt/pull/26485)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.95...v4.4.96](https://github.com/ccxt/ccxt/compare/go/v4.4.95...v4.4.96)
[Changes][v4.4.96]
# [v4.4.95](https://github.com/ccxt/ccxt/releases/tag/v4.4.95) - 2025-07-17 [#v4495---2025-07-17]
## What's Changed [#whats-changed-84]
* fix(example): missing break ^ by [@ttodua](https://github.com/ttodua) in [#26406](https://github.com/ccxt/ccxt/pull/26406)
* coinbase leverage methods by [@samgermain](https://github.com/samgermain) in [#26405](https://github.com/ccxt/ccxt/pull/26405)
* fix(go): run live-tests on the pipeline by [@carlosmiei](https://github.com/carlosmiei) in [#26400](https://github.com/ccxt/ccxt/pull/26400)
* Bitget isMarginTradingAllowed bug by [@caoilainnl](https://github.com/caoilainnl) in [#26412](https://github.com/ccxt/ccxt/pull/26412)
* mexc(fix): add missing awaits by [@profyverya](https://github.com/profyverya) in [#26401](https://github.com/ccxt/ccxt/pull/26401)
* fix(cli): loading keys ^ by [@ttodua](https://github.com/ttodua) in [#26371](https://github.com/ccxt/ccxt/pull/26371)
* feat: schedule futures using microtasks in typescript and js by [@pcriadoperez](https://github.com/pcriadoperez) in [#26408](https://github.com/ccxt/ccxt/pull/26408)
* bitstamp error mapping by [@ndubel](https://github.com/ndubel) in [#26417](https://github.com/ccxt/ccxt/pull/26417)
* fix(blofin): fetchFundingRateHistory pagination by [@carlosmiei](https://github.com/carlosmiei) in [#26418](https://github.com/ccxt/ccxt/pull/26418)
* coinmate.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26419](https://github.com/ccxt/ccxt/pull/26419)
* feat: clean history in go/v4 by [@sc0Vu](https://github.com/sc0Vu) in [#26423](https://github.com/ccxt/ccxt/pull/26423)
* fix(bybit): fetchFundingHistory amount value by [@Dan-krm](https://github.com/Dan-krm) in [#26427](https://github.com/ccxt/ccxt/pull/26427)
* coinone.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26429](https://github.com/ccxt/ccxt/pull/26429)
* fix(exchange): tenary in python by [@sc0Vu](https://github.com/sc0Vu) in [#26433](https://github.com/ccxt/ccxt/pull/26433)
* fix(cs): fix case issue by [@ttodua](https://github.com/ttodua) in [#26432](https://github.com/ccxt/ccxt/pull/26432)
* fix(future): check if cancelled first by [@carlosmiei](https://github.com/carlosmiei) in [#26424](https://github.com/ccxt/ccxt/pull/26424)
* coinsph.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26430](https://github.com/ccxt/ccxt/pull/26430)
* fix(gate): fetchDeposits until conversion by [@carlosmiei](https://github.com/carlosmiei) in [#26434](https://github.com/ccxt/ccxt/pull/26434)
* fix(hyperliquid): candles RL fix by [@ttodua](https://github.com/ttodua) in [#26428](https://github.com/ccxt/ccxt/pull/26428)
* fix(hyperliquid): currency baseName by [@carlosmiei](https://github.com/carlosmiei) in [#26425](https://github.com/ccxt/ccxt/pull/26425)
* feat(woo): v3 apis by [@sc0Vu](https://github.com/sc0Vu) in [#26330](https://github.com/ccxt/ccxt/pull/26330)
* bingx exchange currencies update by [@yzh-pelle](https://github.com/yzh-pelle) in [#26421](https://github.com/ccxt/ccxt/pull/26421)
* fix(kraken) watchOrderBookForSymbols by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#26422](https://github.com/ccxt/ccxt/pull/26422)
* fix(woo): go request tests by [@carlosmiei](https://github.com/carlosmiei) in [#26435](https://github.com/ccxt/ccxt/pull/26435)
* feat(bingx): transfer, fetchTransfers, new endpoints and url by [@Dan-krm](https://github.com/Dan-krm) in [#26359](https://github.com/ccxt/ccxt/pull/26359)
* fix(go): missing go files by [@carlosmiei](https://github.com/carlosmiei) in [#26436](https://github.com/ccxt/ccxt/pull/26436)
* Fix go tests static by [@carlosmiei](https://github.com/carlosmiei) in [#26438](https://github.com/ccxt/ccxt/pull/26438)
* fix(build): go build command by [@carlosmiei](https://github.com/carlosmiei) in [#26439](https://github.com/ccxt/ccxt/pull/26439)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.4.94...v4.4.95](https://github.com/ccxt/ccxt/compare/v4.4.94...v4.4.95)
[Changes][v4.4.95]
# [v4.4.94](https://github.com/ccxt/ccxt/releases/tag/v4.4.94) - 2025-07-11 [#v4494---2025-07-11]
## What's Changed [#whats-changed-85]
* fix(wavesexchange): public buy sell trades by [@ttodua](https://github.com/ttodua) in [#26383](https://github.com/ccxt/ccxt/pull/26383)
* chore(tests): minor skips by [@ttodua](https://github.com/ttodua) in [#26372](https://github.com/ccxt/ccxt/pull/26372)
* feat(hyperliquid): support subaccount by [@sc0Vu](https://github.com/sc0Vu) in [#26340](https://github.com/ccxt/ccxt/pull/26340)
* fix(hyperliquid): kBase pairs fix by [@carlosmiei](https://github.com/carlosmiei) in [#26385](https://github.com/ccxt/ccxt/pull/26385)
* fix(hyperliquid): build order by [@carlosmiei](https://github.com/carlosmiei) in [#26386](https://github.com/ccxt/ccxt/pull/26386)
* tests(fetchTickers): add checks for markets & calculations & etc by [@ttodua](https://github.com/ttodua) in [#26334](https://github.com/ccxt/ccxt/pull/26334)
* fix(coinmetro): broken markets by [@ttodua](https://github.com/ttodua) in [#26389](https://github.com/ccxt/ccxt/pull/26389)
* docs(hedge): createOrder param by [@ttodua](https://github.com/ttodua) in [#26393](https://github.com/ccxt/ccxt/pull/26393)
* fix(bybit): spot tp/sl type 2 orders by [@carlosmiei](https://github.com/carlosmiei) in [#26394](https://github.com/ccxt/ccxt/pull/26394)
* fix(coinbase): try map balance errors by [@carlosmiei](https://github.com/carlosmiei) in [#26395](https://github.com/ccxt/ccxt/pull/26395)
* fix(okx): createOrder, omit tgtCcy param in edge case by [@Dan-krm](https://github.com/Dan-krm) in [#26382](https://github.com/ccxt/ccxt/pull/26382)
* fix(htx): fetchFundingRateHistory pagination by [@carlosmiei](https://github.com/carlosmiei) in [#26396](https://github.com/ccxt/ccxt/pull/26396)
* chore(repo): remove file by [@ttodua](https://github.com/ttodua) in [#26390](https://github.com/ccxt/ccxt/pull/26390)
* chore(repo): remove phpunit remnant by [@ttodua](https://github.com/ttodua) in [#26392](https://github.com/ccxt/ccxt/pull/26392)
* feat(okx): add static tests for balance by [@carlosmiei](https://github.com/carlosmiei) in [#26397](https://github.com/ccxt/ccxt/pull/26397)
* feat(okx): fetchBalance, enable negative balances by [@Dan-krm](https://github.com/Dan-krm) in [#26381](https://github.com/ccxt/ccxt/pull/26381)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.93...v4.4.94](https://github.com/ccxt/ccxt/compare/go/v4.4.93...v4.4.94)
[Changes][v4.4.94]
# [v4.4.93](https://github.com/ccxt/ccxt/releases/tag/v4.4.93) - 2025-07-09 [#v4493---2025-07-09]
## What's Changed [#whats-changed-86]
* fix(exmo): fetchCurrencies reorg & networks implementation by [@ttodua](https://github.com/ttodua) in [#26011](https://github.com/ccxt/ccxt/pull/26011)
* fix(cryptomus): fetchCurrencies reorg 2 by [@ttodua](https://github.com/ttodua) in [#26258](https://github.com/ccxt/ccxt/pull/26258)
* fix(latoken): fetchCUrrencies reorg & tests by [@ttodua](https://github.com/ttodua) in [#26042](https://github.com/ccxt/ccxt/pull/26042)
* fix(kucoin): fetchCurrencies reorg & struct by [@ttodua](https://github.com/ttodua) in [#26039](https://github.com/ccxt/ccxt/pull/26039)
* fix(coinex): error code ^ by [@ttodua](https://github.com/ttodua) in [#26329](https://github.com/ccxt/ccxt/pull/26329)
* fix(ascendex): order parsing by [@ttodua](https://github.com/ttodua) in [#26328](https://github.com/ccxt/ccxt/pull/26328)
* fix(hyperliquid): sanitize baseName by [@carlosmiei](https://github.com/carlosmiei) in [#26332](https://github.com/ccxt/ccxt/pull/26332)
* fix(bitstamp): ws orders parsing by [@ttodua](https://github.com/ttodua) in [#26331](https://github.com/ccxt/ccxt/pull/26331)
* fix(bybit): unWatch orders/mytrades by [@carlosmiei](https://github.com/carlosmiei) in [#26326](https://github.com/ccxt/ccxt/pull/26326)
* fix(lbank): ratelimit endpoint fix by [@ttodua](https://github.com/ttodua) in [#26337](https://github.com/ccxt/ccxt/pull/26337)
* feat(binance, paradex): new fetchAllGreeks method by [@Dan-krm](https://github.com/Dan-krm) in [#26335](https://github.com/ccxt/ccxt/pull/26335)
* fix(ws): network error on closed connection by [@pcriadoperez](https://github.com/pcriadoperez) in [#26339](https://github.com/ccxt/ccxt/pull/26339)
* fix(go): add NewGreeksArray by [@carlosmiei](https://github.com/carlosmiei) in [#26341](https://github.com/ccxt/ccxt/pull/26341)
* fix(go): default nil for markets by [@carlosmiei](https://github.com/carlosmiei) in [#26342](https://github.com/ccxt/ccxt/pull/26342)
* go cli MapToSafeMap fix by [@caoilainnl](https://github.com/caoilainnl) in [#26346](https://github.com/ccxt/ccxt/pull/26346)
* fix(coinex): add margin property by [@profyverya](https://github.com/profyverya) in [#26350](https://github.com/ccxt/ccxt/pull/26350)
* fix(coincheck): createOrder market order by [@ttodua](https://github.com/ttodua) in [#26361](https://github.com/ccxt/ccxt/pull/26361)
* fix(lbank): inverse & some props by [@ttodua](https://github.com/ttodua) in [#26363](https://github.com/ccxt/ccxt/pull/26363)
* fix(binance): fetchSettlementHistory symbol not required by [@carlosmiei](https://github.com/carlosmiei) in [#26356](https://github.com/ccxt/ccxt/pull/26356)
* feat(okx, bybit): add fetchAllGreeks by [@Dan-krm](https://github.com/Dan-krm) in [#26345](https://github.com/ccxt/ccxt/pull/26345)
* fix(coinex): currency networks by [@profyverya](https://github.com/profyverya) in [#26349](https://github.com/ccxt/ccxt/pull/26349)
* okx - order comments ^ by [@ttodua](https://github.com/ttodua) in [#26347](https://github.com/ccxt/ccxt/pull/26347)
* fix(coinex): add active property to spot markets by [@profyverya](https://github.com/profyverya) in [#26348](https://github.com/ccxt/ccxt/pull/26348)
* fix(base): parsePrecision by [@ttodua](https://github.com/ttodua) in [#26357](https://github.com/ccxt/ccxt/pull/26357)
* fix(bybit): sign in go by [@carlosmiei](https://github.com/carlosmiei) in [#26365](https://github.com/ccxt/ccxt/pull/26365)
* coincheck leverage methods by [@samgermain](https://github.com/samgermain) in [#26368](https://github.com/ccxt/ccxt/pull/26368)
* coinbaseexchange leverage methods by [@samgermain](https://github.com/samgermain) in [#26367](https://github.com/ccxt/ccxt/pull/26367)
* feat(bybit): option for enable markprice instead of entryprice by [@ttodua](https://github.com/ttodua) in [#26358](https://github.com/ccxt/ccxt/pull/26358)
* fix(triggerDirection): unify across several exchanges by [@ttodua](https://github.com/ttodua) in [#26369](https://github.com/ccxt/ccxt/pull/26369)
* fix(kucoin): trigger param by [@ttodua](https://github.com/ttodua) in [#26373](https://github.com/ccxt/ccxt/pull/26373)
* fix(deribit): parseposition fixes by [@ttodua](https://github.com/ttodua) in [#26370](https://github.com/ccxt/ccxt/pull/26370)
## New Contributors [#new-contributors-46]
* [@caoilainnl](https://github.com/caoilainnl) made their first contribution in [#26346](https://github.com/ccxt/ccxt/pull/26346)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.4.92...v4.4.93](https://github.com/ccxt/ccxt/compare/v4.4.92...v4.4.93)
[Changes][v4.4.93]
# [v4.4.92](https://github.com/ccxt/ccxt/releases/tag/v4.4.92) - 2025-07-01 [#v4492---2025-07-01]
## What's Changed [#whats-changed-87]
* Make Markets Mutex public by [@Um11aut](https://github.com/Um11aut) in [#26297](https://github.com/ccxt/ccxt/pull/26297)
* feat(lbank): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#26044](https://github.com/ccxt/ccxt/pull/26044)
* fix(exmo): fetchCurrencies multi req by [@ttodua](https://github.com/ttodua) in [#26244](https://github.com/ccxt/ccxt/pull/26244)
* chore: add single-js-build script by [@carlosmiei](https://github.com/carlosmiei) in [#26304](https://github.com/ccxt/ccxt/pull/26304)
* fix(lbank): fc endpoint by [@ttodua](https://github.com/ttodua) in [#26303](https://github.com/ccxt/ccxt/pull/26303)
* Go lock fix by [@carlosmiei](https://github.com/carlosmiei) in [#26310](https://github.com/ccxt/ccxt/pull/26310)
* fix(goTranspiler): rename old variables by [@carlosmiei](https://github.com/carlosmiei) in [#26306](https://github.com/ccxt/ccxt/pull/26306)
* fix(bybit): unwatchOrders and unwatchMyTrades by [@pcriadoperez](https://github.com/pcriadoperez) in [#26313](https://github.com/ccxt/ccxt/pull/26313)
* fix(client): reject error by [@carlosmiei](https://github.com/carlosmiei) in [#26314](https://github.com/ccxt/ccxt/pull/26314)
* fix(go): Yymmdd infix by [@carlosmiei](https://github.com/carlosmiei) in [#26316](https://github.com/ccxt/ccxt/pull/26316)
* fix(python): websocket rejections by [@pcriadoperez](https://github.com/pcriadoperez) in [#26319](https://github.com/ccxt/ccxt/pull/26319)
* docs(bitmart): add stpMode by [@sc0Vu](https://github.com/sc0Vu) in [#26318](https://github.com/ccxt/ccxt/pull/26318)
* fix(bitvavo): throw if operatorId not found by [@carlosmiei](https://github.com/carlosmiei) in [#26321](https://github.com/ccxt/ccxt/pull/26321)
* fix(bitvavo): static tests by [@carlosmiei](https://github.com/carlosmiei) in [#26323](https://github.com/ccxt/ccxt/pull/26323)
* fix(types): add session to constructor args by [@carlosmiei](https://github.com/carlosmiei) in [#26322](https://github.com/ccxt/ccxt/pull/26322)
* feat: make Options and Currencies thread-safe in go \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#26308](https://github.com/ccxt/ccxt/pull/26308)
* fix(cs): build base/quote Currencies by [@carlosmiei](https://github.com/carlosmiei) in [#26325](https://github.com/ccxt/ccxt/pull/26325)
## New Contributors [#new-contributors-47]
* [@Um11aut](https://github.com/Um11aut) made their first contribution in [#26297](https://github.com/ccxt/ccxt/pull/26297)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.4.91...v4.4.92](https://github.com/ccxt/ccxt/compare/v4.4.91...v4.4.92)
[Changes][v4.4.92]
# [v4.4.91](https://github.com/ccxt/ccxt/releases/tag/v4.4.91) - 2025-06-24 [#v4491---2025-06-24]
## What's Changed [#whats-changed-88]
* Reverts the messageQueue by [@frosty00](https://github.com/frosty00) in [#26248](https://github.com/ccxt/ccxt/pull/26248)
* chore(gate): retest props by [@ttodua](https://github.com/ttodua) in [#26247](https://github.com/ccxt/ccxt/pull/26247)
* chore(fmfwio): prop test by [@ttodua](https://github.com/ttodua) in [#26246](https://github.com/ccxt/ccxt/pull/26246)
* chore(paradex): skip ticker by [@ttodua](https://github.com/ttodua) in [#26232](https://github.com/ccxt/ccxt/pull/26232)
* fix!(coinlist): delist by [@ttodua](https://github.com/ttodua) in [#26137](https://github.com/ccxt/ccxt/pull/26137)
* chore(cryptocom): unskip tests by [@ttodua](https://github.com/ttodua) in [#26227](https://github.com/ccxt/ccxt/pull/26227)
* chore(modetrade): skip test redo by [@ttodua](https://github.com/ttodua) in [#26226](https://github.com/ccxt/ccxt/pull/26226)
* cli: remove --history by [@sc0Vu](https://github.com/sc0Vu) in [#26253](https://github.com/ccxt/ccxt/pull/26253)
* Restore fast client behaviour in python websockets by [@frosty00](https://github.com/frosty00) in [#26254](https://github.com/ccxt/ccxt/pull/26254)
* cex.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26251](https://github.com/ccxt/ccxt/pull/26251)
* chore(cryptomus): unskip tests by [@ttodua](https://github.com/ttodua) in [#26228](https://github.com/ccxt/ccxt/pull/26228)
* fix(exmo): fetchMarkets fixes by [@ttodua](https://github.com/ttodua) in [#26243](https://github.com/ccxt/ccxt/pull/26243)
* fix(c#): disable most warnings and upgrade dotnet by [@carlosmiei](https://github.com/carlosmiei) in [#26262](https://github.com/ccxt/ccxt/pull/26262)
* fix(mexc): watchOrders remove omit by [@carlosmiei](https://github.com/carlosmiei) in [#26269](https://github.com/ccxt/ccxt/pull/26269)
* feat(kraken): update watchMultiHelper methods to v2 by [@Dan-krm](https://github.com/Dan-krm) in [#26057](https://github.com/ccxt/ccxt/pull/26057)
* fix(kraken): update ping/pong & authentication by [@sc0Vu](https://github.com/sc0Vu) in [#26266](https://github.com/ccxt/ccxt/pull/26266)
* test(fetchTrades): sorted test by [@ttodua](https://github.com/ttodua) in [#26268](https://github.com/ccxt/ccxt/pull/26268)
* chore(bitmex): remove unskip & dummy change trigger retest by [@ttodua](https://github.com/ttodua) in [#26265](https://github.com/ccxt/ccxt/pull/26265)
* test(tickers): fix tolerance for quotevol/basevol comparison by [@ttodua](https://github.com/ttodua) in [#26260](https://github.com/ccxt/ccxt/pull/26260)
* fix(ts): broken imports by [@ttodua](https://github.com/ttodua) in [#26273](https://github.com/ccxt/ccxt/pull/26273)
* chore(cryptomus): skip 2 ^ by [@ttodua](https://github.com/ttodua) in [#26261](https://github.com/ccxt/ccxt/pull/26261)
* test(ticker): fix check for negative values, & bitmex by [@ttodua](https://github.com/ttodua) in [#26270](https://github.com/ccxt/ccxt/pull/26270)
* fix(bitstamp): userId string by [@carlosmiei](https://github.com/carlosmiei) in [#26284](https://github.com/ccxt/ccxt/pull/26284)
* fix(php): in\_array strict by [@ttodua](https://github.com/ttodua) in [#26283](https://github.com/ccxt/ccxt/pull/26283)
* fix(php): is\_associative fix by [@ttodua](https://github.com/ttodua) in [#26277](https://github.com/ccxt/ccxt/pull/26277)
* fix(exchange): protect cleanCache and add base unWatchOrders by [@carlosmiei](https://github.com/carlosmiei) in [#26280](https://github.com/ccxt/ccxt/pull/26280)
* fix(cryptocom): add skipFetchCurrencies and protect call by [@carlosmiei](https://github.com/carlosmiei) in [#26285](https://github.com/ccxt/ccxt/pull/26285)
* fix: c# tests build by [@carlosmiei](https://github.com/carlosmiei) in [#26287](https://github.com/ccxt/ccxt/pull/26287)
* Ccxtpro error handling by [@frosty00](https://github.com/frosty00) in [#26278](https://github.com/ccxt/ccxt/pull/26278)
* fix(bybit): ws spot orders parsing by [@carlosmiei](https://github.com/carlosmiei) in [#26291](https://github.com/ccxt/ccxt/pull/26291)
* hyperliquid: add type3 stop order by [@sc0Vu](https://github.com/sc0Vu) in [#26288](https://github.com/ccxt/ccxt/pull/26288)
* fix: release.yml dotnet version by [@carlosmiei](https://github.com/carlosmiei) in [#26293](https://github.com/ccxt/ccxt/pull/26293)
* mexc XBT mapping by [@ndubel](https://github.com/ndubel) in [#26292](https://github.com/ccxt/ccxt/pull/26292)
* Merge clients by [@frosty00](https://github.com/frosty00) in [#26294](https://github.com/ccxt/ccxt/pull/26294)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.90...v4.4.91](https://github.com/ccxt/ccxt/compare/go/v4.4.90...v4.4.91)
[Changes][v4.4.91]
# [v4.4.90](https://github.com/ccxt/ccxt/releases/tag/v4.4.90) - 2025-06-18 [#v4490---2025-06-18]
## What's Changed [#whats-changed-89]
* chore: add release-js-only workflow by [@carlosmiei](https://github.com/carlosmiei) in [#26203](https://github.com/ccxt/ccxt/pull/26203)
* skip(paradex): bid/ask watchtickers by [@ttodua](https://github.com/ttodua) in [#26191](https://github.com/ccxt/ccxt/pull/26191)
* feat(bitget): UTA endpoints and fetchUtaMarkets by [@Dan-krm](https://github.com/Dan-krm) in [#26194](https://github.com/ccxt/ccxt/pull/26194)
* btcbox.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26204](https://github.com/ccxt/ccxt/pull/26204)
* fix(bybit): cost rounding by [@carlosmiei](https://github.com/carlosmiei) in [#26206](https://github.com/ccxt/ccxt/pull/26206)
* btcmarkets.has - leverage methods by [@samgermain](https://github.com/samgermain) in [#26212](https://github.com/ccxt/ccxt/pull/26212)
* fix(bingx): fetchFundingRate parsing by [@carlosmiei](https://github.com/carlosmiei) in [#26210](https://github.com/ccxt/ccxt/pull/26210)
* fix(bitget): go build by [@carlosmiei](https://github.com/carlosmiei) in [#26216](https://github.com/ccxt/ccxt/pull/26216)
* feat(exchange): add sort() and fix bingx signing by [@carlosmiei](https://github.com/carlosmiei) in [#26214](https://github.com/ccxt/ccxt/pull/26214)
* feat(bitrue): edit ratelimits by [@Dan-krm](https://github.com/Dan-krm) in [#26208](https://github.com/ccxt/ccxt/pull/26208)
* feat(go): make options concurrent safe by [@carlosmiei](https://github.com/carlosmiei) in [#26219](https://github.com/ccxt/ccxt/pull/26219)
* btcturk.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26221](https://github.com/ccxt/ccxt/pull/26221)
* fix(okx): protect groupBy against empty currencies by [@carlosmiei](https://github.com/carlosmiei) in [#26230](https://github.com/ccxt/ccxt/pull/26230)
* fix(coinbase): closePosition remove future check by [@carlosmiei](https://github.com/carlosmiei) in [#26222](https://github.com/ccxt/ccxt/pull/26222)
* Hollaex exchange update by [@yzh-pelle](https://github.com/yzh-pelle) in [#26223](https://github.com/ccxt/ccxt/pull/26223)
* go: update exchange\_throttler by [@sc0Vu](https://github.com/sc0Vu) in [#26240](https://github.com/ccxt/ccxt/pull/26240)
* Fix TradeOgre parse\_ticker mapping for last, baseVolume, quoteVolume by [@Rishirandhawa](https://github.com/Rishirandhawa) in [#26236](https://github.com/ccxt/ccxt/pull/26236)
* fix(delta): fetchMarkets by [@ttodua](https://github.com/ttodua) in [#26235](https://github.com/ccxt/ccxt/pull/26235)
* fix(xt): open orders by [@ttodua](https://github.com/ttodua) in [#26233](https://github.com/ccxt/ccxt/pull/26233)
* fix(go): parseleverage call by [@carlosmiei](https://github.com/carlosmiei) in [#26231](https://github.com/ccxt/ccxt/pull/26231)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.89...v4.4.90](https://github.com/ccxt/ccxt/compare/go/v4.4.89...v4.4.90)
[Changes][v4.4.90]
# [v4.4.89](https://github.com/ccxt/ccxt/releases/tag/v4.4.89) - 2025-06-12 [#v4489---2025-06-12]
## What's Changed [#whats-changed-90]
* build(deps): bump next from 14.2.26 to 15.2.4 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#26143](https://github.com/ccxt/ccxt/pull/26143)
* feat(cli): add raw in python cli by [@sc0Vu](https://github.com/sc0Vu) in [#26154](https://github.com/ccxt/ccxt/pull/26154)
* feat(luno): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#26046](https://github.com/ccxt/ccxt/pull/26046)
* fix(hashkey): fetchCurrencies safeStruct & tests by [@ttodua](https://github.com/ttodua) in [#26027](https://github.com/ccxt/ccxt/pull/26027)
* fix(digifinex): fetchCUrrencies reorg by [@ttodua](https://github.com/ttodua) in [#26008](https://github.com/ccxt/ccxt/pull/26008)
* chore: add Standalone CLI by [@ttodua](https://github.com/ttodua) in [#21735](https://github.com/ccxt/ccxt/pull/21735)
* Fix package json docs by [@carlosmiei](https://github.com/carlosmiei) in [#26158](https://github.com/ccxt/ccxt/pull/26158)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#26160](https://github.com/ccxt/ccxt/pull/26160)
* bitvavo.has: leverage methods by [@samgermain](https://github.com/samgermain) in [#26162](https://github.com/ccxt/ccxt/pull/26162)
* fix(okx): market start time by [@ttodua](https://github.com/ttodua) in [#26157](https://github.com/ccxt/ccxt/pull/26157)
* fix(bitget): market parse field opentime by [@ttodua](https://github.com/ttodua) in [#26163](https://github.com/ccxt/ccxt/pull/26163)
* refactor(kraken): multi request by [@ttodua](https://github.com/ttodua) in [#26172](https://github.com/ccxt/ccxt/pull/26172)
* fix(gate): parse markets spot & swap 'created' timestamps by [@ttodua](https://github.com/ttodua) in [#26161](https://github.com/ccxt/ccxt/pull/26161)
* fix(build): remove new line by [@sc0Vu](https://github.com/sc0Vu) in [#26159](https://github.com/ccxt/ccxt/pull/26159)
* fix(cache): create cache folder if needed by [@carlosmiei](https://github.com/carlosmiei) in [#26183](https://github.com/ccxt/ccxt/pull/26183)
* feat(clipy): add --no-load-markets by [@sc0Vu](https://github.com/sc0Vu) in [#26184](https://github.com/ccxt/ccxt/pull/26184)
* feat(phemex): fetchDepositAddress update endpoint, MKR defaultNetworks by [@Dan-krm](https://github.com/Dan-krm) in [#26182](https://github.com/ccxt/ccxt/pull/26182)
* fix(kraken): broad errors handling by [@carlosmiei](https://github.com/carlosmiei) in [#26181](https://github.com/ccxt/ccxt/pull/26181)
* test(digifinex): currencies by [@ttodua](https://github.com/ttodua) in [#26173](https://github.com/ccxt/ccxt/pull/26173)
* fix(kraken): market amount precision by [@ttodua](https://github.com/ttodua) in [#26142](https://github.com/ccxt/ccxt/pull/26142)
* Rename cache directory in README.md by [@sc0Vu](https://github.com/sc0Vu) in [#26186](https://github.com/ccxt/ccxt/pull/26186)
* skip python coinbase tests by [@ttodua](https://github.com/ttodua) in [#26193](https://github.com/ccxt/ccxt/pull/26193)
* fix(kraken): remove darkpool by [@ttodua](https://github.com/ttodua) in [#26196](https://github.com/ccxt/ccxt/pull/26196)
* bingx exchange update transfer by [@yzh-pelle](https://github.com/yzh-pelle) in [#26199](https://github.com/ccxt/ccxt/pull/26199)
* fix(coinbase): ws connections issue by [@ttodua](https://github.com/ttodua) in [#26198](https://github.com/ccxt/ccxt/pull/26198)
* feat(phemex): fetchDepositAddress explicitly require a network parameter by [@Dan-krm](https://github.com/Dan-krm) in [#26195](https://github.com/ccxt/ccxt/pull/26195)
* btcalpha.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26190](https://github.com/ccxt/ccxt/pull/26190)
* precision tests & php decimal\_to\_precision fix by [@ttodua](https://github.com/ttodua) in [#26177](https://github.com/ccxt/ccxt/pull/26177)
* cryptocom exchange update with editOrder by [@yzh-pelle](https://github.com/yzh-pelle) in [#26188](https://github.com/ccxt/ccxt/pull/26188)
* fix(go): loadMarkets concurrency and support concurrent maps by [@carlosmiei](https://github.com/carlosmiei) in [#26197](https://github.com/ccxt/ccxt/pull/26197)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.4.88...v4.4.89](https://github.com/ccxt/ccxt/compare/v4.4.88...v4.4.89)
[Changes][v4.4.89]
# [v4.4.88](https://github.com/ccxt/ccxt/releases/tag/v4.4.88) - 2025-06-04 [#v4488---2025-06-04]
## What's Changed [#whats-changed-91]
* feat(base): fetchFirstBarUsingOHLCV by [@ttodua](https://github.com/ttodua) in [#26130](https://github.com/ccxt/ccxt/pull/26130)
* fix(modetrade): id, has and balanceParsing by [@carlosmiei](https://github.com/carlosmiei) in [#26149](https://github.com/ccxt/ccxt/pull/26149)
* refactor(bybit): category param handling by [@Dan-krm](https://github.com/Dan-krm) in [#26145](https://github.com/ccxt/ccxt/pull/26145)
* fix(exchange): loadMarketHelper by [@sc0Vu](https://github.com/sc0Vu) in [#26148](https://github.com/ccxt/ccxt/pull/26148)
* fix(tests): modetrade by [@carlosmiei](https://github.com/carlosmiei) in [#26150](https://github.com/ccxt/ccxt/pull/26150)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.87...v4.4.88](https://github.com/ccxt/ccxt/compare/go/v4.4.87...v4.4.88)
[Changes][v4.4.88]
# [v4.4.87](https://github.com/ccxt/ccxt/releases/tag/v4.4.87) - 2025-06-03 [#v4487---2025-06-03]
## What's Changed [#whats-changed-92]
* fix(xt): fetchOpenOrders/fetchOrders parsing by [@carlosmiei](https://github.com/carlosmiei) in [#26089](https://github.com/ccxt/ccxt/pull/26089)
* fix(woo): fetch open trailing orders by [@carlosmiei](https://github.com/carlosmiei) in [#26090](https://github.com/ccxt/ccxt/pull/26090)
* Fix typo: Rename variable `RUN_BASE_TETS` to `RUN_BASE_TESTS` in Go tests entrypoint by [@sdarioz](https://github.com/sdarioz) in [#26059](https://github.com/ccxt/ccxt/pull/26059)
* feat(whitebit): fetchCurrencies reorg & networks implementation by [@ttodua](https://github.com/ttodua) in [#26100](https://github.com/ccxt/ccxt/pull/26100)
* bitteam.has leverage methods by [@samgermain](https://github.com/samgermain) in [#26098](https://github.com/ccxt/ccxt/pull/26098)
* refactor(vertex): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#26095](https://github.com/ccxt/ccxt/pull/26095)
* fix(probit): fetchCurrencies reorg by [@ttodua](https://github.com/ttodua) in [#26093](https://github.com/ccxt/ccxt/pull/26093)
* fix(poloniex): major reorg for fetchCurrencies, fetchDepositAddress, createDepositAddress, Withdraw by [@ttodua](https://github.com/ttodua) in [#26091](https://github.com/ccxt/ccxt/pull/26091)
* chore: fix manual table by [@carlosmiei](https://github.com/carlosmiei) in [#26105](https://github.com/ccxt/ccxt/pull/26105)
* fix(kraken): fetchCurrencies struct by [@ttodua](https://github.com/ttodua) in [#26037](https://github.com/ccxt/ccxt/pull/26037)
* refactor(gate): fetchCurrencies change by [@ttodua](https://github.com/ttodua) in [#26016](https://github.com/ccxt/ccxt/pull/26016)
* fix(htx): fetchOpenOrders remove symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#26109](https://github.com/ccxt/ccxt/pull/26109)
* feat(okx): add fetchFundingRates by [@lucky2077](https://github.com/lucky2077) in [#26106](https://github.com/ccxt/ccxt/pull/26106)
* fix(xt): fetchCurrencies reorg by [@ttodua](https://github.com/ttodua) in [#26108](https://github.com/ccxt/ccxt/pull/26108)
* fix(coinmetro): precision fix by [@ttodua](https://github.com/ttodua) in [#26111](https://github.com/ccxt/ccxt/pull/26111)
* fix!(woofipro): unify fetchCurrencies > networks by [@ttodua](https://github.com/ttodua) in [#26107](https://github.com/ccxt/ccxt/pull/26107)
* Fix cycling dependency by [@olegtaranenko](https://github.com/olegtaranenko) in [#26114](https://github.com/ccxt/ccxt/pull/26114)
* fix(go): add reload option to loadMarkets by [@carlosmiei](https://github.com/carlosmiei) in [#26120](https://github.com/ccxt/ccxt/pull/26120)
* \[Binance] fix spot stop loss editOrder by [@GuillaumeDSM](https://github.com/GuillaumeDSM) in [#26124](https://github.com/ccxt/ccxt/pull/26124)
* feat(okx): add fetchOpenInterests by [@lucky2077](https://github.com/lucky2077) in [#26112](https://github.com/ccxt/ccxt/pull/26112)
* refactor(timex): fetchCurrencies refactor by [@ttodua](https://github.com/ttodua) in [#26094](https://github.com/ccxt/ccxt/pull/26094)
* refactor(phemex): fetchCurrencies Struct by [@ttodua](https://github.com/ttodua) in [#26085](https://github.com/ccxt/ccxt/pull/26085)
* go(build): remove semicolon by [@sc0Vu](https://github.com/sc0Vu) in [#26126](https://github.com/ccxt/ccxt/pull/26126)
* fix(woo): fetchCurrencies reorg, networks, fetchDepositAddress, Withdraw by [@ttodua](https://github.com/ttodua) in [#26104](https://github.com/ccxt/ccxt/pull/26104)
* fix(base): max retries fetch by [@ttodua](https://github.com/ttodua) in [#26131](https://github.com/ccxt/ccxt/pull/26131)
* feat: add OKX (US) by [@carlosmiei](https://github.com/carlosmiei) in [#26128](https://github.com/ccxt/ccxt/pull/26128)
* fix(paradex): parseOrder: rejected by [@carlosmiei](https://github.com/carlosmiei) in [#26138](https://github.com/ccxt/ccxt/pull/26138)
* feat(base): temp currencies in fetchMarkets by [@ttodua](https://github.com/ttodua) in [#26024](https://github.com/ccxt/ccxt/pull/26024)
* fix(gate): currency deposit address & base minor by [@ttodua](https://github.com/ttodua) in [#26134](https://github.com/ccxt/ccxt/pull/26134)
* feat: add Mode Trade Exchange by [@carlosmiei](https://github.com/carlosmiei) in [#26140](https://github.com/ccxt/ccxt/pull/26140)
* feat(hyperliquid): allow vaultAddress as global option by [@carlosmiei](https://github.com/carlosmiei) in [#26141](https://github.com/ccxt/ccxt/pull/26141)
## New Contributors [#new-contributors-48]
* [@sdarioz](https://github.com/sdarioz) made their first contribution in [#26059](https://github.com/ccxt/ccxt/pull/26059)
* [@lucky2077](https://github.com/lucky2077) made their first contribution in [#26106](https://github.com/ccxt/ccxt/pull/26106)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.86...v4.4.87](https://github.com/ccxt/ccxt/compare/go/v4.4.86...v4.4.87)
[Changes][v4.4.87]
# [v4.4.86](https://github.com/ccxt/ccxt/releases/tag/v4.4.86) - 2025-05-27 [#v4486---2025-05-27]
## What's Changed [#whats-changed-93]
* no expiry for spot by [@ttodua](https://github.com/ttodua) in [#26049](https://github.com/ccxt/ccxt/pull/26049)
* feat(okx): add changelog errors and endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#26054](https://github.com/ccxt/ccxt/pull/26054)
* fix(mexc): fetchCurrencies fields by [@ttodua](https://github.com/ttodua) in [#26048](https://github.com/ccxt/ccxt/pull/26048)
* fix(python): remove python/ccxt/pro/test/Exchange directory by [@ttodua](https://github.com/ttodua) in [#26045](https://github.com/ccxt/ccxt/pull/26045)
* test(bequant): skip fields by [@ttodua](https://github.com/ttodua) in [#26050](https://github.com/ccxt/ccxt/pull/26050)
* kuna - delist by [@ttodua](https://github.com/ttodua) in [#26040](https://github.com/ccxt/ccxt/pull/26040)
* fix(hollaex): fetchCurrencies reorg & networks implementation & tests by [@ttodua](https://github.com/ttodua) in [#26029](https://github.com/ccxt/ccxt/pull/26029)
* fix(deribit): fetchCurrencies & static tests by [@ttodua](https://github.com/ttodua) in [#26006](https://github.com/ccxt/ccxt/pull/26006)
* fix(htx): fetchCurrencies reorg by [@ttodua](https://github.com/ttodua) in [#26032](https://github.com/ccxt/ccxt/pull/26032)
* fix(okcoin): fetchCurrencies reorg by [@ttodua](https://github.com/ttodua) in [#26052](https://github.com/ccxt/ccxt/pull/26052)
* fix(oxfun): fetchCurrencies reorg by [@ttodua](https://github.com/ttodua) in [#26055](https://github.com/ccxt/ccxt/pull/26055)
* fix(ascendex): fetchMarkets & fetchCUrrencies by [@ttodua](https://github.com/ttodua) in [#26015](https://github.com/ccxt/ccxt/pull/26015)
* fix(ndax): fetchCurrencies reorg by [@ttodua](https://github.com/ttodua) in [#26051](https://github.com/ccxt/ccxt/pull/26051)
* fix(onetrading): fetchCurrencies struct by [@ttodua](https://github.com/ttodua) in [#26053](https://github.com/ccxt/ccxt/pull/26053)
* fix(bitget): withdraw precision by [@ttodua](https://github.com/ttodua) in [#26060](https://github.com/ccxt/ccxt/pull/26060)
* fix(coinbase): fetchMarketV3 by [@sc0Vu](https://github.com/sc0Vu) in [#26061](https://github.com/ccxt/ccxt/pull/26061)
* proxies docs & py files removal by [@ttodua](https://github.com/ttodua) in [#26063](https://github.com/ccxt/ccxt/pull/26063)
* fix(python): wsSocksProxy fix by [@ttodua](https://github.com/ttodua) in [#26064](https://github.com/ccxt/ccxt/pull/26064)
* feat(bitmart): update account fetchBalance by [@Dan-krm](https://github.com/Dan-krm) in [#26067](https://github.com/ccxt/ccxt/pull/26067)
* fix(huobijp): rename into bittrade by [@ttodua](https://github.com/ttodua) in [#26036](https://github.com/ccxt/ccxt/pull/26036)
* fix(hollaex): networksById order by [@ttodua](https://github.com/ttodua) in [#26065](https://github.com/ccxt/ccxt/pull/26065)
* fix(hyperliquid): fees by [@sc0Vu](https://github.com/sc0Vu) in [#26073](https://github.com/ccxt/ccxt/pull/26073)
* fix: rm huobijp leftovers by [@carlosmiei](https://github.com/carlosmiei) in [#26074](https://github.com/ccxt/ccxt/pull/26074)
* fix(bitget): transaction go parsing by [@carlosmiei](https://github.com/carlosmiei) in [#26075](https://github.com/ccxt/ccxt/pull/26075)
* fix(luno): ob and indexed comparison by [@carlosmiei](https://github.com/carlosmiei) in [#26076](https://github.com/ccxt/ccxt/pull/26076)
* fix(mexc): ob initialization by [@carlosmiei](https://github.com/carlosmiei) in [#26081](https://github.com/ccxt/ccxt/pull/26081)
* fix(binance): clean orderbook cache by [@sc0Vu](https://github.com/sc0Vu) in [#26080](https://github.com/ccxt/ccxt/pull/26080)
* fix(paradex): canceled order parsing by [@carlosmiei](https://github.com/carlosmiei) in [#26083](https://github.com/ccxt/ccxt/pull/26083)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.4.85...v4.4.86](https://github.com/ccxt/ccxt/compare/v4.4.85...v4.4.86)
[Changes][v4.4.86]
# [v4.4.85](https://github.com/ccxt/ccxt/releases/tag/v4.4.85) - 2025-05-22 [#v4485---2025-05-22]
## What's Changed [#whats-changed-94]
* fix(bybit): fetchCurrencies reorg & tests by [@ttodua](https://github.com/ttodua) in [#25917](https://github.com/ccxt/ccxt/pull/25917)
* fix(cache.py): fix deleting orders not in hasmap by [@pcriadoperez](https://github.com/pcriadoperez) in [#25994](https://github.com/ccxt/ccxt/pull/25994)
* bitstamp.has leverage methods by [@samgermain](https://github.com/samgermain) in [#25996](https://github.com/ccxt/ccxt/pull/25996)
* fix(coinlist): fetchCurrencies reorg by [@ttodua](https://github.com/ttodua) in [#25980](https://github.com/ccxt/ccxt/pull/25980)
* fix: release workflow by [@pcriadoperez](https://github.com/pcriadoperez) in [#25993](https://github.com/ccxt/ccxt/pull/25993)
* feat(cryptocom): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25985](https://github.com/ccxt/ccxt/pull/25985)
* feat(coinsph): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25984](https://github.com/ccxt/ccxt/pull/25984)
* feat(btcbox): fetchMarkets by [@ttodua](https://github.com/ttodua) in [#25912](https://github.com/ccxt/ccxt/pull/25912)
* delist(bl3p): shut down by [@ttodua](https://github.com/ttodua) in [#25907](https://github.com/ccxt/ccxt/pull/25907)
* fix(bitrue): fetchCurrencies full restructure by [@ttodua](https://github.com/ttodua) in [#25902](https://github.com/ccxt/ccxt/pull/25902)
* chore(tests-manager.sh): remove by [@ttodua](https://github.com/ttodua) in [#25862](https://github.com/ccxt/ccxt/pull/25862)
* bug(binance): Fix Websocket Testnet Spot Market identification by [@KaiGrassnick](https://github.com/KaiGrassnick) in [#26002](https://github.com/ccxt/ccxt/pull/26002)
* fix(binance): links in the docstring by [@yzh-pelle](https://github.com/yzh-pelle) in [#25997](https://github.com/ccxt/ccxt/pull/25997)
* feat(mexc): add unWatch methods by [@sc0Vu](https://github.com/sc0Vu) in [#25940](https://github.com/ccxt/ccxt/pull/25940)
* fix(cryptomus): fetchCurrencies (reorg & minor fixes) by [@ttodua](https://github.com/ttodua) in [#26004](https://github.com/ccxt/ccxt/pull/26004)
* feat(paradex): add fetchGreeks by [@Dan-krm](https://github.com/Dan-krm) in [#25998](https://github.com/ccxt/ccxt/pull/25998)
* fix(ellipx): fetchCurrencies reorg & static tests by [@ttodua](https://github.com/ttodua) in [#26010](https://github.com/ccxt/ccxt/pull/26010)
* fix(mexc) jsdoc by [@olegtaranenko](https://github.com/olegtaranenko) in [#26009](https://github.com/ccxt/ccxt/pull/26009)
* fix(derive): safeCurrencystructure & static tests by [@ttodua](https://github.com/ttodua) in [#26007](https://github.com/ccxt/ccxt/pull/26007)
* fix(lbank): orderbook parsing by [@carlosmiei](https://github.com/carlosmiei) in [#26013](https://github.com/ccxt/ccxt/pull/26013)
* fix(cs): greeks types by [@carlosmiei](https://github.com/carlosmiei) in [#26014](https://github.com/ccxt/ccxt/pull/26014)
* fix(delta): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#26005](https://github.com/ccxt/ccxt/pull/26005)
* feat(blofin): support params.hedged by [@carlosmiei](https://github.com/carlosmiei) in [#26020](https://github.com/ccxt/ccxt/pull/26020)
* feat: upgrade to latest aiohttp version by [@pcriadoperez](https://github.com/pcriadoperez) in [#25995](https://github.com/ccxt/ccxt/pull/25995)
* fix(gemini): add SOL quote currency by [@sc0Vu](https://github.com/sc0Vu) in [#26023](https://github.com/ccxt/ccxt/pull/26023)
* fix(kucoinfutures): unify marginMode param by [@carlosmiei](https://github.com/carlosmiei) in [#26021](https://github.com/ccxt/ccxt/pull/26021)
* Blofin - positionMode and marginMode methods implementation by [@yzh-pelle](https://github.com/yzh-pelle) in [#26018](https://github.com/ccxt/ccxt/pull/26018)
* fix(poloniex): createOrderWs and cancelOrderWs return type by [@carlosmiei](https://github.com/carlosmiei) in [#26034](https://github.com/ccxt/ccxt/pull/26034)
* fix(hyperliquid): fetchCurrencies struct by [@ttodua](https://github.com/ttodua) in [#26030](https://github.com/ccxt/ccxt/pull/26030)
* fix(base): errors import in py ws by [@ttodua](https://github.com/ttodua) in [#26031](https://github.com/ccxt/ccxt/pull/26031)
* fix(hitbtc): fetchCurrencies reorg by [@ttodua](https://github.com/ttodua) in [#26028](https://github.com/ccxt/ccxt/pull/26028)
* feat(kraken): cancelOrderWs, cancelOrdersWs, cancelAllOrdersWs update to v2 by [@Dan-krm](https://github.com/Dan-krm) in [#26019](https://github.com/ccxt/ccxt/pull/26019)
* feat!(idex): delist by [@ttodua](https://github.com/ttodua) in [#26035](https://github.com/ccxt/ccxt/pull/26035)
* fix(gemini): fetchCurrencies safeStruct by [@ttodua](https://github.com/ttodua) in [#26025](https://github.com/ccxt/ccxt/pull/26025)
* fix(cli): infer param and missing args by [@carlosmiei](https://github.com/carlosmiei) in [#26038](https://github.com/ccxt/ccxt/pull/26038)
* fix(base) loadMarkets docs by [@olegtaranenko](https://github.com/olegtaranenko) in [#26026](https://github.com/ccxt/ccxt/pull/26026)
* fix: remove idex files by [@carlosmiei](https://github.com/carlosmiei) in [#26041](https://github.com/ccxt/ccxt/pull/26041)
## New Contributors [#new-contributors-49]
* [@KaiGrassnick](https://github.com/KaiGrassnick) made their first contribution in [#26002](https://github.com/ccxt/ccxt/pull/26002)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/v4.4.83...v4.4.85](https://github.com/ccxt/ccxt/compare/v4.4.83...v4.4.85)
[Changes][v4.4.85]
# [v4.4.82](https://github.com/ccxt/ccxt/releases/tag/v4.4.82) - 2025-05-13 [#v4482---2025-05-13]
## What's Changed [#whats-changed-95]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
* build(deps): bump next from 14.2.21 to 14.2.25 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25542](https://github.com/ccxt/ccxt/pull/25542)
* fix(kraken) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#25543](https://github.com/ccxt/ccxt/pull/25543)
* better instructions for exhange-capabilities script by [@samgermain](https://github.com/samgermain) in [#25546](https://github.com/ccxt/ccxt/pull/25546)
* feat(bitmart): add editOrder to limit swap orders by [@carlosmiei](https://github.com/carlosmiei) in [#25547](https://github.com/ccxt/ccxt/pull/25547)
* chore: readme remove expired campaign by [@carlosmiei](https://github.com/carlosmiei) in [#25551](https://github.com/ccxt/ccxt/pull/25551)
* docs(readme): minor by [@ttodua](https://github.com/ttodua) in [#25550](https://github.com/ccxt/ccxt/pull/25550)
* fix(goTranspiler): safeCurrencyCode inherited call by [@carlosmiei](https://github.com/carlosmiei) in [#25548](https://github.com/ccxt/ccxt/pull/25548)
* bingx, bitmart: has\["createReduceOnlyOrder"] = true by [@samgermain](https://github.com/samgermain) in [#25552](https://github.com/ccxt/ccxt/pull/25552)
* feat(okx) - full networks unif by [@ttodua](https://github.com/ttodua) in [#25553](https://github.com/ccxt/ccxt/pull/25553)
* feat(base) - handleRequestNetwork by [@ttodua](https://github.com/ttodua) in [#25466](https://github.com/ccxt/ccxt/pull/25466)
* has\["createReduceOnlyOrder"] by [@samgermain](https://github.com/samgermain) in [#25555](https://github.com/ccxt/ccxt/pull/25555)
* fix(bitget): sandbox markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#25557](https://github.com/ccxt/ccxt/pull/25557)
* feat(exchange): type constructor by [@carlosmiei](https://github.com/carlosmiei) in [#25558](https://github.com/ccxt/ccxt/pull/25558)
* feat(constructor): support sandbox/testnet key by [@carlosmiei](https://github.com/carlosmiei) in [#25559](https://github.com/ccxt/ccxt/pull/25559)
* fix(okx) - zksync ^ by [@ttodua](https://github.com/ttodua) in [#25560](https://github.com/ccxt/ccxt/pull/25560)
* poloniex & poloniexfutures - v3 Update & merger by [@ttodua](https://github.com/ttodua) in [#25378](https://github.com/ccxt/ccxt/pull/25378)
* feat(binance): update binance documentation links by [@Dan-krm](https://github.com/Dan-krm) in [#25561](https://github.com/ccxt/ccxt/pull/25561)
* feat(exchange): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#25562](https://github.com/ccxt/ccxt/pull/25562)
* fix(bingx) - implicit balance endpoint ^ by [@ttodua](https://github.com/ttodua) in [#25567](https://github.com/ccxt/ccxt/pull/25567)
* chore(poloniex) - ws skip tests ^ by [@ttodua](https://github.com/ttodua) in [#25566](https://github.com/ccxt/ccxt/pull/25566)
* fix(cex) - missing active key ^ by [@ttodua](https://github.com/ttodua) in [#25565](https://github.com/ccxt/ccxt/pull/25565)
* whitebit: createOrder - update docstring, has array by [@samgermain](https://github.com/samgermain) in [#25563](https://github.com/ccxt/ccxt/pull/25563)
* feat(whitebit): createDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25569](https://github.com/ccxt/ccxt/pull/25569)
* fix(gate): currencies encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25571](https://github.com/ccxt/ccxt/pull/25571)
* fix(poloniex) - features missing symbol req by [@ttodua](https://github.com/ttodua) in [#25573](https://github.com/ccxt/ccxt/pull/25573)
* fix(gate): use replaceAll instead by [@carlosmiei](https://github.com/carlosmiei) in [#25572](https://github.com/ccxt/ccxt/pull/25572)
* feat(whitebit): fetchCrossBorrowRate by [@Dan-krm](https://github.com/Dan-krm) in [#25568](https://github.com/ccxt/ccxt/pull/25568)
* fix(bingx): allAccountBalance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25575](https://github.com/ccxt/ccxt/pull/25575)
* fix(derive): update balance by [@sc0Vu](https://github.com/sc0Vu) in [#25581](https://github.com/ccxt/ccxt/pull/25581)
* fix(derive): rename deriveWalletAddress by [@sc0Vu](https://github.com/sc0Vu) in [#25582](https://github.com/ccxt/ccxt/pull/25582)
* krakenfutures\["has"]: createPostOnlyOrder, createReduceOnlyOrder, ... = true by [@samgermain](https://github.com/samgermain) in [#25576](https://github.com/ccxt/ccxt/pull/25576)
* feat(hyperliquid): add createVault by [@sc0Vu](https://github.com/sc0Vu) in [#25577](https://github.com/ccxt/ccxt/pull/25577)
* refactor & fix(okx) - fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25564](https://github.com/ccxt/ccxt/pull/25564)
* fix(bingx) - unskip tests by [@ttodua](https://github.com/ttodua) in [#25583](https://github.com/ccxt/ccxt/pull/25583)
* fix(derive): add creation\_timestamp by [@sc0Vu](https://github.com/sc0Vu) in [#25594](https://github.com/ccxt/ccxt/pull/25594)
* fix(exchange) mismatched return type by [@olegtaranenko](https://github.com/olegtaranenko) in [#25593](https://github.com/ccxt/ccxt/pull/25593)
* fix(bingx) - implicit api by [@ttodua](https://github.com/ttodua) in [#25584](https://github.com/ccxt/ccxt/pull/25584)
* fix(krakenfutures) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25586](https://github.com/ccxt/ccxt/pull/25586)
* okcoin.has createPostOnlyOrder, createReduceOnlyOrder, createStopLimitOrder, createStopMarketOrder by [@samgermain](https://github.com/samgermain) in [#25585](https://github.com/ccxt/ccxt/pull/25585)
* feat(exchanges): createDepositAddress, add DepositAddress type by [@Dan-krm](https://github.com/Dan-krm) in [#25595](https://github.com/ccxt/ccxt/pull/25595)
* fix(coinbase) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25587](https://github.com/ccxt/ccxt/pull/25587)
* fix(bitmart) - watchTrades fix by [@ttodua](https://github.com/ttodua) in [#25589](https://github.com/ccxt/ccxt/pull/25589)
* tests(ace) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25590](https://github.com/ccxt/ccxt/pull/25590)
* fix(ascendex) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25591](https://github.com/ccxt/ccxt/pull/25591)
* fix(paradex): market parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25606](https://github.com/ccxt/ccxt/pull/25606)
* fix(woo): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25605](https://github.com/ccxt/ccxt/pull/25605)
* tests(binance) - unksip networks ^ by [@ttodua](https://github.com/ttodua) in [#25607](https://github.com/ccxt/ccxt/pull/25607)
* fix(okx) - expiry time for future/option by [@ttodua](https://github.com/ttodua) in [#25600](https://github.com/ccxt/ccxt/pull/25600)
* fix(woofipro) - inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25604](https://github.com/ccxt/ccxt/pull/25604)
* fix(derive) - linear inverse ^ by [@ttodua](https://github.com/ttodua) in [#25602](https://github.com/ccxt/ccxt/pull/25602)
* fix(paradex): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25603](https://github.com/ccxt/ccxt/pull/25603)
* bit2c has false methods by [@samgermain](https://github.com/samgermain) in [#25609](https://github.com/ccxt/ccxt/pull/25609)
* tests(ace) - unskip markets ^ by [@ttodua](https://github.com/ttodua) in [#25599](https://github.com/ccxt/ccxt/pull/25599)
* fix(defx) - market inverse ^ by [@ttodua](https://github.com/ttodua) in [#25601](https://github.com/ccxt/ccxt/pull/25601)
* fix(derive): options linear ^ by [@ttodua](https://github.com/ttodua) in [#25608](https://github.com/ccxt/ccxt/pull/25608)
* tests(binanceus) - fetchStatus unskip ^ by [@ttodua](https://github.com/ttodua) in [#25597](https://github.com/ccxt/ccxt/pull/25597)
* build(deps): bump next from 14.2.25 to 14.2.26 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25626](https://github.com/ccxt/ccxt/pull/25626)
* fix(bitget) - market precision by [@ttodua](https://github.com/ttodua) in [#25624](https://github.com/ccxt/ccxt/pull/25624)
* fix(ascedex): currency id str ^ by [@ttodua](https://github.com/ttodua) in [#25614](https://github.com/ccxt/ccxt/pull/25614)
* chore(bitfinex1) - delist old version by [@ttodua](https://github.com/ttodua) in [#25621](https://github.com/ccxt/ccxt/pull/25621)
* tests(bitget): ws orderbook field ^ by [@ttodua](https://github.com/ttodua) in [#25625](https://github.com/ccxt/ccxt/pull/25625)
* tests(binance): unskip ticker & precision ^ by [@ttodua](https://github.com/ttodua) in [#25616](https://github.com/ccxt/ccxt/pull/25616)
* fix(bitget): fetchWithdrawals code not required by [@carlosmiei](https://github.com/carlosmiei) in [#25633](https://github.com/ccxt/ccxt/pull/25633)
* fix(bitrue): orderbook & retest by [@ttodua](https://github.com/ttodua) in [#25634](https://github.com/ccxt/ccxt/pull/25634)
* fix(build): remove bitfinex1 data by [@carlosmiei](https://github.com/carlosmiei) in [#25640](https://github.com/ccxt/ccxt/pull/25640)
* feat(bybit): define most method types by [@Dan-krm](https://github.com/Dan-krm) in [#25636](https://github.com/ccxt/ccxt/pull/25636)
* chore: pushback ccxt.ts by [@carlosmiei](https://github.com/carlosmiei) in [#25641](https://github.com/ccxt/ccxt/pull/25641)
* ace.has: false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25642](https://github.com/ccxt/ccxt/pull/25642)
* chore(tests): minor comment by [@ttodua](https://github.com/ttodua) in [#25635](https://github.com/ccxt/ccxt/pull/25635)
* fix(binance): update ids by [@carlosmiei](https://github.com/carlosmiei) in [#25645](https://github.com/ccxt/ccxt/pull/25645)
* feat(bybit): add pagination to fetchPositions by [@carlosmiei](https://github.com/carlosmiei) in [#25646](https://github.com/ccxt/ccxt/pull/25646)
* alpaca.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25649](https://github.com/ccxt/ccxt/pull/25649)
* chore(skips): empty entries ^ by [@ttodua](https://github.com/ttodua) in [#25618](https://github.com/ccxt/ccxt/pull/25618)
* refactor(base): reorg removeRepeatedElementsFromArray by [@ttodua](https://github.com/ttodua) in [#25644](https://github.com/ccxt/ccxt/pull/25644)
* ascendex.has - option and future methods = false by [@samgermain](https://github.com/samgermain) in [#25656](https://github.com/ccxt/ccxt/pull/25656)
* ace, alpaca: option methods = false by [@samgermain](https://github.com/samgermain) in [#25655](https://github.com/ccxt/ccxt/pull/25655)
* fix(deribit): currency inference by [@carlosmiei](https://github.com/carlosmiei) in [#25657](https://github.com/ccxt/ccxt/pull/25657)
* hitbtc.has: option/future methods = false by [@samgermain](https://github.com/samgermain) in [#25658](https://github.com/ccxt/ccxt/pull/25658)
* bit2c.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25659](https://github.com/ccxt/ccxt/pull/25659)
* bitbank.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25662](https://github.com/ccxt/ccxt/pull/25662)
* fix(gate): currencies url encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25667](https://github.com/ccxt/ccxt/pull/25667)
* bitmart parseTransaction fix by [@ndubel](https://github.com/ndubel) in [#25671](https://github.com/ccxt/ccxt/pull/25671)
* fix(gate): btc inverse contractSize fix by [@ttodua](https://github.com/ttodua) in [#25672](https://github.com/ccxt/ccxt/pull/25672)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25670](https://github.com/ccxt/ccxt/pull/25670)
* tests(ascendex): skip bid ask ^ by [@ttodua](https://github.com/ttodua) in [#25665](https://github.com/ccxt/ccxt/pull/25665)
* delist(bitpanda): remove old alias by [@ttodua](https://github.com/ttodua) in [#25664](https://github.com/ccxt/ccxt/pull/25664)
* duplicate folders/files ^ by [@ttodua](https://github.com/ttodua) in [#25648](https://github.com/ccxt/ccxt/pull/25648)
* chore(onetrading): comment ^ by [@ttodua](https://github.com/ttodua) in [#25632](https://github.com/ccxt/ccxt/pull/25632)
* fix(bitopro): ws unskip (minor changes) by [@ttodua](https://github.com/ttodua) in [#25630](https://github.com/ccxt/ccxt/pull/25630)
* tests(bitmart): unskip fields ^ by [@ttodua](https://github.com/ttodua) in [#25627](https://github.com/ccxt/ccxt/pull/25627)
* chore(reorg): validate types ^ by [@ttodua](https://github.com/ttodua) in [#25622](https://github.com/ccxt/ccxt/pull/25622)
* chore(bitcoincom): delist (remove) inexistent old alias ^ by [@ttodua](https://github.com/ttodua) in [#25620](https://github.com/ccxt/ccxt/pull/25620)
* fix(bitbns) - active & unskip ^ by [@ttodua](https://github.com/ttodua) in [#25619](https://github.com/ccxt/ccxt/pull/25619)
* unskip bequant ^ by [@ttodua](https://github.com/ttodua) in [#25615](https://github.com/ccxt/ccxt/pull/25615)
* tests(binanceusdm) - retest few props ^ by [@ttodua](https://github.com/ttodua) in [#25617](https://github.com/ccxt/ccxt/pull/25617)
* chore(tests): datetime comments enhance ^ by [@ttodua](https://github.com/ttodua) in [#25631](https://github.com/ccxt/ccxt/pull/25631)
* test(assertions): enhance tests by [@ttodua](https://github.com/ttodua) in [#25650](https://github.com/ccxt/ccxt/pull/25650)
* test(markets): complete reorg by [@ttodua](https://github.com/ttodua) in [#25669](https://github.com/ccxt/ccxt/pull/25669)
* fix(bybit): option currency inference by [@Dan-krm](https://github.com/Dan-krm) in [#25673](https://github.com/ccxt/ccxt/pull/25673)
* fix(docs) - precisions by [@ttodua](https://github.com/ttodua) in [#23316](https://github.com/ccxt/ccxt/pull/23316)
* bitopro skip timestamp ^ by [@ttodua](https://github.com/ttodua) in [#25675](https://github.com/ccxt/ccxt/pull/25675)
* ws duplicate trades filtering by [@ttodua](https://github.com/ttodua) in [#25639](https://github.com/ccxt/ccxt/pull/25639)
* fix(coinlist): support swap markets by [@carlosmiei](https://github.com/carlosmiei) in [#25676](https://github.com/ccxt/ccxt/pull/25676)
* feat(bitmart): add setPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25678](https://github.com/ccxt/ccxt/pull/25678)
* unskip bitflyer ^ by [@ttodua](https://github.com/ttodua) in [#25623](https://github.com/ccxt/ccxt/pull/25623)
* chore(skips): sort alphabetically ^ by [@ttodua](https://github.com/ttodua) in [#25677](https://github.com/ccxt/ccxt/pull/25677)
* bithumb.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25680](https://github.com/ccxt/ccxt/pull/25680)
* fix(tests): skip json ^ by [@ttodua](https://github.com/ttodua) in [#25681](https://github.com/ccxt/ccxt/pull/25681)
* fix(Exchange): removeRepeatedElementsFromArray keys order dependency by [@carlosmiei](https://github.com/carlosmiei) in [#25683](https://github.com/ccxt/ccxt/pull/25683)
* fix(blofin): fetchClosedOrders flag by [@carlosmiei](https://github.com/carlosmiei) in [#25685](https://github.com/ccxt/ccxt/pull/25685)
* feat(bitmart): add fetchPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25686](https://github.com/ccxt/ccxt/pull/25686)
* chore: disable go test by [@carlosmiei](https://github.com/carlosmiei) in [#25687](https://github.com/ccxt/ccxt/pull/25687)
* fix(okx): fetchohlcv by [@ttodua](https://github.com/ttodua) in [#25682](https://github.com/ccxt/ccxt/pull/25682)
* doc(order): stoploss & params by [@ttodua](https://github.com/ttodua) in [#25684](https://github.com/ccxt/ccxt/pull/25684)
* chore: fix js action by [@carlosmiei](https://github.com/carlosmiei) in [#25697](https://github.com/ccxt/ccxt/pull/25697)
* test(market): fix precision issues ^ by [@ttodua](https://github.com/ttodua) in [#25690](https://github.com/ccxt/ccxt/pull/25690)
* test(bitmart): skip watchOB bid-ask ^ by [@ttodua](https://github.com/ttodua) in [#25691](https://github.com/ccxt/ccxt/pull/25691)
* test(bitflyer): no settleId ^ by [@ttodua](https://github.com/ttodua) in [#25693](https://github.com/ccxt/ccxt/pull/25693)
* fix(safeCurrencyStructure): withdraw/deposit/active by [@ttodua](https://github.com/ttodua) in [#25698](https://github.com/ccxt/ccxt/pull/25698)
* bitopro.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25705](https://github.com/ccxt/ccxt/pull/25705)
* chore: remove js/ dep from export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25700](https://github.com/ccxt/ccxt/pull/25700)
* test(market): removal of few skips ^ by [@ttodua](https://github.com/ttodua) in [#25692](https://github.com/ccxt/ccxt/pull/25692)
* feat(coinlist): add missing endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25703](https://github.com/ccxt/ccxt/pull/25703)
* test(coinex): skip precision & networks ^ by [@ttodua](https://github.com/ttodua) in [#25696](https://github.com/ccxt/ccxt/pull/25696)
* test(bitopro): skip l2 ^ by [@ttodua](https://github.com/ttodua) in [#25695](https://github.com/ccxt/ccxt/pull/25695)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25694](https://github.com/ccxt/ccxt/pull/25694)
* fix(vss): remove js/ overwrite by [@carlosmiei](https://github.com/carlosmiei) in [#25706](https://github.com/ccxt/ccxt/pull/25706)
* bitrue.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25708](https://github.com/ccxt/ccxt/pull/25708)
* feat(upbit): add '1s' and '1y' timeframes by [@LambdaBen](https://github.com/LambdaBen) in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* Optimize Docker setup: replace .NET SDK installation with direct scri… by [@xucheng](https://github.com/xucheng) in [#25715](https://github.com/ccxt/ccxt/pull/25715)
* feat(tests): add per lang disabled flag by [@carlosmiei](https://github.com/carlosmiei) in [#25716](https://github.com/ccxt/ccxt/pull/25716)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25717](https://github.com/ccxt/ccxt/pull/25717)
* feat(coinlist): add fetchFundingRate by [@Dan-krm](https://github.com/Dan-krm) in [#25719](https://github.com/ccxt/ccxt/pull/25719)
* fix(binance): deposit address & reversedNetworks by [@ttodua](https://github.com/ttodua) in [#25718](https://github.com/ccxt/ccxt/pull/25718)
* fix(coinex.cs): fetchCurrencies network key by [@carlosmiei](https://github.com/carlosmiei) in [#25722](https://github.com/ccxt/ccxt/pull/25722)
* test(skips): add type ^ by [@ttodua](https://github.com/ttodua) in [#25724](https://github.com/ccxt/ccxt/pull/25724)
* fix(hyperliquid): orderId in watchMyTrades by [@carlosmiei](https://github.com/carlosmiei) in [#25726](https://github.com/ccxt/ccxt/pull/25726)
* ace - skip further ^ by [@ttodua](https://github.com/ttodua) in [#25725](https://github.com/ccxt/ccxt/pull/25725)
* fix(bitget): fetchTradingFee swap by [@carlosmiei](https://github.com/carlosmiei) in [#25730](https://github.com/ccxt/ccxt/pull/25730)
* fix(proxy): proxyUrl fix & implementation in c# by [@ttodua](https://github.com/ttodua) in [#25638](https://github.com/ccxt/ccxt/pull/25638)
* feat(upbit): define new Implicit APIs and remove deprecated API by [@LambdaBen](https://github.com/LambdaBen) in [#25733](https://github.com/ccxt/ccxt/pull/25733)
* fix(paradex): fetchTickers by [@carlosmiei](https://github.com/carlosmiei) in [#25735](https://github.com/ccxt/ccxt/pull/25735)
* chore: update actions/python to v5 by [@carlosmiei](https://github.com/carlosmiei) in [#25744](https://github.com/ccxt/ccxt/pull/25744)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/v4 by [@dependabot](https://github.com/dependabot) in [#25745](https://github.com/ccxt/ccxt/pull/25745)
* update(upbit): update rateLimit and add cost to Implicit API by [@LambdaBen](https://github.com/LambdaBen) in [#25747](https://github.com/ccxt/ccxt/pull/25747)
* feat(tests): add conflicts detection to markets by [@carlosmiei](https://github.com/carlosmiei) in [#25748](https://github.com/ccxt/ccxt/pull/25748)
* chore: bump ubuntu version in go by [@carlosmiei](https://github.com/carlosmiei) in [#25750](https://github.com/ccxt/ccxt/pull/25750)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25754](https://github.com/ccxt/ccxt/pull/25754)
* feat(okx): April 17 2025 changelog by [@Dan-krm](https://github.com/Dan-krm) in [#25756](https://github.com/ccxt/ccxt/pull/25756)
* feat(xt): add editOrder by [@Dan-krm](https://github.com/Dan-krm) in [#25751](https://github.com/ccxt/ccxt/pull/25751)
* fix(okx): preopen sandbox markets parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25761](https://github.com/ccxt/ccxt/pull/25761)
* apex omni - v3 Merge by [@cj2094](https://github.com/cj2094) in [#25428](https://github.com/ccxt/ccxt/pull/25428)
* feat(upbit): define new Unified API fetchTradingFees by [@carlosmiei](https://github.com/carlosmiei) in [#25768](https://github.com/ccxt/ccxt/pull/25768)
* fix(upbit): fetchTickers check by [@carlosmiei](https://github.com/carlosmiei) in [#25769](https://github.com/ccxt/ccxt/pull/25769)
* fix(apex) jsdoc by [@olegtaranenko](https://github.com/olegtaranenko) in [#25773](https://github.com/ccxt/ccxt/pull/25773)
* fix(poloniex): open orders symbol check by [@carlosmiei](https://github.com/carlosmiei) in [#25771](https://github.com/ccxt/ccxt/pull/25771)
* tests(fetchCurrencies): make active/deposit/withdraw checks robust by [@ttodua](https://github.com/ttodua) in [#25723](https://github.com/ccxt/ccxt/pull/25723)
* feat(bitget): fetchFundingRate, alternative method by [@Dan-krm](https://github.com/Dan-krm) in [#25778](https://github.com/ccxt/ccxt/pull/25778)
* fix(gate): watchPostions fix close positions error by [@pcriadoperez](https://github.com/pcriadoperez) in [#25782](https://github.com/ccxt/ccxt/pull/25782)
* chore(binance): remove malta MT by [@ttodua](https://github.com/ttodua) in [#25752](https://github.com/ccxt/ccxt/pull/25752)
* feat(bitget): fetchFundingRate, updated response by [@Dan-krm](https://github.com/Dan-krm) in [#25783](https://github.com/ccxt/ccxt/pull/25783)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25791](https://github.com/ccxt/ccxt/pull/25791)
* fix(upbit): max url lengthes by [@ttodua](https://github.com/ttodua) in [#25789](https://github.com/ccxt/ccxt/pull/25789)
* feat(apex): multiple fixes by [@ttodua](https://github.com/ttodua) in [#25787](https://github.com/ccxt/ccxt/pull/25787)
* test(defx): skip ohlcv open ^ by [@ttodua](https://github.com/ttodua) in [#25790](https://github.com/ccxt/ccxt/pull/25790)
* fix(cex): fetchtickers open price by [@ttodua](https://github.com/ttodua) in [#25788](https://github.com/ccxt/ccxt/pull/25788)
* fix(bitmex): market states & expiry for perps by [@ttodua](https://github.com/ttodua) in [#25785](https://github.com/ccxt/ccxt/pull/25785)
* tradeogre websockets adding by [@rayBastard](https://github.com/rayBastard) in [#25775](https://github.com/ccxt/ccxt/pull/25775)
* fix(precision): base safeCurrencyStructure change for currency wide precision by [@ttodua](https://github.com/ttodua) in [#25786](https://github.com/ccxt/ccxt/pull/25786)
* update(upbit): update createOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25799](https://github.com/ccxt/ccxt/pull/25799)
* test(fetchCurrencies): check for duplicate codes by [@Dan-krm](https://github.com/Dan-krm) in [#25801](https://github.com/ccxt/ccxt/pull/25801)
* feat(tests): add log with info level by [@carlosmiei](https://github.com/carlosmiei) in [#25804](https://github.com/ccxt/ccxt/pull/25804)
* test(currencies): fix check ^ by [@ttodua](https://github.com/ttodua) in [#25809](https://github.com/ccxt/ccxt/pull/25809)
* fix(p2b): remove recursion call by [@sc0Vu](https://github.com/sc0Vu) in [#25814](https://github.com/ccxt/ccxt/pull/25814)
* fix(hollaex): remove recursion call by [@sc0Vu](https://github.com/sc0Vu) in [#25815](https://github.com/ccxt/ccxt/pull/25815)
* fix(hyperliquid): update balance with isolated margin by [@sc0Vu](https://github.com/sc0Vu) in [#25816](https://github.com/ccxt/ccxt/pull/25816)
* feat(cointach): implement fetchDepositWithdrawFees by [@carlosmiei](https://github.com/carlosmiei) in [#25818](https://github.com/ccxt/ccxt/pull/25818)
* test(shared-methods): add extra extend for empty values by [@ttodua](https://github.com/ttodua) in [#25817](https://github.com/ccxt/ccxt/pull/25817)
* fix(hitbtc & bequant): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25819](https://github.com/ccxt/ccxt/pull/25819)
* fix(probit): type currency ^ by [@ttodua](https://github.com/ttodua) in [#25829](https://github.com/ccxt/ccxt/pull/25829)
* fix!(ace): delist by [@ttodua](https://github.com/ttodua) in [#25820](https://github.com/ccxt/ccxt/pull/25820)
* fix(coinbase) - WS orderbook by [@ttodua](https://github.com/ttodua) in [#25095](https://github.com/ccxt/ccxt/pull/25095)
* fix(mexc): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25813](https://github.com/ccxt/ccxt/pull/25813)
* fix(phemex): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25828](https://github.com/ccxt/ccxt/pull/25828)
* test(binancecoinm): remove skip by [@ttodua](https://github.com/ttodua) in [#25822](https://github.com/ccxt/ccxt/pull/25822)
* fix(whitebit): missing key ^ by [@ttodua](https://github.com/ttodua) in [#25826](https://github.com/ccxt/ccxt/pull/25826)
* fix(woo): currency & market fields by [@ttodua](https://github.com/ttodua) in [#25824](https://github.com/ccxt/ccxt/pull/25824)
* fix(mexc): createOrder multiple fixes by [@ttodua](https://github.com/ttodua) in [#25808](https://github.com/ccxt/ccxt/pull/25808)
* fix(bitget): fetchOHLCV reorganize by [@ttodua](https://github.com/ttodua) in [#25797](https://github.com/ccxt/ccxt/pull/25797)
* fix(xt): currency type by [@ttodua](https://github.com/ttodua) in [#25825](https://github.com/ccxt/ccxt/pull/25825)
* feat(upbit): editOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25834](https://github.com/ccxt/ccxt/pull/25834)
* feat(exchanges): add type to fetchPositions by [@Dan-krm](https://github.com/Dan-krm) in [#25833](https://github.com/ccxt/ccxt/pull/25833)
* fix(bitget): swap sandbox balance by [@carlosmiei](https://github.com/carlosmiei) in [#25836](https://github.com/ccxt/ccxt/pull/25836)
* fix(go): disable flaky test by [@carlosmiei](https://github.com/carlosmiei) in [#25837](https://github.com/ccxt/ccxt/pull/25837)
* fix(timex): safeTrade ^ by [@ttodua](https://github.com/ttodua) in [#25827](https://github.com/ccxt/ccxt/pull/25827)
* fix(bitopro): networks key ^ by [@ttodua](https://github.com/ttodua) in [#25851](https://github.com/ccxt/ccxt/pull/25851)
* fix(hyperliquid): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25840](https://github.com/ccxt/ccxt/pull/25840)
* fix(bitrue): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25839](https://github.com/ccxt/ccxt/pull/25839)
* fix(poloniex): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25838](https://github.com/ccxt/ccxt/pull/25838)
* fix(kraken): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25842](https://github.com/ccxt/ccxt/pull/25842)
* fix(hollaex): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25843](https://github.com/ccxt/ccxt/pull/25843)
* fix(delta): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25844](https://github.com/ccxt/ccxt/pull/25844)
* fix(deribit): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25845](https://github.com/ccxt/ccxt/pull/25845)
* fix(huobijp): currency networks ^ by [@ttodua](https://github.com/ttodua) in [#25841](https://github.com/ccxt/ccxt/pull/25841)
* fix(bitmex): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25849](https://github.com/ccxt/ccxt/pull/25849)
* fix(bitvavo): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25850](https://github.com/ccxt/ccxt/pull/25850)
* fix(coinone): currency type field ^ by [@ttodua](https://github.com/ttodua) in [#25846](https://github.com/ccxt/ccxt/pull/25846)
* fix(coinlist): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25847](https://github.com/ccxt/ccxt/pull/25847)
* fix(coinex): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25848](https://github.com/ccxt/ccxt/pull/25848)
* fix(whitebit): crypto type by [@ttodua](https://github.com/ttodua) in [#25857](https://github.com/ccxt/ccxt/pull/25857)
* fix(htx): currency type by [@ttodua](https://github.com/ttodua) in [#25856](https://github.com/ccxt/ccxt/pull/25856)
* chore(ace): remove json skip ^ by [@ttodua](https://github.com/ttodua) in [#25854](https://github.com/ccxt/ccxt/pull/25854)
* test(skip): several exchanges ^ by [@ttodua](https://github.com/ttodua) in [#25865](https://github.com/ccxt/ccxt/pull/25865)
* fix(ascendex): deposit withdraw by [@ttodua](https://github.com/ttodua) in [#25863](https://github.com/ccxt/ccxt/pull/25863)
* fix(delta): correct expiry when no mfetched market by [@sc0Vu](https://github.com/sc0Vu) in [#25866](https://github.com/ccxt/ccxt/pull/25866)
* test(coinone): major currencies skip by [@ttodua](https://github.com/ttodua) in [#25867](https://github.com/ccxt/ccxt/pull/25867)
* fix(bingx): safe currency by [@ttodua](https://github.com/ttodua) in [#25869](https://github.com/ccxt/ccxt/pull/25869)
* feat(upbit): define new CCXT Pro watchOHLCV AP by [@carlosmiei](https://github.com/carlosmiei) in [#25872](https://github.com/ccxt/ccxt/pull/25872)
* feat(bitvavo): support operatorId by [@carlosmiei](https://github.com/carlosmiei) in [#25874](https://github.com/ccxt/ccxt/pull/25874)
* fix(typo): build/transpile.sh by [@sc0Vu](https://github.com/sc0Vu) in [#25876](https://github.com/ccxt/ccxt/pull/25876)
* fix(bitmat): currency related things by [@ttodua](https://github.com/ttodua) in [#25871](https://github.com/ccxt/ccxt/pull/25871)
* retest htx by [@ttodua](https://github.com/ttodua) in [#25873](https://github.com/ccxt/ccxt/pull/25873)
* fix(bitget): fix fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25870](https://github.com/ccxt/ccxt/pull/25870)
* refactor(ticker): minor by [@ttodua](https://github.com/ttodua) in [#25868](https://github.com/ccxt/ccxt/pull/25868)
* update(upbit): Update Docs site URL by [@LambdaBen](https://github.com/LambdaBen) in [#25860](https://github.com/ccxt/ccxt/pull/25860)
* test(htx): remove proxy by [@ttodua](https://github.com/ttodua) in [#25883](https://github.com/ccxt/ccxt/pull/25883)
* feat(binance): add loadAllOptions flag by [@carlosmiei](https://github.com/carlosmiei) in [#25885](https://github.com/ccxt/ccxt/pull/25885)
* feat(bybit): change createOrder stopLossPrice endpoint by [@Dan-krm](https://github.com/Dan-krm) in [#25887](https://github.com/ccxt/ccxt/pull/25887)
* fix(htx): null bid-ask by [@ttodua](https://github.com/ttodua) in [#25881](https://github.com/ccxt/ccxt/pull/25881)
* test(ticker): more detailed tests by [@ttodua](https://github.com/ttodua) in [#25888](https://github.com/ccxt/ccxt/pull/25888)
* fix(docs): table generation by [@carlosmiei](https://github.com/carlosmiei) in [#25891](https://github.com/ccxt/ccxt/pull/25891)
* fix(cs): handle empty keys/values by [@carlosmiei](https://github.com/carlosmiei) in [#25892](https://github.com/ccxt/ccxt/pull/25892)
* fix(htx): python base & certificates addition by [@ttodua](https://github.com/ttodua) in [#25886](https://github.com/ccxt/ccxt/pull/25886)
* test(orderbook): amend all orderbook tests by [@ttodua](https://github.com/ttodua) in [#25889](https://github.com/ccxt/ccxt/pull/25889)
* test(bingx): bv compare ^ by [@ttodua](https://github.com/ttodua) in [#25890](https://github.com/ccxt/ccxt/pull/25890)
* fix(bitget): parse tickers fix by [@ttodua](https://github.com/ttodua) in [#25896](https://github.com/ccxt/ccxt/pull/25896)
* fix(bitfinex): fetchTickers & parseTicker by [@ttodua](https://github.com/ttodua) in [#25895](https://github.com/ccxt/ccxt/pull/25895)
* test(apex): skip spread by [@ttodua](https://github.com/ttodua) in [#25910](https://github.com/ccxt/ccxt/pull/25910)
* refactor: remove l2 skips by [@ttodua](https://github.com/ttodua) in [#25901](https://github.com/ccxt/ccxt/pull/25901)
* upbit - skips by [@ttodua](https://github.com/ttodua) in [#25909](https://github.com/ccxt/ccxt/pull/25909)
* refactor(htx): unfix :) by [@ttodua](https://github.com/ttodua) in [#25903](https://github.com/ccxt/ccxt/pull/25903)
* fix(bitmex): fetchMarkets by [@ttodua](https://github.com/ttodua) in [#25898](https://github.com/ccxt/ccxt/pull/25898)
* fix(bitopro): currency type by [@ttodua](https://github.com/ttodua) in [#25900](https://github.com/ccxt/ccxt/pull/25900)
* fix(coinbase): revert USD by [@ttodua](https://github.com/ttodua) in [#25922](https://github.com/ccxt/ccxt/pull/25922)
* fix(okx): fetchDepositAddress network handling by [@carlosmiei](https://github.com/carlosmiei) in [#25920](https://github.com/ccxt/ccxt/pull/25920)
* feat(binance): update testnet ws url for spot by [@sc0Vu](https://github.com/sc0Vu) in [#25923](https://github.com/ccxt/ccxt/pull/25923)
* test(btcturk): retest loadmarkets fields by [@ttodua](https://github.com/ttodua) in [#25915](https://github.com/ccxt/ccxt/pull/25915)
* fix(bitvavo): multiple fields in fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25911](https://github.com/ccxt/ccxt/pull/25911)
* test(btcmarkets): retest by [@ttodua](https://github.com/ttodua) in [#25914](https://github.com/ccxt/ccxt/pull/25914)
* test(bitteam): retest by [@ttodua](https://github.com/ttodua) in [#25908](https://github.com/ccxt/ccxt/pull/25908)
* test(bitso): unskip ohlcv by [@ttodua](https://github.com/ttodua) in [#25906](https://github.com/ccxt/ccxt/pull/25906)
* fix(bybit): createOrder, option category param by [@Dan-krm](https://github.com/Dan-krm) in [#25925](https://github.com/ccxt/ccxt/pull/25925)
* fix(bybit): fetchLedger inverse for uta 2.0 by [@carlosmiei](https://github.com/carlosmiei) in [#25924](https://github.com/ccxt/ccxt/pull/25924)
* fix(bitmart): bitmart upgrade positions to v2 by [@carlosmiei](https://github.com/carlosmiei) in [#25926](https://github.com/ccxt/ccxt/pull/25926)
* test(btcalpha): unskip by [@ttodua](https://github.com/ttodua) in [#25913](https://github.com/ccxt/ccxt/pull/25913)
* test.market.ts allow linear and inverse to be undefined for options by [@Dan-krm](https://github.com/Dan-krm) in [#25927](https://github.com/ccxt/ccxt/pull/25927)
* feat(bitget): type crypto & fiat by [@ttodua](https://github.com/ttodua) in [#25897](https://github.com/ccxt/ccxt/pull/25897)
* fix: changelog and release notes by [@pcriadoperez](https://github.com/pcriadoperez) in [#25431](https://github.com/ccxt/ccxt/pull/25431)
* feat(oxfun): fetchFundingRate by [@carlosmiei](https://github.com/carlosmiei) in [#25935](https://github.com/ccxt/ccxt/pull/25935)
* fix: changelog by [@pcriadoperez](https://github.com/pcriadoperez) in [#25936](https://github.com/ccxt/ccxt/pull/25936)
* fix(bingx): withdraw, support spot account by [@carlosmiei](https://github.com/carlosmiei) in [#25929](https://github.com/ccxt/ccxt/pull/25929)
* fix(hyperliquid): handle order error by [@carlosmiei](https://github.com/carlosmiei) in [#25934](https://github.com/ccxt/ccxt/pull/25934)
* fix(bybit): option markets types & revert tests by [@ttodua](https://github.com/ttodua) in [#25928](https://github.com/ccxt/ccxt/pull/25928)
* fix(bigone): fetchCurrencies reorganize by [@ttodua](https://github.com/ttodua) in [#25918](https://github.com/ccxt/ccxt/pull/25918)
* refactor(ascendex): minor fields/skips by [@ttodua](https://github.com/ttodua) in [#25947](https://github.com/ccxt/ccxt/pull/25947)
* test(coinbase): skip spread OB by [@ttodua](https://github.com/ttodua) in [#25946](https://github.com/ccxt/ccxt/pull/25946)
* fix(bitfinex): deposit withdraw statuses, extra fixes by [@ttodua](https://github.com/ttodua) in [#25949](https://github.com/ccxt/ccxt/pull/25949)
* fix(apex): fetchCurrencies reorg & field fixes by [@ttodua](https://github.com/ttodua) in [#25945](https://github.com/ccxt/ccxt/pull/25945)
* refactor(bingx): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25941](https://github.com/ccxt/ccxt/pull/25941)
* fix(proxies): some updates by [@ttodua](https://github.com/ttodua) in [#25943](https://github.com/ccxt/ccxt/pull/25943)
* fix(docs) improve markdown hints by [@olegtaranenko](https://github.com/olegtaranenko) in [#25952](https://github.com/ccxt/ccxt/pull/25952)
* refactor(bitfinex): networks reorg by [@ttodua](https://github.com/ttodua) in [#25950](https://github.com/ccxt/ccxt/pull/25950)
* fix(bitget): max candles back by [@ttodua](https://github.com/ttodua) in [#25939](https://github.com/ccxt/ccxt/pull/25939)
* fix(go): urlencode and datetime fix by [@carlosmiei](https://github.com/carlosmiei) in [#25953](https://github.com/ccxt/ccxt/pull/25953)
## New Contributors [#new-contributors-50]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* [@LambdaBen](https://github.com/LambdaBen) made their first contribution in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* [@xucheng](https://github.com/xucheng) made their first contribution in [#25715](https://github.com/ccxt/ccxt/pull/25715)
* [@cj2094](https://github.com/cj2094) made their first contribution in [#25428](https://github.com/ccxt/ccxt/pull/25428)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.82](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.82)
[Changes][v4.4.82]
# [v4.4.80](https://github.com/ccxt/ccxt/releases/tag/v4.4.80) - 2025-05-09 [#v4480---2025-05-09]
## What's Changed [#whats-changed-96]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
* build(deps): bump next from 14.2.21 to 14.2.25 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25542](https://github.com/ccxt/ccxt/pull/25542)
* fix(kraken) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#25543](https://github.com/ccxt/ccxt/pull/25543)
* better instructions for exhange-capabilities script by [@samgermain](https://github.com/samgermain) in [#25546](https://github.com/ccxt/ccxt/pull/25546)
* feat(bitmart): add editOrder to limit swap orders by [@carlosmiei](https://github.com/carlosmiei) in [#25547](https://github.com/ccxt/ccxt/pull/25547)
* chore: readme remove expired campaign by [@carlosmiei](https://github.com/carlosmiei) in [#25551](https://github.com/ccxt/ccxt/pull/25551)
* docs(readme): minor by [@ttodua](https://github.com/ttodua) in [#25550](https://github.com/ccxt/ccxt/pull/25550)
* fix(goTranspiler): safeCurrencyCode inherited call by [@carlosmiei](https://github.com/carlosmiei) in [#25548](https://github.com/ccxt/ccxt/pull/25548)
* bingx, bitmart: has\["createReduceOnlyOrder"] = true by [@samgermain](https://github.com/samgermain) in [#25552](https://github.com/ccxt/ccxt/pull/25552)
* feat(okx) - full networks unif by [@ttodua](https://github.com/ttodua) in [#25553](https://github.com/ccxt/ccxt/pull/25553)
* feat(base) - handleRequestNetwork by [@ttodua](https://github.com/ttodua) in [#25466](https://github.com/ccxt/ccxt/pull/25466)
* has\["createReduceOnlyOrder"] by [@samgermain](https://github.com/samgermain) in [#25555](https://github.com/ccxt/ccxt/pull/25555)
* fix(bitget): sandbox markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#25557](https://github.com/ccxt/ccxt/pull/25557)
* feat(exchange): type constructor by [@carlosmiei](https://github.com/carlosmiei) in [#25558](https://github.com/ccxt/ccxt/pull/25558)
* feat(constructor): support sandbox/testnet key by [@carlosmiei](https://github.com/carlosmiei) in [#25559](https://github.com/ccxt/ccxt/pull/25559)
* fix(okx) - zksync ^ by [@ttodua](https://github.com/ttodua) in [#25560](https://github.com/ccxt/ccxt/pull/25560)
* poloniex & poloniexfutures - v3 Update & merger by [@ttodua](https://github.com/ttodua) in [#25378](https://github.com/ccxt/ccxt/pull/25378)
* feat(binance): update binance documentation links by [@Dan-krm](https://github.com/Dan-krm) in [#25561](https://github.com/ccxt/ccxt/pull/25561)
* feat(exchange): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#25562](https://github.com/ccxt/ccxt/pull/25562)
* fix(bingx) - implicit balance endpoint ^ by [@ttodua](https://github.com/ttodua) in [#25567](https://github.com/ccxt/ccxt/pull/25567)
* chore(poloniex) - ws skip tests ^ by [@ttodua](https://github.com/ttodua) in [#25566](https://github.com/ccxt/ccxt/pull/25566)
* fix(cex) - missing active key ^ by [@ttodua](https://github.com/ttodua) in [#25565](https://github.com/ccxt/ccxt/pull/25565)
* whitebit: createOrder - update docstring, has array by [@samgermain](https://github.com/samgermain) in [#25563](https://github.com/ccxt/ccxt/pull/25563)
* feat(whitebit): createDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25569](https://github.com/ccxt/ccxt/pull/25569)
* fix(gate): currencies encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25571](https://github.com/ccxt/ccxt/pull/25571)
* fix(poloniex) - features missing symbol req by [@ttodua](https://github.com/ttodua) in [#25573](https://github.com/ccxt/ccxt/pull/25573)
* fix(gate): use replaceAll instead by [@carlosmiei](https://github.com/carlosmiei) in [#25572](https://github.com/ccxt/ccxt/pull/25572)
* feat(whitebit): fetchCrossBorrowRate by [@Dan-krm](https://github.com/Dan-krm) in [#25568](https://github.com/ccxt/ccxt/pull/25568)
* fix(bingx): allAccountBalance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25575](https://github.com/ccxt/ccxt/pull/25575)
* fix(derive): update balance by [@sc0Vu](https://github.com/sc0Vu) in [#25581](https://github.com/ccxt/ccxt/pull/25581)
* fix(derive): rename deriveWalletAddress by [@sc0Vu](https://github.com/sc0Vu) in [#25582](https://github.com/ccxt/ccxt/pull/25582)
* krakenfutures\["has"]: createPostOnlyOrder, createReduceOnlyOrder, ... = true by [@samgermain](https://github.com/samgermain) in [#25576](https://github.com/ccxt/ccxt/pull/25576)
* feat(hyperliquid): add createVault by [@sc0Vu](https://github.com/sc0Vu) in [#25577](https://github.com/ccxt/ccxt/pull/25577)
* refactor & fix(okx) - fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25564](https://github.com/ccxt/ccxt/pull/25564)
* fix(bingx) - unskip tests by [@ttodua](https://github.com/ttodua) in [#25583](https://github.com/ccxt/ccxt/pull/25583)
* fix(derive): add creation\_timestamp by [@sc0Vu](https://github.com/sc0Vu) in [#25594](https://github.com/ccxt/ccxt/pull/25594)
* fix(exchange) mismatched return type by [@olegtaranenko](https://github.com/olegtaranenko) in [#25593](https://github.com/ccxt/ccxt/pull/25593)
* fix(bingx) - implicit api by [@ttodua](https://github.com/ttodua) in [#25584](https://github.com/ccxt/ccxt/pull/25584)
* fix(krakenfutures) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25586](https://github.com/ccxt/ccxt/pull/25586)
* okcoin.has createPostOnlyOrder, createReduceOnlyOrder, createStopLimitOrder, createStopMarketOrder by [@samgermain](https://github.com/samgermain) in [#25585](https://github.com/ccxt/ccxt/pull/25585)
* feat(exchanges): createDepositAddress, add DepositAddress type by [@Dan-krm](https://github.com/Dan-krm) in [#25595](https://github.com/ccxt/ccxt/pull/25595)
* fix(coinbase) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25587](https://github.com/ccxt/ccxt/pull/25587)
* fix(bitmart) - watchTrades fix by [@ttodua](https://github.com/ttodua) in [#25589](https://github.com/ccxt/ccxt/pull/25589)
* tests(ace) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25590](https://github.com/ccxt/ccxt/pull/25590)
* fix(ascendex) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25591](https://github.com/ccxt/ccxt/pull/25591)
* fix(paradex): market parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25606](https://github.com/ccxt/ccxt/pull/25606)
* fix(woo): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25605](https://github.com/ccxt/ccxt/pull/25605)
* tests(binance) - unksip networks ^ by [@ttodua](https://github.com/ttodua) in [#25607](https://github.com/ccxt/ccxt/pull/25607)
* fix(okx) - expiry time for future/option by [@ttodua](https://github.com/ttodua) in [#25600](https://github.com/ccxt/ccxt/pull/25600)
* fix(woofipro) - inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25604](https://github.com/ccxt/ccxt/pull/25604)
* fix(derive) - linear inverse ^ by [@ttodua](https://github.com/ttodua) in [#25602](https://github.com/ccxt/ccxt/pull/25602)
* fix(paradex): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25603](https://github.com/ccxt/ccxt/pull/25603)
* bit2c has false methods by [@samgermain](https://github.com/samgermain) in [#25609](https://github.com/ccxt/ccxt/pull/25609)
* tests(ace) - unskip markets ^ by [@ttodua](https://github.com/ttodua) in [#25599](https://github.com/ccxt/ccxt/pull/25599)
* fix(defx) - market inverse ^ by [@ttodua](https://github.com/ttodua) in [#25601](https://github.com/ccxt/ccxt/pull/25601)
* fix(derive): options linear ^ by [@ttodua](https://github.com/ttodua) in [#25608](https://github.com/ccxt/ccxt/pull/25608)
* tests(binanceus) - fetchStatus unskip ^ by [@ttodua](https://github.com/ttodua) in [#25597](https://github.com/ccxt/ccxt/pull/25597)
* build(deps): bump next from 14.2.25 to 14.2.26 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25626](https://github.com/ccxt/ccxt/pull/25626)
* fix(bitget) - market precision by [@ttodua](https://github.com/ttodua) in [#25624](https://github.com/ccxt/ccxt/pull/25624)
* fix(ascedex): currency id str ^ by [@ttodua](https://github.com/ttodua) in [#25614](https://github.com/ccxt/ccxt/pull/25614)
* chore(bitfinex1) - delist old version by [@ttodua](https://github.com/ttodua) in [#25621](https://github.com/ccxt/ccxt/pull/25621)
* tests(bitget): ws orderbook field ^ by [@ttodua](https://github.com/ttodua) in [#25625](https://github.com/ccxt/ccxt/pull/25625)
* tests(binance): unskip ticker & precision ^ by [@ttodua](https://github.com/ttodua) in [#25616](https://github.com/ccxt/ccxt/pull/25616)
* fix(bitget): fetchWithdrawals code not required by [@carlosmiei](https://github.com/carlosmiei) in [#25633](https://github.com/ccxt/ccxt/pull/25633)
* fix(bitrue): orderbook & retest by [@ttodua](https://github.com/ttodua) in [#25634](https://github.com/ccxt/ccxt/pull/25634)
* fix(build): remove bitfinex1 data by [@carlosmiei](https://github.com/carlosmiei) in [#25640](https://github.com/ccxt/ccxt/pull/25640)
* feat(bybit): define most method types by [@Dan-krm](https://github.com/Dan-krm) in [#25636](https://github.com/ccxt/ccxt/pull/25636)
* chore: pushback ccxt.ts by [@carlosmiei](https://github.com/carlosmiei) in [#25641](https://github.com/ccxt/ccxt/pull/25641)
* ace.has: false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25642](https://github.com/ccxt/ccxt/pull/25642)
* chore(tests): minor comment by [@ttodua](https://github.com/ttodua) in [#25635](https://github.com/ccxt/ccxt/pull/25635)
* fix(binance): update ids by [@carlosmiei](https://github.com/carlosmiei) in [#25645](https://github.com/ccxt/ccxt/pull/25645)
* feat(bybit): add pagination to fetchPositions by [@carlosmiei](https://github.com/carlosmiei) in [#25646](https://github.com/ccxt/ccxt/pull/25646)
* alpaca.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25649](https://github.com/ccxt/ccxt/pull/25649)
* chore(skips): empty entries ^ by [@ttodua](https://github.com/ttodua) in [#25618](https://github.com/ccxt/ccxt/pull/25618)
* refactor(base): reorg removeRepeatedElementsFromArray by [@ttodua](https://github.com/ttodua) in [#25644](https://github.com/ccxt/ccxt/pull/25644)
* ascendex.has - option and future methods = false by [@samgermain](https://github.com/samgermain) in [#25656](https://github.com/ccxt/ccxt/pull/25656)
* ace, alpaca: option methods = false by [@samgermain](https://github.com/samgermain) in [#25655](https://github.com/ccxt/ccxt/pull/25655)
* fix(deribit): currency inference by [@carlosmiei](https://github.com/carlosmiei) in [#25657](https://github.com/ccxt/ccxt/pull/25657)
* hitbtc.has: option/future methods = false by [@samgermain](https://github.com/samgermain) in [#25658](https://github.com/ccxt/ccxt/pull/25658)
* bit2c.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25659](https://github.com/ccxt/ccxt/pull/25659)
* bitbank.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25662](https://github.com/ccxt/ccxt/pull/25662)
* fix(gate): currencies url encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25667](https://github.com/ccxt/ccxt/pull/25667)
* bitmart parseTransaction fix by [@ndubel](https://github.com/ndubel) in [#25671](https://github.com/ccxt/ccxt/pull/25671)
* fix(gate): btc inverse contractSize fix by [@ttodua](https://github.com/ttodua) in [#25672](https://github.com/ccxt/ccxt/pull/25672)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25670](https://github.com/ccxt/ccxt/pull/25670)
* tests(ascendex): skip bid ask ^ by [@ttodua](https://github.com/ttodua) in [#25665](https://github.com/ccxt/ccxt/pull/25665)
* delist(bitpanda): remove old alias by [@ttodua](https://github.com/ttodua) in [#25664](https://github.com/ccxt/ccxt/pull/25664)
* duplicate folders/files ^ by [@ttodua](https://github.com/ttodua) in [#25648](https://github.com/ccxt/ccxt/pull/25648)
* chore(onetrading): comment ^ by [@ttodua](https://github.com/ttodua) in [#25632](https://github.com/ccxt/ccxt/pull/25632)
* fix(bitopro): ws unskip (minor changes) by [@ttodua](https://github.com/ttodua) in [#25630](https://github.com/ccxt/ccxt/pull/25630)
* tests(bitmart): unskip fields ^ by [@ttodua](https://github.com/ttodua) in [#25627](https://github.com/ccxt/ccxt/pull/25627)
* chore(reorg): validate types ^ by [@ttodua](https://github.com/ttodua) in [#25622](https://github.com/ccxt/ccxt/pull/25622)
* chore(bitcoincom): delist (remove) inexistent old alias ^ by [@ttodua](https://github.com/ttodua) in [#25620](https://github.com/ccxt/ccxt/pull/25620)
* fix(bitbns) - active & unskip ^ by [@ttodua](https://github.com/ttodua) in [#25619](https://github.com/ccxt/ccxt/pull/25619)
* unskip bequant ^ by [@ttodua](https://github.com/ttodua) in [#25615](https://github.com/ccxt/ccxt/pull/25615)
* tests(binanceusdm) - retest few props ^ by [@ttodua](https://github.com/ttodua) in [#25617](https://github.com/ccxt/ccxt/pull/25617)
* chore(tests): datetime comments enhance ^ by [@ttodua](https://github.com/ttodua) in [#25631](https://github.com/ccxt/ccxt/pull/25631)
* test(assertions): enhance tests by [@ttodua](https://github.com/ttodua) in [#25650](https://github.com/ccxt/ccxt/pull/25650)
* test(markets): complete reorg by [@ttodua](https://github.com/ttodua) in [#25669](https://github.com/ccxt/ccxt/pull/25669)
* fix(bybit): option currency inference by [@Dan-krm](https://github.com/Dan-krm) in [#25673](https://github.com/ccxt/ccxt/pull/25673)
* fix(docs) - precisions by [@ttodua](https://github.com/ttodua) in [#23316](https://github.com/ccxt/ccxt/pull/23316)
* bitopro skip timestamp ^ by [@ttodua](https://github.com/ttodua) in [#25675](https://github.com/ccxt/ccxt/pull/25675)
* ws duplicate trades filtering by [@ttodua](https://github.com/ttodua) in [#25639](https://github.com/ccxt/ccxt/pull/25639)
* fix(coinlist): support swap markets by [@carlosmiei](https://github.com/carlosmiei) in [#25676](https://github.com/ccxt/ccxt/pull/25676)
* feat(bitmart): add setPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25678](https://github.com/ccxt/ccxt/pull/25678)
* unskip bitflyer ^ by [@ttodua](https://github.com/ttodua) in [#25623](https://github.com/ccxt/ccxt/pull/25623)
* chore(skips): sort alphabetically ^ by [@ttodua](https://github.com/ttodua) in [#25677](https://github.com/ccxt/ccxt/pull/25677)
* bithumb.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25680](https://github.com/ccxt/ccxt/pull/25680)
* fix(tests): skip json ^ by [@ttodua](https://github.com/ttodua) in [#25681](https://github.com/ccxt/ccxt/pull/25681)
* fix(Exchange): removeRepeatedElementsFromArray keys order dependency by [@carlosmiei](https://github.com/carlosmiei) in [#25683](https://github.com/ccxt/ccxt/pull/25683)
* fix(blofin): fetchClosedOrders flag by [@carlosmiei](https://github.com/carlosmiei) in [#25685](https://github.com/ccxt/ccxt/pull/25685)
* feat(bitmart): add fetchPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25686](https://github.com/ccxt/ccxt/pull/25686)
* chore: disable go test by [@carlosmiei](https://github.com/carlosmiei) in [#25687](https://github.com/ccxt/ccxt/pull/25687)
* fix(okx): fetchohlcv by [@ttodua](https://github.com/ttodua) in [#25682](https://github.com/ccxt/ccxt/pull/25682)
* doc(order): stoploss & params by [@ttodua](https://github.com/ttodua) in [#25684](https://github.com/ccxt/ccxt/pull/25684)
* chore: fix js action by [@carlosmiei](https://github.com/carlosmiei) in [#25697](https://github.com/ccxt/ccxt/pull/25697)
* test(market): fix precision issues ^ by [@ttodua](https://github.com/ttodua) in [#25690](https://github.com/ccxt/ccxt/pull/25690)
* test(bitmart): skip watchOB bid-ask ^ by [@ttodua](https://github.com/ttodua) in [#25691](https://github.com/ccxt/ccxt/pull/25691)
* test(bitflyer): no settleId ^ by [@ttodua](https://github.com/ttodua) in [#25693](https://github.com/ccxt/ccxt/pull/25693)
* fix(safeCurrencyStructure): withdraw/deposit/active by [@ttodua](https://github.com/ttodua) in [#25698](https://github.com/ccxt/ccxt/pull/25698)
* bitopro.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25705](https://github.com/ccxt/ccxt/pull/25705)
* chore: remove js/ dep from export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25700](https://github.com/ccxt/ccxt/pull/25700)
* test(market): removal of few skips ^ by [@ttodua](https://github.com/ttodua) in [#25692](https://github.com/ccxt/ccxt/pull/25692)
* feat(coinlist): add missing endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25703](https://github.com/ccxt/ccxt/pull/25703)
* test(coinex): skip precision & networks ^ by [@ttodua](https://github.com/ttodua) in [#25696](https://github.com/ccxt/ccxt/pull/25696)
* test(bitopro): skip l2 ^ by [@ttodua](https://github.com/ttodua) in [#25695](https://github.com/ccxt/ccxt/pull/25695)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25694](https://github.com/ccxt/ccxt/pull/25694)
* fix(vss): remove js/ overwrite by [@carlosmiei](https://github.com/carlosmiei) in [#25706](https://github.com/ccxt/ccxt/pull/25706)
* bitrue.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25708](https://github.com/ccxt/ccxt/pull/25708)
* feat(upbit): add '1s' and '1y' timeframes by [@LambdaBen](https://github.com/LambdaBen) in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* Optimize Docker setup: replace .NET SDK installation with direct scri… by [@xucheng](https://github.com/xucheng) in [#25715](https://github.com/ccxt/ccxt/pull/25715)
* feat(tests): add per lang disabled flag by [@carlosmiei](https://github.com/carlosmiei) in [#25716](https://github.com/ccxt/ccxt/pull/25716)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25717](https://github.com/ccxt/ccxt/pull/25717)
* feat(coinlist): add fetchFundingRate by [@Dan-krm](https://github.com/Dan-krm) in [#25719](https://github.com/ccxt/ccxt/pull/25719)
* fix(binance): deposit address & reversedNetworks by [@ttodua](https://github.com/ttodua) in [#25718](https://github.com/ccxt/ccxt/pull/25718)
* fix(coinex.cs): fetchCurrencies network key by [@carlosmiei](https://github.com/carlosmiei) in [#25722](https://github.com/ccxt/ccxt/pull/25722)
* test(skips): add type ^ by [@ttodua](https://github.com/ttodua) in [#25724](https://github.com/ccxt/ccxt/pull/25724)
* fix(hyperliquid): orderId in watchMyTrades by [@carlosmiei](https://github.com/carlosmiei) in [#25726](https://github.com/ccxt/ccxt/pull/25726)
* ace - skip further ^ by [@ttodua](https://github.com/ttodua) in [#25725](https://github.com/ccxt/ccxt/pull/25725)
* fix(bitget): fetchTradingFee swap by [@carlosmiei](https://github.com/carlosmiei) in [#25730](https://github.com/ccxt/ccxt/pull/25730)
* fix(proxy): proxyUrl fix & implementation in c# by [@ttodua](https://github.com/ttodua) in [#25638](https://github.com/ccxt/ccxt/pull/25638)
* feat(upbit): define new Implicit APIs and remove deprecated API by [@LambdaBen](https://github.com/LambdaBen) in [#25733](https://github.com/ccxt/ccxt/pull/25733)
* fix(paradex): fetchTickers by [@carlosmiei](https://github.com/carlosmiei) in [#25735](https://github.com/ccxt/ccxt/pull/25735)
* chore: update actions/python to v5 by [@carlosmiei](https://github.com/carlosmiei) in [#25744](https://github.com/ccxt/ccxt/pull/25744)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/v4 by [@dependabot](https://github.com/dependabot) in [#25745](https://github.com/ccxt/ccxt/pull/25745)
* update(upbit): update rateLimit and add cost to Implicit API by [@LambdaBen](https://github.com/LambdaBen) in [#25747](https://github.com/ccxt/ccxt/pull/25747)
* feat(tests): add conflicts detection to markets by [@carlosmiei](https://github.com/carlosmiei) in [#25748](https://github.com/ccxt/ccxt/pull/25748)
* chore: bump ubuntu version in go by [@carlosmiei](https://github.com/carlosmiei) in [#25750](https://github.com/ccxt/ccxt/pull/25750)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25754](https://github.com/ccxt/ccxt/pull/25754)
* feat(okx): April 17 2025 changelog by [@Dan-krm](https://github.com/Dan-krm) in [#25756](https://github.com/ccxt/ccxt/pull/25756)
* feat(xt): add editOrder by [@Dan-krm](https://github.com/Dan-krm) in [#25751](https://github.com/ccxt/ccxt/pull/25751)
* fix(okx): preopen sandbox markets parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25761](https://github.com/ccxt/ccxt/pull/25761)
* apex omni - v3 Merge by [@cj2094](https://github.com/cj2094) in [#25428](https://github.com/ccxt/ccxt/pull/25428)
* feat(upbit): define new Unified API fetchTradingFees by [@carlosmiei](https://github.com/carlosmiei) in [#25768](https://github.com/ccxt/ccxt/pull/25768)
* fix(upbit): fetchTickers check by [@carlosmiei](https://github.com/carlosmiei) in [#25769](https://github.com/ccxt/ccxt/pull/25769)
* fix(apex) jsdoc by [@olegtaranenko](https://github.com/olegtaranenko) in [#25773](https://github.com/ccxt/ccxt/pull/25773)
* fix(poloniex): open orders symbol check by [@carlosmiei](https://github.com/carlosmiei) in [#25771](https://github.com/ccxt/ccxt/pull/25771)
* tests(fetchCurrencies): make active/deposit/withdraw checks robust by [@ttodua](https://github.com/ttodua) in [#25723](https://github.com/ccxt/ccxt/pull/25723)
* feat(bitget): fetchFundingRate, alternative method by [@Dan-krm](https://github.com/Dan-krm) in [#25778](https://github.com/ccxt/ccxt/pull/25778)
* fix(gate): watchPostions fix close positions error by [@pcriadoperez](https://github.com/pcriadoperez) in [#25782](https://github.com/ccxt/ccxt/pull/25782)
* chore(binance): remove malta MT by [@ttodua](https://github.com/ttodua) in [#25752](https://github.com/ccxt/ccxt/pull/25752)
* feat(bitget): fetchFundingRate, updated response by [@Dan-krm](https://github.com/Dan-krm) in [#25783](https://github.com/ccxt/ccxt/pull/25783)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25791](https://github.com/ccxt/ccxt/pull/25791)
* fix(upbit): max url lengthes by [@ttodua](https://github.com/ttodua) in [#25789](https://github.com/ccxt/ccxt/pull/25789)
* feat(apex): multiple fixes by [@ttodua](https://github.com/ttodua) in [#25787](https://github.com/ccxt/ccxt/pull/25787)
* test(defx): skip ohlcv open ^ by [@ttodua](https://github.com/ttodua) in [#25790](https://github.com/ccxt/ccxt/pull/25790)
* fix(cex): fetchtickers open price by [@ttodua](https://github.com/ttodua) in [#25788](https://github.com/ccxt/ccxt/pull/25788)
* fix(bitmex): market states & expiry for perps by [@ttodua](https://github.com/ttodua) in [#25785](https://github.com/ccxt/ccxt/pull/25785)
* tradeogre websockets adding by [@rayBastard](https://github.com/rayBastard) in [#25775](https://github.com/ccxt/ccxt/pull/25775)
* fix(precision): base safeCurrencyStructure change for currency wide precision by [@ttodua](https://github.com/ttodua) in [#25786](https://github.com/ccxt/ccxt/pull/25786)
* update(upbit): update createOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25799](https://github.com/ccxt/ccxt/pull/25799)
* test(fetchCurrencies): check for duplicate codes by [@Dan-krm](https://github.com/Dan-krm) in [#25801](https://github.com/ccxt/ccxt/pull/25801)
* feat(tests): add log with info level by [@carlosmiei](https://github.com/carlosmiei) in [#25804](https://github.com/ccxt/ccxt/pull/25804)
* test(currencies): fix check ^ by [@ttodua](https://github.com/ttodua) in [#25809](https://github.com/ccxt/ccxt/pull/25809)
* fix(p2b): remove recursion call by [@sc0Vu](https://github.com/sc0Vu) in [#25814](https://github.com/ccxt/ccxt/pull/25814)
* fix(hollaex): remove recursion call by [@sc0Vu](https://github.com/sc0Vu) in [#25815](https://github.com/ccxt/ccxt/pull/25815)
* fix(hyperliquid): update balance with isolated margin by [@sc0Vu](https://github.com/sc0Vu) in [#25816](https://github.com/ccxt/ccxt/pull/25816)
* feat(cointach): implement fetchDepositWithdrawFees by [@carlosmiei](https://github.com/carlosmiei) in [#25818](https://github.com/ccxt/ccxt/pull/25818)
* test(shared-methods): add extra extend for empty values by [@ttodua](https://github.com/ttodua) in [#25817](https://github.com/ccxt/ccxt/pull/25817)
* fix(hitbtc & bequant): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25819](https://github.com/ccxt/ccxt/pull/25819)
* fix(probit): type currency ^ by [@ttodua](https://github.com/ttodua) in [#25829](https://github.com/ccxt/ccxt/pull/25829)
* fix!(ace): delist by [@ttodua](https://github.com/ttodua) in [#25820](https://github.com/ccxt/ccxt/pull/25820)
* fix(coinbase) - WS orderbook by [@ttodua](https://github.com/ttodua) in [#25095](https://github.com/ccxt/ccxt/pull/25095)
* fix(mexc): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25813](https://github.com/ccxt/ccxt/pull/25813)
* fix(phemex): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25828](https://github.com/ccxt/ccxt/pull/25828)
* test(binancecoinm): remove skip by [@ttodua](https://github.com/ttodua) in [#25822](https://github.com/ccxt/ccxt/pull/25822)
* fix(whitebit): missing key ^ by [@ttodua](https://github.com/ttodua) in [#25826](https://github.com/ccxt/ccxt/pull/25826)
* fix(woo): currency & market fields by [@ttodua](https://github.com/ttodua) in [#25824](https://github.com/ccxt/ccxt/pull/25824)
* fix(mexc): createOrder multiple fixes by [@ttodua](https://github.com/ttodua) in [#25808](https://github.com/ccxt/ccxt/pull/25808)
* fix(bitget): fetchOHLCV reorganize by [@ttodua](https://github.com/ttodua) in [#25797](https://github.com/ccxt/ccxt/pull/25797)
* fix(xt): currency type by [@ttodua](https://github.com/ttodua) in [#25825](https://github.com/ccxt/ccxt/pull/25825)
* feat(upbit): editOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25834](https://github.com/ccxt/ccxt/pull/25834)
* feat(exchanges): add type to fetchPositions by [@Dan-krm](https://github.com/Dan-krm) in [#25833](https://github.com/ccxt/ccxt/pull/25833)
* fix(bitget): swap sandbox balance by [@carlosmiei](https://github.com/carlosmiei) in [#25836](https://github.com/ccxt/ccxt/pull/25836)
* fix(go): disable flaky test by [@carlosmiei](https://github.com/carlosmiei) in [#25837](https://github.com/ccxt/ccxt/pull/25837)
* fix(timex): safeTrade ^ by [@ttodua](https://github.com/ttodua) in [#25827](https://github.com/ccxt/ccxt/pull/25827)
* fix(bitopro): networks key ^ by [@ttodua](https://github.com/ttodua) in [#25851](https://github.com/ccxt/ccxt/pull/25851)
* fix(hyperliquid): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25840](https://github.com/ccxt/ccxt/pull/25840)
* fix(bitrue): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25839](https://github.com/ccxt/ccxt/pull/25839)
* fix(poloniex): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25838](https://github.com/ccxt/ccxt/pull/25838)
* fix(kraken): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25842](https://github.com/ccxt/ccxt/pull/25842)
* fix(hollaex): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25843](https://github.com/ccxt/ccxt/pull/25843)
* fix(delta): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25844](https://github.com/ccxt/ccxt/pull/25844)
* fix(deribit): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25845](https://github.com/ccxt/ccxt/pull/25845)
* fix(huobijp): currency networks ^ by [@ttodua](https://github.com/ttodua) in [#25841](https://github.com/ccxt/ccxt/pull/25841)
* fix(bitmex): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25849](https://github.com/ccxt/ccxt/pull/25849)
* fix(bitvavo): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25850](https://github.com/ccxt/ccxt/pull/25850)
* fix(coinone): currency type field ^ by [@ttodua](https://github.com/ttodua) in [#25846](https://github.com/ccxt/ccxt/pull/25846)
* fix(coinlist): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25847](https://github.com/ccxt/ccxt/pull/25847)
* fix(coinex): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25848](https://github.com/ccxt/ccxt/pull/25848)
* fix(whitebit): crypto type by [@ttodua](https://github.com/ttodua) in [#25857](https://github.com/ccxt/ccxt/pull/25857)
* fix(htx): currency type by [@ttodua](https://github.com/ttodua) in [#25856](https://github.com/ccxt/ccxt/pull/25856)
* chore(ace): remove json skip ^ by [@ttodua](https://github.com/ttodua) in [#25854](https://github.com/ccxt/ccxt/pull/25854)
* test(skip): several exchanges ^ by [@ttodua](https://github.com/ttodua) in [#25865](https://github.com/ccxt/ccxt/pull/25865)
* fix(ascendex): deposit withdraw by [@ttodua](https://github.com/ttodua) in [#25863](https://github.com/ccxt/ccxt/pull/25863)
* fix(delta): correct expiry when no mfetched market by [@sc0Vu](https://github.com/sc0Vu) in [#25866](https://github.com/ccxt/ccxt/pull/25866)
* test(coinone): major currencies skip by [@ttodua](https://github.com/ttodua) in [#25867](https://github.com/ccxt/ccxt/pull/25867)
* fix(bingx): safe currency by [@ttodua](https://github.com/ttodua) in [#25869](https://github.com/ccxt/ccxt/pull/25869)
* feat(upbit): define new CCXT Pro watchOHLCV AP by [@carlosmiei](https://github.com/carlosmiei) in [#25872](https://github.com/ccxt/ccxt/pull/25872)
* feat(bitvavo): support operatorId by [@carlosmiei](https://github.com/carlosmiei) in [#25874](https://github.com/ccxt/ccxt/pull/25874)
* fix(typo): build/transpile.sh by [@sc0Vu](https://github.com/sc0Vu) in [#25876](https://github.com/ccxt/ccxt/pull/25876)
* fix(bitmat): currency related things by [@ttodua](https://github.com/ttodua) in [#25871](https://github.com/ccxt/ccxt/pull/25871)
* retest htx by [@ttodua](https://github.com/ttodua) in [#25873](https://github.com/ccxt/ccxt/pull/25873)
* fix(bitget): fix fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25870](https://github.com/ccxt/ccxt/pull/25870)
* refactor(ticker): minor by [@ttodua](https://github.com/ttodua) in [#25868](https://github.com/ccxt/ccxt/pull/25868)
* update(upbit): Update Docs site URL by [@LambdaBen](https://github.com/LambdaBen) in [#25860](https://github.com/ccxt/ccxt/pull/25860)
* test(htx): remove proxy by [@ttodua](https://github.com/ttodua) in [#25883](https://github.com/ccxt/ccxt/pull/25883)
* feat(binance): add loadAllOptions flag by [@carlosmiei](https://github.com/carlosmiei) in [#25885](https://github.com/ccxt/ccxt/pull/25885)
* feat(bybit): change createOrder stopLossPrice endpoint by [@Dan-krm](https://github.com/Dan-krm) in [#25887](https://github.com/ccxt/ccxt/pull/25887)
* fix(htx): null bid-ask by [@ttodua](https://github.com/ttodua) in [#25881](https://github.com/ccxt/ccxt/pull/25881)
* test(ticker): more detailed tests by [@ttodua](https://github.com/ttodua) in [#25888](https://github.com/ccxt/ccxt/pull/25888)
* fix(docs): table generation by [@carlosmiei](https://github.com/carlosmiei) in [#25891](https://github.com/ccxt/ccxt/pull/25891)
* fix(cs): handle empty keys/values by [@carlosmiei](https://github.com/carlosmiei) in [#25892](https://github.com/ccxt/ccxt/pull/25892)
* fix(htx): python base & certificates addition by [@ttodua](https://github.com/ttodua) in [#25886](https://github.com/ccxt/ccxt/pull/25886)
* test(orderbook): amend all orderbook tests by [@ttodua](https://github.com/ttodua) in [#25889](https://github.com/ccxt/ccxt/pull/25889)
* test(bingx): bv compare ^ by [@ttodua](https://github.com/ttodua) in [#25890](https://github.com/ccxt/ccxt/pull/25890)
* fix(bitget): parse tickers fix by [@ttodua](https://github.com/ttodua) in [#25896](https://github.com/ccxt/ccxt/pull/25896)
* fix(bitfinex): fetchTickers & parseTicker by [@ttodua](https://github.com/ttodua) in [#25895](https://github.com/ccxt/ccxt/pull/25895)
* test(apex): skip spread by [@ttodua](https://github.com/ttodua) in [#25910](https://github.com/ccxt/ccxt/pull/25910)
* refactor: remove l2 skips by [@ttodua](https://github.com/ttodua) in [#25901](https://github.com/ccxt/ccxt/pull/25901)
* upbit - skips by [@ttodua](https://github.com/ttodua) in [#25909](https://github.com/ccxt/ccxt/pull/25909)
* refactor(htx): unfix :) by [@ttodua](https://github.com/ttodua) in [#25903](https://github.com/ccxt/ccxt/pull/25903)
* fix(bitmex): fetchMarkets by [@ttodua](https://github.com/ttodua) in [#25898](https://github.com/ccxt/ccxt/pull/25898)
* fix(bitopro): currency type by [@ttodua](https://github.com/ttodua) in [#25900](https://github.com/ccxt/ccxt/pull/25900)
* fix(coinbase): revert USD by [@ttodua](https://github.com/ttodua) in [#25922](https://github.com/ccxt/ccxt/pull/25922)
* fix(okx): fetchDepositAddress network handling by [@carlosmiei](https://github.com/carlosmiei) in [#25920](https://github.com/ccxt/ccxt/pull/25920)
* feat(binance): update testnet ws url for spot by [@sc0Vu](https://github.com/sc0Vu) in [#25923](https://github.com/ccxt/ccxt/pull/25923)
* test(btcturk): retest loadmarkets fields by [@ttodua](https://github.com/ttodua) in [#25915](https://github.com/ccxt/ccxt/pull/25915)
* fix(bitvavo): multiple fields in fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25911](https://github.com/ccxt/ccxt/pull/25911)
* test(btcmarkets): retest by [@ttodua](https://github.com/ttodua) in [#25914](https://github.com/ccxt/ccxt/pull/25914)
* test(bitteam): retest by [@ttodua](https://github.com/ttodua) in [#25908](https://github.com/ccxt/ccxt/pull/25908)
* test(bitso): unskip ohlcv by [@ttodua](https://github.com/ttodua) in [#25906](https://github.com/ccxt/ccxt/pull/25906)
* fix(bybit): createOrder, option category param by [@Dan-krm](https://github.com/Dan-krm) in [#25925](https://github.com/ccxt/ccxt/pull/25925)
* fix(bybit): fetchLedger inverse for uta 2.0 by [@carlosmiei](https://github.com/carlosmiei) in [#25924](https://github.com/ccxt/ccxt/pull/25924)
* fix(bitmart): bitmart upgrade positions to v2 by [@carlosmiei](https://github.com/carlosmiei) in [#25926](https://github.com/ccxt/ccxt/pull/25926)
* test(btcalpha): unskip by [@ttodua](https://github.com/ttodua) in [#25913](https://github.com/ccxt/ccxt/pull/25913)
* test.market.ts allow linear and inverse to be undefined for options by [@Dan-krm](https://github.com/Dan-krm) in [#25927](https://github.com/ccxt/ccxt/pull/25927)
* feat(bitget): type crypto & fiat by [@ttodua](https://github.com/ttodua) in [#25897](https://github.com/ccxt/ccxt/pull/25897)
* fix: changelog and release notes by [@pcriadoperez](https://github.com/pcriadoperez) in [#25431](https://github.com/ccxt/ccxt/pull/25431)
## New Contributors [#new-contributors-51]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* [@LambdaBen](https://github.com/LambdaBen) made their first contribution in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* [@xucheng](https://github.com/xucheng) made their first contribution in [#25715](https://github.com/ccxt/ccxt/pull/25715)
* [@cj2094](https://github.com/cj2094) made their first contribution in [#25428](https://github.com/ccxt/ccxt/pull/25428)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.80](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.80)
[Changes][v4.4.80]
# [v4.4.79](https://github.com/ccxt/ccxt/releases/tag/v4.4.79) - 2025-05-06 [#v4479---2025-05-06]
## What's Changed [#whats-changed-97]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
* build(deps): bump next from 14.2.21 to 14.2.25 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25542](https://github.com/ccxt/ccxt/pull/25542)
* fix(kraken) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#25543](https://github.com/ccxt/ccxt/pull/25543)
* better instructions for exhange-capabilities script by [@samgermain](https://github.com/samgermain) in [#25546](https://github.com/ccxt/ccxt/pull/25546)
* feat(bitmart): add editOrder to limit swap orders by [@carlosmiei](https://github.com/carlosmiei) in [#25547](https://github.com/ccxt/ccxt/pull/25547)
* chore: readme remove expired campaign by [@carlosmiei](https://github.com/carlosmiei) in [#25551](https://github.com/ccxt/ccxt/pull/25551)
* docs(readme): minor by [@ttodua](https://github.com/ttodua) in [#25550](https://github.com/ccxt/ccxt/pull/25550)
* fix(goTranspiler): safeCurrencyCode inherited call by [@carlosmiei](https://github.com/carlosmiei) in [#25548](https://github.com/ccxt/ccxt/pull/25548)
* bingx, bitmart: has\["createReduceOnlyOrder"] = true by [@samgermain](https://github.com/samgermain) in [#25552](https://github.com/ccxt/ccxt/pull/25552)
* feat(okx) - full networks unif by [@ttodua](https://github.com/ttodua) in [#25553](https://github.com/ccxt/ccxt/pull/25553)
* feat(base) - handleRequestNetwork by [@ttodua](https://github.com/ttodua) in [#25466](https://github.com/ccxt/ccxt/pull/25466)
* has\["createReduceOnlyOrder"] by [@samgermain](https://github.com/samgermain) in [#25555](https://github.com/ccxt/ccxt/pull/25555)
* fix(bitget): sandbox markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#25557](https://github.com/ccxt/ccxt/pull/25557)
* feat(exchange): type constructor by [@carlosmiei](https://github.com/carlosmiei) in [#25558](https://github.com/ccxt/ccxt/pull/25558)
* feat(constructor): support sandbox/testnet key by [@carlosmiei](https://github.com/carlosmiei) in [#25559](https://github.com/ccxt/ccxt/pull/25559)
* fix(okx) - zksync ^ by [@ttodua](https://github.com/ttodua) in [#25560](https://github.com/ccxt/ccxt/pull/25560)
* poloniex & poloniexfutures - v3 Update & merger by [@ttodua](https://github.com/ttodua) in [#25378](https://github.com/ccxt/ccxt/pull/25378)
* feat(binance): update binance documentation links by [@Dan-krm](https://github.com/Dan-krm) in [#25561](https://github.com/ccxt/ccxt/pull/25561)
* feat(exchange): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#25562](https://github.com/ccxt/ccxt/pull/25562)
* fix(bingx) - implicit balance endpoint ^ by [@ttodua](https://github.com/ttodua) in [#25567](https://github.com/ccxt/ccxt/pull/25567)
* chore(poloniex) - ws skip tests ^ by [@ttodua](https://github.com/ttodua) in [#25566](https://github.com/ccxt/ccxt/pull/25566)
* fix(cex) - missing active key ^ by [@ttodua](https://github.com/ttodua) in [#25565](https://github.com/ccxt/ccxt/pull/25565)
* whitebit: createOrder - update docstring, has array by [@samgermain](https://github.com/samgermain) in [#25563](https://github.com/ccxt/ccxt/pull/25563)
* feat(whitebit): createDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25569](https://github.com/ccxt/ccxt/pull/25569)
* fix(gate): currencies encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25571](https://github.com/ccxt/ccxt/pull/25571)
* fix(poloniex) - features missing symbol req by [@ttodua](https://github.com/ttodua) in [#25573](https://github.com/ccxt/ccxt/pull/25573)
* fix(gate): use replaceAll instead by [@carlosmiei](https://github.com/carlosmiei) in [#25572](https://github.com/ccxt/ccxt/pull/25572)
* feat(whitebit): fetchCrossBorrowRate by [@Dan-krm](https://github.com/Dan-krm) in [#25568](https://github.com/ccxt/ccxt/pull/25568)
* fix(bingx): allAccountBalance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25575](https://github.com/ccxt/ccxt/pull/25575)
* fix(derive): update balance by [@sc0Vu](https://github.com/sc0Vu) in [#25581](https://github.com/ccxt/ccxt/pull/25581)
* fix(derive): rename deriveWalletAddress by [@sc0Vu](https://github.com/sc0Vu) in [#25582](https://github.com/ccxt/ccxt/pull/25582)
* krakenfutures\["has"]: createPostOnlyOrder, createReduceOnlyOrder, ... = true by [@samgermain](https://github.com/samgermain) in [#25576](https://github.com/ccxt/ccxt/pull/25576)
* feat(hyperliquid): add createVault by [@sc0Vu](https://github.com/sc0Vu) in [#25577](https://github.com/ccxt/ccxt/pull/25577)
* refactor & fix(okx) - fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25564](https://github.com/ccxt/ccxt/pull/25564)
* fix(bingx) - unskip tests by [@ttodua](https://github.com/ttodua) in [#25583](https://github.com/ccxt/ccxt/pull/25583)
* fix(derive): add creation\_timestamp by [@sc0Vu](https://github.com/sc0Vu) in [#25594](https://github.com/ccxt/ccxt/pull/25594)
* fix(exchange) mismatched return type by [@olegtaranenko](https://github.com/olegtaranenko) in [#25593](https://github.com/ccxt/ccxt/pull/25593)
* fix(bingx) - implicit api by [@ttodua](https://github.com/ttodua) in [#25584](https://github.com/ccxt/ccxt/pull/25584)
* fix(krakenfutures) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25586](https://github.com/ccxt/ccxt/pull/25586)
* okcoin.has createPostOnlyOrder, createReduceOnlyOrder, createStopLimitOrder, createStopMarketOrder by [@samgermain](https://github.com/samgermain) in [#25585](https://github.com/ccxt/ccxt/pull/25585)
* feat(exchanges): createDepositAddress, add DepositAddress type by [@Dan-krm](https://github.com/Dan-krm) in [#25595](https://github.com/ccxt/ccxt/pull/25595)
* fix(coinbase) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25587](https://github.com/ccxt/ccxt/pull/25587)
* fix(bitmart) - watchTrades fix by [@ttodua](https://github.com/ttodua) in [#25589](https://github.com/ccxt/ccxt/pull/25589)
* tests(ace) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25590](https://github.com/ccxt/ccxt/pull/25590)
* fix(ascendex) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25591](https://github.com/ccxt/ccxt/pull/25591)
* fix(paradex): market parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25606](https://github.com/ccxt/ccxt/pull/25606)
* fix(woo): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25605](https://github.com/ccxt/ccxt/pull/25605)
* tests(binance) - unksip networks ^ by [@ttodua](https://github.com/ttodua) in [#25607](https://github.com/ccxt/ccxt/pull/25607)
* fix(okx) - expiry time for future/option by [@ttodua](https://github.com/ttodua) in [#25600](https://github.com/ccxt/ccxt/pull/25600)
* fix(woofipro) - inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25604](https://github.com/ccxt/ccxt/pull/25604)
* fix(derive) - linear inverse ^ by [@ttodua](https://github.com/ttodua) in [#25602](https://github.com/ccxt/ccxt/pull/25602)
* fix(paradex): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25603](https://github.com/ccxt/ccxt/pull/25603)
* bit2c has false methods by [@samgermain](https://github.com/samgermain) in [#25609](https://github.com/ccxt/ccxt/pull/25609)
* tests(ace) - unskip markets ^ by [@ttodua](https://github.com/ttodua) in [#25599](https://github.com/ccxt/ccxt/pull/25599)
* fix(defx) - market inverse ^ by [@ttodua](https://github.com/ttodua) in [#25601](https://github.com/ccxt/ccxt/pull/25601)
* fix(derive): options linear ^ by [@ttodua](https://github.com/ttodua) in [#25608](https://github.com/ccxt/ccxt/pull/25608)
* tests(binanceus) - fetchStatus unskip ^ by [@ttodua](https://github.com/ttodua) in [#25597](https://github.com/ccxt/ccxt/pull/25597)
* build(deps): bump next from 14.2.25 to 14.2.26 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25626](https://github.com/ccxt/ccxt/pull/25626)
* fix(bitget) - market precision by [@ttodua](https://github.com/ttodua) in [#25624](https://github.com/ccxt/ccxt/pull/25624)
* fix(ascedex): currency id str ^ by [@ttodua](https://github.com/ttodua) in [#25614](https://github.com/ccxt/ccxt/pull/25614)
* chore(bitfinex1) - delist old version by [@ttodua](https://github.com/ttodua) in [#25621](https://github.com/ccxt/ccxt/pull/25621)
* tests(bitget): ws orderbook field ^ by [@ttodua](https://github.com/ttodua) in [#25625](https://github.com/ccxt/ccxt/pull/25625)
* tests(binance): unskip ticker & precision ^ by [@ttodua](https://github.com/ttodua) in [#25616](https://github.com/ccxt/ccxt/pull/25616)
* fix(bitget): fetchWithdrawals code not required by [@carlosmiei](https://github.com/carlosmiei) in [#25633](https://github.com/ccxt/ccxt/pull/25633)
* fix(bitrue): orderbook & retest by [@ttodua](https://github.com/ttodua) in [#25634](https://github.com/ccxt/ccxt/pull/25634)
* fix(build): remove bitfinex1 data by [@carlosmiei](https://github.com/carlosmiei) in [#25640](https://github.com/ccxt/ccxt/pull/25640)
* feat(bybit): define most method types by [@Dan-krm](https://github.com/Dan-krm) in [#25636](https://github.com/ccxt/ccxt/pull/25636)
* chore: pushback ccxt.ts by [@carlosmiei](https://github.com/carlosmiei) in [#25641](https://github.com/ccxt/ccxt/pull/25641)
* ace.has: false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25642](https://github.com/ccxt/ccxt/pull/25642)
* chore(tests): minor comment by [@ttodua](https://github.com/ttodua) in [#25635](https://github.com/ccxt/ccxt/pull/25635)
* fix(binance): update ids by [@carlosmiei](https://github.com/carlosmiei) in [#25645](https://github.com/ccxt/ccxt/pull/25645)
* feat(bybit): add pagination to fetchPositions by [@carlosmiei](https://github.com/carlosmiei) in [#25646](https://github.com/ccxt/ccxt/pull/25646)
* alpaca.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25649](https://github.com/ccxt/ccxt/pull/25649)
* chore(skips): empty entries ^ by [@ttodua](https://github.com/ttodua) in [#25618](https://github.com/ccxt/ccxt/pull/25618)
* refactor(base): reorg removeRepeatedElementsFromArray by [@ttodua](https://github.com/ttodua) in [#25644](https://github.com/ccxt/ccxt/pull/25644)
* ascendex.has - option and future methods = false by [@samgermain](https://github.com/samgermain) in [#25656](https://github.com/ccxt/ccxt/pull/25656)
* ace, alpaca: option methods = false by [@samgermain](https://github.com/samgermain) in [#25655](https://github.com/ccxt/ccxt/pull/25655)
* fix(deribit): currency inference by [@carlosmiei](https://github.com/carlosmiei) in [#25657](https://github.com/ccxt/ccxt/pull/25657)
* hitbtc.has: option/future methods = false by [@samgermain](https://github.com/samgermain) in [#25658](https://github.com/ccxt/ccxt/pull/25658)
* bit2c.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25659](https://github.com/ccxt/ccxt/pull/25659)
* bitbank.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25662](https://github.com/ccxt/ccxt/pull/25662)
* fix(gate): currencies url encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25667](https://github.com/ccxt/ccxt/pull/25667)
* bitmart parseTransaction fix by [@ndubel](https://github.com/ndubel) in [#25671](https://github.com/ccxt/ccxt/pull/25671)
* fix(gate): btc inverse contractSize fix by [@ttodua](https://github.com/ttodua) in [#25672](https://github.com/ccxt/ccxt/pull/25672)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25670](https://github.com/ccxt/ccxt/pull/25670)
* tests(ascendex): skip bid ask ^ by [@ttodua](https://github.com/ttodua) in [#25665](https://github.com/ccxt/ccxt/pull/25665)
* delist(bitpanda): remove old alias by [@ttodua](https://github.com/ttodua) in [#25664](https://github.com/ccxt/ccxt/pull/25664)
* duplicate folders/files ^ by [@ttodua](https://github.com/ttodua) in [#25648](https://github.com/ccxt/ccxt/pull/25648)
* chore(onetrading): comment ^ by [@ttodua](https://github.com/ttodua) in [#25632](https://github.com/ccxt/ccxt/pull/25632)
* fix(bitopro): ws unskip (minor changes) by [@ttodua](https://github.com/ttodua) in [#25630](https://github.com/ccxt/ccxt/pull/25630)
* tests(bitmart): unskip fields ^ by [@ttodua](https://github.com/ttodua) in [#25627](https://github.com/ccxt/ccxt/pull/25627)
* chore(reorg): validate types ^ by [@ttodua](https://github.com/ttodua) in [#25622](https://github.com/ccxt/ccxt/pull/25622)
* chore(bitcoincom): delist (remove) inexistent old alias ^ by [@ttodua](https://github.com/ttodua) in [#25620](https://github.com/ccxt/ccxt/pull/25620)
* fix(bitbns) - active & unskip ^ by [@ttodua](https://github.com/ttodua) in [#25619](https://github.com/ccxt/ccxt/pull/25619)
* unskip bequant ^ by [@ttodua](https://github.com/ttodua) in [#25615](https://github.com/ccxt/ccxt/pull/25615)
* tests(binanceusdm) - retest few props ^ by [@ttodua](https://github.com/ttodua) in [#25617](https://github.com/ccxt/ccxt/pull/25617)
* chore(tests): datetime comments enhance ^ by [@ttodua](https://github.com/ttodua) in [#25631](https://github.com/ccxt/ccxt/pull/25631)
* test(assertions): enhance tests by [@ttodua](https://github.com/ttodua) in [#25650](https://github.com/ccxt/ccxt/pull/25650)
* test(markets): complete reorg by [@ttodua](https://github.com/ttodua) in [#25669](https://github.com/ccxt/ccxt/pull/25669)
* fix(bybit): option currency inference by [@Dan-krm](https://github.com/Dan-krm) in [#25673](https://github.com/ccxt/ccxt/pull/25673)
* fix(docs) - precisions by [@ttodua](https://github.com/ttodua) in [#23316](https://github.com/ccxt/ccxt/pull/23316)
* bitopro skip timestamp ^ by [@ttodua](https://github.com/ttodua) in [#25675](https://github.com/ccxt/ccxt/pull/25675)
* ws duplicate trades filtering by [@ttodua](https://github.com/ttodua) in [#25639](https://github.com/ccxt/ccxt/pull/25639)
* fix(coinlist): support swap markets by [@carlosmiei](https://github.com/carlosmiei) in [#25676](https://github.com/ccxt/ccxt/pull/25676)
* feat(bitmart): add setPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25678](https://github.com/ccxt/ccxt/pull/25678)
* unskip bitflyer ^ by [@ttodua](https://github.com/ttodua) in [#25623](https://github.com/ccxt/ccxt/pull/25623)
* chore(skips): sort alphabetically ^ by [@ttodua](https://github.com/ttodua) in [#25677](https://github.com/ccxt/ccxt/pull/25677)
* bithumb.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25680](https://github.com/ccxt/ccxt/pull/25680)
* fix(tests): skip json ^ by [@ttodua](https://github.com/ttodua) in [#25681](https://github.com/ccxt/ccxt/pull/25681)
* fix(Exchange): removeRepeatedElementsFromArray keys order dependency by [@carlosmiei](https://github.com/carlosmiei) in [#25683](https://github.com/ccxt/ccxt/pull/25683)
* fix(blofin): fetchClosedOrders flag by [@carlosmiei](https://github.com/carlosmiei) in [#25685](https://github.com/ccxt/ccxt/pull/25685)
* feat(bitmart): add fetchPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25686](https://github.com/ccxt/ccxt/pull/25686)
* chore: disable go test by [@carlosmiei](https://github.com/carlosmiei) in [#25687](https://github.com/ccxt/ccxt/pull/25687)
* fix(okx): fetchohlcv by [@ttodua](https://github.com/ttodua) in [#25682](https://github.com/ccxt/ccxt/pull/25682)
* doc(order): stoploss & params by [@ttodua](https://github.com/ttodua) in [#25684](https://github.com/ccxt/ccxt/pull/25684)
* chore: fix js action by [@carlosmiei](https://github.com/carlosmiei) in [#25697](https://github.com/ccxt/ccxt/pull/25697)
* test(market): fix precision issues ^ by [@ttodua](https://github.com/ttodua) in [#25690](https://github.com/ccxt/ccxt/pull/25690)
* test(bitmart): skip watchOB bid-ask ^ by [@ttodua](https://github.com/ttodua) in [#25691](https://github.com/ccxt/ccxt/pull/25691)
* test(bitflyer): no settleId ^ by [@ttodua](https://github.com/ttodua) in [#25693](https://github.com/ccxt/ccxt/pull/25693)
* fix(safeCurrencyStructure): withdraw/deposit/active by [@ttodua](https://github.com/ttodua) in [#25698](https://github.com/ccxt/ccxt/pull/25698)
* bitopro.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25705](https://github.com/ccxt/ccxt/pull/25705)
* chore: remove js/ dep from export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25700](https://github.com/ccxt/ccxt/pull/25700)
* test(market): removal of few skips ^ by [@ttodua](https://github.com/ttodua) in [#25692](https://github.com/ccxt/ccxt/pull/25692)
* feat(coinlist): add missing endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25703](https://github.com/ccxt/ccxt/pull/25703)
* test(coinex): skip precision & networks ^ by [@ttodua](https://github.com/ttodua) in [#25696](https://github.com/ccxt/ccxt/pull/25696)
* test(bitopro): skip l2 ^ by [@ttodua](https://github.com/ttodua) in [#25695](https://github.com/ccxt/ccxt/pull/25695)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25694](https://github.com/ccxt/ccxt/pull/25694)
* fix(vss): remove js/ overwrite by [@carlosmiei](https://github.com/carlosmiei) in [#25706](https://github.com/ccxt/ccxt/pull/25706)
* bitrue.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25708](https://github.com/ccxt/ccxt/pull/25708)
* feat(upbit): add '1s' and '1y' timeframes by [@LambdaBen](https://github.com/LambdaBen) in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* Optimize Docker setup: replace .NET SDK installation with direct scri… by [@xucheng](https://github.com/xucheng) in [#25715](https://github.com/ccxt/ccxt/pull/25715)
* feat(tests): add per lang disabled flag by [@carlosmiei](https://github.com/carlosmiei) in [#25716](https://github.com/ccxt/ccxt/pull/25716)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25717](https://github.com/ccxt/ccxt/pull/25717)
* feat(coinlist): add fetchFundingRate by [@Dan-krm](https://github.com/Dan-krm) in [#25719](https://github.com/ccxt/ccxt/pull/25719)
* fix(binance): deposit address & reversedNetworks by [@ttodua](https://github.com/ttodua) in [#25718](https://github.com/ccxt/ccxt/pull/25718)
* fix(coinex.cs): fetchCurrencies network key by [@carlosmiei](https://github.com/carlosmiei) in [#25722](https://github.com/ccxt/ccxt/pull/25722)
* test(skips): add type ^ by [@ttodua](https://github.com/ttodua) in [#25724](https://github.com/ccxt/ccxt/pull/25724)
* fix(hyperliquid): orderId in watchMyTrades by [@carlosmiei](https://github.com/carlosmiei) in [#25726](https://github.com/ccxt/ccxt/pull/25726)
* ace - skip further ^ by [@ttodua](https://github.com/ttodua) in [#25725](https://github.com/ccxt/ccxt/pull/25725)
* fix(bitget): fetchTradingFee swap by [@carlosmiei](https://github.com/carlosmiei) in [#25730](https://github.com/ccxt/ccxt/pull/25730)
* fix(proxy): proxyUrl fix & implementation in c# by [@ttodua](https://github.com/ttodua) in [#25638](https://github.com/ccxt/ccxt/pull/25638)
* feat(upbit): define new Implicit APIs and remove deprecated API by [@LambdaBen](https://github.com/LambdaBen) in [#25733](https://github.com/ccxt/ccxt/pull/25733)
* fix(paradex): fetchTickers by [@carlosmiei](https://github.com/carlosmiei) in [#25735](https://github.com/ccxt/ccxt/pull/25735)
* chore: update actions/python to v5 by [@carlosmiei](https://github.com/carlosmiei) in [#25744](https://github.com/ccxt/ccxt/pull/25744)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/v4 by [@dependabot](https://github.com/dependabot) in [#25745](https://github.com/ccxt/ccxt/pull/25745)
* update(upbit): update rateLimit and add cost to Implicit API by [@LambdaBen](https://github.com/LambdaBen) in [#25747](https://github.com/ccxt/ccxt/pull/25747)
* feat(tests): add conflicts detection to markets by [@carlosmiei](https://github.com/carlosmiei) in [#25748](https://github.com/ccxt/ccxt/pull/25748)
* chore: bump ubuntu version in go by [@carlosmiei](https://github.com/carlosmiei) in [#25750](https://github.com/ccxt/ccxt/pull/25750)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25754](https://github.com/ccxt/ccxt/pull/25754)
* feat(okx): April 17 2025 changelog by [@Dan-krm](https://github.com/Dan-krm) in [#25756](https://github.com/ccxt/ccxt/pull/25756)
* feat(xt): add editOrder by [@Dan-krm](https://github.com/Dan-krm) in [#25751](https://github.com/ccxt/ccxt/pull/25751)
* fix(okx): preopen sandbox markets parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25761](https://github.com/ccxt/ccxt/pull/25761)
* apex omni - v3 Merge by [@cj2094](https://github.com/cj2094) in [#25428](https://github.com/ccxt/ccxt/pull/25428)
* feat(upbit): define new Unified API fetchTradingFees by [@carlosmiei](https://github.com/carlosmiei) in [#25768](https://github.com/ccxt/ccxt/pull/25768)
* fix(upbit): fetchTickers check by [@carlosmiei](https://github.com/carlosmiei) in [#25769](https://github.com/ccxt/ccxt/pull/25769)
* fix(apex) jsdoc by [@olegtaranenko](https://github.com/olegtaranenko) in [#25773](https://github.com/ccxt/ccxt/pull/25773)
* fix(poloniex): open orders symbol check by [@carlosmiei](https://github.com/carlosmiei) in [#25771](https://github.com/ccxt/ccxt/pull/25771)
* tests(fetchCurrencies): make active/deposit/withdraw checks robust by [@ttodua](https://github.com/ttodua) in [#25723](https://github.com/ccxt/ccxt/pull/25723)
* feat(bitget): fetchFundingRate, alternative method by [@Dan-krm](https://github.com/Dan-krm) in [#25778](https://github.com/ccxt/ccxt/pull/25778)
* fix(gate): watchPostions fix close positions error by [@pcriadoperez](https://github.com/pcriadoperez) in [#25782](https://github.com/ccxt/ccxt/pull/25782)
* chore(binance): remove malta MT by [@ttodua](https://github.com/ttodua) in [#25752](https://github.com/ccxt/ccxt/pull/25752)
* feat(bitget): fetchFundingRate, updated response by [@Dan-krm](https://github.com/Dan-krm) in [#25783](https://github.com/ccxt/ccxt/pull/25783)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25791](https://github.com/ccxt/ccxt/pull/25791)
* fix(upbit): max url lengthes by [@ttodua](https://github.com/ttodua) in [#25789](https://github.com/ccxt/ccxt/pull/25789)
* feat(apex): multiple fixes by [@ttodua](https://github.com/ttodua) in [#25787](https://github.com/ccxt/ccxt/pull/25787)
* test(defx): skip ohlcv open ^ by [@ttodua](https://github.com/ttodua) in [#25790](https://github.com/ccxt/ccxt/pull/25790)
* fix(cex): fetchtickers open price by [@ttodua](https://github.com/ttodua) in [#25788](https://github.com/ccxt/ccxt/pull/25788)
* fix(bitmex): market states & expiry for perps by [@ttodua](https://github.com/ttodua) in [#25785](https://github.com/ccxt/ccxt/pull/25785)
* tradeogre websockets adding by [@rayBastard](https://github.com/rayBastard) in [#25775](https://github.com/ccxt/ccxt/pull/25775)
* fix(precision): base safeCurrencyStructure change for currency wide precision by [@ttodua](https://github.com/ttodua) in [#25786](https://github.com/ccxt/ccxt/pull/25786)
* update(upbit): update createOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25799](https://github.com/ccxt/ccxt/pull/25799)
* test(fetchCurrencies): check for duplicate codes by [@Dan-krm](https://github.com/Dan-krm) in [#25801](https://github.com/ccxt/ccxt/pull/25801)
* feat(tests): add log with info level by [@carlosmiei](https://github.com/carlosmiei) in [#25804](https://github.com/ccxt/ccxt/pull/25804)
* test(currencies): fix check ^ by [@ttodua](https://github.com/ttodua) in [#25809](https://github.com/ccxt/ccxt/pull/25809)
* fix(p2b): remove recursion call by [@sc0Vu](https://github.com/sc0Vu) in [#25814](https://github.com/ccxt/ccxt/pull/25814)
* fix(hollaex): remove recursion call by [@sc0Vu](https://github.com/sc0Vu) in [#25815](https://github.com/ccxt/ccxt/pull/25815)
* fix(hyperliquid): update balance with isolated margin by [@sc0Vu](https://github.com/sc0Vu) in [#25816](https://github.com/ccxt/ccxt/pull/25816)
* feat(cointach): implement fetchDepositWithdrawFees by [@carlosmiei](https://github.com/carlosmiei) in [#25818](https://github.com/ccxt/ccxt/pull/25818)
* test(shared-methods): add extra extend for empty values by [@ttodua](https://github.com/ttodua) in [#25817](https://github.com/ccxt/ccxt/pull/25817)
* fix(hitbtc & bequant): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25819](https://github.com/ccxt/ccxt/pull/25819)
* fix(probit): type currency ^ by [@ttodua](https://github.com/ttodua) in [#25829](https://github.com/ccxt/ccxt/pull/25829)
* fix!(ace): delist by [@ttodua](https://github.com/ttodua) in [#25820](https://github.com/ccxt/ccxt/pull/25820)
* fix(coinbase) - WS orderbook by [@ttodua](https://github.com/ttodua) in [#25095](https://github.com/ccxt/ccxt/pull/25095)
* fix(mexc): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25813](https://github.com/ccxt/ccxt/pull/25813)
* fix(phemex): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25828](https://github.com/ccxt/ccxt/pull/25828)
* test(binancecoinm): remove skip by [@ttodua](https://github.com/ttodua) in [#25822](https://github.com/ccxt/ccxt/pull/25822)
* fix(whitebit): missing key ^ by [@ttodua](https://github.com/ttodua) in [#25826](https://github.com/ccxt/ccxt/pull/25826)
* fix(woo): currency & market fields by [@ttodua](https://github.com/ttodua) in [#25824](https://github.com/ccxt/ccxt/pull/25824)
* fix(mexc): createOrder multiple fixes by [@ttodua](https://github.com/ttodua) in [#25808](https://github.com/ccxt/ccxt/pull/25808)
* fix(bitget): fetchOHLCV reorganize by [@ttodua](https://github.com/ttodua) in [#25797](https://github.com/ccxt/ccxt/pull/25797)
* fix(xt): currency type by [@ttodua](https://github.com/ttodua) in [#25825](https://github.com/ccxt/ccxt/pull/25825)
* feat(upbit): editOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25834](https://github.com/ccxt/ccxt/pull/25834)
* feat(exchanges): add type to fetchPositions by [@Dan-krm](https://github.com/Dan-krm) in [#25833](https://github.com/ccxt/ccxt/pull/25833)
* fix(bitget): swap sandbox balance by [@carlosmiei](https://github.com/carlosmiei) in [#25836](https://github.com/ccxt/ccxt/pull/25836)
* fix(go): disable flaky test by [@carlosmiei](https://github.com/carlosmiei) in [#25837](https://github.com/ccxt/ccxt/pull/25837)
* fix(timex): safeTrade ^ by [@ttodua](https://github.com/ttodua) in [#25827](https://github.com/ccxt/ccxt/pull/25827)
* fix(bitopro): networks key ^ by [@ttodua](https://github.com/ttodua) in [#25851](https://github.com/ccxt/ccxt/pull/25851)
* fix(hyperliquid): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25840](https://github.com/ccxt/ccxt/pull/25840)
* fix(bitrue): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25839](https://github.com/ccxt/ccxt/pull/25839)
* fix(poloniex): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25838](https://github.com/ccxt/ccxt/pull/25838)
* fix(kraken): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25842](https://github.com/ccxt/ccxt/pull/25842)
* fix(hollaex): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25843](https://github.com/ccxt/ccxt/pull/25843)
* fix(delta): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25844](https://github.com/ccxt/ccxt/pull/25844)
* fix(deribit): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25845](https://github.com/ccxt/ccxt/pull/25845)
* fix(huobijp): currency networks ^ by [@ttodua](https://github.com/ttodua) in [#25841](https://github.com/ccxt/ccxt/pull/25841)
* fix(bitmex): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25849](https://github.com/ccxt/ccxt/pull/25849)
* fix(bitvavo): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25850](https://github.com/ccxt/ccxt/pull/25850)
* fix(coinone): currency type field ^ by [@ttodua](https://github.com/ttodua) in [#25846](https://github.com/ccxt/ccxt/pull/25846)
* fix(coinlist): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25847](https://github.com/ccxt/ccxt/pull/25847)
* fix(coinex): fc type ^ by [@ttodua](https://github.com/ttodua) in [#25848](https://github.com/ccxt/ccxt/pull/25848)
* fix(whitebit): crypto type by [@ttodua](https://github.com/ttodua) in [#25857](https://github.com/ccxt/ccxt/pull/25857)
* fix(htx): currency type by [@ttodua](https://github.com/ttodua) in [#25856](https://github.com/ccxt/ccxt/pull/25856)
* chore(ace): remove json skip ^ by [@ttodua](https://github.com/ttodua) in [#25854](https://github.com/ccxt/ccxt/pull/25854)
* test(skip): several exchanges ^ by [@ttodua](https://github.com/ttodua) in [#25865](https://github.com/ccxt/ccxt/pull/25865)
* fix(ascendex): deposit withdraw by [@ttodua](https://github.com/ttodua) in [#25863](https://github.com/ccxt/ccxt/pull/25863)
* fix(delta): correct expiry when no mfetched market by [@sc0Vu](https://github.com/sc0Vu) in [#25866](https://github.com/ccxt/ccxt/pull/25866)
* test(coinone): major currencies skip by [@ttodua](https://github.com/ttodua) in [#25867](https://github.com/ccxt/ccxt/pull/25867)
* fix(bingx): safe currency by [@ttodua](https://github.com/ttodua) in [#25869](https://github.com/ccxt/ccxt/pull/25869)
* feat(upbit): define new CCXT Pro watchOHLCV AP by [@carlosmiei](https://github.com/carlosmiei) in [#25872](https://github.com/ccxt/ccxt/pull/25872)
* feat(bitvavo): support operatorId by [@carlosmiei](https://github.com/carlosmiei) in [#25874](https://github.com/ccxt/ccxt/pull/25874)
* fix(typo): build/transpile.sh by [@sc0Vu](https://github.com/sc0Vu) in [#25876](https://github.com/ccxt/ccxt/pull/25876)
* fix(bitmat): currency related things by [@ttodua](https://github.com/ttodua) in [#25871](https://github.com/ccxt/ccxt/pull/25871)
* retest htx by [@ttodua](https://github.com/ttodua) in [#25873](https://github.com/ccxt/ccxt/pull/25873)
* fix(bitget): fix fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25870](https://github.com/ccxt/ccxt/pull/25870)
* refactor(ticker): minor by [@ttodua](https://github.com/ttodua) in [#25868](https://github.com/ccxt/ccxt/pull/25868)
* update(upbit): Update Docs site URL by [@LambdaBen](https://github.com/LambdaBen) in [#25860](https://github.com/ccxt/ccxt/pull/25860)
* test(htx): remove proxy by [@ttodua](https://github.com/ttodua) in [#25883](https://github.com/ccxt/ccxt/pull/25883)
* feat(binance): add loadAllOptions flag by [@carlosmiei](https://github.com/carlosmiei) in [#25885](https://github.com/ccxt/ccxt/pull/25885)
* feat(bybit): change createOrder stopLossPrice endpoint by [@Dan-krm](https://github.com/Dan-krm) in [#25887](https://github.com/ccxt/ccxt/pull/25887)
* fix(htx): null bid-ask by [@ttodua](https://github.com/ttodua) in [#25881](https://github.com/ccxt/ccxt/pull/25881)
* test(ticker): more detailed tests by [@ttodua](https://github.com/ttodua) in [#25888](https://github.com/ccxt/ccxt/pull/25888)
* fix(docs): table generation by [@carlosmiei](https://github.com/carlosmiei) in [#25891](https://github.com/ccxt/ccxt/pull/25891)
* fix(cs): handle empty keys/values by [@carlosmiei](https://github.com/carlosmiei) in [#25892](https://github.com/ccxt/ccxt/pull/25892)
## New Contributors [#new-contributors-52]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* [@LambdaBen](https://github.com/LambdaBen) made their first contribution in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* [@xucheng](https://github.com/xucheng) made their first contribution in [#25715](https://github.com/ccxt/ccxt/pull/25715)
* [@cj2094](https://github.com/cj2094) made their first contribution in [#25428](https://github.com/ccxt/ccxt/pull/25428)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.79](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.79)
[Changes][v4.4.79]
# [v4.4.78](https://github.com/ccxt/ccxt/releases/tag/v4.4.78) - 2025-04-30 [#v4478---2025-04-30]
## What's Changed [#whats-changed-98]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
* build(deps): bump next from 14.2.21 to 14.2.25 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25542](https://github.com/ccxt/ccxt/pull/25542)
* fix(kraken) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#25543](https://github.com/ccxt/ccxt/pull/25543)
* better instructions for exhange-capabilities script by [@samgermain](https://github.com/samgermain) in [#25546](https://github.com/ccxt/ccxt/pull/25546)
* feat(bitmart): add editOrder to limit swap orders by [@carlosmiei](https://github.com/carlosmiei) in [#25547](https://github.com/ccxt/ccxt/pull/25547)
* chore: readme remove expired campaign by [@carlosmiei](https://github.com/carlosmiei) in [#25551](https://github.com/ccxt/ccxt/pull/25551)
* docs(readme): minor by [@ttodua](https://github.com/ttodua) in [#25550](https://github.com/ccxt/ccxt/pull/25550)
* fix(goTranspiler): safeCurrencyCode inherited call by [@carlosmiei](https://github.com/carlosmiei) in [#25548](https://github.com/ccxt/ccxt/pull/25548)
* bingx, bitmart: has\["createReduceOnlyOrder"] = true by [@samgermain](https://github.com/samgermain) in [#25552](https://github.com/ccxt/ccxt/pull/25552)
* feat(okx) - full networks unif by [@ttodua](https://github.com/ttodua) in [#25553](https://github.com/ccxt/ccxt/pull/25553)
* feat(base) - handleRequestNetwork by [@ttodua](https://github.com/ttodua) in [#25466](https://github.com/ccxt/ccxt/pull/25466)
* has\["createReduceOnlyOrder"] by [@samgermain](https://github.com/samgermain) in [#25555](https://github.com/ccxt/ccxt/pull/25555)
* fix(bitget): sandbox markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#25557](https://github.com/ccxt/ccxt/pull/25557)
* feat(exchange): type constructor by [@carlosmiei](https://github.com/carlosmiei) in [#25558](https://github.com/ccxt/ccxt/pull/25558)
* feat(constructor): support sandbox/testnet key by [@carlosmiei](https://github.com/carlosmiei) in [#25559](https://github.com/ccxt/ccxt/pull/25559)
* fix(okx) - zksync ^ by [@ttodua](https://github.com/ttodua) in [#25560](https://github.com/ccxt/ccxt/pull/25560)
* poloniex & poloniexfutures - v3 Update & merger by [@ttodua](https://github.com/ttodua) in [#25378](https://github.com/ccxt/ccxt/pull/25378)
* feat(binance): update binance documentation links by [@Dan-krm](https://github.com/Dan-krm) in [#25561](https://github.com/ccxt/ccxt/pull/25561)
* feat(exchange): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#25562](https://github.com/ccxt/ccxt/pull/25562)
* fix(bingx) - implicit balance endpoint ^ by [@ttodua](https://github.com/ttodua) in [#25567](https://github.com/ccxt/ccxt/pull/25567)
* chore(poloniex) - ws skip tests ^ by [@ttodua](https://github.com/ttodua) in [#25566](https://github.com/ccxt/ccxt/pull/25566)
* fix(cex) - missing active key ^ by [@ttodua](https://github.com/ttodua) in [#25565](https://github.com/ccxt/ccxt/pull/25565)
* whitebit: createOrder - update docstring, has array by [@samgermain](https://github.com/samgermain) in [#25563](https://github.com/ccxt/ccxt/pull/25563)
* feat(whitebit): createDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25569](https://github.com/ccxt/ccxt/pull/25569)
* fix(gate): currencies encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25571](https://github.com/ccxt/ccxt/pull/25571)
* fix(poloniex) - features missing symbol req by [@ttodua](https://github.com/ttodua) in [#25573](https://github.com/ccxt/ccxt/pull/25573)
* fix(gate): use replaceAll instead by [@carlosmiei](https://github.com/carlosmiei) in [#25572](https://github.com/ccxt/ccxt/pull/25572)
* feat(whitebit): fetchCrossBorrowRate by [@Dan-krm](https://github.com/Dan-krm) in [#25568](https://github.com/ccxt/ccxt/pull/25568)
* fix(bingx): allAccountBalance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25575](https://github.com/ccxt/ccxt/pull/25575)
* fix(derive): update balance by [@sc0Vu](https://github.com/sc0Vu) in [#25581](https://github.com/ccxt/ccxt/pull/25581)
* fix(derive): rename deriveWalletAddress by [@sc0Vu](https://github.com/sc0Vu) in [#25582](https://github.com/ccxt/ccxt/pull/25582)
* krakenfutures\["has"]: createPostOnlyOrder, createReduceOnlyOrder, ... = true by [@samgermain](https://github.com/samgermain) in [#25576](https://github.com/ccxt/ccxt/pull/25576)
* feat(hyperliquid): add createVault by [@sc0Vu](https://github.com/sc0Vu) in [#25577](https://github.com/ccxt/ccxt/pull/25577)
* refactor & fix(okx) - fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25564](https://github.com/ccxt/ccxt/pull/25564)
* fix(bingx) - unskip tests by [@ttodua](https://github.com/ttodua) in [#25583](https://github.com/ccxt/ccxt/pull/25583)
* fix(derive): add creation\_timestamp by [@sc0Vu](https://github.com/sc0Vu) in [#25594](https://github.com/ccxt/ccxt/pull/25594)
* fix(exchange) mismatched return type by [@olegtaranenko](https://github.com/olegtaranenko) in [#25593](https://github.com/ccxt/ccxt/pull/25593)
* fix(bingx) - implicit api by [@ttodua](https://github.com/ttodua) in [#25584](https://github.com/ccxt/ccxt/pull/25584)
* fix(krakenfutures) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25586](https://github.com/ccxt/ccxt/pull/25586)
* okcoin.has createPostOnlyOrder, createReduceOnlyOrder, createStopLimitOrder, createStopMarketOrder by [@samgermain](https://github.com/samgermain) in [#25585](https://github.com/ccxt/ccxt/pull/25585)
* feat(exchanges): createDepositAddress, add DepositAddress type by [@Dan-krm](https://github.com/Dan-krm) in [#25595](https://github.com/ccxt/ccxt/pull/25595)
* fix(coinbase) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25587](https://github.com/ccxt/ccxt/pull/25587)
* fix(bitmart) - watchTrades fix by [@ttodua](https://github.com/ttodua) in [#25589](https://github.com/ccxt/ccxt/pull/25589)
* tests(ace) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25590](https://github.com/ccxt/ccxt/pull/25590)
* fix(ascendex) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25591](https://github.com/ccxt/ccxt/pull/25591)
* fix(paradex): market parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25606](https://github.com/ccxt/ccxt/pull/25606)
* fix(woo): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25605](https://github.com/ccxt/ccxt/pull/25605)
* tests(binance) - unksip networks ^ by [@ttodua](https://github.com/ttodua) in [#25607](https://github.com/ccxt/ccxt/pull/25607)
* fix(okx) - expiry time for future/option by [@ttodua](https://github.com/ttodua) in [#25600](https://github.com/ccxt/ccxt/pull/25600)
* fix(woofipro) - inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25604](https://github.com/ccxt/ccxt/pull/25604)
* fix(derive) - linear inverse ^ by [@ttodua](https://github.com/ttodua) in [#25602](https://github.com/ccxt/ccxt/pull/25602)
* fix(paradex): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25603](https://github.com/ccxt/ccxt/pull/25603)
* bit2c has false methods by [@samgermain](https://github.com/samgermain) in [#25609](https://github.com/ccxt/ccxt/pull/25609)
* tests(ace) - unskip markets ^ by [@ttodua](https://github.com/ttodua) in [#25599](https://github.com/ccxt/ccxt/pull/25599)
* fix(defx) - market inverse ^ by [@ttodua](https://github.com/ttodua) in [#25601](https://github.com/ccxt/ccxt/pull/25601)
* fix(derive): options linear ^ by [@ttodua](https://github.com/ttodua) in [#25608](https://github.com/ccxt/ccxt/pull/25608)
* tests(binanceus) - fetchStatus unskip ^ by [@ttodua](https://github.com/ttodua) in [#25597](https://github.com/ccxt/ccxt/pull/25597)
* build(deps): bump next from 14.2.25 to 14.2.26 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25626](https://github.com/ccxt/ccxt/pull/25626)
* fix(bitget) - market precision by [@ttodua](https://github.com/ttodua) in [#25624](https://github.com/ccxt/ccxt/pull/25624)
* fix(ascedex): currency id str ^ by [@ttodua](https://github.com/ttodua) in [#25614](https://github.com/ccxt/ccxt/pull/25614)
* chore(bitfinex1) - delist old version by [@ttodua](https://github.com/ttodua) in [#25621](https://github.com/ccxt/ccxt/pull/25621)
* tests(bitget): ws orderbook field ^ by [@ttodua](https://github.com/ttodua) in [#25625](https://github.com/ccxt/ccxt/pull/25625)
* tests(binance): unskip ticker & precision ^ by [@ttodua](https://github.com/ttodua) in [#25616](https://github.com/ccxt/ccxt/pull/25616)
* fix(bitget): fetchWithdrawals code not required by [@carlosmiei](https://github.com/carlosmiei) in [#25633](https://github.com/ccxt/ccxt/pull/25633)
* fix(bitrue): orderbook & retest by [@ttodua](https://github.com/ttodua) in [#25634](https://github.com/ccxt/ccxt/pull/25634)
* fix(build): remove bitfinex1 data by [@carlosmiei](https://github.com/carlosmiei) in [#25640](https://github.com/ccxt/ccxt/pull/25640)
* feat(bybit): define most method types by [@Dan-krm](https://github.com/Dan-krm) in [#25636](https://github.com/ccxt/ccxt/pull/25636)
* chore: pushback ccxt.ts by [@carlosmiei](https://github.com/carlosmiei) in [#25641](https://github.com/ccxt/ccxt/pull/25641)
* ace.has: false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25642](https://github.com/ccxt/ccxt/pull/25642)
* chore(tests): minor comment by [@ttodua](https://github.com/ttodua) in [#25635](https://github.com/ccxt/ccxt/pull/25635)
* fix(binance): update ids by [@carlosmiei](https://github.com/carlosmiei) in [#25645](https://github.com/ccxt/ccxt/pull/25645)
* feat(bybit): add pagination to fetchPositions by [@carlosmiei](https://github.com/carlosmiei) in [#25646](https://github.com/ccxt/ccxt/pull/25646)
* alpaca.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25649](https://github.com/ccxt/ccxt/pull/25649)
* chore(skips): empty entries ^ by [@ttodua](https://github.com/ttodua) in [#25618](https://github.com/ccxt/ccxt/pull/25618)
* refactor(base): reorg removeRepeatedElementsFromArray by [@ttodua](https://github.com/ttodua) in [#25644](https://github.com/ccxt/ccxt/pull/25644)
* ascendex.has - option and future methods = false by [@samgermain](https://github.com/samgermain) in [#25656](https://github.com/ccxt/ccxt/pull/25656)
* ace, alpaca: option methods = false by [@samgermain](https://github.com/samgermain) in [#25655](https://github.com/ccxt/ccxt/pull/25655)
* fix(deribit): currency inference by [@carlosmiei](https://github.com/carlosmiei) in [#25657](https://github.com/ccxt/ccxt/pull/25657)
* hitbtc.has: option/future methods = false by [@samgermain](https://github.com/samgermain) in [#25658](https://github.com/ccxt/ccxt/pull/25658)
* bit2c.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25659](https://github.com/ccxt/ccxt/pull/25659)
* bitbank.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25662](https://github.com/ccxt/ccxt/pull/25662)
* fix(gate): currencies url encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25667](https://github.com/ccxt/ccxt/pull/25667)
* bitmart parseTransaction fix by [@ndubel](https://github.com/ndubel) in [#25671](https://github.com/ccxt/ccxt/pull/25671)
* fix(gate): btc inverse contractSize fix by [@ttodua](https://github.com/ttodua) in [#25672](https://github.com/ccxt/ccxt/pull/25672)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25670](https://github.com/ccxt/ccxt/pull/25670)
* tests(ascendex): skip bid ask ^ by [@ttodua](https://github.com/ttodua) in [#25665](https://github.com/ccxt/ccxt/pull/25665)
* delist(bitpanda): remove old alias by [@ttodua](https://github.com/ttodua) in [#25664](https://github.com/ccxt/ccxt/pull/25664)
* duplicate folders/files ^ by [@ttodua](https://github.com/ttodua) in [#25648](https://github.com/ccxt/ccxt/pull/25648)
* chore(onetrading): comment ^ by [@ttodua](https://github.com/ttodua) in [#25632](https://github.com/ccxt/ccxt/pull/25632)
* fix(bitopro): ws unskip (minor changes) by [@ttodua](https://github.com/ttodua) in [#25630](https://github.com/ccxt/ccxt/pull/25630)
* tests(bitmart): unskip fields ^ by [@ttodua](https://github.com/ttodua) in [#25627](https://github.com/ccxt/ccxt/pull/25627)
* chore(reorg): validate types ^ by [@ttodua](https://github.com/ttodua) in [#25622](https://github.com/ccxt/ccxt/pull/25622)
* chore(bitcoincom): delist (remove) inexistent old alias ^ by [@ttodua](https://github.com/ttodua) in [#25620](https://github.com/ccxt/ccxt/pull/25620)
* fix(bitbns) - active & unskip ^ by [@ttodua](https://github.com/ttodua) in [#25619](https://github.com/ccxt/ccxt/pull/25619)
* unskip bequant ^ by [@ttodua](https://github.com/ttodua) in [#25615](https://github.com/ccxt/ccxt/pull/25615)
* tests(binanceusdm) - retest few props ^ by [@ttodua](https://github.com/ttodua) in [#25617](https://github.com/ccxt/ccxt/pull/25617)
* chore(tests): datetime comments enhance ^ by [@ttodua](https://github.com/ttodua) in [#25631](https://github.com/ccxt/ccxt/pull/25631)
* test(assertions): enhance tests by [@ttodua](https://github.com/ttodua) in [#25650](https://github.com/ccxt/ccxt/pull/25650)
* test(markets): complete reorg by [@ttodua](https://github.com/ttodua) in [#25669](https://github.com/ccxt/ccxt/pull/25669)
* fix(bybit): option currency inference by [@Dan-krm](https://github.com/Dan-krm) in [#25673](https://github.com/ccxt/ccxt/pull/25673)
* fix(docs) - precisions by [@ttodua](https://github.com/ttodua) in [#23316](https://github.com/ccxt/ccxt/pull/23316)
* bitopro skip timestamp ^ by [@ttodua](https://github.com/ttodua) in [#25675](https://github.com/ccxt/ccxt/pull/25675)
* ws duplicate trades filtering by [@ttodua](https://github.com/ttodua) in [#25639](https://github.com/ccxt/ccxt/pull/25639)
* fix(coinlist): support swap markets by [@carlosmiei](https://github.com/carlosmiei) in [#25676](https://github.com/ccxt/ccxt/pull/25676)
* feat(bitmart): add setPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25678](https://github.com/ccxt/ccxt/pull/25678)
* unskip bitflyer ^ by [@ttodua](https://github.com/ttodua) in [#25623](https://github.com/ccxt/ccxt/pull/25623)
* chore(skips): sort alphabetically ^ by [@ttodua](https://github.com/ttodua) in [#25677](https://github.com/ccxt/ccxt/pull/25677)
* bithumb.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25680](https://github.com/ccxt/ccxt/pull/25680)
* fix(tests): skip json ^ by [@ttodua](https://github.com/ttodua) in [#25681](https://github.com/ccxt/ccxt/pull/25681)
* fix(Exchange): removeRepeatedElementsFromArray keys order dependency by [@carlosmiei](https://github.com/carlosmiei) in [#25683](https://github.com/ccxt/ccxt/pull/25683)
* fix(blofin): fetchClosedOrders flag by [@carlosmiei](https://github.com/carlosmiei) in [#25685](https://github.com/ccxt/ccxt/pull/25685)
* feat(bitmart): add fetchPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25686](https://github.com/ccxt/ccxt/pull/25686)
* chore: disable go test by [@carlosmiei](https://github.com/carlosmiei) in [#25687](https://github.com/ccxt/ccxt/pull/25687)
* fix(okx): fetchohlcv by [@ttodua](https://github.com/ttodua) in [#25682](https://github.com/ccxt/ccxt/pull/25682)
* doc(order): stoploss & params by [@ttodua](https://github.com/ttodua) in [#25684](https://github.com/ccxt/ccxt/pull/25684)
* chore: fix js action by [@carlosmiei](https://github.com/carlosmiei) in [#25697](https://github.com/ccxt/ccxt/pull/25697)
* test(market): fix precision issues ^ by [@ttodua](https://github.com/ttodua) in [#25690](https://github.com/ccxt/ccxt/pull/25690)
* test(bitmart): skip watchOB bid-ask ^ by [@ttodua](https://github.com/ttodua) in [#25691](https://github.com/ccxt/ccxt/pull/25691)
* test(bitflyer): no settleId ^ by [@ttodua](https://github.com/ttodua) in [#25693](https://github.com/ccxt/ccxt/pull/25693)
* fix(safeCurrencyStructure): withdraw/deposit/active by [@ttodua](https://github.com/ttodua) in [#25698](https://github.com/ccxt/ccxt/pull/25698)
* bitopro.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25705](https://github.com/ccxt/ccxt/pull/25705)
* chore: remove js/ dep from export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25700](https://github.com/ccxt/ccxt/pull/25700)
* test(market): removal of few skips ^ by [@ttodua](https://github.com/ttodua) in [#25692](https://github.com/ccxt/ccxt/pull/25692)
* feat(coinlist): add missing endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25703](https://github.com/ccxt/ccxt/pull/25703)
* test(coinex): skip precision & networks ^ by [@ttodua](https://github.com/ttodua) in [#25696](https://github.com/ccxt/ccxt/pull/25696)
* test(bitopro): skip l2 ^ by [@ttodua](https://github.com/ttodua) in [#25695](https://github.com/ccxt/ccxt/pull/25695)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25694](https://github.com/ccxt/ccxt/pull/25694)
* fix(vss): remove js/ overwrite by [@carlosmiei](https://github.com/carlosmiei) in [#25706](https://github.com/ccxt/ccxt/pull/25706)
* bitrue.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25708](https://github.com/ccxt/ccxt/pull/25708)
* feat(upbit): add '1s' and '1y' timeframes by [@LambdaBen](https://github.com/LambdaBen) in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* Optimize Docker setup: replace .NET SDK installation with direct scri… by [@xucheng](https://github.com/xucheng) in [#25715](https://github.com/ccxt/ccxt/pull/25715)
* feat(tests): add per lang disabled flag by [@carlosmiei](https://github.com/carlosmiei) in [#25716](https://github.com/ccxt/ccxt/pull/25716)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25717](https://github.com/ccxt/ccxt/pull/25717)
* feat(coinlist): add fetchFundingRate by [@Dan-krm](https://github.com/Dan-krm) in [#25719](https://github.com/ccxt/ccxt/pull/25719)
* fix(binance): deposit address & reversedNetworks by [@ttodua](https://github.com/ttodua) in [#25718](https://github.com/ccxt/ccxt/pull/25718)
* fix(coinex.cs): fetchCurrencies network key by [@carlosmiei](https://github.com/carlosmiei) in [#25722](https://github.com/ccxt/ccxt/pull/25722)
* test(skips): add type ^ by [@ttodua](https://github.com/ttodua) in [#25724](https://github.com/ccxt/ccxt/pull/25724)
* fix(hyperliquid): orderId in watchMyTrades by [@carlosmiei](https://github.com/carlosmiei) in [#25726](https://github.com/ccxt/ccxt/pull/25726)
* ace - skip further ^ by [@ttodua](https://github.com/ttodua) in [#25725](https://github.com/ccxt/ccxt/pull/25725)
* fix(bitget): fetchTradingFee swap by [@carlosmiei](https://github.com/carlosmiei) in [#25730](https://github.com/ccxt/ccxt/pull/25730)
* fix(proxy): proxyUrl fix & implementation in c# by [@ttodua](https://github.com/ttodua) in [#25638](https://github.com/ccxt/ccxt/pull/25638)
* feat(upbit): define new Implicit APIs and remove deprecated API by [@LambdaBen](https://github.com/LambdaBen) in [#25733](https://github.com/ccxt/ccxt/pull/25733)
* fix(paradex): fetchTickers by [@carlosmiei](https://github.com/carlosmiei) in [#25735](https://github.com/ccxt/ccxt/pull/25735)
* chore: update actions/python to v5 by [@carlosmiei](https://github.com/carlosmiei) in [#25744](https://github.com/ccxt/ccxt/pull/25744)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/v4 by [@dependabot](https://github.com/dependabot) in [#25745](https://github.com/ccxt/ccxt/pull/25745)
* update(upbit): update rateLimit and add cost to Implicit API by [@LambdaBen](https://github.com/LambdaBen) in [#25747](https://github.com/ccxt/ccxt/pull/25747)
* feat(tests): add conflicts detection to markets by [@carlosmiei](https://github.com/carlosmiei) in [#25748](https://github.com/ccxt/ccxt/pull/25748)
* chore: bump ubuntu version in go by [@carlosmiei](https://github.com/carlosmiei) in [#25750](https://github.com/ccxt/ccxt/pull/25750)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25754](https://github.com/ccxt/ccxt/pull/25754)
* feat(okx): April 17 2025 changelog by [@Dan-krm](https://github.com/Dan-krm) in [#25756](https://github.com/ccxt/ccxt/pull/25756)
* feat(xt): add editOrder by [@Dan-krm](https://github.com/Dan-krm) in [#25751](https://github.com/ccxt/ccxt/pull/25751)
* fix(okx): preopen sandbox markets parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25761](https://github.com/ccxt/ccxt/pull/25761)
* apex omni - v3 Merge by [@cj2094](https://github.com/cj2094) in [#25428](https://github.com/ccxt/ccxt/pull/25428)
* feat(upbit): define new Unified API fetchTradingFees by [@carlosmiei](https://github.com/carlosmiei) in [#25768](https://github.com/ccxt/ccxt/pull/25768)
* fix(upbit): fetchTickers check by [@carlosmiei](https://github.com/carlosmiei) in [#25769](https://github.com/ccxt/ccxt/pull/25769)
* fix(apex) jsdoc by [@olegtaranenko](https://github.com/olegtaranenko) in [#25773](https://github.com/ccxt/ccxt/pull/25773)
* fix(poloniex): open orders symbol check by [@carlosmiei](https://github.com/carlosmiei) in [#25771](https://github.com/ccxt/ccxt/pull/25771)
* tests(fetchCurrencies): make active/deposit/withdraw checks robust by [@ttodua](https://github.com/ttodua) in [#25723](https://github.com/ccxt/ccxt/pull/25723)
* feat(bitget): fetchFundingRate, alternative method by [@Dan-krm](https://github.com/Dan-krm) in [#25778](https://github.com/ccxt/ccxt/pull/25778)
* fix(gate): watchPostions fix close positions error by [@pcriadoperez](https://github.com/pcriadoperez) in [#25782](https://github.com/ccxt/ccxt/pull/25782)
* chore(binance): remove malta MT by [@ttodua](https://github.com/ttodua) in [#25752](https://github.com/ccxt/ccxt/pull/25752)
* feat(bitget): fetchFundingRate, updated response by [@Dan-krm](https://github.com/Dan-krm) in [#25783](https://github.com/ccxt/ccxt/pull/25783)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25791](https://github.com/ccxt/ccxt/pull/25791)
* fix(upbit): max url lengthes by [@ttodua](https://github.com/ttodua) in [#25789](https://github.com/ccxt/ccxt/pull/25789)
* feat(apex): multiple fixes by [@ttodua](https://github.com/ttodua) in [#25787](https://github.com/ccxt/ccxt/pull/25787)
* test(defx): skip ohlcv open ^ by [@ttodua](https://github.com/ttodua) in [#25790](https://github.com/ccxt/ccxt/pull/25790)
* fix(cex): fetchtickers open price by [@ttodua](https://github.com/ttodua) in [#25788](https://github.com/ccxt/ccxt/pull/25788)
* fix(bitmex): market states & expiry for perps by [@ttodua](https://github.com/ttodua) in [#25785](https://github.com/ccxt/ccxt/pull/25785)
* tradeogre websockets adding by [@rayBastard](https://github.com/rayBastard) in [#25775](https://github.com/ccxt/ccxt/pull/25775)
* fix(precision): base safeCurrencyStructure change for currency wide precision by [@ttodua](https://github.com/ttodua) in [#25786](https://github.com/ccxt/ccxt/pull/25786)
* update(upbit): update createOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25799](https://github.com/ccxt/ccxt/pull/25799)
* test(fetchCurrencies): check for duplicate codes by [@Dan-krm](https://github.com/Dan-krm) in [#25801](https://github.com/ccxt/ccxt/pull/25801)
* feat(tests): add log with info level by [@carlosmiei](https://github.com/carlosmiei) in [#25804](https://github.com/ccxt/ccxt/pull/25804)
* test(currencies): fix check ^ by [@ttodua](https://github.com/ttodua) in [#25809](https://github.com/ccxt/ccxt/pull/25809)
* fix(p2b): remove recursion call by [@sc0Vu](https://github.com/sc0Vu) in [#25814](https://github.com/ccxt/ccxt/pull/25814)
* fix(hollaex): remove recursion call by [@sc0Vu](https://github.com/sc0Vu) in [#25815](https://github.com/ccxt/ccxt/pull/25815)
* fix(hyperliquid): update balance with isolated margin by [@sc0Vu](https://github.com/sc0Vu) in [#25816](https://github.com/ccxt/ccxt/pull/25816)
* feat(cointach): implement fetchDepositWithdrawFees by [@carlosmiei](https://github.com/carlosmiei) in [#25818](https://github.com/ccxt/ccxt/pull/25818)
* test(shared-methods): add extra extend for empty values by [@ttodua](https://github.com/ttodua) in [#25817](https://github.com/ccxt/ccxt/pull/25817)
* fix(hitbtc & bequant): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25819](https://github.com/ccxt/ccxt/pull/25819)
* fix(probit): type currency ^ by [@ttodua](https://github.com/ttodua) in [#25829](https://github.com/ccxt/ccxt/pull/25829)
* fix!(ace): delist by [@ttodua](https://github.com/ttodua) in [#25820](https://github.com/ccxt/ccxt/pull/25820)
* fix(coinbase) - WS orderbook by [@ttodua](https://github.com/ttodua) in [#25095](https://github.com/ccxt/ccxt/pull/25095)
* fix(mexc): fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25813](https://github.com/ccxt/ccxt/pull/25813)
* fix(phemex): currency type ^ by [@ttodua](https://github.com/ttodua) in [#25828](https://github.com/ccxt/ccxt/pull/25828)
* test(binancecoinm): remove skip by [@ttodua](https://github.com/ttodua) in [#25822](https://github.com/ccxt/ccxt/pull/25822)
* fix(whitebit): missing key ^ by [@ttodua](https://github.com/ttodua) in [#25826](https://github.com/ccxt/ccxt/pull/25826)
* fix(woo): currency & market fields by [@ttodua](https://github.com/ttodua) in [#25824](https://github.com/ccxt/ccxt/pull/25824)
* fix(mexc): createOrder multiple fixes by [@ttodua](https://github.com/ttodua) in [#25808](https://github.com/ccxt/ccxt/pull/25808)
* fix(bitget): fetchOHLCV reorganize by [@ttodua](https://github.com/ttodua) in [#25797](https://github.com/ccxt/ccxt/pull/25797)
* fix(xt): currency type by [@ttodua](https://github.com/ttodua) in [#25825](https://github.com/ccxt/ccxt/pull/25825)
* feat(upbit): editOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25834](https://github.com/ccxt/ccxt/pull/25834)
* feat(exchanges): add type to fetchPositions by [@Dan-krm](https://github.com/Dan-krm) in [#25833](https://github.com/ccxt/ccxt/pull/25833)
* fix(bitget): swap sandbox balance by [@carlosmiei](https://github.com/carlosmiei) in [#25836](https://github.com/ccxt/ccxt/pull/25836)
* fix(go): disable flaky test by [@carlosmiei](https://github.com/carlosmiei) in [#25837](https://github.com/ccxt/ccxt/pull/25837)
## New Contributors [#new-contributors-53]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* [@LambdaBen](https://github.com/LambdaBen) made their first contribution in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* [@xucheng](https://github.com/xucheng) made their first contribution in [#25715](https://github.com/ccxt/ccxt/pull/25715)
* [@cj2094](https://github.com/cj2094) made their first contribution in [#25428](https://github.com/ccxt/ccxt/pull/25428)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.78](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.78)
[Changes][v4.4.78]
# [v4.4.77](https://github.com/ccxt/ccxt/releases/tag/v4.4.77) - 2025-04-21 [#v4477---2025-04-21]
## What's Changed [#whats-changed-99]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
* build(deps): bump next from 14.2.21 to 14.2.25 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25542](https://github.com/ccxt/ccxt/pull/25542)
* fix(kraken) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#25543](https://github.com/ccxt/ccxt/pull/25543)
* better instructions for exhange-capabilities script by [@samgermain](https://github.com/samgermain) in [#25546](https://github.com/ccxt/ccxt/pull/25546)
* feat(bitmart): add editOrder to limit swap orders by [@carlosmiei](https://github.com/carlosmiei) in [#25547](https://github.com/ccxt/ccxt/pull/25547)
* chore: readme remove expired campaign by [@carlosmiei](https://github.com/carlosmiei) in [#25551](https://github.com/ccxt/ccxt/pull/25551)
* docs(readme): minor by [@ttodua](https://github.com/ttodua) in [#25550](https://github.com/ccxt/ccxt/pull/25550)
* fix(goTranspiler): safeCurrencyCode inherited call by [@carlosmiei](https://github.com/carlosmiei) in [#25548](https://github.com/ccxt/ccxt/pull/25548)
* bingx, bitmart: has\["createReduceOnlyOrder"] = true by [@samgermain](https://github.com/samgermain) in [#25552](https://github.com/ccxt/ccxt/pull/25552)
* feat(okx) - full networks unif by [@ttodua](https://github.com/ttodua) in [#25553](https://github.com/ccxt/ccxt/pull/25553)
* feat(base) - handleRequestNetwork by [@ttodua](https://github.com/ttodua) in [#25466](https://github.com/ccxt/ccxt/pull/25466)
* has\["createReduceOnlyOrder"] by [@samgermain](https://github.com/samgermain) in [#25555](https://github.com/ccxt/ccxt/pull/25555)
* fix(bitget): sandbox markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#25557](https://github.com/ccxt/ccxt/pull/25557)
* feat(exchange): type constructor by [@carlosmiei](https://github.com/carlosmiei) in [#25558](https://github.com/ccxt/ccxt/pull/25558)
* feat(constructor): support sandbox/testnet key by [@carlosmiei](https://github.com/carlosmiei) in [#25559](https://github.com/ccxt/ccxt/pull/25559)
* fix(okx) - zksync ^ by [@ttodua](https://github.com/ttodua) in [#25560](https://github.com/ccxt/ccxt/pull/25560)
* poloniex & poloniexfutures - v3 Update & merger by [@ttodua](https://github.com/ttodua) in [#25378](https://github.com/ccxt/ccxt/pull/25378)
* feat(binance): update binance documentation links by [@Dan-krm](https://github.com/Dan-krm) in [#25561](https://github.com/ccxt/ccxt/pull/25561)
* feat(exchange): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#25562](https://github.com/ccxt/ccxt/pull/25562)
* fix(bingx) - implicit balance endpoint ^ by [@ttodua](https://github.com/ttodua) in [#25567](https://github.com/ccxt/ccxt/pull/25567)
* chore(poloniex) - ws skip tests ^ by [@ttodua](https://github.com/ttodua) in [#25566](https://github.com/ccxt/ccxt/pull/25566)
* fix(cex) - missing active key ^ by [@ttodua](https://github.com/ttodua) in [#25565](https://github.com/ccxt/ccxt/pull/25565)
* whitebit: createOrder - update docstring, has array by [@samgermain](https://github.com/samgermain) in [#25563](https://github.com/ccxt/ccxt/pull/25563)
* feat(whitebit): createDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25569](https://github.com/ccxt/ccxt/pull/25569)
* fix(gate): currencies encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25571](https://github.com/ccxt/ccxt/pull/25571)
* fix(poloniex) - features missing symbol req by [@ttodua](https://github.com/ttodua) in [#25573](https://github.com/ccxt/ccxt/pull/25573)
* fix(gate): use replaceAll instead by [@carlosmiei](https://github.com/carlosmiei) in [#25572](https://github.com/ccxt/ccxt/pull/25572)
* feat(whitebit): fetchCrossBorrowRate by [@Dan-krm](https://github.com/Dan-krm) in [#25568](https://github.com/ccxt/ccxt/pull/25568)
* fix(bingx): allAccountBalance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25575](https://github.com/ccxt/ccxt/pull/25575)
* fix(derive): update balance by [@sc0Vu](https://github.com/sc0Vu) in [#25581](https://github.com/ccxt/ccxt/pull/25581)
* fix(derive): rename deriveWalletAddress by [@sc0Vu](https://github.com/sc0Vu) in [#25582](https://github.com/ccxt/ccxt/pull/25582)
* krakenfutures\["has"]: createPostOnlyOrder, createReduceOnlyOrder, ... = true by [@samgermain](https://github.com/samgermain) in [#25576](https://github.com/ccxt/ccxt/pull/25576)
* feat(hyperliquid): add createVault by [@sc0Vu](https://github.com/sc0Vu) in [#25577](https://github.com/ccxt/ccxt/pull/25577)
* refactor & fix(okx) - fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25564](https://github.com/ccxt/ccxt/pull/25564)
* fix(bingx) - unskip tests by [@ttodua](https://github.com/ttodua) in [#25583](https://github.com/ccxt/ccxt/pull/25583)
* fix(derive): add creation\_timestamp by [@sc0Vu](https://github.com/sc0Vu) in [#25594](https://github.com/ccxt/ccxt/pull/25594)
* fix(exchange) mismatched return type by [@olegtaranenko](https://github.com/olegtaranenko) in [#25593](https://github.com/ccxt/ccxt/pull/25593)
* fix(bingx) - implicit api by [@ttodua](https://github.com/ttodua) in [#25584](https://github.com/ccxt/ccxt/pull/25584)
* fix(krakenfutures) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25586](https://github.com/ccxt/ccxt/pull/25586)
* okcoin.has createPostOnlyOrder, createReduceOnlyOrder, createStopLimitOrder, createStopMarketOrder by [@samgermain](https://github.com/samgermain) in [#25585](https://github.com/ccxt/ccxt/pull/25585)
* feat(exchanges): createDepositAddress, add DepositAddress type by [@Dan-krm](https://github.com/Dan-krm) in [#25595](https://github.com/ccxt/ccxt/pull/25595)
* fix(coinbase) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25587](https://github.com/ccxt/ccxt/pull/25587)
* fix(bitmart) - watchTrades fix by [@ttodua](https://github.com/ttodua) in [#25589](https://github.com/ccxt/ccxt/pull/25589)
* tests(ace) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25590](https://github.com/ccxt/ccxt/pull/25590)
* fix(ascendex) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25591](https://github.com/ccxt/ccxt/pull/25591)
* fix(paradex): market parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25606](https://github.com/ccxt/ccxt/pull/25606)
* fix(woo): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25605](https://github.com/ccxt/ccxt/pull/25605)
* tests(binance) - unksip networks ^ by [@ttodua](https://github.com/ttodua) in [#25607](https://github.com/ccxt/ccxt/pull/25607)
* fix(okx) - expiry time for future/option by [@ttodua](https://github.com/ttodua) in [#25600](https://github.com/ccxt/ccxt/pull/25600)
* fix(woofipro) - inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25604](https://github.com/ccxt/ccxt/pull/25604)
* fix(derive) - linear inverse ^ by [@ttodua](https://github.com/ttodua) in [#25602](https://github.com/ccxt/ccxt/pull/25602)
* fix(paradex): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25603](https://github.com/ccxt/ccxt/pull/25603)
* bit2c has false methods by [@samgermain](https://github.com/samgermain) in [#25609](https://github.com/ccxt/ccxt/pull/25609)
* tests(ace) - unskip markets ^ by [@ttodua](https://github.com/ttodua) in [#25599](https://github.com/ccxt/ccxt/pull/25599)
* fix(defx) - market inverse ^ by [@ttodua](https://github.com/ttodua) in [#25601](https://github.com/ccxt/ccxt/pull/25601)
* fix(derive): options linear ^ by [@ttodua](https://github.com/ttodua) in [#25608](https://github.com/ccxt/ccxt/pull/25608)
* tests(binanceus) - fetchStatus unskip ^ by [@ttodua](https://github.com/ttodua) in [#25597](https://github.com/ccxt/ccxt/pull/25597)
* build(deps): bump next from 14.2.25 to 14.2.26 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25626](https://github.com/ccxt/ccxt/pull/25626)
* fix(bitget) - market precision by [@ttodua](https://github.com/ttodua) in [#25624](https://github.com/ccxt/ccxt/pull/25624)
* fix(ascedex): currency id str ^ by [@ttodua](https://github.com/ttodua) in [#25614](https://github.com/ccxt/ccxt/pull/25614)
* chore(bitfinex1) - delist old version by [@ttodua](https://github.com/ttodua) in [#25621](https://github.com/ccxt/ccxt/pull/25621)
* tests(bitget): ws orderbook field ^ by [@ttodua](https://github.com/ttodua) in [#25625](https://github.com/ccxt/ccxt/pull/25625)
* tests(binance): unskip ticker & precision ^ by [@ttodua](https://github.com/ttodua) in [#25616](https://github.com/ccxt/ccxt/pull/25616)
* fix(bitget): fetchWithdrawals code not required by [@carlosmiei](https://github.com/carlosmiei) in [#25633](https://github.com/ccxt/ccxt/pull/25633)
* fix(bitrue): orderbook & retest by [@ttodua](https://github.com/ttodua) in [#25634](https://github.com/ccxt/ccxt/pull/25634)
* fix(build): remove bitfinex1 data by [@carlosmiei](https://github.com/carlosmiei) in [#25640](https://github.com/ccxt/ccxt/pull/25640)
* feat(bybit): define most method types by [@Dan-krm](https://github.com/Dan-krm) in [#25636](https://github.com/ccxt/ccxt/pull/25636)
* chore: pushback ccxt.ts by [@carlosmiei](https://github.com/carlosmiei) in [#25641](https://github.com/ccxt/ccxt/pull/25641)
* ace.has: false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25642](https://github.com/ccxt/ccxt/pull/25642)
* chore(tests): minor comment by [@ttodua](https://github.com/ttodua) in [#25635](https://github.com/ccxt/ccxt/pull/25635)
* fix(binance): update ids by [@carlosmiei](https://github.com/carlosmiei) in [#25645](https://github.com/ccxt/ccxt/pull/25645)
* feat(bybit): add pagination to fetchPositions by [@carlosmiei](https://github.com/carlosmiei) in [#25646](https://github.com/ccxt/ccxt/pull/25646)
* alpaca.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25649](https://github.com/ccxt/ccxt/pull/25649)
* chore(skips): empty entries ^ by [@ttodua](https://github.com/ttodua) in [#25618](https://github.com/ccxt/ccxt/pull/25618)
* refactor(base): reorg removeRepeatedElementsFromArray by [@ttodua](https://github.com/ttodua) in [#25644](https://github.com/ccxt/ccxt/pull/25644)
* ascendex.has - option and future methods = false by [@samgermain](https://github.com/samgermain) in [#25656](https://github.com/ccxt/ccxt/pull/25656)
* ace, alpaca: option methods = false by [@samgermain](https://github.com/samgermain) in [#25655](https://github.com/ccxt/ccxt/pull/25655)
* fix(deribit): currency inference by [@carlosmiei](https://github.com/carlosmiei) in [#25657](https://github.com/ccxt/ccxt/pull/25657)
* hitbtc.has: option/future methods = false by [@samgermain](https://github.com/samgermain) in [#25658](https://github.com/ccxt/ccxt/pull/25658)
* bit2c.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25659](https://github.com/ccxt/ccxt/pull/25659)
* bitbank.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25662](https://github.com/ccxt/ccxt/pull/25662)
* fix(gate): currencies url encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25667](https://github.com/ccxt/ccxt/pull/25667)
* bitmart parseTransaction fix by [@ndubel](https://github.com/ndubel) in [#25671](https://github.com/ccxt/ccxt/pull/25671)
* fix(gate): btc inverse contractSize fix by [@ttodua](https://github.com/ttodua) in [#25672](https://github.com/ccxt/ccxt/pull/25672)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25670](https://github.com/ccxt/ccxt/pull/25670)
* tests(ascendex): skip bid ask ^ by [@ttodua](https://github.com/ttodua) in [#25665](https://github.com/ccxt/ccxt/pull/25665)
* delist(bitpanda): remove old alias by [@ttodua](https://github.com/ttodua) in [#25664](https://github.com/ccxt/ccxt/pull/25664)
* duplicate folders/files ^ by [@ttodua](https://github.com/ttodua) in [#25648](https://github.com/ccxt/ccxt/pull/25648)
* chore(onetrading): comment ^ by [@ttodua](https://github.com/ttodua) in [#25632](https://github.com/ccxt/ccxt/pull/25632)
* fix(bitopro): ws unskip (minor changes) by [@ttodua](https://github.com/ttodua) in [#25630](https://github.com/ccxt/ccxt/pull/25630)
* tests(bitmart): unskip fields ^ by [@ttodua](https://github.com/ttodua) in [#25627](https://github.com/ccxt/ccxt/pull/25627)
* chore(reorg): validate types ^ by [@ttodua](https://github.com/ttodua) in [#25622](https://github.com/ccxt/ccxt/pull/25622)
* chore(bitcoincom): delist (remove) inexistent old alias ^ by [@ttodua](https://github.com/ttodua) in [#25620](https://github.com/ccxt/ccxt/pull/25620)
* fix(bitbns) - active & unskip ^ by [@ttodua](https://github.com/ttodua) in [#25619](https://github.com/ccxt/ccxt/pull/25619)
* unskip bequant ^ by [@ttodua](https://github.com/ttodua) in [#25615](https://github.com/ccxt/ccxt/pull/25615)
* tests(binanceusdm) - retest few props ^ by [@ttodua](https://github.com/ttodua) in [#25617](https://github.com/ccxt/ccxt/pull/25617)
* chore(tests): datetime comments enhance ^ by [@ttodua](https://github.com/ttodua) in [#25631](https://github.com/ccxt/ccxt/pull/25631)
* test(assertions): enhance tests by [@ttodua](https://github.com/ttodua) in [#25650](https://github.com/ccxt/ccxt/pull/25650)
* test(markets): complete reorg by [@ttodua](https://github.com/ttodua) in [#25669](https://github.com/ccxt/ccxt/pull/25669)
* fix(bybit): option currency inference by [@Dan-krm](https://github.com/Dan-krm) in [#25673](https://github.com/ccxt/ccxt/pull/25673)
* fix(docs) - precisions by [@ttodua](https://github.com/ttodua) in [#23316](https://github.com/ccxt/ccxt/pull/23316)
* bitopro skip timestamp ^ by [@ttodua](https://github.com/ttodua) in [#25675](https://github.com/ccxt/ccxt/pull/25675)
* ws duplicate trades filtering by [@ttodua](https://github.com/ttodua) in [#25639](https://github.com/ccxt/ccxt/pull/25639)
* fix(coinlist): support swap markets by [@carlosmiei](https://github.com/carlosmiei) in [#25676](https://github.com/ccxt/ccxt/pull/25676)
* feat(bitmart): add setPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25678](https://github.com/ccxt/ccxt/pull/25678)
* unskip bitflyer ^ by [@ttodua](https://github.com/ttodua) in [#25623](https://github.com/ccxt/ccxt/pull/25623)
* chore(skips): sort alphabetically ^ by [@ttodua](https://github.com/ttodua) in [#25677](https://github.com/ccxt/ccxt/pull/25677)
* bithumb.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25680](https://github.com/ccxt/ccxt/pull/25680)
* fix(tests): skip json ^ by [@ttodua](https://github.com/ttodua) in [#25681](https://github.com/ccxt/ccxt/pull/25681)
* fix(Exchange): removeRepeatedElementsFromArray keys order dependency by [@carlosmiei](https://github.com/carlosmiei) in [#25683](https://github.com/ccxt/ccxt/pull/25683)
* fix(blofin): fetchClosedOrders flag by [@carlosmiei](https://github.com/carlosmiei) in [#25685](https://github.com/ccxt/ccxt/pull/25685)
* feat(bitmart): add fetchPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25686](https://github.com/ccxt/ccxt/pull/25686)
* chore: disable go test by [@carlosmiei](https://github.com/carlosmiei) in [#25687](https://github.com/ccxt/ccxt/pull/25687)
* fix(okx): fetchohlcv by [@ttodua](https://github.com/ttodua) in [#25682](https://github.com/ccxt/ccxt/pull/25682)
* doc(order): stoploss & params by [@ttodua](https://github.com/ttodua) in [#25684](https://github.com/ccxt/ccxt/pull/25684)
* chore: fix js action by [@carlosmiei](https://github.com/carlosmiei) in [#25697](https://github.com/ccxt/ccxt/pull/25697)
* test(market): fix precision issues ^ by [@ttodua](https://github.com/ttodua) in [#25690](https://github.com/ccxt/ccxt/pull/25690)
* test(bitmart): skip watchOB bid-ask ^ by [@ttodua](https://github.com/ttodua) in [#25691](https://github.com/ccxt/ccxt/pull/25691)
* test(bitflyer): no settleId ^ by [@ttodua](https://github.com/ttodua) in [#25693](https://github.com/ccxt/ccxt/pull/25693)
* fix(safeCurrencyStructure): withdraw/deposit/active by [@ttodua](https://github.com/ttodua) in [#25698](https://github.com/ccxt/ccxt/pull/25698)
* bitopro.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25705](https://github.com/ccxt/ccxt/pull/25705)
* chore: remove js/ dep from export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25700](https://github.com/ccxt/ccxt/pull/25700)
* test(market): removal of few skips ^ by [@ttodua](https://github.com/ttodua) in [#25692](https://github.com/ccxt/ccxt/pull/25692)
* feat(coinlist): add missing endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25703](https://github.com/ccxt/ccxt/pull/25703)
* test(coinex): skip precision & networks ^ by [@ttodua](https://github.com/ttodua) in [#25696](https://github.com/ccxt/ccxt/pull/25696)
* test(bitopro): skip l2 ^ by [@ttodua](https://github.com/ttodua) in [#25695](https://github.com/ccxt/ccxt/pull/25695)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25694](https://github.com/ccxt/ccxt/pull/25694)
* fix(vss): remove js/ overwrite by [@carlosmiei](https://github.com/carlosmiei) in [#25706](https://github.com/ccxt/ccxt/pull/25706)
* bitrue.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25708](https://github.com/ccxt/ccxt/pull/25708)
* feat(upbit): add '1s' and '1y' timeframes by [@LambdaBen](https://github.com/LambdaBen) in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* Optimize Docker setup: replace .NET SDK installation with direct scri… by [@xucheng](https://github.com/xucheng) in [#25715](https://github.com/ccxt/ccxt/pull/25715)
* feat(tests): add per lang disabled flag by [@carlosmiei](https://github.com/carlosmiei) in [#25716](https://github.com/ccxt/ccxt/pull/25716)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25717](https://github.com/ccxt/ccxt/pull/25717)
* feat(coinlist): add fetchFundingRate by [@Dan-krm](https://github.com/Dan-krm) in [#25719](https://github.com/ccxt/ccxt/pull/25719)
* fix(binance): deposit address & reversedNetworks by [@ttodua](https://github.com/ttodua) in [#25718](https://github.com/ccxt/ccxt/pull/25718)
* fix(coinex.cs): fetchCurrencies network key by [@carlosmiei](https://github.com/carlosmiei) in [#25722](https://github.com/ccxt/ccxt/pull/25722)
* test(skips): add type ^ by [@ttodua](https://github.com/ttodua) in [#25724](https://github.com/ccxt/ccxt/pull/25724)
* fix(hyperliquid): orderId in watchMyTrades by [@carlosmiei](https://github.com/carlosmiei) in [#25726](https://github.com/ccxt/ccxt/pull/25726)
* ace - skip further ^ by [@ttodua](https://github.com/ttodua) in [#25725](https://github.com/ccxt/ccxt/pull/25725)
* fix(bitget): fetchTradingFee swap by [@carlosmiei](https://github.com/carlosmiei) in [#25730](https://github.com/ccxt/ccxt/pull/25730)
* fix(proxy): proxyUrl fix & implementation in c# by [@ttodua](https://github.com/ttodua) in [#25638](https://github.com/ccxt/ccxt/pull/25638)
* feat(upbit): define new Implicit APIs and remove deprecated API by [@LambdaBen](https://github.com/LambdaBen) in [#25733](https://github.com/ccxt/ccxt/pull/25733)
* fix(paradex): fetchTickers by [@carlosmiei](https://github.com/carlosmiei) in [#25735](https://github.com/ccxt/ccxt/pull/25735)
* chore: update actions/python to v5 by [@carlosmiei](https://github.com/carlosmiei) in [#25744](https://github.com/ccxt/ccxt/pull/25744)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/v4 by [@dependabot](https://github.com/dependabot) in [#25745](https://github.com/ccxt/ccxt/pull/25745)
* update(upbit): update rateLimit and add cost to Implicit API by [@LambdaBen](https://github.com/LambdaBen) in [#25747](https://github.com/ccxt/ccxt/pull/25747)
* feat(tests): add conflicts detection to markets by [@carlosmiei](https://github.com/carlosmiei) in [#25748](https://github.com/ccxt/ccxt/pull/25748)
* chore: bump ubuntu version in go by [@carlosmiei](https://github.com/carlosmiei) in [#25750](https://github.com/ccxt/ccxt/pull/25750)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25754](https://github.com/ccxt/ccxt/pull/25754)
* feat(okx): April 17 2025 changelog by [@Dan-krm](https://github.com/Dan-krm) in [#25756](https://github.com/ccxt/ccxt/pull/25756)
* feat(xt): add editOrder by [@Dan-krm](https://github.com/Dan-krm) in [#25751](https://github.com/ccxt/ccxt/pull/25751)
* fix(okx): preopen sandbox markets parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25761](https://github.com/ccxt/ccxt/pull/25761)
## New Contributors [#new-contributors-54]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* [@LambdaBen](https://github.com/LambdaBen) made their first contribution in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* [@xucheng](https://github.com/xucheng) made their first contribution in [#25715](https://github.com/ccxt/ccxt/pull/25715)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.77](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.77)
[Changes][v4.4.77]
# [v4.4.76](https://github.com/ccxt/ccxt/releases/tag/v4.4.76) - 2025-04-17 [#v4476---2025-04-17]
## What's Changed [#whats-changed-100]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
* build(deps): bump next from 14.2.21 to 14.2.25 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25542](https://github.com/ccxt/ccxt/pull/25542)
* fix(kraken) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#25543](https://github.com/ccxt/ccxt/pull/25543)
* better instructions for exhange-capabilities script by [@samgermain](https://github.com/samgermain) in [#25546](https://github.com/ccxt/ccxt/pull/25546)
* feat(bitmart): add editOrder to limit swap orders by [@carlosmiei](https://github.com/carlosmiei) in [#25547](https://github.com/ccxt/ccxt/pull/25547)
* chore: readme remove expired campaign by [@carlosmiei](https://github.com/carlosmiei) in [#25551](https://github.com/ccxt/ccxt/pull/25551)
* docs(readme): minor by [@ttodua](https://github.com/ttodua) in [#25550](https://github.com/ccxt/ccxt/pull/25550)
* fix(goTranspiler): safeCurrencyCode inherited call by [@carlosmiei](https://github.com/carlosmiei) in [#25548](https://github.com/ccxt/ccxt/pull/25548)
* bingx, bitmart: has\["createReduceOnlyOrder"] = true by [@samgermain](https://github.com/samgermain) in [#25552](https://github.com/ccxt/ccxt/pull/25552)
* feat(okx) - full networks unif by [@ttodua](https://github.com/ttodua) in [#25553](https://github.com/ccxt/ccxt/pull/25553)
* feat(base) - handleRequestNetwork by [@ttodua](https://github.com/ttodua) in [#25466](https://github.com/ccxt/ccxt/pull/25466)
* has\["createReduceOnlyOrder"] by [@samgermain](https://github.com/samgermain) in [#25555](https://github.com/ccxt/ccxt/pull/25555)
* fix(bitget): sandbox markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#25557](https://github.com/ccxt/ccxt/pull/25557)
* feat(exchange): type constructor by [@carlosmiei](https://github.com/carlosmiei) in [#25558](https://github.com/ccxt/ccxt/pull/25558)
* feat(constructor): support sandbox/testnet key by [@carlosmiei](https://github.com/carlosmiei) in [#25559](https://github.com/ccxt/ccxt/pull/25559)
* fix(okx) - zksync ^ by [@ttodua](https://github.com/ttodua) in [#25560](https://github.com/ccxt/ccxt/pull/25560)
* poloniex & poloniexfutures - v3 Update & merger by [@ttodua](https://github.com/ttodua) in [#25378](https://github.com/ccxt/ccxt/pull/25378)
* feat(binance): update binance documentation links by [@Dan-krm](https://github.com/Dan-krm) in [#25561](https://github.com/ccxt/ccxt/pull/25561)
* feat(exchange): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#25562](https://github.com/ccxt/ccxt/pull/25562)
* fix(bingx) - implicit balance endpoint ^ by [@ttodua](https://github.com/ttodua) in [#25567](https://github.com/ccxt/ccxt/pull/25567)
* chore(poloniex) - ws skip tests ^ by [@ttodua](https://github.com/ttodua) in [#25566](https://github.com/ccxt/ccxt/pull/25566)
* fix(cex) - missing active key ^ by [@ttodua](https://github.com/ttodua) in [#25565](https://github.com/ccxt/ccxt/pull/25565)
* whitebit: createOrder - update docstring, has array by [@samgermain](https://github.com/samgermain) in [#25563](https://github.com/ccxt/ccxt/pull/25563)
* feat(whitebit): createDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25569](https://github.com/ccxt/ccxt/pull/25569)
* fix(gate): currencies encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25571](https://github.com/ccxt/ccxt/pull/25571)
* fix(poloniex) - features missing symbol req by [@ttodua](https://github.com/ttodua) in [#25573](https://github.com/ccxt/ccxt/pull/25573)
* fix(gate): use replaceAll instead by [@carlosmiei](https://github.com/carlosmiei) in [#25572](https://github.com/ccxt/ccxt/pull/25572)
* feat(whitebit): fetchCrossBorrowRate by [@Dan-krm](https://github.com/Dan-krm) in [#25568](https://github.com/ccxt/ccxt/pull/25568)
* fix(bingx): allAccountBalance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25575](https://github.com/ccxt/ccxt/pull/25575)
* fix(derive): update balance by [@sc0Vu](https://github.com/sc0Vu) in [#25581](https://github.com/ccxt/ccxt/pull/25581)
* fix(derive): rename deriveWalletAddress by [@sc0Vu](https://github.com/sc0Vu) in [#25582](https://github.com/ccxt/ccxt/pull/25582)
* krakenfutures\["has"]: createPostOnlyOrder, createReduceOnlyOrder, ... = true by [@samgermain](https://github.com/samgermain) in [#25576](https://github.com/ccxt/ccxt/pull/25576)
* feat(hyperliquid): add createVault by [@sc0Vu](https://github.com/sc0Vu) in [#25577](https://github.com/ccxt/ccxt/pull/25577)
* refactor & fix(okx) - fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25564](https://github.com/ccxt/ccxt/pull/25564)
* fix(bingx) - unskip tests by [@ttodua](https://github.com/ttodua) in [#25583](https://github.com/ccxt/ccxt/pull/25583)
* fix(derive): add creation\_timestamp by [@sc0Vu](https://github.com/sc0Vu) in [#25594](https://github.com/ccxt/ccxt/pull/25594)
* fix(exchange) mismatched return type by [@olegtaranenko](https://github.com/olegtaranenko) in [#25593](https://github.com/ccxt/ccxt/pull/25593)
* fix(bingx) - implicit api by [@ttodua](https://github.com/ttodua) in [#25584](https://github.com/ccxt/ccxt/pull/25584)
* fix(krakenfutures) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25586](https://github.com/ccxt/ccxt/pull/25586)
* okcoin.has createPostOnlyOrder, createReduceOnlyOrder, createStopLimitOrder, createStopMarketOrder by [@samgermain](https://github.com/samgermain) in [#25585](https://github.com/ccxt/ccxt/pull/25585)
* feat(exchanges): createDepositAddress, add DepositAddress type by [@Dan-krm](https://github.com/Dan-krm) in [#25595](https://github.com/ccxt/ccxt/pull/25595)
* fix(coinbase) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25587](https://github.com/ccxt/ccxt/pull/25587)
* fix(bitmart) - watchTrades fix by [@ttodua](https://github.com/ttodua) in [#25589](https://github.com/ccxt/ccxt/pull/25589)
* tests(ace) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25590](https://github.com/ccxt/ccxt/pull/25590)
* fix(ascendex) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25591](https://github.com/ccxt/ccxt/pull/25591)
* fix(paradex): market parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25606](https://github.com/ccxt/ccxt/pull/25606)
* fix(woo): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25605](https://github.com/ccxt/ccxt/pull/25605)
* tests(binance) - unksip networks ^ by [@ttodua](https://github.com/ttodua) in [#25607](https://github.com/ccxt/ccxt/pull/25607)
* fix(okx) - expiry time for future/option by [@ttodua](https://github.com/ttodua) in [#25600](https://github.com/ccxt/ccxt/pull/25600)
* fix(woofipro) - inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25604](https://github.com/ccxt/ccxt/pull/25604)
* fix(derive) - linear inverse ^ by [@ttodua](https://github.com/ttodua) in [#25602](https://github.com/ccxt/ccxt/pull/25602)
* fix(paradex): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25603](https://github.com/ccxt/ccxt/pull/25603)
* bit2c has false methods by [@samgermain](https://github.com/samgermain) in [#25609](https://github.com/ccxt/ccxt/pull/25609)
* tests(ace) - unskip markets ^ by [@ttodua](https://github.com/ttodua) in [#25599](https://github.com/ccxt/ccxt/pull/25599)
* fix(defx) - market inverse ^ by [@ttodua](https://github.com/ttodua) in [#25601](https://github.com/ccxt/ccxt/pull/25601)
* fix(derive): options linear ^ by [@ttodua](https://github.com/ttodua) in [#25608](https://github.com/ccxt/ccxt/pull/25608)
* tests(binanceus) - fetchStatus unskip ^ by [@ttodua](https://github.com/ttodua) in [#25597](https://github.com/ccxt/ccxt/pull/25597)
* build(deps): bump next from 14.2.25 to 14.2.26 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25626](https://github.com/ccxt/ccxt/pull/25626)
* fix(bitget) - market precision by [@ttodua](https://github.com/ttodua) in [#25624](https://github.com/ccxt/ccxt/pull/25624)
* fix(ascedex): currency id str ^ by [@ttodua](https://github.com/ttodua) in [#25614](https://github.com/ccxt/ccxt/pull/25614)
* chore(bitfinex1) - delist old version by [@ttodua](https://github.com/ttodua) in [#25621](https://github.com/ccxt/ccxt/pull/25621)
* tests(bitget): ws orderbook field ^ by [@ttodua](https://github.com/ttodua) in [#25625](https://github.com/ccxt/ccxt/pull/25625)
* tests(binance): unskip ticker & precision ^ by [@ttodua](https://github.com/ttodua) in [#25616](https://github.com/ccxt/ccxt/pull/25616)
* fix(bitget): fetchWithdrawals code not required by [@carlosmiei](https://github.com/carlosmiei) in [#25633](https://github.com/ccxt/ccxt/pull/25633)
* fix(bitrue): orderbook & retest by [@ttodua](https://github.com/ttodua) in [#25634](https://github.com/ccxt/ccxt/pull/25634)
* fix(build): remove bitfinex1 data by [@carlosmiei](https://github.com/carlosmiei) in [#25640](https://github.com/ccxt/ccxt/pull/25640)
* feat(bybit): define most method types by [@Dan-krm](https://github.com/Dan-krm) in [#25636](https://github.com/ccxt/ccxt/pull/25636)
* chore: pushback ccxt.ts by [@carlosmiei](https://github.com/carlosmiei) in [#25641](https://github.com/ccxt/ccxt/pull/25641)
* ace.has: false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25642](https://github.com/ccxt/ccxt/pull/25642)
* chore(tests): minor comment by [@ttodua](https://github.com/ttodua) in [#25635](https://github.com/ccxt/ccxt/pull/25635)
* fix(binance): update ids by [@carlosmiei](https://github.com/carlosmiei) in [#25645](https://github.com/ccxt/ccxt/pull/25645)
* feat(bybit): add pagination to fetchPositions by [@carlosmiei](https://github.com/carlosmiei) in [#25646](https://github.com/ccxt/ccxt/pull/25646)
* alpaca.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25649](https://github.com/ccxt/ccxt/pull/25649)
* chore(skips): empty entries ^ by [@ttodua](https://github.com/ttodua) in [#25618](https://github.com/ccxt/ccxt/pull/25618)
* refactor(base): reorg removeRepeatedElementsFromArray by [@ttodua](https://github.com/ttodua) in [#25644](https://github.com/ccxt/ccxt/pull/25644)
* ascendex.has - option and future methods = false by [@samgermain](https://github.com/samgermain) in [#25656](https://github.com/ccxt/ccxt/pull/25656)
* ace, alpaca: option methods = false by [@samgermain](https://github.com/samgermain) in [#25655](https://github.com/ccxt/ccxt/pull/25655)
* fix(deribit): currency inference by [@carlosmiei](https://github.com/carlosmiei) in [#25657](https://github.com/ccxt/ccxt/pull/25657)
* hitbtc.has: option/future methods = false by [@samgermain](https://github.com/samgermain) in [#25658](https://github.com/ccxt/ccxt/pull/25658)
* bit2c.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25659](https://github.com/ccxt/ccxt/pull/25659)
* bitbank.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25662](https://github.com/ccxt/ccxt/pull/25662)
* fix(gate): currencies url encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25667](https://github.com/ccxt/ccxt/pull/25667)
* bitmart parseTransaction fix by [@ndubel](https://github.com/ndubel) in [#25671](https://github.com/ccxt/ccxt/pull/25671)
* fix(gate): btc inverse contractSize fix by [@ttodua](https://github.com/ttodua) in [#25672](https://github.com/ccxt/ccxt/pull/25672)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25670](https://github.com/ccxt/ccxt/pull/25670)
* tests(ascendex): skip bid ask ^ by [@ttodua](https://github.com/ttodua) in [#25665](https://github.com/ccxt/ccxt/pull/25665)
* delist(bitpanda): remove old alias by [@ttodua](https://github.com/ttodua) in [#25664](https://github.com/ccxt/ccxt/pull/25664)
* duplicate folders/files ^ by [@ttodua](https://github.com/ttodua) in [#25648](https://github.com/ccxt/ccxt/pull/25648)
* chore(onetrading): comment ^ by [@ttodua](https://github.com/ttodua) in [#25632](https://github.com/ccxt/ccxt/pull/25632)
* fix(bitopro): ws unskip (minor changes) by [@ttodua](https://github.com/ttodua) in [#25630](https://github.com/ccxt/ccxt/pull/25630)
* tests(bitmart): unskip fields ^ by [@ttodua](https://github.com/ttodua) in [#25627](https://github.com/ccxt/ccxt/pull/25627)
* chore(reorg): validate types ^ by [@ttodua](https://github.com/ttodua) in [#25622](https://github.com/ccxt/ccxt/pull/25622)
* chore(bitcoincom): delist (remove) inexistent old alias ^ by [@ttodua](https://github.com/ttodua) in [#25620](https://github.com/ccxt/ccxt/pull/25620)
* fix(bitbns) - active & unskip ^ by [@ttodua](https://github.com/ttodua) in [#25619](https://github.com/ccxt/ccxt/pull/25619)
* unskip bequant ^ by [@ttodua](https://github.com/ttodua) in [#25615](https://github.com/ccxt/ccxt/pull/25615)
* tests(binanceusdm) - retest few props ^ by [@ttodua](https://github.com/ttodua) in [#25617](https://github.com/ccxt/ccxt/pull/25617)
* chore(tests): datetime comments enhance ^ by [@ttodua](https://github.com/ttodua) in [#25631](https://github.com/ccxt/ccxt/pull/25631)
* test(assertions): enhance tests by [@ttodua](https://github.com/ttodua) in [#25650](https://github.com/ccxt/ccxt/pull/25650)
* test(markets): complete reorg by [@ttodua](https://github.com/ttodua) in [#25669](https://github.com/ccxt/ccxt/pull/25669)
* fix(bybit): option currency inference by [@Dan-krm](https://github.com/Dan-krm) in [#25673](https://github.com/ccxt/ccxt/pull/25673)
* fix(docs) - precisions by [@ttodua](https://github.com/ttodua) in [#23316](https://github.com/ccxt/ccxt/pull/23316)
* bitopro skip timestamp ^ by [@ttodua](https://github.com/ttodua) in [#25675](https://github.com/ccxt/ccxt/pull/25675)
* ws duplicate trades filtering by [@ttodua](https://github.com/ttodua) in [#25639](https://github.com/ccxt/ccxt/pull/25639)
* fix(coinlist): support swap markets by [@carlosmiei](https://github.com/carlosmiei) in [#25676](https://github.com/ccxt/ccxt/pull/25676)
* feat(bitmart): add setPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25678](https://github.com/ccxt/ccxt/pull/25678)
* unskip bitflyer ^ by [@ttodua](https://github.com/ttodua) in [#25623](https://github.com/ccxt/ccxt/pull/25623)
* chore(skips): sort alphabetically ^ by [@ttodua](https://github.com/ttodua) in [#25677](https://github.com/ccxt/ccxt/pull/25677)
* bithumb.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25680](https://github.com/ccxt/ccxt/pull/25680)
* fix(tests): skip json ^ by [@ttodua](https://github.com/ttodua) in [#25681](https://github.com/ccxt/ccxt/pull/25681)
* fix(Exchange): removeRepeatedElementsFromArray keys order dependency by [@carlosmiei](https://github.com/carlosmiei) in [#25683](https://github.com/ccxt/ccxt/pull/25683)
* fix(blofin): fetchClosedOrders flag by [@carlosmiei](https://github.com/carlosmiei) in [#25685](https://github.com/ccxt/ccxt/pull/25685)
* feat(bitmart): add fetchPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25686](https://github.com/ccxt/ccxt/pull/25686)
* chore: disable go test by [@carlosmiei](https://github.com/carlosmiei) in [#25687](https://github.com/ccxt/ccxt/pull/25687)
* fix(okx): fetchohlcv by [@ttodua](https://github.com/ttodua) in [#25682](https://github.com/ccxt/ccxt/pull/25682)
* doc(order): stoploss & params by [@ttodua](https://github.com/ttodua) in [#25684](https://github.com/ccxt/ccxt/pull/25684)
* chore: fix js action by [@carlosmiei](https://github.com/carlosmiei) in [#25697](https://github.com/ccxt/ccxt/pull/25697)
* test(market): fix precision issues ^ by [@ttodua](https://github.com/ttodua) in [#25690](https://github.com/ccxt/ccxt/pull/25690)
* test(bitmart): skip watchOB bid-ask ^ by [@ttodua](https://github.com/ttodua) in [#25691](https://github.com/ccxt/ccxt/pull/25691)
* test(bitflyer): no settleId ^ by [@ttodua](https://github.com/ttodua) in [#25693](https://github.com/ccxt/ccxt/pull/25693)
* fix(safeCurrencyStructure): withdraw/deposit/active by [@ttodua](https://github.com/ttodua) in [#25698](https://github.com/ccxt/ccxt/pull/25698)
* bitopro.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25705](https://github.com/ccxt/ccxt/pull/25705)
* chore: remove js/ dep from export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25700](https://github.com/ccxt/ccxt/pull/25700)
* test(market): removal of few skips ^ by [@ttodua](https://github.com/ttodua) in [#25692](https://github.com/ccxt/ccxt/pull/25692)
* feat(coinlist): add missing endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25703](https://github.com/ccxt/ccxt/pull/25703)
* test(coinex): skip precision & networks ^ by [@ttodua](https://github.com/ttodua) in [#25696](https://github.com/ccxt/ccxt/pull/25696)
* test(bitopro): skip l2 ^ by [@ttodua](https://github.com/ttodua) in [#25695](https://github.com/ccxt/ccxt/pull/25695)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25694](https://github.com/ccxt/ccxt/pull/25694)
* fix(vss): remove js/ overwrite by [@carlosmiei](https://github.com/carlosmiei) in [#25706](https://github.com/ccxt/ccxt/pull/25706)
* bitrue.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25708](https://github.com/ccxt/ccxt/pull/25708)
* feat(upbit): add '1s' and '1y' timeframes by [@LambdaBen](https://github.com/LambdaBen) in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* Optimize Docker setup: replace .NET SDK installation with direct scri… by [@xucheng](https://github.com/xucheng) in [#25715](https://github.com/ccxt/ccxt/pull/25715)
* feat(tests): add per lang disabled flag by [@carlosmiei](https://github.com/carlosmiei) in [#25716](https://github.com/ccxt/ccxt/pull/25716)
* chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.35.0 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25717](https://github.com/ccxt/ccxt/pull/25717)
* feat(coinlist): add fetchFundingRate by [@Dan-krm](https://github.com/Dan-krm) in [#25719](https://github.com/ccxt/ccxt/pull/25719)
* fix(binance): deposit address & reversedNetworks by [@ttodua](https://github.com/ttodua) in [#25718](https://github.com/ccxt/ccxt/pull/25718)
* fix(coinex.cs): fetchCurrencies network key by [@carlosmiei](https://github.com/carlosmiei) in [#25722](https://github.com/ccxt/ccxt/pull/25722)
* test(skips): add type ^ by [@ttodua](https://github.com/ttodua) in [#25724](https://github.com/ccxt/ccxt/pull/25724)
* fix(hyperliquid): orderId in watchMyTrades by [@carlosmiei](https://github.com/carlosmiei) in [#25726](https://github.com/ccxt/ccxt/pull/25726)
* ace - skip further ^ by [@ttodua](https://github.com/ttodua) in [#25725](https://github.com/ccxt/ccxt/pull/25725)
* fix(bitget): fetchTradingFee swap by [@carlosmiei](https://github.com/carlosmiei) in [#25730](https://github.com/ccxt/ccxt/pull/25730)
* fix(proxy): proxyUrl fix & implementation in c# by [@ttodua](https://github.com/ttodua) in [#25638](https://github.com/ccxt/ccxt/pull/25638)
* feat(upbit): define new Implicit APIs and remove deprecated API by [@LambdaBen](https://github.com/LambdaBen) in [#25733](https://github.com/ccxt/ccxt/pull/25733)
* fix(paradex): fetchTickers by [@carlosmiei](https://github.com/carlosmiei) in [#25735](https://github.com/ccxt/ccxt/pull/25735)
* chore: update actions/python to v5 by [@carlosmiei](https://github.com/carlosmiei) in [#25744](https://github.com/ccxt/ccxt/pull/25744)
## New Contributors [#new-contributors-55]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* [@LambdaBen](https://github.com/LambdaBen) made their first contribution in [#25711](https://github.com/ccxt/ccxt/pull/25711)
* [@xucheng](https://github.com/xucheng) made their first contribution in [#25715](https://github.com/ccxt/ccxt/pull/25715)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.76](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.76)
[Changes][v4.4.76]
# [v4.4.75](https://github.com/ccxt/ccxt/releases/tag/v4.4.75) - 2025-04-13 [#v4475---2025-04-13]
## What's Changed [#whats-changed-101]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
* build(deps): bump next from 14.2.21 to 14.2.25 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25542](https://github.com/ccxt/ccxt/pull/25542)
* fix(kraken) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#25543](https://github.com/ccxt/ccxt/pull/25543)
* better instructions for exhange-capabilities script by [@samgermain](https://github.com/samgermain) in [#25546](https://github.com/ccxt/ccxt/pull/25546)
* feat(bitmart): add editOrder to limit swap orders by [@carlosmiei](https://github.com/carlosmiei) in [#25547](https://github.com/ccxt/ccxt/pull/25547)
* chore: readme remove expired campaign by [@carlosmiei](https://github.com/carlosmiei) in [#25551](https://github.com/ccxt/ccxt/pull/25551)
* docs(readme): minor by [@ttodua](https://github.com/ttodua) in [#25550](https://github.com/ccxt/ccxt/pull/25550)
* fix(goTranspiler): safeCurrencyCode inherited call by [@carlosmiei](https://github.com/carlosmiei) in [#25548](https://github.com/ccxt/ccxt/pull/25548)
* bingx, bitmart: has\["createReduceOnlyOrder"] = true by [@samgermain](https://github.com/samgermain) in [#25552](https://github.com/ccxt/ccxt/pull/25552)
* feat(okx) - full networks unif by [@ttodua](https://github.com/ttodua) in [#25553](https://github.com/ccxt/ccxt/pull/25553)
* feat(base) - handleRequestNetwork by [@ttodua](https://github.com/ttodua) in [#25466](https://github.com/ccxt/ccxt/pull/25466)
* has\["createReduceOnlyOrder"] by [@samgermain](https://github.com/samgermain) in [#25555](https://github.com/ccxt/ccxt/pull/25555)
* fix(bitget): sandbox markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#25557](https://github.com/ccxt/ccxt/pull/25557)
* feat(exchange): type constructor by [@carlosmiei](https://github.com/carlosmiei) in [#25558](https://github.com/ccxt/ccxt/pull/25558)
* feat(constructor): support sandbox/testnet key by [@carlosmiei](https://github.com/carlosmiei) in [#25559](https://github.com/ccxt/ccxt/pull/25559)
* fix(okx) - zksync ^ by [@ttodua](https://github.com/ttodua) in [#25560](https://github.com/ccxt/ccxt/pull/25560)
* poloniex & poloniexfutures - v3 Update & merger by [@ttodua](https://github.com/ttodua) in [#25378](https://github.com/ccxt/ccxt/pull/25378)
* feat(binance): update binance documentation links by [@Dan-krm](https://github.com/Dan-krm) in [#25561](https://github.com/ccxt/ccxt/pull/25561)
* feat(exchange): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#25562](https://github.com/ccxt/ccxt/pull/25562)
* fix(bingx) - implicit balance endpoint ^ by [@ttodua](https://github.com/ttodua) in [#25567](https://github.com/ccxt/ccxt/pull/25567)
* chore(poloniex) - ws skip tests ^ by [@ttodua](https://github.com/ttodua) in [#25566](https://github.com/ccxt/ccxt/pull/25566)
* fix(cex) - missing active key ^ by [@ttodua](https://github.com/ttodua) in [#25565](https://github.com/ccxt/ccxt/pull/25565)
* whitebit: createOrder - update docstring, has array by [@samgermain](https://github.com/samgermain) in [#25563](https://github.com/ccxt/ccxt/pull/25563)
* feat(whitebit): createDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25569](https://github.com/ccxt/ccxt/pull/25569)
* fix(gate): currencies encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25571](https://github.com/ccxt/ccxt/pull/25571)
* fix(poloniex) - features missing symbol req by [@ttodua](https://github.com/ttodua) in [#25573](https://github.com/ccxt/ccxt/pull/25573)
* fix(gate): use replaceAll instead by [@carlosmiei](https://github.com/carlosmiei) in [#25572](https://github.com/ccxt/ccxt/pull/25572)
* feat(whitebit): fetchCrossBorrowRate by [@Dan-krm](https://github.com/Dan-krm) in [#25568](https://github.com/ccxt/ccxt/pull/25568)
* fix(bingx): allAccountBalance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25575](https://github.com/ccxt/ccxt/pull/25575)
* fix(derive): update balance by [@sc0Vu](https://github.com/sc0Vu) in [#25581](https://github.com/ccxt/ccxt/pull/25581)
* fix(derive): rename deriveWalletAddress by [@sc0Vu](https://github.com/sc0Vu) in [#25582](https://github.com/ccxt/ccxt/pull/25582)
* krakenfutures\["has"]: createPostOnlyOrder, createReduceOnlyOrder, ... = true by [@samgermain](https://github.com/samgermain) in [#25576](https://github.com/ccxt/ccxt/pull/25576)
* feat(hyperliquid): add createVault by [@sc0Vu](https://github.com/sc0Vu) in [#25577](https://github.com/ccxt/ccxt/pull/25577)
* refactor & fix(okx) - fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25564](https://github.com/ccxt/ccxt/pull/25564)
* fix(bingx) - unskip tests by [@ttodua](https://github.com/ttodua) in [#25583](https://github.com/ccxt/ccxt/pull/25583)
* fix(derive): add creation\_timestamp by [@sc0Vu](https://github.com/sc0Vu) in [#25594](https://github.com/ccxt/ccxt/pull/25594)
* fix(exchange) mismatched return type by [@olegtaranenko](https://github.com/olegtaranenko) in [#25593](https://github.com/ccxt/ccxt/pull/25593)
* fix(bingx) - implicit api by [@ttodua](https://github.com/ttodua) in [#25584](https://github.com/ccxt/ccxt/pull/25584)
* fix(krakenfutures) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25586](https://github.com/ccxt/ccxt/pull/25586)
* okcoin.has createPostOnlyOrder, createReduceOnlyOrder, createStopLimitOrder, createStopMarketOrder by [@samgermain](https://github.com/samgermain) in [#25585](https://github.com/ccxt/ccxt/pull/25585)
* feat(exchanges): createDepositAddress, add DepositAddress type by [@Dan-krm](https://github.com/Dan-krm) in [#25595](https://github.com/ccxt/ccxt/pull/25595)
* fix(coinbase) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25587](https://github.com/ccxt/ccxt/pull/25587)
* fix(bitmart) - watchTrades fix by [@ttodua](https://github.com/ttodua) in [#25589](https://github.com/ccxt/ccxt/pull/25589)
* tests(ace) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25590](https://github.com/ccxt/ccxt/pull/25590)
* fix(ascendex) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25591](https://github.com/ccxt/ccxt/pull/25591)
* fix(paradex): market parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25606](https://github.com/ccxt/ccxt/pull/25606)
* fix(woo): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25605](https://github.com/ccxt/ccxt/pull/25605)
* tests(binance) - unksip networks ^ by [@ttodua](https://github.com/ttodua) in [#25607](https://github.com/ccxt/ccxt/pull/25607)
* fix(okx) - expiry time for future/option by [@ttodua](https://github.com/ttodua) in [#25600](https://github.com/ccxt/ccxt/pull/25600)
* fix(woofipro) - inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25604](https://github.com/ccxt/ccxt/pull/25604)
* fix(derive) - linear inverse ^ by [@ttodua](https://github.com/ttodua) in [#25602](https://github.com/ccxt/ccxt/pull/25602)
* fix(paradex): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25603](https://github.com/ccxt/ccxt/pull/25603)
* bit2c has false methods by [@samgermain](https://github.com/samgermain) in [#25609](https://github.com/ccxt/ccxt/pull/25609)
* tests(ace) - unskip markets ^ by [@ttodua](https://github.com/ttodua) in [#25599](https://github.com/ccxt/ccxt/pull/25599)
* fix(defx) - market inverse ^ by [@ttodua](https://github.com/ttodua) in [#25601](https://github.com/ccxt/ccxt/pull/25601)
* fix(derive): options linear ^ by [@ttodua](https://github.com/ttodua) in [#25608](https://github.com/ccxt/ccxt/pull/25608)
* tests(binanceus) - fetchStatus unskip ^ by [@ttodua](https://github.com/ttodua) in [#25597](https://github.com/ccxt/ccxt/pull/25597)
* build(deps): bump next from 14.2.25 to 14.2.26 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25626](https://github.com/ccxt/ccxt/pull/25626)
* fix(bitget) - market precision by [@ttodua](https://github.com/ttodua) in [#25624](https://github.com/ccxt/ccxt/pull/25624)
* fix(ascedex): currency id str ^ by [@ttodua](https://github.com/ttodua) in [#25614](https://github.com/ccxt/ccxt/pull/25614)
* chore(bitfinex1) - delist old version by [@ttodua](https://github.com/ttodua) in [#25621](https://github.com/ccxt/ccxt/pull/25621)
* tests(bitget): ws orderbook field ^ by [@ttodua](https://github.com/ttodua) in [#25625](https://github.com/ccxt/ccxt/pull/25625)
* tests(binance): unskip ticker & precision ^ by [@ttodua](https://github.com/ttodua) in [#25616](https://github.com/ccxt/ccxt/pull/25616)
* fix(bitget): fetchWithdrawals code not required by [@carlosmiei](https://github.com/carlosmiei) in [#25633](https://github.com/ccxt/ccxt/pull/25633)
* fix(bitrue): orderbook & retest by [@ttodua](https://github.com/ttodua) in [#25634](https://github.com/ccxt/ccxt/pull/25634)
* fix(build): remove bitfinex1 data by [@carlosmiei](https://github.com/carlosmiei) in [#25640](https://github.com/ccxt/ccxt/pull/25640)
* feat(bybit): define most method types by [@Dan-krm](https://github.com/Dan-krm) in [#25636](https://github.com/ccxt/ccxt/pull/25636)
* chore: pushback ccxt.ts by [@carlosmiei](https://github.com/carlosmiei) in [#25641](https://github.com/ccxt/ccxt/pull/25641)
* ace.has: false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25642](https://github.com/ccxt/ccxt/pull/25642)
* chore(tests): minor comment by [@ttodua](https://github.com/ttodua) in [#25635](https://github.com/ccxt/ccxt/pull/25635)
* fix(binance): update ids by [@carlosmiei](https://github.com/carlosmiei) in [#25645](https://github.com/ccxt/ccxt/pull/25645)
* feat(bybit): add pagination to fetchPositions by [@carlosmiei](https://github.com/carlosmiei) in [#25646](https://github.com/ccxt/ccxt/pull/25646)
* alpaca.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25649](https://github.com/ccxt/ccxt/pull/25649)
* chore(skips): empty entries ^ by [@ttodua](https://github.com/ttodua) in [#25618](https://github.com/ccxt/ccxt/pull/25618)
* refactor(base): reorg removeRepeatedElementsFromArray by [@ttodua](https://github.com/ttodua) in [#25644](https://github.com/ccxt/ccxt/pull/25644)
* ascendex.has - option and future methods = false by [@samgermain](https://github.com/samgermain) in [#25656](https://github.com/ccxt/ccxt/pull/25656)
* ace, alpaca: option methods = false by [@samgermain](https://github.com/samgermain) in [#25655](https://github.com/ccxt/ccxt/pull/25655)
* fix(deribit): currency inference by [@carlosmiei](https://github.com/carlosmiei) in [#25657](https://github.com/ccxt/ccxt/pull/25657)
* hitbtc.has: option/future methods = false by [@samgermain](https://github.com/samgermain) in [#25658](https://github.com/ccxt/ccxt/pull/25658)
* bit2c.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25659](https://github.com/ccxt/ccxt/pull/25659)
* bitbank.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25662](https://github.com/ccxt/ccxt/pull/25662)
* fix(gate): currencies url encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25667](https://github.com/ccxt/ccxt/pull/25667)
* bitmart parseTransaction fix by [@ndubel](https://github.com/ndubel) in [#25671](https://github.com/ccxt/ccxt/pull/25671)
* fix(gate): btc inverse contractSize fix by [@ttodua](https://github.com/ttodua) in [#25672](https://github.com/ccxt/ccxt/pull/25672)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25670](https://github.com/ccxt/ccxt/pull/25670)
* tests(ascendex): skip bid ask ^ by [@ttodua](https://github.com/ttodua) in [#25665](https://github.com/ccxt/ccxt/pull/25665)
* delist(bitpanda): remove old alias by [@ttodua](https://github.com/ttodua) in [#25664](https://github.com/ccxt/ccxt/pull/25664)
* duplicate folders/files ^ by [@ttodua](https://github.com/ttodua) in [#25648](https://github.com/ccxt/ccxt/pull/25648)
* chore(onetrading): comment ^ by [@ttodua](https://github.com/ttodua) in [#25632](https://github.com/ccxt/ccxt/pull/25632)
* fix(bitopro): ws unskip (minor changes) by [@ttodua](https://github.com/ttodua) in [#25630](https://github.com/ccxt/ccxt/pull/25630)
* tests(bitmart): unskip fields ^ by [@ttodua](https://github.com/ttodua) in [#25627](https://github.com/ccxt/ccxt/pull/25627)
* chore(reorg): validate types ^ by [@ttodua](https://github.com/ttodua) in [#25622](https://github.com/ccxt/ccxt/pull/25622)
* chore(bitcoincom): delist (remove) inexistent old alias ^ by [@ttodua](https://github.com/ttodua) in [#25620](https://github.com/ccxt/ccxt/pull/25620)
* fix(bitbns) - active & unskip ^ by [@ttodua](https://github.com/ttodua) in [#25619](https://github.com/ccxt/ccxt/pull/25619)
* unskip bequant ^ by [@ttodua](https://github.com/ttodua) in [#25615](https://github.com/ccxt/ccxt/pull/25615)
* tests(binanceusdm) - retest few props ^ by [@ttodua](https://github.com/ttodua) in [#25617](https://github.com/ccxt/ccxt/pull/25617)
* chore(tests): datetime comments enhance ^ by [@ttodua](https://github.com/ttodua) in [#25631](https://github.com/ccxt/ccxt/pull/25631)
* test(assertions): enhance tests by [@ttodua](https://github.com/ttodua) in [#25650](https://github.com/ccxt/ccxt/pull/25650)
* test(markets): complete reorg by [@ttodua](https://github.com/ttodua) in [#25669](https://github.com/ccxt/ccxt/pull/25669)
* fix(bybit): option currency inference by [@Dan-krm](https://github.com/Dan-krm) in [#25673](https://github.com/ccxt/ccxt/pull/25673)
* fix(docs) - precisions by [@ttodua](https://github.com/ttodua) in [#23316](https://github.com/ccxt/ccxt/pull/23316)
* bitopro skip timestamp ^ by [@ttodua](https://github.com/ttodua) in [#25675](https://github.com/ccxt/ccxt/pull/25675)
* ws duplicate trades filtering by [@ttodua](https://github.com/ttodua) in [#25639](https://github.com/ccxt/ccxt/pull/25639)
* fix(coinlist): support swap markets by [@carlosmiei](https://github.com/carlosmiei) in [#25676](https://github.com/ccxt/ccxt/pull/25676)
* feat(bitmart): add setPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25678](https://github.com/ccxt/ccxt/pull/25678)
* unskip bitflyer ^ by [@ttodua](https://github.com/ttodua) in [#25623](https://github.com/ccxt/ccxt/pull/25623)
* chore(skips): sort alphabetically ^ by [@ttodua](https://github.com/ttodua) in [#25677](https://github.com/ccxt/ccxt/pull/25677)
* bithumb.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25680](https://github.com/ccxt/ccxt/pull/25680)
* fix(tests): skip json ^ by [@ttodua](https://github.com/ttodua) in [#25681](https://github.com/ccxt/ccxt/pull/25681)
* fix(Exchange): removeRepeatedElementsFromArray keys order dependency by [@carlosmiei](https://github.com/carlosmiei) in [#25683](https://github.com/ccxt/ccxt/pull/25683)
* fix(blofin): fetchClosedOrders flag by [@carlosmiei](https://github.com/carlosmiei) in [#25685](https://github.com/ccxt/ccxt/pull/25685)
* feat(bitmart): add fetchPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25686](https://github.com/ccxt/ccxt/pull/25686)
* chore: disable go test by [@carlosmiei](https://github.com/carlosmiei) in [#25687](https://github.com/ccxt/ccxt/pull/25687)
* fix(okx): fetchohlcv by [@ttodua](https://github.com/ttodua) in [#25682](https://github.com/ccxt/ccxt/pull/25682)
* doc(order): stoploss & params by [@ttodua](https://github.com/ttodua) in [#25684](https://github.com/ccxt/ccxt/pull/25684)
* chore: fix js action by [@carlosmiei](https://github.com/carlosmiei) in [#25697](https://github.com/ccxt/ccxt/pull/25697)
* test(market): fix precision issues ^ by [@ttodua](https://github.com/ttodua) in [#25690](https://github.com/ccxt/ccxt/pull/25690)
* test(bitmart): skip watchOB bid-ask ^ by [@ttodua](https://github.com/ttodua) in [#25691](https://github.com/ccxt/ccxt/pull/25691)
* test(bitflyer): no settleId ^ by [@ttodua](https://github.com/ttodua) in [#25693](https://github.com/ccxt/ccxt/pull/25693)
* fix(safeCurrencyStructure): withdraw/deposit/active by [@ttodua](https://github.com/ttodua) in [#25698](https://github.com/ccxt/ccxt/pull/25698)
* bitopro.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25705](https://github.com/ccxt/ccxt/pull/25705)
* chore: remove js/ dep from export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25700](https://github.com/ccxt/ccxt/pull/25700)
* test(market): removal of few skips ^ by [@ttodua](https://github.com/ttodua) in [#25692](https://github.com/ccxt/ccxt/pull/25692)
* feat(coinlist): add missing endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25703](https://github.com/ccxt/ccxt/pull/25703)
* test(coinex): skip precision & networks ^ by [@ttodua](https://github.com/ttodua) in [#25696](https://github.com/ccxt/ccxt/pull/25696)
* test(bitopro): skip l2 ^ by [@ttodua](https://github.com/ttodua) in [#25695](https://github.com/ccxt/ccxt/pull/25695)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25694](https://github.com/ccxt/ccxt/pull/25694)
* fix(vss): remove js/ overwrite by [@carlosmiei](https://github.com/carlosmiei) in [#25706](https://github.com/ccxt/ccxt/pull/25706)
## New Contributors [#new-contributors-56]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.75](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.75)
[Changes][v4.4.75]
# [v4.4.74](https://github.com/ccxt/ccxt/releases/tag/v4.4.74) - 2025-04-12 [#v4474---2025-04-12]
## What's Changed [#whats-changed-102]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
* build(deps): bump next from 14.2.21 to 14.2.25 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25542](https://github.com/ccxt/ccxt/pull/25542)
* fix(kraken) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#25543](https://github.com/ccxt/ccxt/pull/25543)
* better instructions for exhange-capabilities script by [@samgermain](https://github.com/samgermain) in [#25546](https://github.com/ccxt/ccxt/pull/25546)
* feat(bitmart): add editOrder to limit swap orders by [@carlosmiei](https://github.com/carlosmiei) in [#25547](https://github.com/ccxt/ccxt/pull/25547)
* chore: readme remove expired campaign by [@carlosmiei](https://github.com/carlosmiei) in [#25551](https://github.com/ccxt/ccxt/pull/25551)
* docs(readme): minor by [@ttodua](https://github.com/ttodua) in [#25550](https://github.com/ccxt/ccxt/pull/25550)
* fix(goTranspiler): safeCurrencyCode inherited call by [@carlosmiei](https://github.com/carlosmiei) in [#25548](https://github.com/ccxt/ccxt/pull/25548)
* bingx, bitmart: has\["createReduceOnlyOrder"] = true by [@samgermain](https://github.com/samgermain) in [#25552](https://github.com/ccxt/ccxt/pull/25552)
* feat(okx) - full networks unif by [@ttodua](https://github.com/ttodua) in [#25553](https://github.com/ccxt/ccxt/pull/25553)
* feat(base) - handleRequestNetwork by [@ttodua](https://github.com/ttodua) in [#25466](https://github.com/ccxt/ccxt/pull/25466)
* has\["createReduceOnlyOrder"] by [@samgermain](https://github.com/samgermain) in [#25555](https://github.com/ccxt/ccxt/pull/25555)
* fix(bitget): sandbox markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#25557](https://github.com/ccxt/ccxt/pull/25557)
* feat(exchange): type constructor by [@carlosmiei](https://github.com/carlosmiei) in [#25558](https://github.com/ccxt/ccxt/pull/25558)
* feat(constructor): support sandbox/testnet key by [@carlosmiei](https://github.com/carlosmiei) in [#25559](https://github.com/ccxt/ccxt/pull/25559)
* fix(okx) - zksync ^ by [@ttodua](https://github.com/ttodua) in [#25560](https://github.com/ccxt/ccxt/pull/25560)
* poloniex & poloniexfutures - v3 Update & merger by [@ttodua](https://github.com/ttodua) in [#25378](https://github.com/ccxt/ccxt/pull/25378)
* feat(binance): update binance documentation links by [@Dan-krm](https://github.com/Dan-krm) in [#25561](https://github.com/ccxt/ccxt/pull/25561)
* feat(exchange): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#25562](https://github.com/ccxt/ccxt/pull/25562)
* fix(bingx) - implicit balance endpoint ^ by [@ttodua](https://github.com/ttodua) in [#25567](https://github.com/ccxt/ccxt/pull/25567)
* chore(poloniex) - ws skip tests ^ by [@ttodua](https://github.com/ttodua) in [#25566](https://github.com/ccxt/ccxt/pull/25566)
* fix(cex) - missing active key ^ by [@ttodua](https://github.com/ttodua) in [#25565](https://github.com/ccxt/ccxt/pull/25565)
* whitebit: createOrder - update docstring, has array by [@samgermain](https://github.com/samgermain) in [#25563](https://github.com/ccxt/ccxt/pull/25563)
* feat(whitebit): createDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25569](https://github.com/ccxt/ccxt/pull/25569)
* fix(gate): currencies encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25571](https://github.com/ccxt/ccxt/pull/25571)
* fix(poloniex) - features missing symbol req by [@ttodua](https://github.com/ttodua) in [#25573](https://github.com/ccxt/ccxt/pull/25573)
* fix(gate): use replaceAll instead by [@carlosmiei](https://github.com/carlosmiei) in [#25572](https://github.com/ccxt/ccxt/pull/25572)
* feat(whitebit): fetchCrossBorrowRate by [@Dan-krm](https://github.com/Dan-krm) in [#25568](https://github.com/ccxt/ccxt/pull/25568)
* fix(bingx): allAccountBalance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25575](https://github.com/ccxt/ccxt/pull/25575)
* fix(derive): update balance by [@sc0Vu](https://github.com/sc0Vu) in [#25581](https://github.com/ccxt/ccxt/pull/25581)
* fix(derive): rename deriveWalletAddress by [@sc0Vu](https://github.com/sc0Vu) in [#25582](https://github.com/ccxt/ccxt/pull/25582)
* krakenfutures\["has"]: createPostOnlyOrder, createReduceOnlyOrder, ... = true by [@samgermain](https://github.com/samgermain) in [#25576](https://github.com/ccxt/ccxt/pull/25576)
* feat(hyperliquid): add createVault by [@sc0Vu](https://github.com/sc0Vu) in [#25577](https://github.com/ccxt/ccxt/pull/25577)
* refactor & fix(okx) - fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25564](https://github.com/ccxt/ccxt/pull/25564)
* fix(bingx) - unskip tests by [@ttodua](https://github.com/ttodua) in [#25583](https://github.com/ccxt/ccxt/pull/25583)
* fix(derive): add creation\_timestamp by [@sc0Vu](https://github.com/sc0Vu) in [#25594](https://github.com/ccxt/ccxt/pull/25594)
* fix(exchange) mismatched return type by [@olegtaranenko](https://github.com/olegtaranenko) in [#25593](https://github.com/ccxt/ccxt/pull/25593)
* fix(bingx) - implicit api by [@ttodua](https://github.com/ttodua) in [#25584](https://github.com/ccxt/ccxt/pull/25584)
* fix(krakenfutures) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25586](https://github.com/ccxt/ccxt/pull/25586)
* okcoin.has createPostOnlyOrder, createReduceOnlyOrder, createStopLimitOrder, createStopMarketOrder by [@samgermain](https://github.com/samgermain) in [#25585](https://github.com/ccxt/ccxt/pull/25585)
* feat(exchanges): createDepositAddress, add DepositAddress type by [@Dan-krm](https://github.com/Dan-krm) in [#25595](https://github.com/ccxt/ccxt/pull/25595)
* fix(coinbase) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25587](https://github.com/ccxt/ccxt/pull/25587)
* fix(bitmart) - watchTrades fix by [@ttodua](https://github.com/ttodua) in [#25589](https://github.com/ccxt/ccxt/pull/25589)
* tests(ace) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25590](https://github.com/ccxt/ccxt/pull/25590)
* fix(ascendex) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25591](https://github.com/ccxt/ccxt/pull/25591)
* fix(paradex): market parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25606](https://github.com/ccxt/ccxt/pull/25606)
* fix(woo): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25605](https://github.com/ccxt/ccxt/pull/25605)
* tests(binance) - unksip networks ^ by [@ttodua](https://github.com/ttodua) in [#25607](https://github.com/ccxt/ccxt/pull/25607)
* fix(okx) - expiry time for future/option by [@ttodua](https://github.com/ttodua) in [#25600](https://github.com/ccxt/ccxt/pull/25600)
* fix(woofipro) - inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25604](https://github.com/ccxt/ccxt/pull/25604)
* fix(derive) - linear inverse ^ by [@ttodua](https://github.com/ttodua) in [#25602](https://github.com/ccxt/ccxt/pull/25602)
* fix(paradex): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25603](https://github.com/ccxt/ccxt/pull/25603)
* bit2c has false methods by [@samgermain](https://github.com/samgermain) in [#25609](https://github.com/ccxt/ccxt/pull/25609)
* tests(ace) - unskip markets ^ by [@ttodua](https://github.com/ttodua) in [#25599](https://github.com/ccxt/ccxt/pull/25599)
* fix(defx) - market inverse ^ by [@ttodua](https://github.com/ttodua) in [#25601](https://github.com/ccxt/ccxt/pull/25601)
* fix(derive): options linear ^ by [@ttodua](https://github.com/ttodua) in [#25608](https://github.com/ccxt/ccxt/pull/25608)
* tests(binanceus) - fetchStatus unskip ^ by [@ttodua](https://github.com/ttodua) in [#25597](https://github.com/ccxt/ccxt/pull/25597)
* build(deps): bump next from 14.2.25 to 14.2.26 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25626](https://github.com/ccxt/ccxt/pull/25626)
* fix(bitget) - market precision by [@ttodua](https://github.com/ttodua) in [#25624](https://github.com/ccxt/ccxt/pull/25624)
* fix(ascedex): currency id str ^ by [@ttodua](https://github.com/ttodua) in [#25614](https://github.com/ccxt/ccxt/pull/25614)
* chore(bitfinex1) - delist old version by [@ttodua](https://github.com/ttodua) in [#25621](https://github.com/ccxt/ccxt/pull/25621)
* tests(bitget): ws orderbook field ^ by [@ttodua](https://github.com/ttodua) in [#25625](https://github.com/ccxt/ccxt/pull/25625)
* tests(binance): unskip ticker & precision ^ by [@ttodua](https://github.com/ttodua) in [#25616](https://github.com/ccxt/ccxt/pull/25616)
* fix(bitget): fetchWithdrawals code not required by [@carlosmiei](https://github.com/carlosmiei) in [#25633](https://github.com/ccxt/ccxt/pull/25633)
* fix(bitrue): orderbook & retest by [@ttodua](https://github.com/ttodua) in [#25634](https://github.com/ccxt/ccxt/pull/25634)
* fix(build): remove bitfinex1 data by [@carlosmiei](https://github.com/carlosmiei) in [#25640](https://github.com/ccxt/ccxt/pull/25640)
* feat(bybit): define most method types by [@Dan-krm](https://github.com/Dan-krm) in [#25636](https://github.com/ccxt/ccxt/pull/25636)
* chore: pushback ccxt.ts by [@carlosmiei](https://github.com/carlosmiei) in [#25641](https://github.com/ccxt/ccxt/pull/25641)
* ace.has: false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25642](https://github.com/ccxt/ccxt/pull/25642)
* chore(tests): minor comment by [@ttodua](https://github.com/ttodua) in [#25635](https://github.com/ccxt/ccxt/pull/25635)
* fix(binance): update ids by [@carlosmiei](https://github.com/carlosmiei) in [#25645](https://github.com/ccxt/ccxt/pull/25645)
* feat(bybit): add pagination to fetchPositions by [@carlosmiei](https://github.com/carlosmiei) in [#25646](https://github.com/ccxt/ccxt/pull/25646)
* alpaca.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25649](https://github.com/ccxt/ccxt/pull/25649)
* chore(skips): empty entries ^ by [@ttodua](https://github.com/ttodua) in [#25618](https://github.com/ccxt/ccxt/pull/25618)
* refactor(base): reorg removeRepeatedElementsFromArray by [@ttodua](https://github.com/ttodua) in [#25644](https://github.com/ccxt/ccxt/pull/25644)
* ascendex.has - option and future methods = false by [@samgermain](https://github.com/samgermain) in [#25656](https://github.com/ccxt/ccxt/pull/25656)
* ace, alpaca: option methods = false by [@samgermain](https://github.com/samgermain) in [#25655](https://github.com/ccxt/ccxt/pull/25655)
* fix(deribit): currency inference by [@carlosmiei](https://github.com/carlosmiei) in [#25657](https://github.com/ccxt/ccxt/pull/25657)
* hitbtc.has: option/future methods = false by [@samgermain](https://github.com/samgermain) in [#25658](https://github.com/ccxt/ccxt/pull/25658)
* bit2c.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25659](https://github.com/ccxt/ccxt/pull/25659)
* bitbank.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25662](https://github.com/ccxt/ccxt/pull/25662)
* fix(gate): currencies url encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25667](https://github.com/ccxt/ccxt/pull/25667)
* bitmart parseTransaction fix by [@ndubel](https://github.com/ndubel) in [#25671](https://github.com/ccxt/ccxt/pull/25671)
* fix(gate): btc inverse contractSize fix by [@ttodua](https://github.com/ttodua) in [#25672](https://github.com/ccxt/ccxt/pull/25672)
* test(ace): skip temp ^ by [@ttodua](https://github.com/ttodua) in [#25670](https://github.com/ccxt/ccxt/pull/25670)
* tests(ascendex): skip bid ask ^ by [@ttodua](https://github.com/ttodua) in [#25665](https://github.com/ccxt/ccxt/pull/25665)
* delist(bitpanda): remove old alias by [@ttodua](https://github.com/ttodua) in [#25664](https://github.com/ccxt/ccxt/pull/25664)
* duplicate folders/files ^ by [@ttodua](https://github.com/ttodua) in [#25648](https://github.com/ccxt/ccxt/pull/25648)
* chore(onetrading): comment ^ by [@ttodua](https://github.com/ttodua) in [#25632](https://github.com/ccxt/ccxt/pull/25632)
* fix(bitopro): ws unskip (minor changes) by [@ttodua](https://github.com/ttodua) in [#25630](https://github.com/ccxt/ccxt/pull/25630)
* tests(bitmart): unskip fields ^ by [@ttodua](https://github.com/ttodua) in [#25627](https://github.com/ccxt/ccxt/pull/25627)
* chore(reorg): validate types ^ by [@ttodua](https://github.com/ttodua) in [#25622](https://github.com/ccxt/ccxt/pull/25622)
* chore(bitcoincom): delist (remove) inexistent old alias ^ by [@ttodua](https://github.com/ttodua) in [#25620](https://github.com/ccxt/ccxt/pull/25620)
* fix(bitbns) - active & unskip ^ by [@ttodua](https://github.com/ttodua) in [#25619](https://github.com/ccxt/ccxt/pull/25619)
* unskip bequant ^ by [@ttodua](https://github.com/ttodua) in [#25615](https://github.com/ccxt/ccxt/pull/25615)
* tests(binanceusdm) - retest few props ^ by [@ttodua](https://github.com/ttodua) in [#25617](https://github.com/ccxt/ccxt/pull/25617)
* chore(tests): datetime comments enhance ^ by [@ttodua](https://github.com/ttodua) in [#25631](https://github.com/ccxt/ccxt/pull/25631)
* test(assertions): enhance tests by [@ttodua](https://github.com/ttodua) in [#25650](https://github.com/ccxt/ccxt/pull/25650)
* test(markets): complete reorg by [@ttodua](https://github.com/ttodua) in [#25669](https://github.com/ccxt/ccxt/pull/25669)
* fix(bybit): option currency inference by [@Dan-krm](https://github.com/Dan-krm) in [#25673](https://github.com/ccxt/ccxt/pull/25673)
* fix(docs) - precisions by [@ttodua](https://github.com/ttodua) in [#23316](https://github.com/ccxt/ccxt/pull/23316)
* bitopro skip timestamp ^ by [@ttodua](https://github.com/ttodua) in [#25675](https://github.com/ccxt/ccxt/pull/25675)
* ws duplicate trades filtering by [@ttodua](https://github.com/ttodua) in [#25639](https://github.com/ccxt/ccxt/pull/25639)
* fix(coinlist): support swap markets by [@carlosmiei](https://github.com/carlosmiei) in [#25676](https://github.com/ccxt/ccxt/pull/25676)
* feat(bitmart): add setPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25678](https://github.com/ccxt/ccxt/pull/25678)
* unskip bitflyer ^ by [@ttodua](https://github.com/ttodua) in [#25623](https://github.com/ccxt/ccxt/pull/25623)
* chore(skips): sort alphabetically ^ by [@ttodua](https://github.com/ttodua) in [#25677](https://github.com/ccxt/ccxt/pull/25677)
* bithumb.has leverage methods = false by [@samgermain](https://github.com/samgermain) in [#25680](https://github.com/ccxt/ccxt/pull/25680)
* fix(tests): skip json ^ by [@ttodua](https://github.com/ttodua) in [#25681](https://github.com/ccxt/ccxt/pull/25681)
* fix(Exchange): removeRepeatedElementsFromArray keys order dependency by [@carlosmiei](https://github.com/carlosmiei) in [#25683](https://github.com/ccxt/ccxt/pull/25683)
* fix(blofin): fetchClosedOrders flag by [@carlosmiei](https://github.com/carlosmiei) in [#25685](https://github.com/ccxt/ccxt/pull/25685)
* feat(bitmart): add fetchPositionMode by [@carlosmiei](https://github.com/carlosmiei) in [#25686](https://github.com/ccxt/ccxt/pull/25686)
* chore: disable go test by [@carlosmiei](https://github.com/carlosmiei) in [#25687](https://github.com/ccxt/ccxt/pull/25687)
* fix(okx): fetchohlcv by [@ttodua](https://github.com/ttodua) in [#25682](https://github.com/ccxt/ccxt/pull/25682)
* doc(order): stoploss & params by [@ttodua](https://github.com/ttodua) in [#25684](https://github.com/ccxt/ccxt/pull/25684)
* chore: fix js action by [@carlosmiei](https://github.com/carlosmiei) in [#25697](https://github.com/ccxt/ccxt/pull/25697)
## New Contributors [#new-contributors-57]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.74](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.74)
[Changes][v4.4.74]
# [v4.4.73](https://github.com/ccxt/ccxt/releases/tag/v4.4.73) - 2025-04-06 [#v4473---2025-04-06]
## What's Changed [#whats-changed-103]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
* build(deps): bump next from 14.2.21 to 14.2.25 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25542](https://github.com/ccxt/ccxt/pull/25542)
* fix(kraken) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#25543](https://github.com/ccxt/ccxt/pull/25543)
* better instructions for exhange-capabilities script by [@samgermain](https://github.com/samgermain) in [#25546](https://github.com/ccxt/ccxt/pull/25546)
* feat(bitmart): add editOrder to limit swap orders by [@carlosmiei](https://github.com/carlosmiei) in [#25547](https://github.com/ccxt/ccxt/pull/25547)
* chore: readme remove expired campaign by [@carlosmiei](https://github.com/carlosmiei) in [#25551](https://github.com/ccxt/ccxt/pull/25551)
* docs(readme): minor by [@ttodua](https://github.com/ttodua) in [#25550](https://github.com/ccxt/ccxt/pull/25550)
* fix(goTranspiler): safeCurrencyCode inherited call by [@carlosmiei](https://github.com/carlosmiei) in [#25548](https://github.com/ccxt/ccxt/pull/25548)
* bingx, bitmart: has\["createReduceOnlyOrder"] = true by [@samgermain](https://github.com/samgermain) in [#25552](https://github.com/ccxt/ccxt/pull/25552)
* feat(okx) - full networks unif by [@ttodua](https://github.com/ttodua) in [#25553](https://github.com/ccxt/ccxt/pull/25553)
* feat(base) - handleRequestNetwork by [@ttodua](https://github.com/ttodua) in [#25466](https://github.com/ccxt/ccxt/pull/25466)
* has\["createReduceOnlyOrder"] by [@samgermain](https://github.com/samgermain) in [#25555](https://github.com/ccxt/ccxt/pull/25555)
* fix(bitget): sandbox markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#25557](https://github.com/ccxt/ccxt/pull/25557)
* feat(exchange): type constructor by [@carlosmiei](https://github.com/carlosmiei) in [#25558](https://github.com/ccxt/ccxt/pull/25558)
* feat(constructor): support sandbox/testnet key by [@carlosmiei](https://github.com/carlosmiei) in [#25559](https://github.com/ccxt/ccxt/pull/25559)
* fix(okx) - zksync ^ by [@ttodua](https://github.com/ttodua) in [#25560](https://github.com/ccxt/ccxt/pull/25560)
* poloniex & poloniexfutures - v3 Update & merger by [@ttodua](https://github.com/ttodua) in [#25378](https://github.com/ccxt/ccxt/pull/25378)
* feat(binance): update binance documentation links by [@Dan-krm](https://github.com/Dan-krm) in [#25561](https://github.com/ccxt/ccxt/pull/25561)
* feat(exchange): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#25562](https://github.com/ccxt/ccxt/pull/25562)
* fix(bingx) - implicit balance endpoint ^ by [@ttodua](https://github.com/ttodua) in [#25567](https://github.com/ccxt/ccxt/pull/25567)
* chore(poloniex) - ws skip tests ^ by [@ttodua](https://github.com/ttodua) in [#25566](https://github.com/ccxt/ccxt/pull/25566)
* fix(cex) - missing active key ^ by [@ttodua](https://github.com/ttodua) in [#25565](https://github.com/ccxt/ccxt/pull/25565)
* whitebit: createOrder - update docstring, has array by [@samgermain](https://github.com/samgermain) in [#25563](https://github.com/ccxt/ccxt/pull/25563)
* feat(whitebit): createDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25569](https://github.com/ccxt/ccxt/pull/25569)
* fix(gate): currencies encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25571](https://github.com/ccxt/ccxt/pull/25571)
* fix(poloniex) - features missing symbol req by [@ttodua](https://github.com/ttodua) in [#25573](https://github.com/ccxt/ccxt/pull/25573)
* fix(gate): use replaceAll instead by [@carlosmiei](https://github.com/carlosmiei) in [#25572](https://github.com/ccxt/ccxt/pull/25572)
* feat(whitebit): fetchCrossBorrowRate by [@Dan-krm](https://github.com/Dan-krm) in [#25568](https://github.com/ccxt/ccxt/pull/25568)
* fix(bingx): allAccountBalance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25575](https://github.com/ccxt/ccxt/pull/25575)
* fix(derive): update balance by [@sc0Vu](https://github.com/sc0Vu) in [#25581](https://github.com/ccxt/ccxt/pull/25581)
* fix(derive): rename deriveWalletAddress by [@sc0Vu](https://github.com/sc0Vu) in [#25582](https://github.com/ccxt/ccxt/pull/25582)
* krakenfutures\["has"]: createPostOnlyOrder, createReduceOnlyOrder, ... = true by [@samgermain](https://github.com/samgermain) in [#25576](https://github.com/ccxt/ccxt/pull/25576)
* feat(hyperliquid): add createVault by [@sc0Vu](https://github.com/sc0Vu) in [#25577](https://github.com/ccxt/ccxt/pull/25577)
* refactor & fix(okx) - fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25564](https://github.com/ccxt/ccxt/pull/25564)
* fix(bingx) - unskip tests by [@ttodua](https://github.com/ttodua) in [#25583](https://github.com/ccxt/ccxt/pull/25583)
* fix(derive): add creation\_timestamp by [@sc0Vu](https://github.com/sc0Vu) in [#25594](https://github.com/ccxt/ccxt/pull/25594)
* fix(exchange) mismatched return type by [@olegtaranenko](https://github.com/olegtaranenko) in [#25593](https://github.com/ccxt/ccxt/pull/25593)
* fix(bingx) - implicit api by [@ttodua](https://github.com/ttodua) in [#25584](https://github.com/ccxt/ccxt/pull/25584)
* fix(krakenfutures) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25586](https://github.com/ccxt/ccxt/pull/25586)
* okcoin.has createPostOnlyOrder, createReduceOnlyOrder, createStopLimitOrder, createStopMarketOrder by [@samgermain](https://github.com/samgermain) in [#25585](https://github.com/ccxt/ccxt/pull/25585)
* feat(exchanges): createDepositAddress, add DepositAddress type by [@Dan-krm](https://github.com/Dan-krm) in [#25595](https://github.com/ccxt/ccxt/pull/25595)
* fix(coinbase) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25587](https://github.com/ccxt/ccxt/pull/25587)
* fix(bitmart) - watchTrades fix by [@ttodua](https://github.com/ttodua) in [#25589](https://github.com/ccxt/ccxt/pull/25589)
* tests(ace) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25590](https://github.com/ccxt/ccxt/pull/25590)
* fix(ascendex) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25591](https://github.com/ccxt/ccxt/pull/25591)
* fix(paradex): market parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25606](https://github.com/ccxt/ccxt/pull/25606)
* fix(woo): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25605](https://github.com/ccxt/ccxt/pull/25605)
* tests(binance) - unksip networks ^ by [@ttodua](https://github.com/ttodua) in [#25607](https://github.com/ccxt/ccxt/pull/25607)
* fix(okx) - expiry time for future/option by [@ttodua](https://github.com/ttodua) in [#25600](https://github.com/ccxt/ccxt/pull/25600)
* fix(woofipro) - inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25604](https://github.com/ccxt/ccxt/pull/25604)
* fix(derive) - linear inverse ^ by [@ttodua](https://github.com/ttodua) in [#25602](https://github.com/ccxt/ccxt/pull/25602)
* fix(paradex): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25603](https://github.com/ccxt/ccxt/pull/25603)
* bit2c has false methods by [@samgermain](https://github.com/samgermain) in [#25609](https://github.com/ccxt/ccxt/pull/25609)
* tests(ace) - unskip markets ^ by [@ttodua](https://github.com/ttodua) in [#25599](https://github.com/ccxt/ccxt/pull/25599)
* fix(defx) - market inverse ^ by [@ttodua](https://github.com/ttodua) in [#25601](https://github.com/ccxt/ccxt/pull/25601)
* fix(derive): options linear ^ by [@ttodua](https://github.com/ttodua) in [#25608](https://github.com/ccxt/ccxt/pull/25608)
* tests(binanceus) - fetchStatus unskip ^ by [@ttodua](https://github.com/ttodua) in [#25597](https://github.com/ccxt/ccxt/pull/25597)
* build(deps): bump next from 14.2.25 to 14.2.26 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25626](https://github.com/ccxt/ccxt/pull/25626)
* fix(bitget) - market precision by [@ttodua](https://github.com/ttodua) in [#25624](https://github.com/ccxt/ccxt/pull/25624)
* fix(ascedex): currency id str ^ by [@ttodua](https://github.com/ttodua) in [#25614](https://github.com/ccxt/ccxt/pull/25614)
* chore(bitfinex1) - delist old version by [@ttodua](https://github.com/ttodua) in [#25621](https://github.com/ccxt/ccxt/pull/25621)
* tests(bitget): ws orderbook field ^ by [@ttodua](https://github.com/ttodua) in [#25625](https://github.com/ccxt/ccxt/pull/25625)
* tests(binance): unskip ticker & precision ^ by [@ttodua](https://github.com/ttodua) in [#25616](https://github.com/ccxt/ccxt/pull/25616)
* fix(bitget): fetchWithdrawals code not required by [@carlosmiei](https://github.com/carlosmiei) in [#25633](https://github.com/ccxt/ccxt/pull/25633)
* fix(bitrue): orderbook & retest by [@ttodua](https://github.com/ttodua) in [#25634](https://github.com/ccxt/ccxt/pull/25634)
* fix(build): remove bitfinex1 data by [@carlosmiei](https://github.com/carlosmiei) in [#25640](https://github.com/ccxt/ccxt/pull/25640)
* feat(bybit): define most method types by [@Dan-krm](https://github.com/Dan-krm) in [#25636](https://github.com/ccxt/ccxt/pull/25636)
* chore: pushback ccxt.ts by [@carlosmiei](https://github.com/carlosmiei) in [#25641](https://github.com/ccxt/ccxt/pull/25641)
* ace.has: false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25642](https://github.com/ccxt/ccxt/pull/25642)
* chore(tests): minor comment by [@ttodua](https://github.com/ttodua) in [#25635](https://github.com/ccxt/ccxt/pull/25635)
* fix(binance): update ids by [@carlosmiei](https://github.com/carlosmiei) in [#25645](https://github.com/ccxt/ccxt/pull/25645)
* feat(bybit): add pagination to fetchPositions by [@carlosmiei](https://github.com/carlosmiei) in [#25646](https://github.com/ccxt/ccxt/pull/25646)
* alpaca.has = false for leverage methods by [@samgermain](https://github.com/samgermain) in [#25649](https://github.com/ccxt/ccxt/pull/25649)
* chore(skips): empty entries ^ by [@ttodua](https://github.com/ttodua) in [#25618](https://github.com/ccxt/ccxt/pull/25618)
* refactor(base): reorg removeRepeatedElementsFromArray by [@ttodua](https://github.com/ttodua) in [#25644](https://github.com/ccxt/ccxt/pull/25644)
## New Contributors [#new-contributors-58]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.73](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.73)
[Changes][v4.4.73]
# [v4.4.72](https://github.com/ccxt/ccxt/releases/tag/v4.4.72) - 2025-04-01 [#v4472---2025-04-01]
## What's Changed [#whats-changed-104]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
* build(deps): bump next from 14.2.21 to 14.2.25 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25542](https://github.com/ccxt/ccxt/pull/25542)
* fix(kraken) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#25543](https://github.com/ccxt/ccxt/pull/25543)
* better instructions for exhange-capabilities script by [@samgermain](https://github.com/samgermain) in [#25546](https://github.com/ccxt/ccxt/pull/25546)
* feat(bitmart): add editOrder to limit swap orders by [@carlosmiei](https://github.com/carlosmiei) in [#25547](https://github.com/ccxt/ccxt/pull/25547)
* chore: readme remove expired campaign by [@carlosmiei](https://github.com/carlosmiei) in [#25551](https://github.com/ccxt/ccxt/pull/25551)
* docs(readme): minor by [@ttodua](https://github.com/ttodua) in [#25550](https://github.com/ccxt/ccxt/pull/25550)
* fix(goTranspiler): safeCurrencyCode inherited call by [@carlosmiei](https://github.com/carlosmiei) in [#25548](https://github.com/ccxt/ccxt/pull/25548)
* bingx, bitmart: has\["createReduceOnlyOrder"] = true by [@samgermain](https://github.com/samgermain) in [#25552](https://github.com/ccxt/ccxt/pull/25552)
* feat(okx) - full networks unif by [@ttodua](https://github.com/ttodua) in [#25553](https://github.com/ccxt/ccxt/pull/25553)
* feat(base) - handleRequestNetwork by [@ttodua](https://github.com/ttodua) in [#25466](https://github.com/ccxt/ccxt/pull/25466)
* has\["createReduceOnlyOrder"] by [@samgermain](https://github.com/samgermain) in [#25555](https://github.com/ccxt/ccxt/pull/25555)
* fix(bitget): sandbox markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#25557](https://github.com/ccxt/ccxt/pull/25557)
* feat(exchange): type constructor by [@carlosmiei](https://github.com/carlosmiei) in [#25558](https://github.com/ccxt/ccxt/pull/25558)
* feat(constructor): support sandbox/testnet key by [@carlosmiei](https://github.com/carlosmiei) in [#25559](https://github.com/ccxt/ccxt/pull/25559)
* fix(okx) - zksync ^ by [@ttodua](https://github.com/ttodua) in [#25560](https://github.com/ccxt/ccxt/pull/25560)
* poloniex & poloniexfutures - v3 Update & merger by [@ttodua](https://github.com/ttodua) in [#25378](https://github.com/ccxt/ccxt/pull/25378)
* feat(binance): update binance documentation links by [@Dan-krm](https://github.com/Dan-krm) in [#25561](https://github.com/ccxt/ccxt/pull/25561)
* feat(exchange): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#25562](https://github.com/ccxt/ccxt/pull/25562)
* fix(bingx) - implicit balance endpoint ^ by [@ttodua](https://github.com/ttodua) in [#25567](https://github.com/ccxt/ccxt/pull/25567)
* chore(poloniex) - ws skip tests ^ by [@ttodua](https://github.com/ttodua) in [#25566](https://github.com/ccxt/ccxt/pull/25566)
* fix(cex) - missing active key ^ by [@ttodua](https://github.com/ttodua) in [#25565](https://github.com/ccxt/ccxt/pull/25565)
* whitebit: createOrder - update docstring, has array by [@samgermain](https://github.com/samgermain) in [#25563](https://github.com/ccxt/ccxt/pull/25563)
* feat(whitebit): createDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25569](https://github.com/ccxt/ccxt/pull/25569)
* fix(gate): currencies encoding by [@carlosmiei](https://github.com/carlosmiei) in [#25571](https://github.com/ccxt/ccxt/pull/25571)
* fix(poloniex) - features missing symbol req by [@ttodua](https://github.com/ttodua) in [#25573](https://github.com/ccxt/ccxt/pull/25573)
* fix(gate): use replaceAll instead by [@carlosmiei](https://github.com/carlosmiei) in [#25572](https://github.com/ccxt/ccxt/pull/25572)
* feat(whitebit): fetchCrossBorrowRate by [@Dan-krm](https://github.com/Dan-krm) in [#25568](https://github.com/ccxt/ccxt/pull/25568)
* fix(bingx): allAccountBalance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25575](https://github.com/ccxt/ccxt/pull/25575)
* fix(derive): update balance by [@sc0Vu](https://github.com/sc0Vu) in [#25581](https://github.com/ccxt/ccxt/pull/25581)
* fix(derive): rename deriveWalletAddress by [@sc0Vu](https://github.com/sc0Vu) in [#25582](https://github.com/ccxt/ccxt/pull/25582)
* krakenfutures\["has"]: createPostOnlyOrder, createReduceOnlyOrder, ... = true by [@samgermain](https://github.com/samgermain) in [#25576](https://github.com/ccxt/ccxt/pull/25576)
* feat(hyperliquid): add createVault by [@sc0Vu](https://github.com/sc0Vu) in [#25577](https://github.com/ccxt/ccxt/pull/25577)
* refactor & fix(okx) - fetchCurrencies by [@ttodua](https://github.com/ttodua) in [#25564](https://github.com/ccxt/ccxt/pull/25564)
* fix(bingx) - unskip tests by [@ttodua](https://github.com/ttodua) in [#25583](https://github.com/ccxt/ccxt/pull/25583)
* fix(derive): add creation\_timestamp by [@sc0Vu](https://github.com/sc0Vu) in [#25594](https://github.com/ccxt/ccxt/pull/25594)
* fix(exchange) mismatched return type by [@olegtaranenko](https://github.com/olegtaranenko) in [#25593](https://github.com/ccxt/ccxt/pull/25593)
* fix(bingx) - implicit api by [@ttodua](https://github.com/ttodua) in [#25584](https://github.com/ccxt/ccxt/pull/25584)
* fix(krakenfutures) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25586](https://github.com/ccxt/ccxt/pull/25586)
* okcoin.has createPostOnlyOrder, createReduceOnlyOrder, createStopLimitOrder, createStopMarketOrder by [@samgermain](https://github.com/samgermain) in [#25585](https://github.com/ccxt/ccxt/pull/25585)
* feat(exchanges): createDepositAddress, add DepositAddress type by [@Dan-krm](https://github.com/Dan-krm) in [#25595](https://github.com/ccxt/ccxt/pull/25595)
* fix(coinbase) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25587](https://github.com/ccxt/ccxt/pull/25587)
* fix(bitmart) - watchTrades fix by [@ttodua](https://github.com/ttodua) in [#25589](https://github.com/ccxt/ccxt/pull/25589)
* tests(ace) - unskip ^ by [@ttodua](https://github.com/ttodua) in [#25590](https://github.com/ccxt/ccxt/pull/25590)
* fix(ascendex) - unskip tests ^ by [@ttodua](https://github.com/ttodua) in [#25591](https://github.com/ccxt/ccxt/pull/25591)
* fix(paradex): market parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25606](https://github.com/ccxt/ccxt/pull/25606)
* fix(woo): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25605](https://github.com/ccxt/ccxt/pull/25605)
* tests(binance) - unksip networks ^ by [@ttodua](https://github.com/ttodua) in [#25607](https://github.com/ccxt/ccxt/pull/25607)
* fix(okx) - expiry time for future/option by [@ttodua](https://github.com/ttodua) in [#25600](https://github.com/ccxt/ccxt/pull/25600)
* fix(woofipro) - inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25604](https://github.com/ccxt/ccxt/pull/25604)
* fix(derive) - linear inverse ^ by [@ttodua](https://github.com/ttodua) in [#25602](https://github.com/ccxt/ccxt/pull/25602)
* fix(paradex): inverse false ^ by [@ttodua](https://github.com/ttodua) in [#25603](https://github.com/ccxt/ccxt/pull/25603)
## New Contributors [#new-contributors-59]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.72](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.72)
[Changes][v4.4.72]
# [v4.4.71](https://github.com/ccxt/ccxt/releases/tag/v4.4.71) - 2025-03-29 [#v4471---2025-03-29]
## What's Changed [#whats-changed-105]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
* build(deps): bump next from 14.2.21 to 14.2.25 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#25542](https://github.com/ccxt/ccxt/pull/25542)
* fix(kraken) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#25543](https://github.com/ccxt/ccxt/pull/25543)
* better instructions for exhange-capabilities script by [@samgermain](https://github.com/samgermain) in [#25546](https://github.com/ccxt/ccxt/pull/25546)
* feat(bitmart): add editOrder to limit swap orders by [@carlosmiei](https://github.com/carlosmiei) in [#25547](https://github.com/ccxt/ccxt/pull/25547)
* chore: readme remove expired campaign by [@carlosmiei](https://github.com/carlosmiei) in [#25551](https://github.com/ccxt/ccxt/pull/25551)
* docs(readme): minor by [@ttodua](https://github.com/ttodua) in [#25550](https://github.com/ccxt/ccxt/pull/25550)
* fix(goTranspiler): safeCurrencyCode inherited call by [@carlosmiei](https://github.com/carlosmiei) in [#25548](https://github.com/ccxt/ccxt/pull/25548)
* bingx, bitmart: has\["createReduceOnlyOrder"] = true by [@samgermain](https://github.com/samgermain) in [#25552](https://github.com/ccxt/ccxt/pull/25552)
* feat(okx) - full networks unif by [@ttodua](https://github.com/ttodua) in [#25553](https://github.com/ccxt/ccxt/pull/25553)
* feat(base) - handleRequestNetwork by [@ttodua](https://github.com/ttodua) in [#25466](https://github.com/ccxt/ccxt/pull/25466)
* has\["createReduceOnlyOrder"] by [@samgermain](https://github.com/samgermain) in [#25555](https://github.com/ccxt/ccxt/pull/25555)
* fix(bitget): sandbox markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#25557](https://github.com/ccxt/ccxt/pull/25557)
* feat(exchange): type constructor by [@carlosmiei](https://github.com/carlosmiei) in [#25558](https://github.com/ccxt/ccxt/pull/25558)
* feat(constructor): support sandbox/testnet key by [@carlosmiei](https://github.com/carlosmiei) in [#25559](https://github.com/ccxt/ccxt/pull/25559)
* fix(okx) - zksync ^ by [@ttodua](https://github.com/ttodua) in [#25560](https://github.com/ccxt/ccxt/pull/25560)
* poloniex & poloniexfutures - v3 Update & merger by [@ttodua](https://github.com/ttodua) in [#25378](https://github.com/ccxt/ccxt/pull/25378)
* feat(binance): update binance documentation links by [@Dan-krm](https://github.com/Dan-krm) in [#25561](https://github.com/ccxt/ccxt/pull/25561)
* feat(exchange): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#25562](https://github.com/ccxt/ccxt/pull/25562)
* fix(bingx) - implicit balance endpoint ^ by [@ttodua](https://github.com/ttodua) in [#25567](https://github.com/ccxt/ccxt/pull/25567)
## New Contributors [#new-contributors-60]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.71](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.71)
[Changes][v4.4.71]
# [v4.4.70](https://github.com/ccxt/ccxt/releases/tag/v4.4.70) - 2025-03-25 [#v4470---2025-03-25]
## What's Changed [#whats-changed-106]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
* feat(bybit): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25513](https://github.com/ccxt/ccxt/pull/25513)
* feat(okx): add new v2 endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25515](https://github.com/ccxt/ccxt/pull/25515)
* fix(go): isObject helper by [@carlosmiei](https://github.com/carlosmiei) in [#25516](https://github.com/ccxt/ccxt/pull/25516)
* fix(okx): createOrder param by [@carlosmiei](https://github.com/carlosmiei) in [#25514](https://github.com/ccxt/ccxt/pull/25514)
* fix(tradeogre): parseOrder by [@carlosmiei](https://github.com/carlosmiei) in [#25519](https://github.com/ccxt/ccxt/pull/25519)
* fix(hyperliquid): postOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25521](https://github.com/ccxt/ccxt/pull/25521)
* fix(tradeogre): account/balance endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25520](https://github.com/ccxt/ccxt/pull/25520)
* fix(coinbase): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25517](https://github.com/ccxt/ccxt/pull/25517)
* fix(go): static response tests by [@carlosmiei](https://github.com/carlosmiei) in [#25526](https://github.com/ccxt/ccxt/pull/25526)
* fix(hyperliquid): infer take/maker by [@carlosmiei](https://github.com/carlosmiei) in [#25527](https://github.com/ccxt/ccxt/pull/25527)
* fix(bitget): watchOrders without a symbol by [@carlosmiei](https://github.com/carlosmiei) in [#25528](https://github.com/ccxt/ccxt/pull/25528)
* fix(Exchange): remove BCC/BCH from commonCurrencies by [@Dan-krm](https://github.com/Dan-krm) in [#25518](https://github.com/ccxt/ccxt/pull/25518)
* fix(bitget): fetchFundingHistory symbol filtering by [@carlosmiei](https://github.com/carlosmiei) in [#25531](https://github.com/ccxt/ccxt/pull/25531)
* fix(types): CrossBorrowRates/IsolatedBorrowRates by [@carlosmiei](https://github.com/carlosmiei) in [#25535](https://github.com/ccxt/ccxt/pull/25535)
* fix(bitget): adjust leverage parsing for cross margin mode by [@flytam](https://github.com/flytam) in [#25534](https://github.com/ccxt/ccxt/pull/25534)
* tests(static): fix string & number issues by [@ttodua](https://github.com/ttodua) in [#25538](https://github.com/ccxt/ccxt/pull/25538)
* fix(hyperliquid): editOrder price precision by [@carlosmiei](https://github.com/carlosmiei) in [#25540](https://github.com/ccxt/ccxt/pull/25540)
* feat(bitget): expanded demo trading capabilities by [@Dan-krm](https://github.com/Dan-krm) in [#25541](https://github.com/ccxt/ccxt/pull/25541)
## New Contributors [#new-contributors-61]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* [@flytam](https://github.com/flytam) made their first contribution in [#25534](https://github.com/ccxt/ccxt/pull/25534)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.70](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.70)
[Changes][v4.4.70]
# [v4.4.69](https://github.com/ccxt/ccxt/releases/tag/v4.4.69) - 2025-03-19 [#v4469---2025-03-19]
## What's Changed [#whats-changed-107]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
* fix(coinbase): commit flag in deposits() by [@carlosmiei](https://github.com/carlosmiei) in [#25489](https://github.com/ccxt/ccxt/pull/25489)
* fix(transpiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25468](https://github.com/ccxt/ccxt/pull/25468)
* cryptomus updating by [@rayBastard](https://github.com/rayBastard) in [#25437](https://github.com/ccxt/ccxt/pull/25437)
* Binance check brokerId for batchOrders by [@yzh-pelle](https://github.com/yzh-pelle) in [#25452](https://github.com/ccxt/ccxt/pull/25452)
* feat(paradex): update apis by [@sc0Vu](https://github.com/sc0Vu) in [#25492](https://github.com/ccxt/ccxt/pull/25492)
* \[bug] removed duplicate cryptomus#fetchTradingFees by [@DelAnt](https://github.com/DelAnt) in [#25495](https://github.com/ccxt/ccxt/pull/25495)
* feat(whitebit): add fetchPosition, fetchPositions, fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25478](https://github.com/ccxt/ccxt/pull/25478)
* transpile.ts expect string fileHeaders.pyPro by [@DelAnt](https://github.com/DelAnt) in [#25494](https://github.com/ccxt/ccxt/pull/25494)
* fix(tradeogre): ohlcv until handling by [@carlosmiei](https://github.com/carlosmiei) in [#25497](https://github.com/ccxt/ccxt/pull/25497)
* fix(tradeogre): parseTicker parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25498](https://github.com/ccxt/ccxt/pull/25498)
* \[bug] Remove parsePortfolioDetails documentation by [@DelAnt](https://github.com/DelAnt) in [#25499](https://github.com/ccxt/ccxt/pull/25499)
* fix(tradeogre): ohlcv parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25503](https://github.com/ccxt/ccxt/pull/25503)
* fix(bitstamp): parseTradingFees loop by [@carlosmiei](https://github.com/carlosmiei) in [#25505](https://github.com/ccxt/ccxt/pull/25505)
* fix(phemex): fetchPositions default currency (USDT) by [@carlosmiei](https://github.com/carlosmiei) in [#25507](https://github.com/ccxt/ccxt/pull/25507)
* fix(hyperliquid): correct swap balance by [@sc0Vu](https://github.com/sc0Vu) in [#25509](https://github.com/ccxt/ccxt/pull/25509)
* fix(exchange.py): load\_markets exception handling by [@carlosmiei](https://github.com/carlosmiei) in [#25510](https://github.com/ccxt/ccxt/pull/25510)
## New Contributors [#new-contributors-62]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.69](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.69)
[Changes][v4.4.69]
# [v4.4.68](https://github.com/ccxt/ccxt/releases/tag/v4.4.68) - 2025-03-14 [#v4468---2025-03-14]
## What's Changed [#whats-changed-108]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
* Update fetchOHLCV with added until parameter by [@AresArtemius](https://github.com/AresArtemius) in [#25454](https://github.com/ccxt/ccxt/pull/25454)
* fix(gotranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25471](https://github.com/ccxt/ccxt/pull/25471)
* fix(retries) - base by [@ttodua](https://github.com/ttodua) in [#25441](https://github.com/ccxt/ccxt/pull/25441)
* Revert "build/transpile.ts minor typing fixes" by [@carlosmiei](https://github.com/carlosmiei) in [#25474](https://github.com/ccxt/ccxt/pull/25474)
* feat(luno): createDepositAddress, fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#25472](https://github.com/ccxt/ccxt/pull/25472)
* fix(bitrue): parseTickers fix by [@carlosmiei](https://github.com/carlosmiei) in [#25476](https://github.com/ccxt/ccxt/pull/25476)
* chore(deps): update ^ by [@ttodua](https://github.com/ttodua) in [#25477](https://github.com/ccxt/ccxt/pull/25477)
* feat(coinbase): add fetchPortfolioDetails by [@carlosmiei](https://github.com/carlosmiei) in [#25470](https://github.com/ccxt/ccxt/pull/25470)
* fix(csharpTranspiler) - types completed by [@ttodua](https://github.com/ttodua) in [#25469](https://github.com/ccxt/ccxt/pull/25469)
* fix(bybit): handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#25480](https://github.com/ccxt/ccxt/pull/25480)
* fix(hyperliquid): createOrders in GO by [@carlosmiei](https://github.com/carlosmiei) in [#25483](https://github.com/ccxt/ccxt/pull/25483)
* fix(coinbase): deposit key by [@carlosmiei](https://github.com/carlosmiei) in [#25485](https://github.com/ccxt/ccxt/pull/25485)
## New Contributors [#new-contributors-63]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.68](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.68)
[Changes][v4.4.68]
# [v4.4.67](https://github.com/ccxt/ccxt/releases/tag/v4.4.67) - 2025-03-12 [#v4467---2025-03-12]
## What's Changed [#whats-changed-109]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
* fetchDeposits update by [@AresArtemius](https://github.com/AresArtemius) in [#25405](https://github.com/ccxt/ccxt/pull/25405)
* fix(build) build broken: duplicated key hashkey#cancelOrder by [@olegtaranenko](https://github.com/olegtaranenko) in [#25422](https://github.com/ccxt/ccxt/pull/25422)
* chore: update go install command by [@carlosmiei](https://github.com/carlosmiei) in [#25424](https://github.com/ccxt/ccxt/pull/25424)
* fix(gate): fetchFundingRates inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25426](https://github.com/ccxt/ccxt/pull/25426)
* build(deps): bump esbuild and tsx by [@dependabot](https://github.com/dependabot) in [#25398](https://github.com/ccxt/ccxt/pull/25398)
* tradeogre add fetchTickers and OHLCV by [@AresArtemius](https://github.com/AresArtemius) in [#25425](https://github.com/ccxt/ccxt/pull/25425)
* fix(gate): watchBidsAsks flag by [@carlosmiei](https://github.com/carlosmiei) in [#25434](https://github.com/ccxt/ccxt/pull/25434)
* fix(bitget): editOrder fix by [@carlosmiei](https://github.com/carlosmiei) in [#25430](https://github.com/ccxt/ccxt/pull/25430)
* chore: update sponsors by [@carlosmiei](https://github.com/carlosmiei) in [#25439](https://github.com/ccxt/ccxt/pull/25439)
* Brocker ID tests updated with cryptomus and derive by [@yzh-pelle](https://github.com/yzh-pelle) in [#25440](https://github.com/ccxt/ccxt/pull/25440)
* feat(whitebit): add endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#25449](https://github.com/ccxt/ccxt/pull/25449)
* Derive `checkRequiredCredentials` moved from `sign` to `signHash` by [@yzh-pelle](https://github.com/yzh-pelle) in [#25448](https://github.com/ccxt/ccxt/pull/25448)
* feat(bitget): update fetchCanceledAndClosedOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25444](https://github.com/ccxt/ccxt/pull/25444)
* build(deps-dev): bump prismjs from 1.29.0 to 1.30.0 by [@dependabot](https://github.com/dependabot) in [#25442](https://github.com/ccxt/ccxt/pull/25442)
* feat(whitebit): add fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25370](https://github.com/ccxt/ccxt/pull/25370)
* Update README.md by [@carlosmiei](https://github.com/carlosmiei) in [#25453](https://github.com/ccxt/ccxt/pull/25453)
* feat(cli): read keys.json by [@sc0Vu](https://github.com/sc0Vu) in [#25458](https://github.com/ccxt/ccxt/pull/25458)
* fix(whitebit): remove duplicated endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#25461](https://github.com/ccxt/ccxt/pull/25461)
* feat(whitebit): add conversion methods by [@Dan-krm](https://github.com/Dan-krm) in [#25376](https://github.com/ccxt/ccxt/pull/25376)
* fix(hyperliquid.go) packb helpers by [@carlosmiei](https://github.com/carlosmiei) in [#25460](https://github.com/ccxt/ccxt/pull/25460)
* fix(htx): cancelOrder error handling by [@carlosmiei](https://github.com/carlosmiei) in [#25462](https://github.com/ccxt/ccxt/pull/25462)
## New Contributors [#new-contributors-64]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.67](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.67)
[Changes][v4.4.67]
# [v4.4.66](https://github.com/ccxt/ccxt/releases/tag/v4.4.66) - 2025-03-06 [#v4466---2025-03-06]
## What's Changed [#whats-changed-110]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
* feat(derive): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#24762](https://github.com/ccxt/ccxt/pull/24762)
* fix(bitrue): replace fromIdx with until by [@sc0Vu](https://github.com/sc0Vu) in [#25412](https://github.com/ccxt/ccxt/pull/25412)
* docs: add go proxy instructions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25410](https://github.com/ccxt/ccxt/pull/25410)
* fix(actions): avoid pull conflicts by [@carlosmiei](https://github.com/carlosmiei) in [#25414](https://github.com/ccxt/ccxt/pull/25414)
* Cryptomus integration by [@yzh-pelle](https://github.com/yzh-pelle) in [#23581](https://github.com/ccxt/ccxt/pull/23581)
* fix(binance): read portfolioMargin from options by [@carlosmiei](https://github.com/carlosmiei) in [#25415](https://github.com/ccxt/ccxt/pull/25415)
* fix(derive): flip var by [@carlosmiei](https://github.com/carlosmiei) in [#25416](https://github.com/ccxt/ccxt/pull/25416)
* fix(tests): safe dict wrapper by [@carlosmiei](https://github.com/carlosmiei) in [#25419](https://github.com/ccxt/ccxt/pull/25419)
## New Contributors [#new-contributors-65]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.66](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.66)
[Changes][v4.4.66]
# [v4.4.65](https://github.com/ccxt/ccxt/releases/tag/v4.4.65) - 2025-03-05 [#v4465---2025-03-05]
## What's Changed [#whats-changed-111]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
* fix(gate): watchPostions filter empty positions on snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#25385](https://github.com/ccxt/ccxt/pull/25385)
* fix(c#): add streaming dict by [@carlosmiei](https://github.com/carlosmiei) in [#25386](https://github.com/ccxt/ccxt/pull/25386)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/cli by [@dependabot](https://github.com/dependabot) in [#25390](https://github.com/ccxt/ccxt/pull/25390)
* onetradings: fetchTime, fetchCurrencies - static tests by [@samgermain](https://github.com/samgermain) in [#25384](https://github.com/ccxt/ccxt/pull/25384)
* feat(util): add exchange removal script and remove currencycom by [@carlosmiei](https://github.com/carlosmiei) in [#25394](https://github.com/ccxt/ccxt/pull/25394)
* cryptocom error mapping by [@ndubel](https://github.com/ndubel) in [#25395](https://github.com/ccxt/ccxt/pull/25395)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/profile by [@dependabot](https://github.com/dependabot) in [#25397](https://github.com/ccxt/ccxt/pull/25397)
* fix(bybit): correct volume key in parse ws ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#25400](https://github.com/ccxt/ccxt/pull/25400)
* fix(gate): ws id by [@carlosmiei](https://github.com/carlosmiei) in [#25401](https://github.com/ccxt/ccxt/pull/25401)
* feat(paradex): add TP/SL order by [@sc0Vu](https://github.com/sc0Vu) in [#25407](https://github.com/ccxt/ccxt/pull/25407)
* feat(hyperliquid): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25322](https://github.com/ccxt/ccxt/pull/25322)
* Hyperliquid orders 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25408](https://github.com/ccxt/ccxt/pull/25408)
* typo in py example by [@giannispan](https://github.com/giannispan) in [#25404](https://github.com/ccxt/ccxt/pull/25404)
## New Contributors [#new-contributors-66]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* [@giannispan](https://github.com/giannispan) made their first contribution in [#25404](https://github.com/ccxt/ccxt/pull/25404)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.65](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.65)
[Changes][v4.4.65]
# [v4.4.64](https://github.com/ccxt/ccxt/releases/tag/v4.4.64) - 2025-03-01 [#v4464---2025-03-01]
## What's Changed [#whats-changed-112]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
* fix(bitopro): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25375](https://github.com/ccxt/ccxt/pull/25375)
* fix(vertex): watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#25377](https://github.com/ccxt/ccxt/pull/25377)
* feat(gate): add ccxt referral to private websocket requests by [@Dan-krm](https://github.com/Dan-krm) in [#25374](https://github.com/ccxt/ccxt/pull/25374)
* fix(binance) - spot marginMode by [@ttodua](https://github.com/ttodua) in [#23694](https://github.com/ccxt/ccxt/pull/23694)
* onetrading fetchMarkets static response by [@samgermain](https://github.com/samgermain) in [#25380](https://github.com/ccxt/ccxt/pull/25380)
* fix(go): mathFloor type checking by [@carlosmiei](https://github.com/carlosmiei) in [#25381](https://github.com/ccxt/ccxt/pull/25381)
* feat(binance): add portfolio/pmloan-history by [@carlosmiei](https://github.com/carlosmiei) in [#25382](https://github.com/ccxt/ccxt/pull/25382)
## New Contributors [#new-contributors-67]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.64](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.64)
[Changes][v4.4.64]
# [v4.4.63](https://github.com/ccxt/ccxt/releases/tag/v4.4.63) - 2025-02-27 [#v4463---2025-02-27]
## What's Changed [#whats-changed-113]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
* whitebit sign fix by [@ndubel](https://github.com/ndubel) in [#25353](https://github.com/ccxt/ccxt/pull/25353)
* gate & exchange - networks by [@ttodua](https://github.com/ttodua) in [#25307](https://github.com/ccxt/ccxt/pull/25307)
* fix(bingx): closedOrders limit param by [@carlosmiei](https://github.com/carlosmiei) in [#25356](https://github.com/ccxt/ccxt/pull/25356)
* refactor(bybit) remove enableDemoTrading no longer required by [@Dan-krm](https://github.com/Dan-krm) in [#25359](https://github.com/ccxt/ccxt/pull/25359)
* fix(go): update exchange\_dynamic.go when transpiling single exchange by [@bistin](https://github.com/bistin) in [#25360](https://github.com/ccxt/ccxt/pull/25360)
* Bitmart update by [@yzh-pelle](https://github.com/yzh-pelle) in [#25342](https://github.com/ccxt/ccxt/pull/25342)
* fix(go): getValue boundaries by [@carlosmiei](https://github.com/carlosmiei) in [#25362](https://github.com/ccxt/ccxt/pull/25362)
* fix(tradeogre): formatting amount and price by [@carlosmiei](https://github.com/carlosmiei) in [#25363](https://github.com/ccxt/ccxt/pull/25363)
* fix(phemex) - inverse symbols by [@ttodua](https://github.com/ttodua) in [#25367](https://github.com/ccxt/ccxt/pull/25367)
* fix(python) - encode decode latin-1 into utf-8 by [@ttodua](https://github.com/ttodua) in [#25365](https://github.com/ccxt/ccxt/pull/25365)
* feat(bybit): revert enableDemoTrading removal by [@Dan-krm](https://github.com/Dan-krm) in [#25369](https://github.com/ccxt/ccxt/pull/25369)
* fix(phemex) - two loadmarkets by [@ttodua](https://github.com/ttodua) in [#25366](https://github.com/ccxt/ccxt/pull/25366)
## New Contributors [#new-contributors-68]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* [@bistin](https://github.com/bistin) made their first contribution in [#25360](https://github.com/ccxt/ccxt/pull/25360)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.63](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.63)
[Changes][v4.4.63]
# [v4.4.62](https://github.com/ccxt/ccxt/releases/tag/v4.4.62) - 2025-02-24 [#v4462---2025-02-24]
## What's Changed [#whats-changed-114]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
* chore: Remove appveyor by [@carlosmiei](https://github.com/carlosmiei) in [#25313](https://github.com/ccxt/ccxt/pull/25313)
* fix(exchange) - transpilable parts (RL & init methods) by [@ttodua](https://github.com/ttodua) in [#23372](https://github.com/ccxt/ccxt/pull/23372)
* feat(bybit): add new api by [@sc0Vu](https://github.com/sc0Vu) in [#25310](https://github.com/ccxt/ccxt/pull/25310)
* fix(phemex) - perps lower by [@ttodua](https://github.com/ttodua) in [#25320](https://github.com/ccxt/ccxt/pull/25320)
* fix(kraken) expose askVolume and bidVolume in fetchTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#25324](https://github.com/ccxt/ccxt/pull/25324)
* test(base) - comments \* by [@ttodua](https://github.com/ttodua) in [#25327](https://github.com/ccxt/ccxt/pull/25327)
* fix(cli) - http response by [@ttodua](https://github.com/ttodua) in [#25329](https://github.com/ccxt/ccxt/pull/25329)
* feat(bybit) - fetchBidsAsks by [@ttodua](https://github.com/ttodua) in [#25328](https://github.com/ccxt/ccxt/pull/25328)
* feat(bybit): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25311](https://github.com/ccxt/ccxt/pull/25311)
* feat(phemex): add fetchConvertQuote, createConvertTrade, fetchConvertHistory by [@Dan-krm](https://github.com/Dan-krm) in [#25306](https://github.com/ccxt/ccxt/pull/25306)
* fix(phemex) - createOrder reduceOnly by [@ttodua](https://github.com/ttodua) in [#25333](https://github.com/ccxt/ccxt/pull/25333)
* fix(lbank) - trade parsing by [@ttodua](https://github.com/ttodua) in [#25334](https://github.com/ccxt/ccxt/pull/25334)
* chore: update cleanup script by [@carlosmiei](https://github.com/carlosmiei) in [#25339](https://github.com/ccxt/ccxt/pull/25339)
* feat(binance): add coinm ws api by [@sc0Vu](https://github.com/sc0Vu) in [#25330](https://github.com/ccxt/ccxt/pull/25330)
* fix(bingx): fetchCanceledAndClosedOrders symbol requirement by [@carlosmiei](https://github.com/carlosmiei) in [#25341](https://github.com/ccxt/ccxt/pull/25341)
* fix: myokx uses the wrong rest api URL's by [@xmatthias](https://github.com/xmatthias) in [#25344](https://github.com/ccxt/ccxt/pull/25344)
* chore(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 in /go/tests/types by [@dependabot](https://github.com/dependabot) in [#25346](https://github.com/ccxt/ccxt/pull/25346)
* refactor(handleMarketTypeAndParams) by [@ttodua](https://github.com/ttodua) in [#25222](https://github.com/ccxt/ccxt/pull/25222)
* whitebit parseTrade update by [@ndubel](https://github.com/ndubel) in [#25348](https://github.com/ccxt/ccxt/pull/25348)
* chore: update release tag by [@carlosmiei](https://github.com/carlosmiei) in [#25349](https://github.com/ccxt/ccxt/pull/25349)
## New Contributors [#new-contributors-69]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.62](https://github.com/ccxt/ccxt/compare/4.4.52...v4.4.62)
[Changes][v4.4.62]
# [go/v4.4.61](https://github.com/ccxt/ccxt/releases/tag/go/v4.4.61) - 2025-02-18 [#gov4461---2025-02-18]
## What's Changed [#whats-changed-115]
* test(ticker) - fix precisions PHP by [@ttodua](https://github.com/ttodua) in [#25295](https://github.com/ccxt/ccxt/pull/25295)
* fix(gate): remove subscriptions for watch symbols by [@sc0Vu](https://github.com/sc0Vu) in [#25301](https://github.com/ccxt/ccxt/pull/25301)
* test(currency) - leveraged tokens tests ^ by [@ttodua](https://github.com/ttodua) in [#25298](https://github.com/ccxt/ccxt/pull/25298)
* fix(gate) - trade timestamps by [@ttodua](https://github.com/ttodua) in [#25299](https://github.com/ccxt/ccxt/pull/25299)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25303](https://github.com/ccxt/ccxt/pull/25303)
* fix(go): signSecp256k1 available in all envs by [@carlosmiei](https://github.com/carlosmiei) in [#25305](https://github.com/ccxt/ccxt/pull/25305)
* fix(phemex) - perpetual pilot by [@ttodua](https://github.com/ttodua) in [#25304](https://github.com/ccxt/ccxt/pull/25304)
* gate - networks list unification ^ by [@ttodua](https://github.com/ttodua) in [#18487](https://github.com/ccxt/ccxt/pull/18487)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.60...go/v4.4.61](https://github.com/ccxt/ccxt/compare/go/v4.4.60...go/v4.4.61)
[Changes][go/v4.4.61]
# [go/v4.4.60](https://github.com/ccxt/ccxt/releases/tag/go/v4.4.60) - 2025-02-17 [#gov4460---2025-02-17]
## What's Changed [#whats-changed-116]
* fix(Alpaca): Fixed the date parameter types to iso8601 formatting on fetchOrders & fetchMyTrades by [@alisalama](https://github.com/alisalama) in [#25280](https://github.com/ccxt/ccxt/pull/25280)
* chore: release automated msg skip by [@carlosmiei](https://github.com/carlosmiei) in [#25281](https://github.com/ccxt/ccxt/pull/25281)
* test(transpilation) - afterConstruct by [@ttodua](https://github.com/ttodua) in [#25274](https://github.com/ccxt/ccxt/pull/25274)
* fix(oxfun): python headers by [@carlosmiei](https://github.com/carlosmiei) in [#25283](https://github.com/ccxt/ccxt/pull/25283)
* test(base) - afterConstructor by [@ttodua](https://github.com/ttodua) in [#25282](https://github.com/ccxt/ccxt/pull/25282)
* feat(xt): ohlcv pagination by [@carlosmiei](https://github.com/carlosmiei) in [#25286](https://github.com/ccxt/ccxt/pull/25286)
* fix(bybit): parseOpenInterest, different open interest for linear and inverse by [@Dan-krm](https://github.com/Dan-krm) in [#25287](https://github.com/ccxt/ccxt/pull/25287)
* fix(hollaex): fetchDepositWithdrawFees - returns response by [@samgermain](https://github.com/samgermain) in [#25284](https://github.com/ccxt/ccxt/pull/25284)
* feat(xt): add watchPositions by [@pcriadoperez](https://github.com/pcriadoperez) in [#25261](https://github.com/ccxt/ccxt/pull/25261)
* feat(binance): add editOrders by [@sc0Vu](https://github.com/sc0Vu) in [#25290](https://github.com/ccxt/ccxt/pull/25290)
* fix(bitget): skip sandbox header in fetchTime by [@carlosmiei](https://github.com/carlosmiei) in [#25291](https://github.com/ccxt/ccxt/pull/25291)
## New Contributors [#new-contributors-70]
* [@alisalama](https://github.com/alisalama) made their first contribution in [#25280](https://github.com/ccxt/ccxt/pull/25280)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.59...go/v4.4.60](https://github.com/ccxt/ccxt/compare/go/v4.4.59...go/v4.4.60)
[Changes][go/v4.4.60]
# [go/v4.4.59](https://github.com/ccxt/ccxt/releases/tag/go/v4.4.59) - 2025-02-14 [#gov4459---2025-02-14]
## What's Changed [#whats-changed-117]
* fix(bitget): sandbox mode in python by [@carlosmiei](https://github.com/carlosmiei) in [#25264](https://github.com/ccxt/ccxt/pull/25264)
* feat(hyperliquid): add fetchFundingHistory by [@sc0Vu](https://github.com/sc0Vu) in [#25263](https://github.com/ccxt/ccxt/pull/25263)
* fix(coinbaseinternational) skip-test max loadmarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25262](https://github.com/ccxt/ccxt/pull/25262)
* hollaex: fetchDeposits, fetchWithdrawals - static tests by [@samgermain](https://github.com/samgermain) in [#25259](https://github.com/ccxt/ccxt/pull/25259)
* feat(exchanges): add int type to fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#25265](https://github.com/ccxt/ccxt/pull/25265)
* fix(bybit): createOrder, spot market buy amount edit by [@Dan-krm](https://github.com/Dan-krm) in [#25273](https://github.com/ccxt/ccxt/pull/25273)
* tests(xt) - skip by [@ttodua](https://github.com/ttodua) in [#25272](https://github.com/ccxt/ccxt/pull/25272)
* chore: disable appveyor termporarily by [@carlosmiei](https://github.com/carlosmiei) in [#25276](https://github.com/ccxt/ccxt/pull/25276)
* reduce number of strictNullTypes errors using a llm by [@frosty00](https://github.com/frosty00) in [#25275](https://github.com/ccxt/ccxt/pull/25275)
* delist wazirx by [@frosty00](https://github.com/frosty00) in [#25277](https://github.com/ccxt/ccxt/pull/25277)
* test(coinlist) - skip ^ by [@ttodua](https://github.com/ttodua) in [#25279](https://github.com/ccxt/ccxt/pull/25279)
* fix(binanceus) - api v3 ^ by [@ttodua](https://github.com/ttodua) in [#25278](https://github.com/ccxt/ccxt/pull/25278)
* hollaex: fetchDepositAddresses, fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25270](https://github.com/ccxt/ccxt/pull/25270)
* fix(C#) - missing default properties by [@ttodua](https://github.com/ttodua) in [#25266](https://github.com/ccxt/ccxt/pull/25266)
* fix(bitmart): updating fetchCurrencies with networks by [@rayBastard](https://github.com/rayBastard) in [#25247](https://github.com/ccxt/ccxt/pull/25247)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.58...go/v4.4.59](https://github.com/ccxt/ccxt/compare/go/v4.4.58...go/v4.4.59)
[Changes][go/v4.4.59]
# [go/v4.4.58](https://github.com/ccxt/ccxt/releases/tag/go/v4.4.58) - 2025-02-11 [#gov4458---2025-02-11]
## What's Changed [#whats-changed-118]
* chore: release permission by [@carlosmiei](https://github.com/carlosmiei) in [#25205](https://github.com/ccxt/ccxt/pull/25205)
* chore: disable travis by [@carlosmiei](https://github.com/carlosmiei) in [#25207](https://github.com/ccxt/ccxt/pull/25207)
* chore: build add --noTests option by [@carlosmiei](https://github.com/carlosmiei) in [#25209](https://github.com/ccxt/ccxt/pull/25209)
* feat(timex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25208](https://github.com/ccxt/ccxt/pull/25208)
* test(python) - asyncio gather remove from sync by [@ttodua](https://github.com/ttodua) in [#25212](https://github.com/ccxt/ccxt/pull/25212)
* fix(bybit): createExpiredOptionMarket quote and settle currencies by [@Dan-krm](https://github.com/Dan-krm) in [#25213](https://github.com/ccxt/ccxt/pull/25213)
* fix(binance) - symbolrequired ^ by [@ttodua](https://github.com/ttodua) in [#25220](https://github.com/ccxt/ccxt/pull/25220)
* chore: try windows machine run by [@carlosmiei](https://github.com/carlosmiei) in [#25215](https://github.com/ccxt/ccxt/pull/25215)
* fix(ascendex) - features sym ^ by [@ttodua](https://github.com/ttodua) in [#25221](https://github.com/ccxt/ccxt/pull/25221)
* fix(coinbase): parse error message by [@carlosmiei](https://github.com/carlosmiei) in [#25224](https://github.com/ccxt/ccxt/pull/25224)
* chore: fixed workflow and twitter links by [@operagxoksana](https://github.com/operagxoksana) in [#25223](https://github.com/ccxt/ccxt/pull/25223)
* fix(bitmart,hyperliquid): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25231](https://github.com/ccxt/ccxt/pull/25231)
* fix(ci-requirements): fix versions for ci-requirements.txt by [@pcriadoperez](https://github.com/pcriadoperez) in [#25228](https://github.com/ccxt/ccxt/pull/25228)
* refactor(ws) - remove extra files by [@ttodua](https://github.com/ttodua) in [#25227](https://github.com/ccxt/ccxt/pull/25227)
* fix(exchange) - last json resp by [@ttodua](https://github.com/ttodua) in [#25225](https://github.com/ccxt/ccxt/pull/25225)
* feat(xt): IF error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#25232](https://github.com/ccxt/ccxt/pull/25232)
* fix(hyperliquid): fix php loadMarkets test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25237](https://github.com/ccxt/ccxt/pull/25237)
* fix(mexc): watchTickers on python by [@pcriadoperez](https://github.com/pcriadoperez) in [#25236](https://github.com/ccxt/ccxt/pull/25236)
* fix(latoken): skip vwap test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25234](https://github.com/ccxt/ccxt/pull/25234)
* fix(whitebit): error handling filter by [@carlosmiei](https://github.com/carlosmiei) in [#25241](https://github.com/ccxt/ccxt/pull/25241)
* fix(vertex) - safemarket in parse ticker by [@ttodua](https://github.com/ttodua) in [#25243](https://github.com/ccxt/ccxt/pull/25243)
* fix(binance) - fetchCurrencies: types & network precisions by [@ttodua](https://github.com/ttodua) in [#25239](https://github.com/ccxt/ccxt/pull/25239)
* fix(base) - safeTicker dont omit zero vwap by [@ttodua](https://github.com/ttodua) in [#25244](https://github.com/ccxt/ccxt/pull/25244)
* bitso: fetchMyTrades - static tests by [@samgermain](https://github.com/samgermain) in [#25251](https://github.com/ccxt/ccxt/pull/25251)
* bitmart: update fees by [@sc0Vu](https://github.com/sc0Vu) in [#25253](https://github.com/ccxt/ccxt/pull/25253)
* chore: debug static test detection by [@carlosmiei](https://github.com/carlosmiei) in [#25047](https://github.com/ccxt/ccxt/pull/25047)
* feat(xt): implement setMarginMode by [@carlosmiei](https://github.com/carlosmiei) in [#25254](https://github.com/ccxt/ccxt/pull/25254)
* fix(bitget): add PAPTRADING header by [@sc0Vu](https://github.com/sc0Vu) in [#25255](https://github.com/ccxt/ccxt/pull/25255)
* chore: php fix release by [@carlosmiei](https://github.com/carlosmiei) in [#25256](https://github.com/ccxt/ccxt/pull/25256)
## New Contributors [#new-contributors-71]
* [@operagxoksana](https://github.com/operagxoksana) made their first contribution in [#25223](https://github.com/ccxt/ccxt/pull/25223)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.57...go/v4.4.58](https://github.com/ccxt/ccxt/compare/go/v4.4.57...go/v4.4.58)
[Changes][go/v4.4.58]
# [go/v4.4.57](https://github.com/ccxt/ccxt/releases/tag/go/v4.4.57) - 2025-02-05 [#gov4457---2025-02-05]
## What's Changed [#whats-changed-119]
* chore: delist lykee by [@pcriadoperez](https://github.com/pcriadoperez) in [#25177](https://github.com/ccxt/ccxt/pull/25177)
* Fix coinbase feature - fetchOHLCV by [@xmatthias](https://github.com/xmatthias) in [#25171](https://github.com/ccxt/ccxt/pull/25171)
* fix(coinex) - withdraw precision by [@ttodua](https://github.com/ttodua) in [#25172](https://github.com/ccxt/ccxt/pull/25172)
* fix(bybit) - meaningful message by [@ttodua](https://github.com/ttodua) in [#25179](https://github.com/ccxt/ccxt/pull/25179)
* build(deps): bump github.com/ethereum/go-ethereum from 1.14.12 to 1.14.13 by [@dependabot](https://github.com/dependabot) in [#25105](https://github.com/ccxt/ccxt/pull/25105)
* chore: update go badge by [@carlosmiei](https://github.com/carlosmiei) in [#25183](https://github.com/ccxt/ccxt/pull/25183)
* chore: go badge image by [@carlosmiei](https://github.com/carlosmiei) in [#25184](https://github.com/ccxt/ccxt/pull/25184)
* chore: add GO LIcense by [@carlosmiei](https://github.com/carlosmiei) in [#25187](https://github.com/ccxt/ccxt/pull/25187)
* chore: nuget badge by [@carlosmiei](https://github.com/carlosmiei) in [#25189](https://github.com/ccxt/ccxt/pull/25189)
* fix(bingx) - skip by [@ttodua](https://github.com/ttodua) in [#25191](https://github.com/ccxt/ccxt/pull/25191)
* fix(safeNumber) - NAN to undefined by [@ttodua](https://github.com/ttodua) in [#25190](https://github.com/ccxt/ccxt/pull/25190)
* enhancement: add space in errors by [@sc0Vu](https://github.com/sc0Vu) in [#25197](https://github.com/ccxt/ccxt/pull/25197)
* fix(go): skip signSecp256k1 in windows by [@carlosmiei](https://github.com/carlosmiei) in [#25198](https://github.com/ccxt/ccxt/pull/25198)
* fix(deribit): stop requiring currency in fetchPositions by [@yzh-pelle](https://github.com/yzh-pelle) in [#25157](https://github.com/ccxt/ccxt/pull/25157)
* fix(binance): recover editContractOrder by [@sc0Vu](https://github.com/sc0Vu) in [#25199](https://github.com/ccxt/ccxt/pull/25199)
* chore: bump ast-transpiler by [@carlosmiei](https://github.com/carlosmiei) in [#25200](https://github.com/ccxt/ccxt/pull/25200)
* chore: reenable release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25201](https://github.com/ccxt/ccxt/pull/25201)
* feat(go): add market override in go by [@carlosmiei](https://github.com/carlosmiei) in [#25202](https://github.com/ccxt/ccxt/pull/25202)
* fix(bybit): watchOrderBook default option limit by [@Dan-krm](https://github.com/Dan-krm) in [#25204](https://github.com/ccxt/ccxt/pull/25204)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.56...go/v4.4.57](https://github.com/ccxt/ccxt/compare/go/v4.4.56...go/v4.4.57)
[Changes][go/v4.4.57]
# [go/v4.4.56](https://github.com/ccxt/ccxt/releases/tag/go/v4.4.56) - 2025-02-03 [#gov4456---2025-02-03]
## What's Changed [#whats-changed-120]
* go: Move to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25170](https://github.com/ccxt/ccxt/pull/25170)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.54...go/v4.4.56](https://github.com/ccxt/ccxt/compare/go/v4.4.54...go/v4.4.56)
[Changes][go/v4.4.56]
# [go/v4.4.54](https://github.com/ccxt/ccxt/releases/tag/go/v4.4.54) - 2025-02-03 [#gov4454---2025-02-03]
## What's Changed [#whats-changed-121]
* chore: restore release flow by [@carlosmiei](https://github.com/carlosmiei) in [#25166](https://github.com/ccxt/ccxt/pull/25166)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#25167](https://github.com/ccxt/ccxt/pull/25167)
* chore: fix hyperlink by [@carlosmiei](https://github.com/carlosmiei) in [#25168](https://github.com/ccxt/ccxt/pull/25168)
* chore: try new release by [@carlosmiei](https://github.com/carlosmiei) in [#25169](https://github.com/ccxt/ccxt/pull/25169)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/go/v4.4.53...go/v4.4.54](https://github.com/ccxt/ccxt/compare/go/v4.4.53...go/v4.4.54)
[Changes][go/v4.4.54]
# [go/v4.4.53](https://github.com/ccxt/ccxt/releases/tag/go/v4.4.53) - 2025-02-03 [#gov4453---2025-02-03]
## What's Changed [#whats-changed-122]
* chore: try npm publish by [@carlosmiei](https://github.com/carlosmiei) in [#25074](https://github.com/ccxt/ccxt/pull/25074)
* chore: try 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25075](https://github.com/ccxt/ccxt/pull/25075)
* chore: release try npm-publish by [@carlosmiei](https://github.com/carlosmiei) in [#25076](https://github.com/ccxt/ccxt/pull/25076)
* chore: uncomment by [@carlosmiei](https://github.com/carlosmiei) in [#25077](https://github.com/ccxt/ccxt/pull/25077)
* chore: Rl2 release by [@carlosmiei](https://github.com/carlosmiei) in [#25078](https://github.com/ccxt/ccxt/pull/25078)
* chore: disable travis commits by [@carlosmiei](https://github.com/carlosmiei) in [#25079](https://github.com/ccxt/ccxt/pull/25079)
* fix(bitmex) - features ^ by [@ttodua](https://github.com/ttodua) in [#25081](https://github.com/ccxt/ccxt/pull/25081)
* docs(bitmart): fetchFundingRateHistory - docstring update by [@samgermain](https://github.com/samgermain) in [#25083](https://github.com/ccxt/ccxt/pull/25083)
* feat(features) - add arguments by [@ttodua](https://github.com/ttodua) in [#25082](https://github.com/ccxt/ccxt/pull/25082)
* chore: js add to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25084](https://github.com/ccxt/ccxt/pull/25084)
* chore: remove comment js by [@carlosmiei](https://github.com/carlosmiei) in [#25085](https://github.com/ccxt/ccxt/pull/25085)
* chore: msg to wiki by [@carlosmiei](https://github.com/carlosmiei) in [#25086](https://github.com/ccxt/ccxt/pull/25086)
* chore: use gh\_token instead by [@carlosmiei](https://github.com/carlosmiei) in [#25088](https://github.com/ccxt/ccxt/pull/25088)
* chore: wiki commit msg by [@carlosmiei](https://github.com/carlosmiei) in [#25089](https://github.com/ccxt/ccxt/pull/25089)
* feat(features) - symbolRequired (batch 1) by [@ttodua](https://github.com/ttodua) in [#25087](https://github.com/ccxt/ccxt/pull/25087)
* fix(binance): remove spl from networks by [@carlosmiei](https://github.com/carlosmiei) in [#25090](https://github.com/ccxt/ccxt/pull/25090)
* fix(binance) - SPL SOL by [@ttodua](https://github.com/ttodua) in [#25091](https://github.com/ccxt/ccxt/pull/25091)
* test(exceptions) - exception message readable by [@ttodua](https://github.com/ttodua) in [#25096](https://github.com/ccxt/ccxt/pull/25096)
* feat(symbolRequired) - batch 2 by [@ttodua](https://github.com/ttodua) in [#25094](https://github.com/ccxt/ccxt/pull/25094)
* feat(lang): go Rest by [@carlosmiei](https://github.com/carlosmiei) in [#23691](https://github.com/ccxt/ccxt/pull/23691)
* build(deps): bump golang.org/x/crypto from 0.22.0 to 0.31.0 by [@dependabot](https://github.com/dependabot) in [#25098](https://github.com/ccxt/ccxt/pull/25098)
* chore: go pushback fix by [@carlosmiei](https://github.com/carlosmiei) in [#25099](https://github.com/ccxt/ccxt/pull/25099)
* chore: go fix by [@carlosmiei](https://github.com/carlosmiei) in [#25100](https://github.com/ccxt/ccxt/pull/25100)
* chore: Remove bins by [@carlosmiei](https://github.com/carlosmiei) in [#25101](https://github.com/ccxt/ccxt/pull/25101)
* chore: update request/response commands by [@carlosmiei](https://github.com/carlosmiei) in [#25102](https://github.com/ccxt/ccxt/pull/25102)
* chore: relesae go by [@carlosmiei](https://github.com/carlosmiei) in [#25103](https://github.com/ccxt/ccxt/pull/25103)
* chore: release git id by [@carlosmiei](https://github.com/carlosmiei) in [#25108](https://github.com/ccxt/ccxt/pull/25108)
* fix(okx): array slice in networks by [@carlosmiei](https://github.com/carlosmiei) in [#25110](https://github.com/ccxt/ccxt/pull/25110)
* chore: Go specific yml by [@carlosmiei](https://github.com/carlosmiei) in [#25111](https://github.com/ccxt/ccxt/pull/25111)
* chore: release try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#25112](https://github.com/ccxt/ccxt/pull/25112)
* revert(python) - parse frame by [@ttodua](https://github.com/ttodua) in [#25114](https://github.com/ccxt/ccxt/pull/25114)
* chore: remove push by [@carlosmiei](https://github.com/carlosmiei) in [#25116](https://github.com/ccxt/ccxt/pull/25116)
* chore: try simplified release by [@carlosmiei](https://github.com/carlosmiei) in [#25117](https://github.com/ccxt/ccxt/pull/25117)
* comment out all steps by [@carlosmiei](https://github.com/carlosmiei) in [#25118](https://github.com/ccxt/ccxt/pull/25118)
* chore: export exchanges on release by [@carlosmiei](https://github.com/carlosmiei) in [#25119](https://github.com/ccxt/ccxt/pull/25119)
* chore: comment set-url by [@carlosmiei](https://github.com/carlosmiei) in [#25120](https://github.com/ccxt/ccxt/pull/25120)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25121](https://github.com/ccxt/ccxt/pull/25121)
* chore: try revert file by [@carlosmiei](https://github.com/carlosmiei) in [#25122](https://github.com/ccxt/ccxt/pull/25122)
* chore: try push head by [@carlosmiei](https://github.com/carlosmiei) in [#25123](https://github.com/ccxt/ccxt/pull/25123)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25124](https://github.com/ccxt/ccxt/pull/25124)
* chore: try my token by [@carlosmiei](https://github.com/carlosmiei) in [#25125](https://github.com/ccxt/ccxt/pull/25125)
* chore: try ssh-key by [@carlosmiei](https://github.com/carlosmiei) in [#25126](https://github.com/ccxt/ccxt/pull/25126)
* chore: new try by [@carlosmiei](https://github.com/carlosmiei) in [#25127](https://github.com/ccxt/ccxt/pull/25127)
* chore: use secret.github by [@carlosmiei](https://github.com/carlosmiei) in [#25128](https://github.com/ccxt/ccxt/pull/25128)
* chore: try different push by [@carlosmiei](https://github.com/carlosmiei) in [#25129](https://github.com/ccxt/ccxt/pull/25129)
* chore: missing push by [@carlosmiei](https://github.com/carlosmiei) in [#25130](https://github.com/ccxt/ccxt/pull/25130)
* chore: try different token by [@carlosmiei](https://github.com/carlosmiei) in [#25131](https://github.com/ccxt/ccxt/pull/25131)
* chore: restore file to previous state by [@carlosmiei](https://github.com/carlosmiei) in [#25132](https://github.com/ccxt/ccxt/pull/25132)
* chore: export-exchanges by [@carlosmiei](https://github.com/carlosmiei) in [#25133](https://github.com/ccxt/ccxt/pull/25133)
* go: update path version to v4 by [@carlosmiei](https://github.com/carlosmiei) in [#25134](https://github.com/ccxt/ccxt/pull/25134)
* chore: fix go deploy by [@carlosmiei](https://github.com/carlosmiei) in [#25135](https://github.com/ccxt/ccxt/pull/25135)
* chore: revert version by [@carlosmiei](https://github.com/carlosmiei) in [#25136](https://github.com/ccxt/ccxt/pull/25136)
* fix(woofipro): prefix edd25519: in api key by [@sc0Vu](https://github.com/sc0Vu) in [#25140](https://github.com/ccxt/ccxt/pull/25140)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#25141](https://github.com/ccxt/ccxt/pull/25141)
* chore: go move module file \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#25137](https://github.com/ccxt/ccxt/pull/25137)
* chore: try removing binaries by [@carlosmiei](https://github.com/carlosmiei) in [#25143](https://github.com/ccxt/ccxt/pull/25143)
* chore: rm binaries 2 by [@carlosmiei](https://github.com/carlosmiei) in [#25144](https://github.com/ccxt/ccxt/pull/25144)
* fix!(bingx) - TRUMP common currency by [@ttodua](https://github.com/ttodua) in [#25146](https://github.com/ccxt/ccxt/pull/25146)
* feat(wavesexchange): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25145](https://github.com/ccxt/ccxt/pull/25145)
* fix(bingx) - withdraw fix by [@ttodua](https://github.com/ttodua) in [#25149](https://github.com/ccxt/ccxt/pull/25149)
* chore: try new path by [@carlosmiei](https://github.com/carlosmiei) in [#25147](https://github.com/ccxt/ccxt/pull/25147)
* Release skip go by [@carlosmiei](https://github.com/carlosmiei) in [#25154](https://github.com/ccxt/ccxt/pull/25154)
* chore: fix go command by [@carlosmiei](https://github.com/carlosmiei) in [#25155](https://github.com/ccxt/ccxt/pull/25155)
* chore: remove mod tidy by [@carlosmiei](https://github.com/carlosmiei) in [#25156](https://github.com/ccxt/ccxt/pull/25156)
* chore: Try merge by [@carlosmiei](https://github.com/carlosmiei) in [#25115](https://github.com/ccxt/ccxt/pull/25115)
* chore: try comiting first by [@carlosmiei](https://github.com/carlosmiei) in [#25158](https://github.com/ccxt/ccxt/pull/25158)
* chore: use git name/email by [@carlosmiei](https://github.com/carlosmiei) in [#25159](https://github.com/ccxt/ccxt/pull/25159)
* chore: try go/ tag by [@carlosmiei](https://github.com/carlosmiei) in [#25160](https://github.com/ccxt/ccxt/pull/25160)
* chore: tmp don't pull changes and run tests by [@carlosmiei](https://github.com/carlosmiei) in [#25161](https://github.com/ccxt/ccxt/pull/25161)
* chore: tag and release match name by [@carlosmiei](https://github.com/carlosmiei) in [#25163](https://github.com/ccxt/ccxt/pull/25163)
* fix(coinbase) - currency id by [@ttodua](https://github.com/ttodua) in [#25162](https://github.com/ccxt/ccxt/pull/25162)
* fix(bitmart) - fetchDepositAddress deposit code by [@ttodua](https://github.com/ttodua) in [#25148](https://github.com/ccxt/ccxt/pull/25148)
* chore: try new mod path by [@carlosmiei](https://github.com/carlosmiei) in [#25164](https://github.com/ccxt/ccxt/pull/25164)
* chore: adjust npm version by [@carlosmiei](https://github.com/carlosmiei) in [#25165](https://github.com/ccxt/ccxt/pull/25165)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.52...go/v4.4.53](https://github.com/ccxt/ccxt/compare/4.4.52...go/v4.4.53)
[Changes][go/v4.4.53]
# [4.4.52](https://github.com/ccxt/ccxt/releases/tag/4.4.52) - 2025-01-28 [#4452---2025-01-28]
## What's Changed [#whats-changed-123]
* chore: release npm auth by [@carlosmiei](https://github.com/carlosmiei) in [#25072](https://github.com/ccxt/ccxt/pull/25072)
* deribit - fix 2 by [@ttodua](https://github.com/ttodua) in [#25064](https://github.com/ccxt/ccxt/pull/25064)
* feat(base) - handleTriggerDirectionAndParams by [@ttodua](https://github.com/ttodua) in [#24548](https://github.com/ccxt/ccxt/pull/24548)
* refactor(test) - remove unused var by [@ttodua](https://github.com/ttodua) in [#25071](https://github.com/ccxt/ccxt/pull/25071)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.51...4.4.52](https://github.com/ccxt/ccxt/compare/4.4.51...4.4.52)
[Changes][4.4.52]
# [4.4.51](https://github.com/ccxt/ccxt/releases/tag/4.4.51) - 2025-01-27 [#4451---2025-01-27]
## What's Changed [#whats-changed-124]
* fix(onetrading): update docs by [@carlosmiei](https://github.com/carlosmiei) in [#24977](https://github.com/ccxt/ccxt/pull/24977)
* chore: add new action by [@carlosmiei](https://github.com/carlosmiei) in [#24980](https://github.com/ccxt/ccxt/pull/24980)
* chore: push-generated action logs by [@carlosmiei](https://github.com/carlosmiei) in [#24983](https://github.com/ccxt/ccxt/pull/24983)
* chore: try push from JS by [@carlosmiei](https://github.com/carlosmiei) in [#24985](https://github.com/ccxt/ccxt/pull/24985)
* chore: Try push 2 by [@carlosmiei](https://github.com/carlosmiei) in [#24986](https://github.com/ccxt/ccxt/pull/24986)
* chore: try set origin by [@carlosmiei](https://github.com/carlosmiei) in [#24987](https://github.com/ccxt/ccxt/pull/24987)
* chore: try push 4 by [@carlosmiei](https://github.com/carlosmiei) in [#24988](https://github.com/ccxt/ccxt/pull/24988)
* fix(mexc): broker API signature error by [@Dan-krm](https://github.com/Dan-krm) in [#24982](https://github.com/ccxt/ccxt/pull/24982)
* chore: try gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#24990](https://github.com/ccxt/ccxt/pull/24990)
* chore: push 6 by [@carlosmiei](https://github.com/carlosmiei) in [#24991](https://github.com/ccxt/ccxt/pull/24991)
* fix(cli) - c# by [@ttodua](https://github.com/ttodua) in [#24989](https://github.com/ccxt/ccxt/pull/24989)
* chore: try push 7 by [@carlosmiei](https://github.com/carlosmiei) in [#24992](https://github.com/ccxt/ccxt/pull/24992)
* chore: try-push 9 by [@carlosmiei](https://github.com/carlosmiei) in [#24993](https://github.com/ccxt/ccxt/pull/24993)
* chore: try push and skip by [@carlosmiei](https://github.com/carlosmiei) in [#24994](https://github.com/ccxt/ccxt/pull/24994)
* chore: avoid recursion loop by [@carlosmiei](https://github.com/carlosmiei) in [#24995](https://github.com/ccxt/ccxt/pull/24995)
* chore: restore token by [@carlosmiei](https://github.com/carlosmiei) in [#24997](https://github.com/ccxt/ccxt/pull/24997)
* chore: ignore commit error by [@carlosmiei](https://github.com/carlosmiei) in [#24998](https://github.com/ccxt/ccxt/pull/24998)
* chore: conditional token availability by [@carlosmiei](https://github.com/carlosmiei) in [#24999](https://github.com/ccxt/ccxt/pull/24999)
* chore: test dummy change by [@carlosmiei](https://github.com/carlosmiei) in [#25000](https://github.com/ccxt/ccxt/pull/25000)
* chore: another try by [@carlosmiei](https://github.com/carlosmiei) in [#25001](https://github.com/ccxt/ccxt/pull/25001)
* chore: use gh\_token by [@carlosmiei](https://github.com/carlosmiei) in [#25002](https://github.com/ccxt/ccxt/pull/25002)
* chore: debug github vars by [@carlosmiei](https://github.com/carlosmiei) in [#25009](https://github.com/ccxt/ccxt/pull/25009)
* fix(deribit): fetchFundingRateHistory, edit since and until handling by [@Dan-krm](https://github.com/Dan-krm) in [#25008](https://github.com/ccxt/ccxt/pull/25008)
* chore: try print vars by [@carlosmiei](https://github.com/carlosmiei) in [#25010](https://github.com/ccxt/ccxt/pull/25010)
* fix(htx) - sign order by [@ttodua](https://github.com/ttodua) in [#24979](https://github.com/ccxt/ccxt/pull/24979)
* chore: debug github vars by [@carlosmiei](https://github.com/carlosmiei) in [#25011](https://github.com/ccxt/ccxt/pull/25011)
* chore: try skip actions commits by [@carlosmiei](https://github.com/carlosmiei) in [#25012](https://github.com/ccxt/ccxt/pull/25012)
* chore: move py/php/c# pushback to actions by [@carlosmiei](https://github.com/carlosmiei) in [#25015](https://github.com/ccxt/ccxt/pull/25015)
* chore: draft release action by [@carlosmiei](https://github.com/carlosmiei) in [#25016](https://github.com/ccxt/ccxt/pull/25016)
* chore(astt) - update ^ by [@ttodua](https://github.com/ttodua) in [#25018](https://github.com/ccxt/ccxt/pull/25018)
* fix(gate): fetchCurrencies parsing by [@ndubel](https://github.com/ndubel) in [#25017](https://github.com/ccxt/ccxt/pull/25017)
* chore: Release draft build by [@carlosmiei](https://github.com/carlosmiei) in [#25020](https://github.com/ccxt/ccxt/pull/25020)
* chore: release permissions by [@carlosmiei](https://github.com/carlosmiei) in [#25021](https://github.com/ccxt/ccxt/pull/25021)
* chore: release permissions by [@carlosmiei](https://github.com/carlosmiei) in [#25022](https://github.com/ccxt/ccxt/pull/25022)
* chore: release move action up by [@carlosmiei](https://github.com/carlosmiei) in [#25024](https://github.com/ccxt/ccxt/pull/25024)
* chore: release permissions by [@carlosmiei](https://github.com/carlosmiei) in [#25025](https://github.com/ccxt/ccxt/pull/25025)
* chore: release action: mkdir by [@carlosmiei](https://github.com/carlosmiei) in [#25026](https://github.com/ccxt/ccxt/pull/25026)
* chore: release try to create folder by [@carlosmiei](https://github.com/carlosmiei) in [#25027](https://github.com/ccxt/ccxt/pull/25027)
* fix(kucoin): fetchMyTrades limit by [@ndubel](https://github.com/ndubel) in [#25023](https://github.com/ccxt/ccxt/pull/25023)
* chore: try rebase=false by [@carlosmiei](https://github.com/carlosmiei) in [#25028](https://github.com/ccxt/ccxt/pull/25028)
* chore: git pull origin by [@carlosmiei](https://github.com/carlosmiei) in [#25029](https://github.com/ccxt/ccxt/pull/25029)
* fix(mexc): support tif in params by [@carlosmiei](https://github.com/carlosmiei) in [#25030](https://github.com/ccxt/ccxt/pull/25030)
* chore: travis skip actions commits by [@carlosmiei](https://github.com/carlosmiei) in [#25033](https://github.com/ccxt/ccxt/pull/25033)
* refactor(exchange) - features ^ by [@ttodua](https://github.com/ttodua) in [#24975](https://github.com/ccxt/ccxt/pull/24975)
* feat(xt) - features by [@ttodua](https://github.com/ttodua) in [#24965](https://github.com/ccxt/ccxt/pull/24965)
* feat(wazirx) - features by [@ttodua](https://github.com/ttodua) in [#24962](https://github.com/ccxt/ccxt/pull/24962)
* feat(vertex) - features by [@ttodua](https://github.com/ttodua) in [#24959](https://github.com/ccxt/ccxt/pull/24959)
* feat(yobit) - features by [@ttodua](https://github.com/ttodua) in [#24966](https://github.com/ccxt/ccxt/pull/24966)
* feat(zonda) - features by [@ttodua](https://github.com/ttodua) in [#24968](https://github.com/ccxt/ccxt/pull/24968)
* feat(zaif) - features by [@ttodua](https://github.com/ttodua) in [#24967](https://github.com/ccxt/ccxt/pull/24967)
* chore: add dotnet to live-tests by [@carlosmiei](https://github.com/carlosmiei) in [#25034](https://github.com/ccxt/ccxt/pull/25034)
* feat(whitebit) - features by [@ttodua](https://github.com/ttodua) in [#24963](https://github.com/ccxt/ccxt/pull/24963)
* feat(wavesexchange) - features by [@ttodua](https://github.com/ttodua) in [#24961](https://github.com/ccxt/ccxt/pull/24961)
* chore: avoid loop by [@carlosmiei](https://github.com/carlosmiei) in [#25035](https://github.com/ccxt/ccxt/pull/25035)
* chore: test actions dummy by [@carlosmiei](https://github.com/carlosmiei) in [#25037](https://github.com/ccxt/ccxt/pull/25037)
* chore: fix workflow condition by [@carlosmiei](https://github.com/carlosmiei) in [#25038](https://github.com/ccxt/ccxt/pull/25038)
* chore: skip travis master commit by [@carlosmiei](https://github.com/carlosmiei) in [#25039](https://github.com/ccxt/ccxt/pull/25039)
* chore: add deployment steps to release.yml by [@carlosmiei](https://github.com/carlosmiei) in [#25036](https://github.com/ccxt/ccxt/pull/25036)
* chore: add final steps to release by [@carlosmiei](https://github.com/carlosmiei) in [#25041](https://github.com/ccxt/ccxt/pull/25041)
* fix(binance) - zero prices by [@ttodua](https://github.com/ttodua) in [#24581](https://github.com/ccxt/ccxt/pull/24581)
* fix(php) - safeNumberOmitZero by [@ttodua](https://github.com/ttodua) in [#25043](https://github.com/ccxt/ccxt/pull/25043)
* fix(binance): keepAliveListenKey by [@sc0Vu](https://github.com/sc0Vu) in [#25045](https://github.com/ccxt/ccxt/pull/25045)
* chore: add config --global to user.name by [@carlosmiei](https://github.com/carlosmiei) in [#25048](https://github.com/ccxt/ccxt/pull/25048)
* feat(probit): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#25032](https://github.com/ccxt/ccxt/pull/25032)
* binance features updates (part 1) by [@ttodua](https://github.com/ttodua) in [#25007](https://github.com/ccxt/ccxt/pull/25007)
* fix(docs): fix htx docs, fix [#25044](https://github.com/ccxt/ccxt/issues/25044) by [@pcriadoperez](https://github.com/pcriadoperez) in [#25051](https://github.com/ccxt/ccxt/pull/25051)
* feat(blofin): add testnet urls by [@pcriadoperez](https://github.com/pcriadoperez) in [#25052](https://github.com/ccxt/ccxt/pull/25052)
* fix(blofin): features test by [@pcriadoperez](https://github.com/pcriadoperez) in [#25054](https://github.com/ccxt/ccxt/pull/25054)
* fix(deribit) - fetchFundingRateHistory pagination by [@ttodua](https://github.com/ttodua) in [#25049](https://github.com/ccxt/ccxt/pull/25049)
* fix(coinex): depositAddress memo parsing by [@carlosmiei](https://github.com/carlosmiei) in [#25056](https://github.com/ccxt/ccxt/pull/25056)
* chore: add debug to release.yml by [@carlosmiei](https://github.com/carlosmiei) in [#25057](https://github.com/ccxt/ccxt/pull/25057)
* chore: relesat tag msg by [@carlosmiei](https://github.com/carlosmiei) in [#25058](https://github.com/ccxt/ccxt/pull/25058)
* fix(coinex): watchBalance - only watch active currencies by [@pcriadoperez](https://github.com/pcriadoperez) in [#25061](https://github.com/ccxt/ccxt/pull/25061)
* fix(coinmetro): fix fetchMarkets by [@pcriadoperez](https://github.com/pcriadoperez) in [#25059](https://github.com/ccxt/ccxt/pull/25059)
* fix(coinlist): loadMarkets test, skip precision.amount by [@pcriadoperez](https://github.com/pcriadoperez) in [#25055](https://github.com/ccxt/ccxt/pull/25055)
* chore: replace gh installations by [@carlosmiei](https://github.com/carlosmiei) in [#25060](https://github.com/ccxt/ccxt/pull/25060)
* chore: remove gh installation by [@carlosmiei](https://github.com/carlosmiei) in [#25062](https://github.com/ccxt/ccxt/pull/25062)
* chore: release pull first by [@carlosmiei](https://github.com/carlosmiei) in [#25065](https://github.com/ccxt/ccxt/pull/25065)
* chore: set gh token by [@carlosmiei](https://github.com/carlosmiei) in [#25066](https://github.com/ccxt/ccxt/pull/25066)
* chore: release fixes by [@carlosmiei](https://github.com/carlosmiei) in [#25067](https://github.com/ccxt/ccxt/pull/25067)
* chore: relesae twine install by [@carlosmiei](https://github.com/carlosmiei) in [#25068](https://github.com/ccxt/ccxt/pull/25068)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.50...4.4.51](https://github.com/ccxt/ccxt/compare/4.4.50...4.4.51)
[Changes][4.4.51]
# [4.4.50](https://github.com/ccxt/ccxt/releases/tag/4.4.50) - 2025-01-21 [#4450---2025-01-21]
## What's Changed [#whats-changed-125]
* fix(binance): fetchOpenOrder docs by [@carlosmiei](https://github.com/carlosmiei) in [#24939](https://github.com/ccxt/ccxt/pull/24939)
* fix: docs build by [@pcriadoperez](https://github.com/pcriadoperez) in [#24940](https://github.com/ccxt/ccxt/pull/24940)
* fix: csharp action - upgrade to net 7.0 by [@pcriadoperez](https://github.com/pcriadoperez) in [#24941](https://github.com/ccxt/ccxt/pull/24941)
* feat(paymium) - features by [@ttodua](https://github.com/ttodua) in [#24931](https://github.com/ccxt/ccxt/pull/24931)
* feat(tradeogre) - features by [@ttodua](https://github.com/ttodua) in [#24936](https://github.com/ccxt/ccxt/pull/24936)
* feat(timex) - features by [@ttodua](https://github.com/ttodua) in [#24934](https://github.com/ccxt/ccxt/pull/24934)
* feat(probit) - features by [@ttodua](https://github.com/ttodua) in [#24932](https://github.com/ccxt/ccxt/pull/24932)
* withdraw with memo by [@shenmush](https://github.com/shenmush) in [#24938](https://github.com/ccxt/ccxt/pull/24938)
* fix(mexc): inverse subType by [@carlosmiei](https://github.com/carlosmiei) in [#24945](https://github.com/ccxt/ccxt/pull/24945)
* feat(tokocrypto) - features by [@ttodua](https://github.com/ttodua) in [#24935](https://github.com/ccxt/ccxt/pull/24935)
* fix(coinex) - SOL network fix ^ by [@ttodua](https://github.com/ttodua) in [#24947](https://github.com/ccxt/ccxt/pull/24947)
* Hollaex ohlcv by [@samgermain](https://github.com/samgermain) in [#24922](https://github.com/ccxt/ccxt/pull/24922)
* feat(alpaca): add createMarketOrderWithCost by [@carlosmiei](https://github.com/carlosmiei) in [#24952](https://github.com/ccxt/ccxt/pull/24952)
* fix(kucoin) - fetchCurrencies new data by [@ttodua](https://github.com/ttodua) in [#24055](https://github.com/ccxt/ccxt/pull/24055)
* feat(binance): protect safeMarket call by [@carlosmiei](https://github.com/carlosmiei) in [#24958](https://github.com/ccxt/ccxt/pull/24958)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24960](https://github.com/ccxt/ccxt/pull/24960)
* fix(kucoin) - parsing networks & fees by [@ttodua](https://github.com/ttodua) in [#24956](https://github.com/ccxt/ccxt/pull/24956)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24969](https://github.com/ccxt/ccxt/pull/24969)
* okcoin, tokocrypto, whitebit updated fetchTime by [@AresArtemius](https://github.com/AresArtemius) in [#24954](https://github.com/ccxt/ccxt/pull/24954)
* fix(blofin) - features ohlcv by [@ttodua](https://github.com/ttodua) in [#24957](https://github.com/ccxt/ccxt/pull/24957)
* feat(binance): add portfolio/negative-balance-exchange-record by [@carlosmiei](https://github.com/carlosmiei) in [#24953](https://github.com/ccxt/ccxt/pull/24953)
* fix(binance) - historical trades by [@ttodua](https://github.com/ttodua) in [#24955](https://github.com/ccxt/ccxt/pull/24955)
* feat(transpiler): add OpenInterest type by [@carlosmiei](https://github.com/carlosmiei) in [#24973](https://github.com/ccxt/ccxt/pull/24973)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24974](https://github.com/ccxt/ccxt/pull/24974)
## New Contributors [#new-contributors-72]
* [@shenmush](https://github.com/shenmush) made their first contribution in [#24938](https://github.com/ccxt/ccxt/pull/24938)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.49...4.4.50](https://github.com/ccxt/ccxt/compare/4.4.49...4.4.50)
[Changes][4.4.50]
# [4.4.49](https://github.com/ccxt/ccxt/releases/tag/4.4.49) - 2025-01-17 [#4449---2025-01-17]
## What's Changed [#whats-changed-126]
* feat(deribit) - features by [@ttodua](https://github.com/ttodua) in [#24881](https://github.com/ccxt/ccxt/pull/24881)
* feat(digifinex) - features by [@ttodua](https://github.com/ttodua) in [#24882](https://github.com/ccxt/ccxt/pull/24882)
* fix(bingx): sign, json body converting arrays to strings by [@Dan-krm](https://github.com/Dan-krm) in [#24444](https://github.com/ccxt/ccxt/pull/24444)
* refactor(bingx): use parseFundingRateHistories by [@Dan-krm](https://github.com/Dan-krm) in [#24893](https://github.com/ccxt/ccxt/pull/24893)
* feat(ellipx) - features by [@ttodua](https://github.com/ttodua) in [#24884](https://github.com/ccxt/ccxt/pull/24884)
* feat(exmo) - features by [@ttodua](https://github.com/ttodua) in [#24885](https://github.com/ccxt/ccxt/pull/24885)
* feat(hitbtc) - features by [@ttodua](https://github.com/ttodua) in [#24886](https://github.com/ccxt/ccxt/pull/24886)
* feat(idex) - features by [@ttodua](https://github.com/ttodua) in [#24891](https://github.com/ccxt/ccxt/pull/24891)
* feat(hollaex) - features by [@ttodua](https://github.com/ttodua) in [#24887](https://github.com/ccxt/ccxt/pull/24887)
* feat(huobijp) - features by [@ttodua](https://github.com/ttodua) in [#24888](https://github.com/ccxt/ccxt/pull/24888)
* feat(bitmart): support ob speed by [@carlosmiei](https://github.com/carlosmiei) in [#24899](https://github.com/ccxt/ccxt/pull/24899)
* docs(ellipx): params\["until"] in docstring by [@samgermain](https://github.com/samgermain) in [#24907](https://github.com/ccxt/ccxt/pull/24907)
* feat(coinsph): fetchOHLCV - params\["until"], limit fix by [@samgermain](https://github.com/samgermain) in [#24869](https://github.com/ccxt/ccxt/pull/24869)
* feat(novadax) - features by [@ttodua](https://github.com/ttodua) in [#24906](https://github.com/ccxt/ccxt/pull/24906)
* feat(luno) - features by [@ttodua](https://github.com/ttodua) in [#24901](https://github.com/ccxt/ccxt/pull/24901)
* feat(mercado) - features by [@ttodua](https://github.com/ttodua) in [#24903](https://github.com/ccxt/ccxt/pull/24903)
* feat(independentreserve) - features by [@ttodua](https://github.com/ttodua) in [#24894](https://github.com/ccxt/ccxt/pull/24894)
* feat(lykke) - features by [@ttodua](https://github.com/ttodua) in [#24902](https://github.com/ccxt/ccxt/pull/24902)
* feat(bitget) - fetchOhlcv useHistoryEndpoint by [@ttodua](https://github.com/ttodua) in [#24900](https://github.com/ccxt/ccxt/pull/24900)
* feat(indodax) - features by [@ttodua](https://github.com/ttodua) in [#24895](https://github.com/ccxt/ccxt/pull/24895)
* feat(lbank) - features by [@ttodua](https://github.com/ttodua) in [#24898](https://github.com/ccxt/ccxt/pull/24898)
* feat(kuna) - features by [@ttodua](https://github.com/ttodua) in [#24896](https://github.com/ccxt/ccxt/pull/24896)
* fix(mexc): add currency id by [@sc0Vu](https://github.com/sc0Vu) in [#24911](https://github.com/ccxt/ccxt/pull/24911)
* fix(bingx): application/json custom encoding by [@Dan-krm](https://github.com/Dan-krm) in [#24910](https://github.com/ccxt/ccxt/pull/24910)
* feat(oxfun) - features by [@ttodua](https://github.com/ttodua) in [#24916](https://github.com/ccxt/ccxt/pull/24916)
* feat(p2b) - features by [@ttodua](https://github.com/ttodua) in [#24917](https://github.com/ccxt/ccxt/pull/24917)
* feat(okcoin) - features by [@ttodua](https://github.com/ttodua) in [#24913](https://github.com/ccxt/ccxt/pull/24913)
* fix(hyperliquid): type transfer by [@carlosmiei](https://github.com/carlosmiei) in [#24920](https://github.com/ccxt/ccxt/pull/24920)
* fix(static-updater) - tsx support by [@ttodua](https://github.com/ttodua) in [#24478](https://github.com/ccxt/ccxt/pull/24478)
* feat(digifinex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#24889](https://github.com/ccxt/ccxt/pull/24889)
* feat(latoken) - features by [@ttodua](https://github.com/ttodua) in [#24897](https://github.com/ccxt/ccxt/pull/24897)
* feat(paradex) - features by [@ttodua](https://github.com/ttodua) in [#24918](https://github.com/ccxt/ccxt/pull/24918)
* feat(myokx) - features by [@ttodua](https://github.com/ttodua) in [#24904](https://github.com/ccxt/ccxt/pull/24904)
* feat(onetrading) - features by [@ttodua](https://github.com/ttodua) in [#24914](https://github.com/ccxt/ccxt/pull/24914)
* fix(bingx): fetchBalance parsing by [@ndubel](https://github.com/ndubel) in [#24912](https://github.com/ccxt/ccxt/pull/24912)
* feat(ndax) - features by [@ttodua](https://github.com/ttodua) in [#24905](https://github.com/ccxt/ccxt/pull/24905)
* feat(oceanex) - features by [@ttodua](https://github.com/ttodua) in [#24909](https://github.com/ccxt/ccxt/pull/24909)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24927](https://github.com/ccxt/ccxt/pull/24927)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.48...4.4.49](https://github.com/ccxt/ccxt/compare/4.4.48...4.4.49)
[Changes][4.4.49]
# [4.4.48](https://github.com/ccxt/ccxt/releases/tag/4.4.48) - 2025-01-14 [#4448---2025-01-14]
## What's Changed [#whats-changed-127]
* feat(coinmetro) - features by [@ttodua](https://github.com/ttodua) in [#24837](https://github.com/ccxt/ccxt/pull/24837)
* feat(coincatch) - features by [@ttodua](https://github.com/ttodua) in [#24828](https://github.com/ccxt/ccxt/pull/24828)
* feat(features) - coincheck by [@ttodua](https://github.com/ttodua) in [#24833](https://github.com/ccxt/ccxt/pull/24833)
* feat(coinspot) - features by [@ttodua](https://github.com/ttodua) in [#24840](https://github.com/ccxt/ccxt/pull/24840)
* feat(coinlist) - features by [@ttodua](https://github.com/ttodua) in [#24834](https://github.com/ccxt/ccxt/pull/24834)
* feat(coinmate) - features by [@ttodua](https://github.com/ttodua) in [#24836](https://github.com/ccxt/ccxt/pull/24836)
* feat(coinone) - features by [@ttodua](https://github.com/ttodua) in [#24838](https://github.com/ccxt/ccxt/pull/24838)
* feat(coinsph) - features by [@ttodua](https://github.com/ttodua) in [#24839](https://github.com/ccxt/ccxt/pull/24839)
* fix(krakenfutures): correct leverage tiers by [@sc0Vu](https://github.com/sc0Vu) in [#24844](https://github.com/ccxt/ccxt/pull/24844)
* fix(defx,bitget): remove params\[''] by [@carlosmiei](https://github.com/carlosmiei) in [#24845](https://github.com/ccxt/ccxt/pull/24845)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#24851](https://github.com/ccxt/ccxt/pull/24851)
* feat(phemex) - features by [@ttodua](https://github.com/ttodua) in [#24849](https://github.com/ccxt/ccxt/pull/24849)
* fix(paradex): shorten expiration of jwt token by [@sc0Vu](https://github.com/sc0Vu) in [#24862](https://github.com/ccxt/ccxt/pull/24862)
* independentreserve - add new api endpoitns by [@simbesh](https://github.com/simbesh) in [#24860](https://github.com/ccxt/ccxt/pull/24860)
* fix(ace): correct key for orderbook by [@sc0Vu](https://github.com/sc0Vu) in [#24861](https://github.com/ccxt/ccxt/pull/24861)
* fix(kraken): skip ZEUS by [@sc0Vu](https://github.com/sc0Vu) in [#24857](https://github.com/ccxt/ccxt/pull/24857)
* fix(bybit): createOrder docs by [@carlosmiei](https://github.com/carlosmiei) in [#24863](https://github.com/ccxt/ccxt/pull/24863)
* feat(poloniexfutures) - features by [@ttodua](https://github.com/ttodua) in [#24854](https://github.com/ccxt/ccxt/pull/24854)
* feat(upbit) - features by [@ttodua](https://github.com/ttodua) in [#24855](https://github.com/ccxt/ccxt/pull/24855)
* feat(poloniex) - features by [@ttodua](https://github.com/ttodua) in [#24852](https://github.com/ccxt/ccxt/pull/24852)
* Fix: Corrected Delta Exchange payload signature generation for cancel order by [@Harshidpatel12](https://github.com/Harshidpatel12) in [#24853](https://github.com/ccxt/ccxt/pull/24853)
* feat: adding timeDifference option by [@AresArtemius](https://github.com/AresArtemius) in [#24639](https://github.com/ccxt/ccxt/pull/24639)
* fix(hyperliquid): update active by [@sc0Vu](https://github.com/sc0Vu) in [#24875](https://github.com/ccxt/ccxt/pull/24875)
* feat(currencycom) - features by [@ttodua](https://github.com/ttodua) in [#24865](https://github.com/ccxt/ccxt/pull/24865)
* feat(defx) - features by [@ttodua](https://github.com/ttodua) in [#24866](https://github.com/ccxt/ccxt/pull/24866)
* feat(delta) - features by [@ttodua](https://github.com/ttodua) in [#24867](https://github.com/ccxt/ccxt/pull/24867)
* refactor(binance): use parseFundingRateHistories by [@Dan-krm](https://github.com/Dan-krm) in [#24876](https://github.com/ccxt/ccxt/pull/24876)
* fix(bybit): fetchBalance parsing by [@carlosmiei](https://github.com/carlosmiei) in [#24879](https://github.com/ccxt/ccxt/pull/24879)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24880](https://github.com/ccxt/ccxt/pull/24880)
## New Contributors [#new-contributors-73]
* [@Harshidpatel12](https://github.com/Harshidpatel12) made their first contribution in [#24853](https://github.com/ccxt/ccxt/pull/24853)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.47...4.4.48](https://github.com/ccxt/ccxt/compare/4.4.47...4.4.48)
[Changes][4.4.48]
# [4.4.47](https://github.com/ccxt/ccxt/releases/tag/4.4.47) - 2025-01-10 [#4447---2025-01-10]
## What's Changed [#whats-changed-128]
* bybit: add api by [@sc0Vu](https://github.com/sc0Vu) in [#24763](https://github.com/ccxt/ccxt/pull/24763)
* fix(bitget): close position by [@pcriadoperez](https://github.com/pcriadoperez) in [#24761](https://github.com/ccxt/ccxt/pull/24761)
* fix(gate): unify networks by [@profyverya](https://github.com/profyverya) in [#24759](https://github.com/ccxt/ccxt/pull/24759)
* fix(okx): update avaxc network by [@sc0Vu](https://github.com/sc0Vu) in [#24764](https://github.com/ccxt/ccxt/pull/24764)
* fix(base) - disable last json response by [@ttodua](https://github.com/ttodua) in [#23931](https://github.com/ccxt/ccxt/pull/23931)
* feat(bigone): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#24760](https://github.com/ccxt/ccxt/pull/24760)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#24781](https://github.com/ccxt/ccxt/pull/24781)
* feat(bitfinex1): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#24773](https://github.com/ccxt/ccxt/pull/24773)
* fix(bingx) - ws balance incoming by [@ttodua](https://github.com/ttodua) in [#24765](https://github.com/ccxt/ccxt/pull/24765)
* feat(ace) - features by [@ttodua](https://github.com/ttodua) in [#24766](https://github.com/ccxt/ccxt/pull/24766)
* feat(alpaca) - features by [@ttodua](https://github.com/ttodua) in [#24767](https://github.com/ccxt/ccxt/pull/24767)
* feat(ascendex) - features by [@ttodua](https://github.com/ttodua) in [#24769](https://github.com/ccxt/ccxt/pull/24769)
* feat(bigone) - features by [@ttodua](https://github.com/ttodua) in [#24770](https://github.com/ccxt/ccxt/pull/24770)
* feat(binanceus) - features by [@ttodua](https://github.com/ttodua) in [#24771](https://github.com/ccxt/ccxt/pull/24771)
* feat(bit2c) - features by [@ttodua](https://github.com/ttodua) in [#24772](https://github.com/ccxt/ccxt/pull/24772)
* feat(bitbank) - features by [@ttodua](https://github.com/ttodua) in [#24777](https://github.com/ccxt/ccxt/pull/24777)
* whitebit error mapping by [@ndubel](https://github.com/ndubel) in [#24782](https://github.com/ccxt/ccxt/pull/24782)
* feat(bitbns) - features by [@ttodua](https://github.com/ttodua) in [#24778](https://github.com/ccxt/ccxt/pull/24778)
* feat(bitflyer) - features by [@ttodua](https://github.com/ttodua) in [#24783](https://github.com/ccxt/ccxt/pull/24783)
* feat(bithumb) - features by [@ttodua](https://github.com/ttodua) in [#24784](https://github.com/ccxt/ccxt/pull/24784)
* feat(bitopro) - features by [@ttodua](https://github.com/ttodua) in [#24785](https://github.com/ccxt/ccxt/pull/24785)
* fix(Crypto.cs): Elliptic Curve message signing fix for JWT (+ cleanup) by [@eniewold](https://github.com/eniewold) in [#24776](https://github.com/ccxt/ccxt/pull/24776)
* tests - `createOrder` by [@ttodua](https://github.com/ttodua) in [#14772](https://github.com/ccxt/ccxt/pull/14772)
* feat(binance): add papi/rateLimit/order by [@carlosmiei](https://github.com/carlosmiei) in [#24789](https://github.com/ccxt/ccxt/pull/24789)
* bitrue - spot & swap by [@ttodua](https://github.com/ttodua) in [#24786](https://github.com/ccxt/ccxt/pull/24786)
* feat(bitso) - features by [@ttodua](https://github.com/ttodua) in [#24787](https://github.com/ccxt/ccxt/pull/24787)
* feat(bitvavo) - features by [@ttodua](https://github.com/ttodua) in [#24792](https://github.com/ccxt/ccxt/pull/24792)
* feat(blofin) - features by [@ttodua](https://github.com/ttodua) in [#24796](https://github.com/ccxt/ccxt/pull/24796)
* feat(bitteam) - features by [@ttodua](https://github.com/ttodua) in [#24788](https://github.com/ccxt/ccxt/pull/24788)
* feat(bl3p) - features by [@ttodua](https://github.com/ttodua) in [#24794](https://github.com/ccxt/ccxt/pull/24794)
* feat(blockchaincom) - features by [@ttodua](https://github.com/ttodua) in [#24795](https://github.com/ccxt/ccxt/pull/24795)
* ace & alpaca - minor edits by [@ttodua](https://github.com/ttodua) in [#24793](https://github.com/ccxt/ccxt/pull/24793)
* feat(Exchange): parseFundingRates use filterByArray by [@Dan-krm](https://github.com/Dan-krm) in [#24779](https://github.com/ccxt/ccxt/pull/24779)
* refactor(Exchange): parseOpenInterests use filterByArray by [@Dan-krm](https://github.com/Dan-krm) in [#24780](https://github.com/ccxt/ccxt/pull/24780)
* feat(btcalpha) - features by [@ttodua](https://github.com/ttodua) in [#24798](https://github.com/ccxt/ccxt/pull/24798)
* feat(btcbox) - features by [@ttodua](https://github.com/ttodua) in [#24799](https://github.com/ccxt/ccxt/pull/24799)
* feat(btcmarkets) - features by [@ttodua](https://github.com/ttodua) in [#24800](https://github.com/ccxt/ccxt/pull/24800)
* chore: detach JS headers step by [@carlosmiei](https://github.com/carlosmiei) in [#24801](https://github.com/ccxt/ccxt/pull/24801)
* feat(btcturk) - features by [@ttodua](https://github.com/ttodua) in [#24804](https://github.com/ccxt/ccxt/pull/24804)
* feat(cex) - features by [@ttodua](https://github.com/ttodua) in [#24807](https://github.com/ccxt/ccxt/pull/24807)
* fix(bybit) - fetchBalance parsing by [@ttodua](https://github.com/ttodua) in [#24808](https://github.com/ccxt/ccxt/pull/24808)
* feat(FAQ): add funding rate FAQ by [@Dan-krm](https://github.com/Dan-krm) in [#24812](https://github.com/ccxt/ccxt/pull/24812)
* fix(xt): websocket token recreated on each watch\_ call, causing 429 error by [@danilbogdan](https://github.com/danilbogdan) in [#24809](https://github.com/ccxt/ccxt/pull/24809)
* chore: add github actions \[read-only for now] by [@carlosmiei](https://github.com/carlosmiei) in [#24803](https://github.com/ccxt/ccxt/pull/24803)
* fix(okx): remove params\[] by [@carlosmiei](https://github.com/carlosmiei) in [#24814](https://github.com/ccxt/ccxt/pull/24814)
* fix(hyperliquid): fetchFundingRateHistory required symbol by [@carlosmiei](https://github.com/carlosmiei) in [#24825](https://github.com/ccxt/ccxt/pull/24825)
* fix(krakenfutures): escape when marginlevels is undefined by [@sc0Vu](https://github.com/sc0Vu) in [#24826](https://github.com/ccxt/ccxt/pull/24826)
* feat(coinbaseexchange) - features by [@ttodua](https://github.com/ttodua) in [#24827](https://github.com/ccxt/ccxt/pull/24827)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24829](https://github.com/ccxt/ccxt/pull/24829)
## New Contributors [#new-contributors-74]
* [@danilbogdan](https://github.com/danilbogdan) made their first contribution in [#24809](https://github.com/ccxt/ccxt/pull/24809)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.46...4.4.47](https://github.com/ccxt/ccxt/compare/4.4.46...4.4.47)
[Changes][4.4.47]
# [4.4.46](https://github.com/ccxt/ccxt/releases/tag/4.4.46) - 2025-01-05 [#4446---2025-01-05]
## What's Changed [#whats-changed-129]
* tests(features) - gtc by [@ttodua](https://github.com/ttodua) in [#24479](https://github.com/ccxt/ccxt/pull/24479)
* feat(delta): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#24746](https://github.com/ccxt/ccxt/pull/24746)
* fix(coinex): use parseInteger by [@sc0Vu](https://github.com/sc0Vu) in [#24748](https://github.com/ccxt/ccxt/pull/24748)
* fix(mexc): add missing timeframe 1w by [@sc0Vu](https://github.com/sc0Vu) in [#24747](https://github.com/ccxt/ccxt/pull/24747)
* feat(bybit) - networks mappings ^ by [@ttodua](https://github.com/ttodua) in [#24739](https://github.com/ccxt/ccxt/pull/24739)
* bybit - fetchDepositAddress unification by [@ttodua](https://github.com/ttodua) in [#24740](https://github.com/ccxt/ccxt/pull/24740)
* feat(bitget) - networks list ^ by [@ttodua](https://github.com/ttodua) in [#24742](https://github.com/ccxt/ccxt/pull/24742)
* detect missing parser methods by [@ttodua](https://github.com/ttodua) in [#24738](https://github.com/ccxt/ccxt/pull/24738)
* refactor(bitget) - networks methods by [@ttodua](https://github.com/ttodua) in [#24743](https://github.com/ccxt/ccxt/pull/24743)
* build(deps): bump next from 14.2.15 to 14.2.21 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#24744](https://github.com/ccxt/ccxt/pull/24744)
* fix(binance): pm exception mapping by [@carlosmiei](https://github.com/carlosmiei) in [#24750](https://github.com/ccxt/ccxt/pull/24750)
* feat(ascendex): fetchOHLCV - params\["until"] by [@samgermain](https://github.com/samgermain) in [#24753](https://github.com/ccxt/ccxt/pull/24753)
* Update `ccxt.pro.manual.md` by [@sina-programer](https://github.com/sina-programer) in [#24754](https://github.com/ccxt/ccxt/pull/24754)
* fix(onetrading): order placement by [@carlosmiei](https://github.com/carlosmiei) in [#24755](https://github.com/ccxt/ccxt/pull/24755)
* fix(hyperliquid): order timestamp by [@carlosmiei](https://github.com/carlosmiei) in [#24756](https://github.com/ccxt/ccxt/pull/24756)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24757](https://github.com/ccxt/ccxt/pull/24757)
## New Contributors [#new-contributors-75]
* [@sina-programer](https://github.com/sina-programer) made their first contribution in [#24754](https://github.com/ccxt/ccxt/pull/24754)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.45...4.4.46](https://github.com/ccxt/ccxt/compare/4.4.45...4.4.46)
[Changes][4.4.46]
# [4.4.45](https://github.com/ccxt/ccxt/releases/tag/4.4.45) - 2025-01-03 [#4445---2025-01-03]
## What's Changed [#whats-changed-130]
* feat(binance): editOrder, add portfolioMargin support by [@Dan-krm](https://github.com/Dan-krm) in [#24704](https://github.com/ccxt/ccxt/pull/24704)
* fix(bingx): remove params\[''] by [@carlosmiei](https://github.com/carlosmiei) in [#24705](https://github.com/ccxt/ccxt/pull/24705)
* fix(okx) - strike num by [@ttodua](https://github.com/ttodua) in [#24708](https://github.com/ccxt/ccxt/pull/24708)
* fix(okx) - fetchmarkets retests by [@ttodua](https://github.com/ttodua) in [#24709](https://github.com/ccxt/ccxt/pull/24709)
* skip ellipx - ob2 by [@ttodua](https://github.com/ttodua) in [#24711](https://github.com/ccxt/ccxt/pull/24711)
* fix(okx) - missing currency 'info' by [@ttodua](https://github.com/ttodua) in [#24710](https://github.com/ccxt/ccxt/pull/24710)
* ellipx - L2 ob skip by [@ttodua](https://github.com/ttodua) in [#24713](https://github.com/ccxt/ccxt/pull/24713)
* bybit skip q/b vol by [@ttodua](https://github.com/ttodua) in [#24712](https://github.com/ccxt/ccxt/pull/24712)
* fix(onetrading): fetchOHLCV parsing by [@carlosmiei](https://github.com/carlosmiei) in [#24716](https://github.com/ccxt/ccxt/pull/24716)
* feat(exmo): fetchOHLCV - params.until by [@samgermain](https://github.com/samgermain) in [#24715](https://github.com/ccxt/ccxt/pull/24715)
* fix(binance): portfolioMargin handleErrors by [@Dan-krm](https://github.com/Dan-krm) in [#24717](https://github.com/ccxt/ccxt/pull/24717)
* features corrections by [@ttodua](https://github.com/ttodua) in [#24703](https://github.com/ccxt/ccxt/pull/24703)
* feat(whitebit): support v2 in tickers by [@carlosmiei](https://github.com/carlosmiei) in [#24719](https://github.com/ccxt/ccxt/pull/24719)
* feat(binance): edited fetchBalance portfolio margin by [@Dan-krm](https://github.com/Dan-krm) in [#24720](https://github.com/ccxt/ccxt/pull/24720)
* feat(blofin): adding copy trading endpoints to urls by [@yzh-pelle](https://github.com/yzh-pelle) in [#24721](https://github.com/ccxt/ccxt/pull/24721)
* fix(myokx) - swap/future by [@ttodua](https://github.com/ttodua) in [#24723](https://github.com/ccxt/ccxt/pull/24723)
* fix(hashkey) - buy sell taker maker fix by [@ttodua](https://github.com/ttodua) in [#24725](https://github.com/ccxt/ccxt/pull/24725)
* tests(lykke) - try with proxy by [@ttodua](https://github.com/ttodua) in [#24724](https://github.com/ccxt/ccxt/pull/24724)
* fix(binance) - ws closing signal by [@ttodua](https://github.com/ttodua) in [#24726](https://github.com/ccxt/ccxt/pull/24726)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24731](https://github.com/ccxt/ccxt/pull/24731)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.44...4.4.45](https://github.com/ccxt/ccxt/compare/4.4.44...4.4.45)
[Changes][4.4.45]
# [4.4.44](https://github.com/ccxt/ccxt/releases/tag/4.4.44) - 2024-12-30 [#4444---2024-12-30]
## What's Changed [#whats-changed-131]
* refactor(binance) - features by [@ttodua](https://github.com/ttodua) in [#24652](https://github.com/ccxt/ccxt/pull/24652)
* fix(delta,coincatch): linear/inverse flags by [@carlosmiei](https://github.com/carlosmiei) in [#24654](https://github.com/ccxt/ccxt/pull/24654)
* fix(bybit): option linear flag by [@carlosmiei](https://github.com/carlosmiei) in [#24655](https://github.com/ccxt/ccxt/pull/24655)
* refactor(mexc) - meta changes by [@ttodua](https://github.com/ttodua) in [#24651](https://github.com/ccxt/ccxt/pull/24651)
* fix(bitget): fetchFundingRates filtering by [@carlosmiei](https://github.com/carlosmiei) in [#24659](https://github.com/ccxt/ccxt/pull/24659)
* bingx - features upd by [@ttodua](https://github.com/ttodua) in [#24656](https://github.com/ccxt/ccxt/pull/24656)
* features - updates by [@ttodua](https://github.com/ttodua) in [#24660](https://github.com/ccxt/ccxt/pull/24660)
* fix(defx): trade side parsing by [@carlosmiei](https://github.com/carlosmiei) in [#24666](https://github.com/ccxt/ccxt/pull/24666)
* oceanex fetchOpenOrders and fetchOHLCV static tests by [@samgermain](https://github.com/samgermain) in [#24634](https://github.com/ccxt/ccxt/pull/24634)
* chore: bitmart skip-keys by [@carlosmiei](https://github.com/carlosmiei) in [#24669](https://github.com/ccxt/ccxt/pull/24669)
* tests(static) - detect & retest exchanges by [@ttodua](https://github.com/ttodua) in [#24670](https://github.com/ccxt/ccxt/pull/24670)
* tests(trades) - taker only by [@ttodua](https://github.com/ttodua) in [#24619](https://github.com/ccxt/ccxt/pull/24619)
* feat(htx): fetchOpenInterests by [@Dan-krm](https://github.com/Dan-krm) in [#24676](https://github.com/ccxt/ccxt/pull/24676)
* build(deps): bump nanoid from 3.3.7 to 3.3.8 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#24523](https://github.com/ccxt/ccxt/pull/24523)
* build(deps): bump next from 14.2.10 to 14.2.15 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#24585](https://github.com/ccxt/ccxt/pull/24585)
* ndax static tests for fetchAccounts and fetchLedger by [@samgermain](https://github.com/samgermain) in [#24682](https://github.com/ccxt/ccxt/pull/24682)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#24684](https://github.com/ccxt/ccxt/pull/24684)
* binance: add cost in doc by [@sc0Vu](https://github.com/sc0Vu) in [#24689](https://github.com/ccxt/ccxt/pull/24689)
* fix(binance): update links to spot doc by [@sc0Vu](https://github.com/sc0Vu) in [#24688](https://github.com/ccxt/ccxt/pull/24688)
* feat(binance): add papiV2 endpoint by [@Dan-krm](https://github.com/Dan-krm) in [#24687](https://github.com/ccxt/ccxt/pull/24687)
* fix(bitopro): patch watchOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#24685](https://github.com/ccxt/ccxt/pull/24685)
* fix(transpile): replace tsx with npx tsx by [@sc0Vu](https://github.com/sc0Vu) in [#24686](https://github.com/ccxt/ccxt/pull/24686)
* fix(binance): remove params\['cost'] by [@carlosmiei](https://github.com/carlosmiei) in [#24697](https://github.com/ccxt/ccxt/pull/24697)
* fix(Bitcoincom): ws urls by [@yzh-pelle](https://github.com/yzh-pelle) in [#24693](https://github.com/ccxt/ccxt/pull/24693)
* ndax editOrder static test by [@samgermain](https://github.com/samgermain) in [#24692](https://github.com/ccxt/ccxt/pull/24692)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24699](https://github.com/ccxt/ccxt/pull/24699)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.43...4.4.44](https://github.com/ccxt/ccxt/compare/4.4.43...4.4.44)
[Changes][4.4.44]
# [4.4.43](https://github.com/ccxt/ccxt/releases/tag/4.4.43) - 2024-12-24 [#4443---2024-12-24]
## What's Changed [#whats-changed-132]
* feat(hyperliquid): certify :D by [@carlosmiei](https://github.com/carlosmiei) in [#24624](https://github.com/ccxt/ccxt/pull/24624)
* feat(bingx): add unique sign handling for some account endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#24625](https://github.com/ccxt/ccxt/pull/24625)
* feat(transpile): split php and python transpilation by [@carlosmiei](https://github.com/carlosmiei) in [#24626](https://github.com/ccxt/ccxt/pull/24626)
* build: move files to typescript by [@carlosmiei](https://github.com/carlosmiei) in [#24627](https://github.com/ccxt/ccxt/pull/24627)
* fix(transpileWs): multiprocess by [@carlosmiei](https://github.com/carlosmiei) in [#24629](https://github.com/ccxt/ccxt/pull/24629)
* chore: debug build by [@carlosmiei](https://github.com/carlosmiei) in [#24630](https://github.com/ccxt/ccxt/pull/24630)
* chore: fix import by [@carlosmiei](https://github.com/carlosmiei) in [#24631](https://github.com/ccxt/ccxt/pull/24631)
* chore: try replace with npm command by [@carlosmiei](https://github.com/carlosmiei) in [#24632](https://github.com/ccxt/ccxt/pull/24632)
* chore: replace tsx calls with npm commands by [@carlosmiei](https://github.com/carlosmiei) in [#24636](https://github.com/ccxt/ccxt/pull/24636)
* feat(vertex): add fetchOpenInterests by [@Dan-krm](https://github.com/Dan-krm) in [#24633](https://github.com/ccxt/ccxt/pull/24633)
* fix(phemex): fetchPositions code handling by [@carlosmiei](https://github.com/carlosmiei) in [#24637](https://github.com/ccxt/ccxt/pull/24637)
* fix(php) - E\_STRICT removal by [@ttodua](https://github.com/ttodua) in [#24640](https://github.com/ccxt/ccxt/pull/24640)
* feat(okx): add myokx branch \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#24638](https://github.com/ccxt/ccxt/pull/24638)
* fix(php) - version numbers by [@ttodua](https://github.com/ttodua) in [#24641](https://github.com/ccxt/ccxt/pull/24641)
* fix(myokx): urls by [@carlosmiei](https://github.com/carlosmiei) in [#24642](https://github.com/ccxt/ccxt/pull/24642)
* fix(php) - pow gmp by [@ttodua](https://github.com/ttodua) in [#24643](https://github.com/ccxt/ccxt/pull/24643)
* fix(gemini) - add triggerPrice by [@ttodua](https://github.com/ttodua) in [#24644](https://github.com/ccxt/ccxt/pull/24644)
* fix(woo) - stoploss/takeprofit price by [@ttodua](https://github.com/ttodua) in [#24613](https://github.com/ccxt/ccxt/pull/24613)
* gemini - `features` by [@ttodua](https://github.com/ttodua) in [#24647](https://github.com/ccxt/ccxt/pull/24647)
* feat(bitstamp) - .features implementation by [@ttodua](https://github.com/ttodua) in [#24438](https://github.com/ccxt/ccxt/pull/24438)
* refactor(exchanges) - remove extra by [@ttodua](https://github.com/ttodua) in [#24648](https://github.com/ccxt/ccxt/pull/24648)
* gmp func - 2 by [@ttodua](https://github.com/ttodua) in [#24646](https://github.com/ccxt/ccxt/pull/24646)
* build: \[skip-tests] by [@carlosmiei](https://github.com/carlosmiei) in [#24645](https://github.com/ccxt/ccxt/pull/24645)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.42...4.4.43](https://github.com/ccxt/ccxt/compare/4.4.42...4.4.43)
[Changes][4.4.43]
# [4.4.42](https://github.com/ccxt/ccxt/releases/tag/4.4.42) - 2024-12-20 [#4442---2024-12-20]
## What's Changed [#whats-changed-133]
* feat(kraken) - features by [@ttodua](https://github.com/ttodua) in [#24575](https://github.com/ccxt/ccxt/pull/24575)
* chore: try workflow \[debug] by [@carlosmiei](https://github.com/carlosmiei) in [#24593](https://github.com/ccxt/ccxt/pull/24593)
* chore: remove workflows by [@carlosmiei](https://github.com/carlosmiei) in [#24595](https://github.com/ccxt/ccxt/pull/24595)
* fix(triggerPrice) - bulk exchanges 1 by [@ttodua](https://github.com/ttodua) in [#24555](https://github.com/ccxt/ccxt/pull/24555)
* feat(cryptocom): error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#24603](https://github.com/ccxt/ccxt/pull/24603)
* feat(binance): add portfolio mint/reedem endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#24604](https://github.com/ccxt/ccxt/pull/24604)
* fix(exchange) - handleOptionAndParams2 by [@ttodua](https://github.com/ttodua) in [#24600](https://github.com/ccxt/ccxt/pull/24600)
* feat(woox) - until missing by [@ttodua](https://github.com/ttodua) in [#24614](https://github.com/ccxt/ccxt/pull/24614)
* feat(binance): add blockTrades endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#24592](https://github.com/ccxt/ccxt/pull/24592)
* bingx fetchMyTrades limit by [@ndubel](https://github.com/ndubel) in [#24605](https://github.com/ccxt/ccxt/pull/24605)
* fix(exchanges) - remove extra by [@ttodua](https://github.com/ttodua) in [#24599](https://github.com/ccxt/ccxt/pull/24599)
* refactor(hashkey) - dry up by [@ttodua](https://github.com/ttodua) in [#24609](https://github.com/ccxt/ccxt/pull/24609)
* hashkey -`features` by [@ttodua](https://github.com/ttodua) in [#24610](https://github.com/ccxt/ccxt/pull/24610)
* feat(coinex) - features by [@ttodua](https://github.com/ttodua) in [#24596](https://github.com/ccxt/ccxt/pull/24596)
* fix(blofin): default balance by [@carlosmiei](https://github.com/carlosmiei) in [#24606](https://github.com/ccxt/ccxt/pull/24606)
* feat(bitfinex): add fetchOpenInterests by [@Dan-krm](https://github.com/Dan-krm) in [#24611](https://github.com/ccxt/ccxt/pull/24611)
* oceanex: static tests for fetchBalance, fetchTicker by [@samgermain](https://github.com/samgermain) in [#24591](https://github.com/ccxt/ccxt/pull/24591)
* feat(hitbtc): add fetchOpenInterests by [@Dan-krm](https://github.com/Dan-krm) in [#24612](https://github.com/ccxt/ccxt/pull/24612)
* woo (woox) - `features` implementation by [@ttodua](https://github.com/ttodua) in [#24615](https://github.com/ccxt/ccxt/pull/24615)
* feat(bitfinex) - `features` by [@ttodua](https://github.com/ttodua) in [#24617](https://github.com/ccxt/ccxt/pull/24617)
* feat(woofipro) - `features` implementation by [@ttodua](https://github.com/ttodua) in [#24616](https://github.com/ccxt/ccxt/pull/24616)
* ndax static tests by [@samgermain](https://github.com/samgermain) in [#24573](https://github.com/ccxt/ccxt/pull/24573)
* krakenfutures - features by [@ttodua](https://github.com/ttodua) in [#24578](https://github.com/ccxt/ccxt/pull/24578)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24618](https://github.com/ccxt/ccxt/pull/24618)
* fix(ndax): tests \[skip-tests] by [@carlosmiei](https://github.com/carlosmiei) in [#24620](https://github.com/ccxt/ccxt/pull/24620)
* fix(blofin): protect data \[skip-tests] by [@carlosmiei](https://github.com/carlosmiei) in [#24621](https://github.com/ccxt/ccxt/pull/24621)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.41...4.4.42](https://github.com/ccxt/ccxt/compare/4.4.41...4.4.42)
[Changes][4.4.42]
# [4.4.41](https://github.com/ccxt/ccxt/releases/tag/4.4.41) - 2024-12-17 [#4441---2024-12-17]
## What's Changed [#whats-changed-134]
* build Improve generate implicit api by [@carlosmiei](https://github.com/carlosmiei) in [#24553](https://github.com/ccxt/ccxt/pull/24553)
* refactor(bybit) - `stopPrice` to `triggerPrice` by [@ttodua](https://github.com/ttodua) in [#24536](https://github.com/ccxt/ccxt/pull/24536)
* kraken: adjust clientOrderId handling in methods by [@Dan-krm](https://github.com/Dan-krm) in [#24504](https://github.com/ccxt/ccxt/pull/24504)
* feat(kucoin): add adjustForTimeDifference option by [@carlosmiei](https://github.com/carlosmiei) in [#24558](https://github.com/ccxt/ccxt/pull/24558)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#24562](https://github.com/ccxt/ccxt/pull/24562)
* feat(bitget): add 41001 error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#24563](https://github.com/ccxt/ccxt/pull/24563)
* fix(xt): fundingRate protection against null by [@carlosmiei](https://github.com/carlosmiei) in [#24567](https://github.com/ccxt/ccxt/pull/24567)
* feat(exmo): add createMarketOrderWithCost by [@carlosmiei](https://github.com/carlosmiei) in [#24568](https://github.com/ccxt/ccxt/pull/24568)
* feat(bitmart): fetchFundingRateHistory by [@Dan-krm](https://github.com/Dan-krm) in [#24569](https://github.com/ccxt/ccxt/pull/24569)
* feat(bitmart): fetchLedger and fetchFundingHistory by [@Dan-krm](https://github.com/Dan-krm) in [#24574](https://github.com/ccxt/ccxt/pull/24574)
* feat(okx) - sol staking endpoints by [@ttodua](https://github.com/ttodua) in [#24570](https://github.com/ccxt/ccxt/pull/24570)
* refactor(binance) - `stopPrice` -> `triggerPrice` by [@ttodua](https://github.com/ttodua) in [#24535](https://github.com/ccxt/ccxt/pull/24535)
* docs(triggerDirection) - ascending/descending by [@ttodua](https://github.com/ttodua) in [#24547](https://github.com/ccxt/ccxt/pull/24547)
* bingx methods by [@ndubel](https://github.com/ndubel) in [#24580](https://github.com/ccxt/ccxt/pull/24580)
* feat(hyperliquid): add fetchOpenInterest/s by [@carlosmiei](https://github.com/carlosmiei) in [#24577](https://github.com/ccxt/ccxt/pull/24577)
* mexc feature rename by [@ttodua](https://github.com/ttodua) in [#24579](https://github.com/ccxt/ccxt/pull/24579)
* chore: github workflow \[ignore] by [@carlosmiei](https://github.com/carlosmiei) in [#24584](https://github.com/ccxt/ccxt/pull/24584)
* fix(pagination): allow repeated option by [@carlosmiei](https://github.com/carlosmiei) in [#24582](https://github.com/ccxt/ccxt/pull/24582)
* bingx fetchOHLCV fix by [@ndubel](https://github.com/ndubel) in [#24583](https://github.com/ccxt/ccxt/pull/24583)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24586](https://github.com/ccxt/ccxt/pull/24586)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.40...4.4.41](https://github.com/ccxt/ccxt/compare/4.4.40...4.4.41)
[Changes][4.4.41]
# [4.4.40](https://github.com/ccxt/ccxt/releases/tag/4.4.40) - 2024-12-13 [#4440---2024-12-13]
## What's Changed [#whats-changed-135]
* fix(bybit): filter execType by [@sc0Vu](https://github.com/sc0Vu) in [#24528](https://github.com/ccxt/ccxt/pull/24528)
* feat(ws): increase size limit to 10MB by [@sc0Vu](https://github.com/sc0Vu) in [#23791](https://github.com/ccxt/ccxt/pull/23791)
* fix(exchange): correct checkWsProxySettings by [@sc0Vu](https://github.com/sc0Vu) in [#24527](https://github.com/ccxt/ccxt/pull/24527)
* cryptocom - features by [@ttodua](https://github.com/ttodua) in [#24525](https://github.com/ccxt/ccxt/pull/24525)
* fix(docs): ledger link by [@carlosmiei](https://github.com/carlosmiei) in [#24529](https://github.com/ccxt/ccxt/pull/24529)
* stop to trigger by [@ttodua](https://github.com/ttodua) in [#24531](https://github.com/ccxt/ccxt/pull/24531)
* params - `stop` to `trigger` by [@ttodua](https://github.com/ttodua) in [#24532](https://github.com/ccxt/ccxt/pull/24532)
* docs(announcements) - add ^ by [@ttodua](https://github.com/ttodua) in [#24222](https://github.com/ccxt/ccxt/pull/24222)
* upbit: update doc by [@sc0Vu](https://github.com/sc0Vu) in [#24542](https://github.com/ccxt/ccxt/pull/24542)
* `stopPrice` -> `triggerPrice` by [@ttodua](https://github.com/ttodua) in [#24534](https://github.com/ccxt/ccxt/pull/24534)
* feat(coinbase) - features by [@ttodua](https://github.com/ttodua) in [#24533](https://github.com/ccxt/ccxt/pull/24533)
* mexc - features by [@ttodua](https://github.com/ttodua) in [#24517](https://github.com/ccxt/ccxt/pull/24517)
* ndax static tests by [@samgermain](https://github.com/samgermain) in [#24513](https://github.com/ccxt/ccxt/pull/24513)
* fix(bitmex): fetchFundingRate parsing by [@carlosmiei](https://github.com/carlosmiei) in [#24545](https://github.com/ccxt/ccxt/pull/24545)
* feat(coinbaseinternational) - features by [@ttodua](https://github.com/ttodua) in [#24537](https://github.com/ccxt/ccxt/pull/24537)
* feat(phemex): fetchFundingRate, add fundingRate field for linear swap by [@Dan-krm](https://github.com/Dan-krm) in [#24546](https://github.com/ccxt/ccxt/pull/24546)
* Fix coinbase fetch accounts base and exponent overflow by [@andrejsjakovlevs](https://github.com/andrejsjakovlevs) in [#24520](https://github.com/ccxt/ccxt/pull/24520)
* fix(binance): simplify reduceOnly conditional by [@Dan-krm](https://github.com/Dan-krm) in [#24516](https://github.com/ccxt/ccxt/pull/24516)
* fix(bybit): increase leverage tiers pagination by [@carlosmiei](https://github.com/carlosmiei) in [#24551](https://github.com/ccxt/ccxt/pull/24551)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24552](https://github.com/ccxt/ccxt/pull/24552)
## New Contributors [#new-contributors-76]
* [@andrejsjakovlevs](https://github.com/andrejsjakovlevs) made their first contribution in [#24520](https://github.com/ccxt/ccxt/pull/24520)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.39...4.4.40](https://github.com/ccxt/ccxt/compare/4.4.39...4.4.40)
[Changes][4.4.40]
# [4.4.39](https://github.com/ccxt/ccxt/releases/tag/4.4.39) - 2024-12-11 [#4439---2024-12-11]
## What's Changed [#whats-changed-136]
* fix(mexc): add fetchTradingFee, remove fetchTradingFees by [@carlosmiei](https://github.com/carlosmiei) in [#24505](https://github.com/ccxt/ccxt/pull/24505)
* feat(okx): improve fetchTrades docs by [@carlosmiei](https://github.com/carlosmiei) in [#24506](https://github.com/ccxt/ccxt/pull/24506)
* htx - features by [@ttodua](https://github.com/ttodua) in [#24502](https://github.com/ccxt/ccxt/pull/24502)
* fix(alpaca): sandbox market API by [@carlosmiei](https://github.com/carlosmiei) in [#24510](https://github.com/ccxt/ccxt/pull/24510)
* fix(Exchange): protect cleanCache deletions by [@carlosmiei](https://github.com/carlosmiei) in [#24511](https://github.com/ccxt/ccxt/pull/24511)
* feat(digifinex): add spot \<> swap to transfer by [@yzh-pelle](https://github.com/yzh-pelle) in [#24508](https://github.com/ccxt/ccxt/pull/24508)
* feat(examples): add exchange-save-load-markets by [@carlosmiei](https://github.com/carlosmiei) in [#24512](https://github.com/ccxt/ccxt/pull/24512)
* feat(alpaca): fetchBalance by [@Dan-krm](https://github.com/Dan-krm) in [#24514](https://github.com/ccxt/ccxt/pull/24514)
* kucoin error mapping by [@ndubel](https://github.com/ndubel) in [#24521](https://github.com/ccxt/ccxt/pull/24521)
* htx - `stop` rename into `trigger` by [@ttodua](https://github.com/ttodua) in [#24509](https://github.com/ccxt/ccxt/pull/24509)
* docs(orders) - add stoploss order by [@ttodua](https://github.com/ttodua) in [#24480](https://github.com/ccxt/ccxt/pull/24480)
* feat(woo): update parseWsOrder and rateLimit by [@jhk482001](https://github.com/jhk482001) in [#24518](https://github.com/ccxt/ccxt/pull/24518)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24522](https://github.com/ccxt/ccxt/pull/24522)
## New Contributors [#new-contributors-77]
* [@jhk482001](https://github.com/jhk482001) made their first contribution in [#24518](https://github.com/ccxt/ccxt/pull/24518)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.38...4.4.39](https://github.com/ccxt/ccxt/compare/4.4.38...4.4.39)
[Changes][4.4.39]
# [4.4.38](https://github.com/ccxt/ccxt/releases/tag/4.4.38) - 2024-12-09 [#4438---2024-12-09]
## What's Changed [#whats-changed-137]
* bitmart - `.features` by [@ttodua](https://github.com/ttodua) in [#24404](https://github.com/ccxt/ccxt/pull/24404)
* ndax static tests by [@samgermain](https://github.com/samgermain) in [#24477](https://github.com/ccxt/ccxt/pull/24477)
* Fix (kucoin): make BASE network name unified by [@profyverya](https://github.com/profyverya) in [#24481](https://github.com/ccxt/ccxt/pull/24481)
* feat(bithumb): add support for TON coin tag in withdraw method by [@danke02](https://github.com/danke02) in [#24472](https://github.com/ccxt/ccxt/pull/24472)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#24488](https://github.com/ccxt/ccxt/pull/24488)
* feat(bingx): add fetchPositionHistory by [@Dan-krm](https://github.com/Dan-krm) in [#24482](https://github.com/ccxt/ccxt/pull/24482)
* fix(features) - gtc (urgent) by [@ttodua](https://github.com/ttodua) in [#24489](https://github.com/ccxt/ccxt/pull/24489)
* feat(kucoin) - features by [@ttodua](https://github.com/ttodua) in [#24486](https://github.com/ccxt/ccxt/pull/24486)
* ndax static tests, docstring params by [@samgermain](https://github.com/samgermain) in [#24492](https://github.com/ccxt/ccxt/pull/24492)
* fix(bybit): add additional Error code mappings by [@xmatthias](https://github.com/xmatthias) in [#24496](https://github.com/ccxt/ccxt/pull/24496)
* feat(kucoinfutures) - .features by [@ttodua](https://github.com/ttodua) in [#24487](https://github.com/ccxt/ccxt/pull/24487)
* ndax fetchDeposits - static tests by [@samgermain](https://github.com/samgermain) in [#24495](https://github.com/ccxt/ccxt/pull/24495)
* fix(bingx): php sign by [@carlosmiei](https://github.com/carlosmiei) in [#24498](https://github.com/ccxt/ccxt/pull/24498)
* feat(bingx): adjust fetchMarkOHLCV endpoint and remove private endpoint by [@Dan-krm](https://github.com/Dan-krm) in [#24470](https://github.com/ccxt/ccxt/pull/24470)
* Update probit.ts by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#24497](https://github.com/ccxt/ccxt/pull/24497)
* fix(ndax): read account: \[skip-tests] by [@carlosmiei](https://github.com/carlosmiei) in [#24499](https://github.com/ccxt/ccxt/pull/24499)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.37...4.4.38](https://github.com/ccxt/ccxt/compare/4.4.37...4.4.38)
[Changes][4.4.38]
# [4.4.37](https://github.com/ccxt/ccxt/releases/tag/4.4.37) - 2024-12-06 [#4437---2024-12-06]
## What's Changed [#whats-changed-138]
* refactor(bitfinex) - old into v1 by [@ttodua](https://github.com/ttodua) in [#24443](https://github.com/ccxt/ccxt/pull/24443)
* feat(gate): update logo by [@carlosmiei](https://github.com/carlosmiei) in [#24459](https://github.com/ccxt/ccxt/pull/24459)
* fix(probit) - watchTrades by [@ttodua](https://github.com/ttodua) in [#24456](https://github.com/ccxt/ccxt/pull/24456)
* feat(coinbase): add fetchDepositId, fetchDepositIds methods by [@Dan-krm](https://github.com/Dan-krm) in [#24454](https://github.com/ccxt/ccxt/pull/24454)
* fix!(bitfinex) - bitfinex2 by [@ttodua](https://github.com/ttodua) in [#24445](https://github.com/ccxt/ccxt/pull/24445)
* fix sh by [@ttodua](https://github.com/ttodua) in [#24460](https://github.com/ccxt/ccxt/pull/24460)
* refactor(features) - gtc to true as default by [@ttodua](https://github.com/ttodua) in [#24451](https://github.com/ccxt/ccxt/pull/24451)
* fix(hyperliquid): upgrade transfer signature by [@sc0Vu](https://github.com/sc0Vu) in [#24441](https://github.com/ccxt/ccxt/pull/24441)
* hyperliquid - features implementation by [@ttodua](https://github.com/ttodua) in [#24448](https://github.com/ccxt/ccxt/pull/24448)
* fix(hyperliquid): update baseid for spot market by [@sc0Vu](https://github.com/sc0Vu) in [#24465](https://github.com/ccxt/ccxt/pull/24465)
* feat(paradex): allow private request with paradexAccount by [@sc0Vu](https://github.com/sc0Vu) in [#24466](https://github.com/ccxt/ccxt/pull/24466)
* feat(coinbase): change fetchDepositId name to fetchDepositMethodId by [@Dan-krm](https://github.com/Dan-krm) in [#24467](https://github.com/ccxt/ccxt/pull/24467)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24468](https://github.com/ccxt/ccxt/pull/24468)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.36...4.4.37](https://github.com/ccxt/ccxt/compare/4.4.36...4.4.37)
[Changes][4.4.37]
# [4.4.36](https://github.com/ccxt/ccxt/releases/tag/4.4.36) - 2024-12-04 [#4436---2024-12-04]
## What's Changed [#whats-changed-139]
* bitopro: update fetchOpenOrders to new api by [@sc0Vu](https://github.com/sc0Vu) in [#24420](https://github.com/ccxt/ccxt/pull/24420)
* bitso sign fixed by [@yzh-pelle](https://github.com/yzh-pelle) in [#24421](https://github.com/ccxt/ccxt/pull/24421)
* fix(deribit): improve fetchBalance with new endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#24422](https://github.com/ccxt/ccxt/pull/24422)
* test(hashkey) - skip by [@ttodua](https://github.com/ttodua) in [#24429](https://github.com/ccxt/ccxt/pull/24429)
* fix(htx): place orders in hedged mode by [@carlosmiei](https://github.com/carlosmiei) in [#24428](https://github.com/ccxt/ccxt/pull/24428)
* fix(kraken) - errors check & rewrite by [@ttodua](https://github.com/ttodua) in [#24430](https://github.com/ccxt/ccxt/pull/24430)
* feat(bitmex) - features by [@ttodua](https://github.com/ttodua) in [#24435](https://github.com/ccxt/ccxt/pull/24435)
* feat(defx): new exchange by [@sc0Vu](https://github.com/sc0Vu) in [#23980](https://github.com/ccxt/ccxt/pull/23980)
* fix(bitfinex2) - some updates by [@ttodua](https://github.com/ttodua) in [#24431](https://github.com/ccxt/ccxt/pull/24431)
* bybit: add apis by [@sc0Vu](https://github.com/sc0Vu) in [#24439](https://github.com/ccxt/ccxt/pull/24439)
* gate: add apis by [@sc0Vu](https://github.com/sc0Vu) in [#24440](https://github.com/ccxt/ccxt/pull/24440)
* build: skip-test by [@carlosmiei](https://github.com/carlosmiei) in [#24446](https://github.com/ccxt/ccxt/pull/24446)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24447](https://github.com/ccxt/ccxt/pull/24447)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.35...4.4.36](https://github.com/ccxt/ccxt/compare/4.4.35...4.4.36)
[Changes][4.4.36]
# [4.4.35](https://github.com/ccxt/ccxt/releases/tag/4.4.35) - 2024-12-01 [#4435---2024-12-01]
## What's Changed [#whats-changed-140]
* fix(probit): resolve ws auth by [@carlosmiei](https://github.com/carlosmiei) in [#24384](https://github.com/ccxt/ccxt/pull/24384)
* fix: myLiquidations in python by [@pcriadoperez](https://github.com/pcriadoperez) in [#24388](https://github.com/ccxt/ccxt/pull/24388)
* Fix(Kucoin): Typo in market structure property by [@profyverya](https://github.com/profyverya) in [#24387](https://github.com/ccxt/ccxt/pull/24387)
* fix(onetrading): remove obselete fetchTrades method by [@samgermain](https://github.com/samgermain) in [#24385](https://github.com/ccxt/ccxt/pull/24385)
* feat(hyperliquid): update precision by [@gaardiolor](https://github.com/gaardiolor) in [#24347](https://github.com/ccxt/ccxt/pull/24347)
* Hyperliquid - fix calculatePricePrecision while-loop by [@gaardiolor](https://github.com/gaardiolor) in [#24392](https://github.com/ccxt/ccxt/pull/24392)
* feat(bingx): add twap order by [@sc0Vu](https://github.com/sc0Vu) in [#24390](https://github.com/ccxt/ccxt/pull/24390)
* gate - features by [@ttodua](https://github.com/ttodua) in [#24393](https://github.com/ccxt/ccxt/pull/24393)
* okx new endpoint by [@ndubel](https://github.com/ndubel) in [#24400](https://github.com/ccxt/ccxt/pull/24400)
* xt update rate limits by [@ndubel](https://github.com/ndubel) in [#24397](https://github.com/ccxt/ccxt/pull/24397)
* fix(bitrue): correct listenkey by [@sc0Vu](https://github.com/sc0Vu) in [#24402](https://github.com/ccxt/ccxt/pull/24402)
* fix(bitmex) - fetchOHLCV by [@cheunhong](https://github.com/cheunhong) in [#24401](https://github.com/ccxt/ccxt/pull/24401)
* fix(probit) - safe markets by [@ttodua](https://github.com/ttodua) in [#24406](https://github.com/ccxt/ccxt/pull/24406)
* idex - DECIMAL\_PLACES into TICK\_SIZE by [@ttodua](https://github.com/ttodua) in [#24273](https://github.com/ccxt/ccxt/pull/24273)
* tests related fixes by [@ttodua](https://github.com/ttodua) in [#24389](https://github.com/ccxt/ccxt/pull/24389)
* fix(bingx): sign, add Content-Type application/json by [@Dan-krm](https://github.com/Dan-krm) in [#24414](https://github.com/ccxt/ccxt/pull/24414)
* feat(kraken): update editOrder endpoint by [@Dan-krm](https://github.com/Dan-krm) in [#24413](https://github.com/ccxt/ccxt/pull/24413)
* fix(tests) - static updater by [@ttodua](https://github.com/ttodua) in [#24412](https://github.com/ccxt/ccxt/pull/24412)
* docs(onetrading): docstring [@see](https://github.com/see) by [@samgermain](https://github.com/samgermain) in [#24411](https://github.com/ccxt/ccxt/pull/24411)
* fix(onetrading): remove fetchDeposits, fetchDepositAddress, createDepositAddress by [@samgermain](https://github.com/samgermain) in [#24395](https://github.com/ccxt/ccxt/pull/24395)
* btcmarkets.ts updated with safeValue to safeDict/Bool by [@AresArtemius](https://github.com/AresArtemius) in [#24221](https://github.com/ccxt/ccxt/pull/24221)
* fix(base) - static tests full msg by [@ttodua](https://github.com/ttodua) in [#23356](https://github.com/ccxt/ccxt/pull/23356)
* fix(probit) - WS reorganize by [@ttodua](https://github.com/ttodua) in [#24415](https://github.com/ccxt/ccxt/pull/24415)
* fix(hyperliquid) - migrate to TICK\_SIZE by [@ttodua](https://github.com/ttodua) in [#24410](https://github.com/ccxt/ccxt/pull/24410)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#24417](https://github.com/ccxt/ccxt/pull/24417)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24418](https://github.com/ccxt/ccxt/pull/24418)
## New Contributors [#new-contributors-78]
* [@profyverya](https://github.com/profyverya) made their first contribution in [#24387](https://github.com/ccxt/ccxt/pull/24387)
* [@gaardiolor](https://github.com/gaardiolor) made their first contribution in [#24347](https://github.com/ccxt/ccxt/pull/24347)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.34...4.4.35](https://github.com/ccxt/ccxt/compare/4.4.34...4.4.35)
[Changes][4.4.35]
# [4.4.34](https://github.com/ccxt/ccxt/releases/tag/4.4.34) - 2024-11-26 [#4434---2024-11-26]
## What's Changed [#whats-changed-141]
* feat(bingx) - features by [@ttodua](https://github.com/ttodua) in [#24315](https://github.com/ccxt/ccxt/pull/24315)
* fix(gate): return value when loadUnifiedStatus by [@sc0Vu](https://github.com/sc0Vu) in [#24327](https://github.com/ccxt/ccxt/pull/24327)
* remove token\_bucket by [@ttodua](https://github.com/ttodua) in [#24317](https://github.com/ccxt/ccxt/pull/24317)
* fix(okx): adjust setLeverage by [@carlosmiei](https://github.com/carlosmiei) in [#24328](https://github.com/ccxt/ccxt/pull/24328)
* fix(woo): old domain replaced with new domain woox.io by [@woo686](https://github.com/woo686) in [#24326](https://github.com/ccxt/ccxt/pull/24326)
* cex change rateLimit by [@ndubel](https://github.com/ndubel) in [#24329](https://github.com/ccxt/ccxt/pull/24329)
* cex order statuses by [@ndubel](https://github.com/ndubel) in [#24332](https://github.com/ccxt/ccxt/pull/24332)
* fix(bybit): options tickers by [@carlosmiei](https://github.com/carlosmiei) in [#24334](https://github.com/ccxt/ccxt/pull/24334)
* fix(krakenfuture): update error by [@sc0Vu](https://github.com/sc0Vu) in [#24340](https://github.com/ccxt/ccxt/pull/24340)
* bingx: add apis by [@sc0Vu](https://github.com/sc0Vu) in [#24342](https://github.com/ccxt/ccxt/pull/24342)
* bitbank: add apis by [@sc0Vu](https://github.com/sc0Vu) in [#24343](https://github.com/ccxt/ccxt/pull/24343)
* bitfinex: add apis by [@sc0Vu](https://github.com/sc0Vu) in [#24344](https://github.com/ccxt/ccxt/pull/24344)
* feat(bitget) - `.features` implementation by [@ttodua](https://github.com/ttodua) in [#24345](https://github.com/ccxt/ccxt/pull/24345)
* feat(phemex) - trigger orders by [@ttodua](https://github.com/ttodua) in [#24300](https://github.com/ccxt/ccxt/pull/24300)
* bybit.ts editing with safeValueN to safeListN by [@AresArtemius](https://github.com/AresArtemius) in [#24276](https://github.com/ccxt/ccxt/pull/24276)
* feat(features) - marginMode by [@ttodua](https://github.com/ttodua) in [#24351](https://github.com/ccxt/ccxt/pull/24351)
* fix: added missing createStopOrder/createTriggerOrder to exchange\["has"] by [@samgermain](https://github.com/samgermain) in [#24350](https://github.com/ccxt/ccxt/pull/24350)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#24354](https://github.com/ccxt/ccxt/pull/24354)
* idex pro docstring [@see](https://github.com/see) by [@samgermain](https://github.com/samgermain) in [#24356](https://github.com/ccxt/ccxt/pull/24356)
* fix(okx) - currencies & fees & static tests by [@ttodua](https://github.com/ttodua) in [#24335](https://github.com/ccxt/ccxt/pull/24335)
* fix(binance): testnet error handling by [@carlosmiei](https://github.com/carlosmiei) in [#24362](https://github.com/ccxt/ccxt/pull/24362)
* fix(onetrading): fetchTradingFees - replace dynamic method call with explicit method call by [@samgermain](https://github.com/samgermain) in [#24361](https://github.com/ccxt/ccxt/pull/24361)
* chore: bump ast-transpiler version by [@carlosmiei](https://github.com/carlosmiei) in [#24364](https://github.com/ccxt/ccxt/pull/24364)
* bitrue error mapping by [@ndubel](https://github.com/ndubel) in [#24363](https://github.com/ccxt/ccxt/pull/24363)
* refactor(static-tests-updaters) - reorg by [@ttodua](https://github.com/ttodua) in [#24349](https://github.com/ccxt/ccxt/pull/24349)
* Coinone coinsph editing safe value by [@AresArtemius](https://github.com/AresArtemius) in [#24337](https://github.com/ccxt/ccxt/pull/24337)
* Coinspot and cryptocom editing safe value by [@AresArtemius](https://github.com/AresArtemius) in [#24359](https://github.com/ccxt/ccxt/pull/24359)
* fix(coinbase): increase max limit by [@carlosmiei](https://github.com/carlosmiei) in [#24367](https://github.com/ccxt/ccxt/pull/24367)
* fix(probit): msg length in ws by [@carlosmiei](https://github.com/carlosmiei) in [#24378](https://github.com/ccxt/ccxt/pull/24378)
* binance: update python examples by [@sc0Vu](https://github.com/sc0Vu) in [#24374](https://github.com/ccxt/ccxt/pull/24374)
* feat(c#): add encoding and other fixes by [@carlosmiei](https://github.com/carlosmiei) in [#24381](https://github.com/ccxt/ccxt/pull/24381)
* fix(filterByValueSinceLimit): handle since = 0 by [@carlosmiei](https://github.com/carlosmiei) in [#24380](https://github.com/ccxt/ccxt/pull/24380)
* fix(php): array\_slice handle strings by [@carlosmiei](https://github.com/carlosmiei) in [#24382](https://github.com/ccxt/ccxt/pull/24382)
* New exchange: Ellipx by [@nguyenhieuec](https://github.com/nguyenhieuec) in [#24151](https://github.com/ccxt/ccxt/pull/24151)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24383](https://github.com/ccxt/ccxt/pull/24383)
## New Contributors [#new-contributors-79]
* [@woo686](https://github.com/woo686) made their first contribution in [#24326](https://github.com/ccxt/ccxt/pull/24326)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.33...4.4.34](https://github.com/ccxt/ccxt/compare/4.4.33...4.4.34)
[Changes][4.4.34]
# [4.4.33](https://github.com/ccxt/ccxt/releases/tag/4.4.33) - 2024-11-20 [#4433---2024-11-20]
## What's Changed [#whats-changed-142]
* bybit error mapping by [@ndubel](https://github.com/ndubel) in [#24292](https://github.com/ccxt/ccxt/pull/24292)
* kucoin - leverage param by [@ttodua](https://github.com/ttodua) in [#24291](https://github.com/ccxt/ccxt/pull/24291)
* fix(coinbase): fetchLedger pagination by [@carlosmiei](https://github.com/carlosmiei) in [#24293](https://github.com/ccxt/ccxt/pull/24293)
* kraken new endpoint for editOrder by [@ndubel](https://github.com/ndubel) in [#24297](https://github.com/ccxt/ccxt/pull/24297)
* phemex docstrings by [@samgermain](https://github.com/samgermain) in [#24302](https://github.com/ccxt/ccxt/pull/24302)
* lbank HIT mapping by [@ndubel](https://github.com/ndubel) in [#24299](https://github.com/ccxt/ccxt/pull/24299)
* fix(phemex) - space in symbols by [@ttodua](https://github.com/ttodua) in [#24296](https://github.com/ccxt/ccxt/pull/24296)
* fix(bybit): flip createMarketBuyRequiresPrice flag by [@carlosmiei](https://github.com/carlosmiei) in [#24303](https://github.com/ccxt/ccxt/pull/24303)
* fix(hyperliquid): fetchMarkets by [@cheunhong](https://github.com/cheunhong) in [#24295](https://github.com/ccxt/ccxt/pull/24295)
* coinex transaction status by [@ndubel](https://github.com/ndubel) in [#24307](https://github.com/ccxt/ccxt/pull/24307)
* cex error mapping by [@ndubel](https://github.com/ndubel) in [#24309](https://github.com/ccxt/ccxt/pull/24309)
* fix(binance) - error codes ^ by [@ttodua](https://github.com/ttodua) in [#24308](https://github.com/ccxt/ccxt/pull/24308)
* feat(features) - initial by [@ttodua](https://github.com/ttodua) in [#23629](https://github.com/ccxt/ccxt/pull/23629)
* test(static) - writer updates by [@ttodua](https://github.com/ttodua) in [#24311](https://github.com/ccxt/ccxt/pull/24311)
* coinbaseexchange: add api by [@sc0Vu](https://github.com/sc0Vu) in [#24316](https://github.com/ccxt/ccxt/pull/24316)
* cex parseBalance by [@ndubel](https://github.com/ndubel) in [#24313](https://github.com/ccxt/ccxt/pull/24313)
* fix(okx): illegal request error handling in ws by [@carlosmiei](https://github.com/carlosmiei) in [#24319](https://github.com/ccxt/ccxt/pull/24319)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24320](https://github.com/ccxt/ccxt/pull/24320)
* fix(bybit): cost order parsing by [@carlosmiei](https://github.com/carlosmiei) in [#24321](https://github.com/ccxt/ccxt/pull/24321)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24322](https://github.com/ccxt/ccxt/pull/24322)
* fix(bybit): php build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24324](https://github.com/ccxt/ccxt/pull/24324)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.32...4.4.33](https://github.com/ccxt/ccxt/compare/4.4.32...4.4.33)
[Changes][4.4.33]
# [4.4.32](https://github.com/ccxt/ccxt/releases/tag/4.4.32) - 2024-11-18 [#4432---2024-11-18]
## What's Changed [#whats-changed-143]
* wavesexchange fetchMyTrades docstring [@see](https://github.com/see) by [@samgermain](https://github.com/samgermain) in [#24271](https://github.com/ccxt/ccxt/pull/24271)
* feat(phemex) - add createOrder stoploss & takeprofit limit price & triggerType params by [@ttodua](https://github.com/ttodua) in [#24269](https://github.com/ccxt/ccxt/pull/24269)
* feat(kucoinfutures): createOrder cost param by [@Dan-krm](https://github.com/Dan-krm) in [#24264](https://github.com/ccxt/ccxt/pull/24264)
* fix(indodax): rl value by [@carlosmiei](https://github.com/carlosmiei) in [#24274](https://github.com/ccxt/ccxt/pull/24274)
* fix(bitvavo): use requestId in crude ws by [@carlosmiei](https://github.com/carlosmiei) in [#24277](https://github.com/ccxt/ccxt/pull/24277)
* fix(gate): fetchFundingRatehistory since/until by [@carlosmiei](https://github.com/carlosmiei) in [#24278](https://github.com/ccxt/ccxt/pull/24278)
* feat(kucoinfutures): updated transfer, added static request tests by [@Dan-krm](https://github.com/Dan-krm) in [#24279](https://github.com/ccxt/ccxt/pull/24279)
* fix(MEXC) Fixed error in MEXC parsing, fixes issue ccxt/ccxt#24058 by [@ywallis](https://github.com/ywallis) in [#24284](https://github.com/ccxt/ccxt/pull/24284)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#24285](https://github.com/ccxt/ccxt/pull/24285)
* feat(exchange): add orjson support by [@carlosmiei](https://github.com/carlosmiei) in [#24223](https://github.com/ccxt/ccxt/pull/24223)
* Disaster docs moving to get doc build broken by [@olegtaranenko](https://github.com/olegtaranenko) in [#24281](https://github.com/ccxt/ccxt/pull/24281)
* fix(exchange): json.loads call by [@carlosmiei](https://github.com/carlosmiei) in [#24289](https://github.com/ccxt/ccxt/pull/24289)
* kucoin: add errors by [@sc0Vu](https://github.com/sc0Vu) in [#24287](https://github.com/ccxt/ccxt/pull/24287)
* feat(kucoinfutures): transfer from spot account by [@Dan-krm](https://github.com/Dan-krm) in [#24282](https://github.com/ccxt/ccxt/pull/24282)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24290](https://github.com/ccxt/ccxt/pull/24290)
## New Contributors [#new-contributors-80]
* [@ywallis](https://github.com/ywallis) made their first contribution in [#24284](https://github.com/ccxt/ccxt/pull/24284)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.31...4.4.32](https://github.com/ccxt/ccxt/compare/4.4.31...4.4.32)
[Changes][4.4.32]
# [4.4.31](https://github.com/ccxt/ccxt/releases/tag/4.4.31) - 2024-11-15 [#4431---2024-11-15]
## What's Changed [#whats-changed-144]
* feat(gate): fetchTime by [@Dan-krm](https://github.com/Dan-krm) in [#24242](https://github.com/ccxt/ccxt/pull/24242)
* test(exchanges): static response, fetchBorrowInterest by [@Dan-krm](https://github.com/Dan-krm) in [#24243](https://github.com/ccxt/ccxt/pull/24243)
* feat(exchanges): LeverageTier type usage by [@Dan-krm](https://github.com/Dan-krm) in [#24234](https://github.com/ccxt/ccxt/pull/24234)
* fix(hyperliquid): correct spot market by [@sc0Vu](https://github.com/sc0Vu) in [#24244](https://github.com/ccxt/ccxt/pull/24244)
* coinex error mapping by [@ndubel](https://github.com/ndubel) in [#24246](https://github.com/ccxt/ccxt/pull/24246)
* coinex cancelOrders fix by [@ndubel](https://github.com/ndubel) in [#24248](https://github.com/ccxt/ccxt/pull/24248)
* fix(coincatch): type inference in inside fetchbalance by [@carlosmiei](https://github.com/carlosmiei) in [#24249](https://github.com/ccxt/ccxt/pull/24249)
* test(exchanges): fetchMarginMode static response tests by [@Dan-krm](https://github.com/Dan-krm) in [#24255](https://github.com/ccxt/ccxt/pull/24255)
* feat(binance): fetchMarginMode by [@Dan-krm](https://github.com/Dan-krm) in [#24256](https://github.com/ccxt/ccxt/pull/24256)
* docs(ohlcv) - custom overload for raw ^ by [@ttodua](https://github.com/ttodua) in [#24258](https://github.com/ccxt/ccxt/pull/24258)
* fix(docs): move docs around by [@carlosmiei](https://github.com/carlosmiei) in [#24250](https://github.com/ccxt/ccxt/pull/24250)
* fix(transpile): remove debug statement by [@carlosmiei](https://github.com/carlosmiei) in [#24260](https://github.com/ccxt/ccxt/pull/24260)
* wavesexchange docstrings by [@samgermain](https://github.com/samgermain) in [#24261](https://github.com/ccxt/ccxt/pull/24261)
* paradex: auth token add expires by [@sc0Vu](https://github.com/sc0Vu) in [#24263](https://github.com/ccxt/ccxt/pull/24263)
* fix(transpile): python-docs by [@carlosmiei](https://github.com/carlosmiei) in [#24265](https://github.com/ccxt/ccxt/pull/24265)
* fix(requirments): pin aiohttp version: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24266](https://github.com/ccxt/ccxt/pull/24266)
* fix(indodax): error handling by [@carlosmiei](https://github.com/carlosmiei) in [#24267](https://github.com/ccxt/ccxt/pull/24267)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24268](https://github.com/ccxt/ccxt/pull/24268)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.30...4.4.31](https://github.com/ccxt/ccxt/compare/4.4.30...4.4.31)
[Changes][4.4.31]
# [4.4.30](https://github.com/ccxt/ccxt/releases/tag/4.4.30) - 2024-11-12 [#4430---2024-11-12]
## What's Changed [#whats-changed-145]
* bitmart.ts editing with safeValue to safeDict/List by [@AresArtemius](https://github.com/AresArtemius) in [#24173](https://github.com/ccxt/ccxt/pull/24173)
* bitfinex.ts updated with safeValue to safeBool/Dict by [@AresArtemius](https://github.com/AresArtemius) in [#24114](https://github.com/ccxt/ccxt/pull/24114)
* bitbns.ts updated with safeValue to safeDict/List by [@AresArtemius](https://github.com/AresArtemius) in [#24113](https://github.com/ccxt/ccxt/pull/24113)
* feat(alpaca): editOrder by [@Dan-krm](https://github.com/Dan-krm) in [#24172](https://github.com/ccxt/ccxt/pull/24172)
* fix(tests): ws import files with case sensitive OS by [@carlosmiei](https://github.com/carlosmiei) in [#24227](https://github.com/ccxt/ccxt/pull/24227)
* fix(blofin): authenticate hang by [@carlosmiei](https://github.com/carlosmiei) in [#24228](https://github.com/ccxt/ccxt/pull/24228)
* fix(lbank) parseFundingRate by [@cheunhong](https://github.com/cheunhong) in [#24226](https://github.com/ccxt/ccxt/pull/24226)
* test(ws) - casing by [@ttodua](https://github.com/ttodua) in [#24229](https://github.com/ccxt/ccxt/pull/24229)
* feat(binance): add staking apis by [@sc0Vu](https://github.com/sc0Vu) in [#24233](https://github.com/ccxt/ccxt/pull/24233)
* hyperliquid: update timeframes by [@sc0Vu](https://github.com/sc0Vu) in [#24231](https://github.com/ccxt/ccxt/pull/24231)
* feat(hyperliquid) fetchFundingRates by [@cheunhong](https://github.com/cheunhong) in [#24225](https://github.com/ccxt/ccxt/pull/24225)
* fix(deribit): spot market flags by [@carlosmiei](https://github.com/carlosmiei) in [#24235](https://github.com/ccxt/ccxt/pull/24235)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24237](https://github.com/ccxt/ccxt/pull/24237)
* fix(deribit): order parsing \[skip-tests] by [@carlosmiei](https://github.com/carlosmiei) in [#24238](https://github.com/ccxt/ccxt/pull/24238)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.29...4.4.30](https://github.com/ccxt/ccxt/compare/4.4.29...4.4.30)
[Changes][4.4.30]
# [4.4.29](https://github.com/ccxt/ccxt/releases/tag/4.4.29) - 2024-11-10 [#4429---2024-11-10]
## What's Changed [#whats-changed-146]
* fix(cli) - auto injection fixes by [@ttodua](https://github.com/ttodua) in [#24199](https://github.com/ccxt/ccxt/pull/24199)
* feat(bitget): fetchFundingRates by [@cheunhong](https://github.com/cheunhong) in [#24196](https://github.com/ccxt/ccxt/pull/24196)
* feat(exchanges): withdraw use the Transaction type by [@Dan-krm](https://github.com/Dan-krm) in [#24198](https://github.com/ccxt/ccxt/pull/24198)
* fix(docs) remove broken link from examples/README.md by [@aljazceru](https://github.com/aljazceru) in [#24193](https://github.com/ccxt/ccxt/pull/24193)
* fix(bitvavo): ws deadlock with multiple calls by [@carlosmiei](https://github.com/carlosmiei) in [#24201](https://github.com/ccxt/ccxt/pull/24201)
* fix(lbank): parseFundingRate interval by [@cheunhong](https://github.com/cheunhong) in [#24204](https://github.com/ccxt/ccxt/pull/24204)
* fix(bybit) - reorg USDC by [@ttodua](https://github.com/ttodua) in [#24205](https://github.com/ccxt/ccxt/pull/24205)
* refactor(bybit) - stop & trigger by [@ttodua](https://github.com/ttodua) in [#24200](https://github.com/ccxt/ccxt/pull/24200)
* fix(bybit): parseFundingRate by [@cheunhong](https://github.com/cheunhong) in [#24203](https://github.com/ccxt/ccxt/pull/24203)
* bitrue.ts editing with safeValue to safeDict/List/Bool by [@AresArtemius](https://github.com/AresArtemius) in [#24181](https://github.com/ccxt/ccxt/pull/24181)
* bitopro.ts updating with safeValue to safeDict/List/bool by [@AresArtemius](https://github.com/AresArtemius) in [#24177](https://github.com/ccxt/ccxt/pull/24177)
* feat(mexc): watchTicker, watchTickers add miniTicker support by [@Dan-krm](https://github.com/Dan-krm) in [#24208](https://github.com/ccxt/ccxt/pull/24208)
* feat(exchange): add fetchOrderBookWs base by [@carlosmiei](https://github.com/carlosmiei) in [#24214](https://github.com/ccxt/ccxt/pull/24214)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24213](https://github.com/ccxt/ccxt/pull/24213)
## New Contributors [#new-contributors-81]
* [@aljazceru](https://github.com/aljazceru) made their first contribution in [#24193](https://github.com/ccxt/ccxt/pull/24193)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.28...4.4.29](https://github.com/ccxt/ccxt/compare/4.4.28...4.4.29)
[Changes][4.4.29]
# [4.4.28](https://github.com/ccxt/ccxt/releases/tag/4.4.28) - 2024-11-08 [#4428---2024-11-08]
## What's Changed [#whats-changed-147]
* feat(binance): add option block order endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#24189](https://github.com/ccxt/ccxt/pull/24189)
* alpaca: add withdraw, fetchDeposits, fetchWithdrawals tests by [@Dan-krm](https://github.com/Dan-krm) in [#24190](https://github.com/ccxt/ccxt/pull/24190)
* fix(binance): watchPositions type inference by [@carlosmiei](https://github.com/carlosmiei) in [#24195](https://github.com/ccxt/ccxt/pull/24195)
* fix(kraken) - order parsing by [@ttodua](https://github.com/ttodua) in [#24192](https://github.com/ccxt/ccxt/pull/24192)
* wavesexchange fetchOrder docstring by [@samgermain](https://github.com/samgermain) in [#24197](https://github.com/ccxt/ccxt/pull/24197)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.27...4.4.28](https://github.com/ccxt/ccxt/compare/4.4.27...4.4.28)
[Changes][4.4.28]
# [4.4.27](https://github.com/ccxt/ccxt/releases/tag/4.4.27) - 2024-11-06 [#4427---2024-11-06]
## What's Changed [#whats-changed-148]
* feat(coinbase) - fetchDepositsWithdrawals by [@ttodua](https://github.com/ttodua) in [#24155](https://github.com/ccxt/ccxt/pull/24155)
* fix(hyperliquid): update rl by [@sc0Vu](https://github.com/sc0Vu) in [#24132](https://github.com/ccxt/ccxt/pull/24132)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#24162](https://github.com/ccxt/ccxt/pull/24162)
* fix(lbank): catch error when handle ping by [@sc0Vu](https://github.com/sc0Vu) in [#24161](https://github.com/ccxt/ccxt/pull/24161)
* fix exchanges logos starting with letters A and B by [@k0ne](https://github.com/k0ne) in [#24150](https://github.com/ccxt/ccxt/pull/24150)
* fix Bybit fetchFundingRates by [@cheunhong](https://github.com/cheunhong) in [#24156](https://github.com/ccxt/ccxt/pull/24156)
* wavesexchange doc links by [@samgermain](https://github.com/samgermain) in [#24163](https://github.com/ccxt/ccxt/pull/24163)
* feat(gate): protect loadUnifiedStatus call by [@carlosmiei](https://github.com/carlosmiei) in [#24164](https://github.com/ccxt/ccxt/pull/24164)
* fix(coinex): transfer account id by [@carlosmiei](https://github.com/carlosmiei) in [#24165](https://github.com/ccxt/ccxt/pull/24165)
* fix(bingx): createOrders adjustments by [@Sem-Z](https://github.com/Sem-Z) in [#24170](https://github.com/ccxt/ccxt/pull/24170)
* feat(lbank) fetchFundingRates by [@cheunhong](https://github.com/cheunhong) in [#24166](https://github.com/ccxt/ccxt/pull/24166)
* feat(alpaca): withdraw, fetchDepositsWithdrawals by [@Dan-krm](https://github.com/Dan-krm) in [#24169](https://github.com/ccxt/ccxt/pull/24169)
* docs: update `ccxt.js` reference by [@emmanuel-ferdman](https://github.com/emmanuel-ferdman) in [#24175](https://github.com/ccxt/ccxt/pull/24175)
* wavesexchange docstrings by [@samgermain](https://github.com/samgermain) in [#24178](https://github.com/ccxt/ccxt/pull/24178)
* fix(bingx): use addressWithPrefix inside parseDepositAddress by [@carlosmiei](https://github.com/carlosmiei) in [#24182](https://github.com/ccxt/ccxt/pull/24182)
* fix(watchTickers/bidsAsks): default market by [@carlosmiei](https://github.com/carlosmiei) in [#24183](https://github.com/ccxt/ccxt/pull/24183)
* feat(cli) - static request & response auto-writing by [@ttodua](https://github.com/ttodua) in [#24149](https://github.com/ccxt/ccxt/pull/24149)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24184](https://github.com/ccxt/ccxt/pull/24184)
* feat(Exchange): add unWatch base implementations by [@carlosmiei](https://github.com/carlosmiei) in [#24185](https://github.com/ccxt/ccxt/pull/24185)
* fix(build): unwatchOHLCVForSymbols signature by [@carlosmiei](https://github.com/carlosmiei) in [#24186](https://github.com/ccxt/ccxt/pull/24186)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24187](https://github.com/ccxt/ccxt/pull/24187)
## New Contributors [#new-contributors-82]
* [@Sem-Z](https://github.com/Sem-Z) made their first contribution in [#24170](https://github.com/ccxt/ccxt/pull/24170)
* [@emmanuel-ferdman](https://github.com/emmanuel-ferdman) made their first contribution in [#24175](https://github.com/ccxt/ccxt/pull/24175)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.26...4.4.27](https://github.com/ccxt/ccxt/compare/4.4.26...4.4.27)
[Changes][4.4.27]
# [4.4.26](https://github.com/ccxt/ccxt/releases/tag/4.4.26) - 2024-11-03 [#4426---2024-11-03]
## What's Changed [#whats-changed-149]
* feat(okx): add staking product-info endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#24116](https://github.com/ccxt/ccxt/pull/24116)
* phemex new endpoint by [@ndubel](https://github.com/ndubel) in [#24117](https://github.com/ccxt/ccxt/pull/24117)
* feat(bingx): add sync to createOrders by [@carlosmiei](https://github.com/carlosmiei) in [#24118](https://github.com/ccxt/ccxt/pull/24118)
* feat(bingx): add /positionMargin/history by [@carlosmiei](https://github.com/carlosmiei) in [#24122](https://github.com/ccxt/ccxt/pull/24122)
* feat(phemex): fetchMarkets add create time by [@Dan-krm](https://github.com/Dan-krm) in [#24120](https://github.com/ccxt/ccxt/pull/24120)
* Margin types by [@samgermain](https://github.com/samgermain) in [#24119](https://github.com/ccxt/ccxt/pull/24119)
* isSandboxMode by [@ttodua](https://github.com/ttodua) in [#23726](https://github.com/ccxt/ccxt/pull/23726)
* feat(bingx): reduceOnly through watchOrders by [@carlosmiei](https://github.com/carlosmiei) in [#24123](https://github.com/ccxt/ccxt/pull/24123)
* feat(exchanges): use BorrowInterest type in fetchBorrowInterest by [@Dan-krm](https://github.com/Dan-krm) in [#24121](https://github.com/ccxt/ccxt/pull/24121)
* fetchBorrowInterest, static request tests by [@Dan-krm](https://github.com/Dan-krm) in [#24128](https://github.com/ccxt/ccxt/pull/24128)
* feat(cex): add fetchOpenOrder/fetchClosedOrder by [@carlosmiei](https://github.com/carlosmiei) in [#24129](https://github.com/ccxt/ccxt/pull/24129)
* exmo: add watchOrders by [@sc0Vu](https://github.com/sc0Vu) in [#24106](https://github.com/ccxt/ccxt/pull/24106)
* feat(alpaca): add fetchMyTrades support by [@Dan-krm](https://github.com/Dan-krm) in [#24136](https://github.com/ccxt/ccxt/pull/24136)
* chore: update codeowners by [@carlosmiei](https://github.com/carlosmiei) in [#24137](https://github.com/ccxt/ccxt/pull/24137)
* feat: optimize hyperliquid ohlcv by [@sc0Vu](https://github.com/sc0Vu) in [#24130](https://github.com/ccxt/ccxt/pull/24130)
* fix(bitmart): update maxlimit by [@sc0Vu](https://github.com/sc0Vu) in [#24142](https://github.com/ccxt/ccxt/pull/24142)
* feat(alpaca): add fetchTicker and fetchTickers support by [@Dan-krm](https://github.com/Dan-krm) in [#24140](https://github.com/ccxt/ccxt/pull/24140)
* test(alpaca): static response, fetchMyTrades by [@Dan-krm](https://github.com/Dan-krm) in [#24143](https://github.com/ccxt/ccxt/pull/24143)
* fix(hyperliquid): fetchFundingRateHistory max limit by [@carlosmiei](https://github.com/carlosmiei) in [#24145](https://github.com/ccxt/ccxt/pull/24145)
* fix(exchange): normalize stringified number by [@carlosmiei](https://github.com/carlosmiei) in [#24148](https://github.com/ccxt/ccxt/pull/24148)
* fix(xt) - trades parsing by [@ttodua](https://github.com/ttodua) in [#24146](https://github.com/ccxt/ccxt/pull/24146)
* test(statics) - add supported flags ^ by [@ttodua](https://github.com/ttodua) in [#24147](https://github.com/ccxt/ccxt/pull/24147)
* feat(alpaca): add fetchDepositAddress by [@Dan-krm](https://github.com/Dan-krm) in [#24152](https://github.com/ccxt/ccxt/pull/24152)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24153](https://github.com/ccxt/ccxt/pull/24153)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.25...4.4.26](https://github.com/ccxt/ccxt/compare/4.4.25...4.4.26)
[Changes][4.4.26]
# [4.4.25](https://github.com/ccxt/ccxt/releases/tag/4.4.25) - 2024-10-29 [#4425---2024-10-29]
## What's Changed [#whats-changed-150]
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#24096](https://github.com/ccxt/ccxt/pull/24096)
* fix woofipro logo by [@k0ne](https://github.com/k0ne) in [#24094](https://github.com/ccxt/ccxt/pull/24094)
* fix(coinex) - network codes unified, withdraw & fetchDepositAddress by [@ttodua](https://github.com/ttodua) in [#24098](https://github.com/ccxt/ccxt/pull/24098)
* fix(bitmex): correct fee by [@sc0Vu](https://github.com/sc0Vu) in [#24105](https://github.com/ccxt/ccxt/pull/24105)
* fix(xt): correct percentage by [@sc0Vu](https://github.com/sc0Vu) in [#24104](https://github.com/ccxt/ccxt/pull/24104)
* fix(hitbtc) - remove safeNetwork by [@ttodua](https://github.com/ttodua) in [#23543](https://github.com/ccxt/ccxt/pull/23543)
* fix(cs) - this.limits by [@ttodua](https://github.com/ttodua) in [#24097](https://github.com/ccxt/ccxt/pull/24097)
* fix(htx) - trigger orders support ^ by [@ttodua](https://github.com/ttodua) in [#24110](https://github.com/ccxt/ccxt/pull/24110)
* fix(xt): percentage using Precise by [@carlosmiei](https://github.com/carlosmiei) in [#24112](https://github.com/ccxt/ccxt/pull/24112)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.24...4.4.25](https://github.com/ccxt/ccxt/compare/4.4.24...4.4.25)
[Changes][4.4.25]
# [4.4.24](https://github.com/ccxt/ccxt/releases/tag/4.4.24) - 2024-10-26 [#4424---2024-10-26]
## What's Changed [#whats-changed-151]
* fix(coincatch): logo by [@carlosmiei](https://github.com/carlosmiei) in [#24078](https://github.com/ccxt/ccxt/pull/24078)
* feat(gate): fetchBorrowInterest by [@Dan-krm](https://github.com/Dan-krm) in [#24075](https://github.com/ccxt/ccxt/pull/24075)
* fix(binance) - asyn end slash ^ by [@ttodua](https://github.com/ttodua) in [#24079](https://github.com/ccxt/ccxt/pull/24079)
* fix(gate) - trigger orders updates by [@ttodua](https://github.com/ttodua) in [#24016](https://github.com/ccxt/ccxt/pull/24016)
* fix(tests) - types and fixes for exchanges by [@ttodua](https://github.com/ttodua) in [#24050](https://github.com/ccxt/ccxt/pull/24050)
* fix(bybit): handle uta2.0 inside fetchBalance by [@carlosmiei](https://github.com/carlosmiei) in [#24081](https://github.com/ccxt/ccxt/pull/24081)
* feat(gate): borrowCrossMargin, repayCrossMargin unifiedAccount by [@Dan-krm](https://github.com/Dan-krm) in [#24074](https://github.com/ccxt/ccxt/pull/24074)
* test(kucoin) - withdraw resp by [@ttodua](https://github.com/ttodua) in [#24063](https://github.com/ccxt/ccxt/pull/24063)
* fix(kucoin) - auto migration detect by [@ttodua](https://github.com/ttodua) in [#24054](https://github.com/ccxt/ccxt/pull/24054)
* fix(gate): params persistence by [@carlosmiei](https://github.com/carlosmiei) in [#24083](https://github.com/ccxt/ccxt/pull/24083)
* fix(safeOrder): parse trades normally by [@carlosmiei](https://github.com/carlosmiei) in [#24086](https://github.com/ccxt/ccxt/pull/24086)
* fix(kucoin): handle\_my\_trade in php by [@carlosmiei](https://github.com/carlosmiei) in [#24091](https://github.com/ccxt/ccxt/pull/24091)
* feat(gate): add unified support to spot create, fetch and cancel methods by [@Dan-krm](https://github.com/Dan-krm) in [#24089](https://github.com/ccxt/ccxt/pull/24089)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24092](https://github.com/ccxt/ccxt/pull/24092)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.23...4.4.24](https://github.com/ccxt/ccxt/compare/4.4.23...4.4.24)
[Changes][4.4.24]
# [4.4.23](https://github.com/ccxt/ccxt/releases/tag/4.4.23) - 2024-10-23 [#4423---2024-10-23]
## What's Changed [#whats-changed-152]
* Manual: borrowCrossMargin, repayCrossMargin, borrowIsolatedMargin, repayIsolatedMargin by [@Dan-krm](https://github.com/Dan-krm) in [#24069](https://github.com/ccxt/ccxt/pull/24069)
* feat(binance): add endpoints, adjust papi weights by [@Dan-krm](https://github.com/Dan-krm) in [#24067](https://github.com/ccxt/ccxt/pull/24067)
* feat(coinex): closePosition by [@Dan-krm](https://github.com/Dan-krm) in [#24068](https://github.com/ccxt/ccxt/pull/24068)
* Coincatch integration by [@rayBastard](https://github.com/rayBastard) in [#23589](https://github.com/ccxt/ccxt/pull/23589)
* has related to funding rate methods by [@samgermain](https://github.com/samgermain) in [#24066](https://github.com/ccxt/ccxt/pull/24066)
* feat(coinbase): update fetchMyTrades pagination max entries by [@carlosmiei](https://github.com/carlosmiei) in [#24071](https://github.com/ccxt/ccxt/pull/24071)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24072](https://github.com/ccxt/ccxt/pull/24072)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.22...4.4.23](https://github.com/ccxt/ccxt/compare/4.4.22...4.4.23)
[Changes][4.4.23]
# [4.4.22](https://github.com/ccxt/ccxt/releases/tag/4.4.22) - 2024-10-22 [#4422---2024-10-22]
## What's Changed [#whats-changed-153]
* test: skip fetchL2OrderBook in ndax by [@sc0Vu](https://github.com/sc0Vu) in [#24043](https://github.com/ccxt/ccxt/pull/24043)
* new api - CEX PLUS by [@ttodua](https://github.com/ttodua) in [#23942](https://github.com/ccxt/ccxt/pull/23942)
* fix(cli) - ts fix `info` removal by [@ttodua](https://github.com/ttodua) in [#24046](https://github.com/ccxt/ccxt/pull/24046)
* test(comments) - minor change ^ by [@ttodua](https://github.com/ttodua) in [#24047](https://github.com/ccxt/ccxt/pull/24047)
* feat(bitflyer): fetchFundingRate by [@samgermain](https://github.com/samgermain) in [#24049](https://github.com/ccxt/ccxt/pull/24049)
* feat(sh): update cleanup by [@sc0Vu](https://github.com/sc0Vu) in [#24053](https://github.com/ccxt/ccxt/pull/24053)
* has: funding rate methods by [@samgermain](https://github.com/samgermain) in [#24048](https://github.com/ccxt/ccxt/pull/24048)
* fix(php) - unsubscribe error by [@ttodua](https://github.com/ttodua) in [#24045](https://github.com/ccxt/ccxt/pull/24045)
* fix(htx): update cost by [@sc0Vu](https://github.com/sc0Vu) in [#24041](https://github.com/ccxt/ccxt/pull/24041)
* feat(exchanges): fetchLongShortRatio, fetchLongShortRatioHistory by [@Dan-krm](https://github.com/Dan-krm) in [#24011](https://github.com/ccxt/ccxt/pull/24011)
* feat(gate): fetchBalance, unified support by [@Dan-krm](https://github.com/Dan-krm) in [#23961](https://github.com/ccxt/ccxt/pull/23961)
* fix(kucoin) - update withdraw endpoint by [@ttodua](https://github.com/ttodua) in [#24059](https://github.com/ccxt/ccxt/pull/24059)
* fix(hyperliquid): contracts units/and unrealizedPnl by [@carlosmiei](https://github.com/carlosmiei) in [#24060](https://github.com/ccxt/ccxt/pull/24060)
* fix(cryptocom): add fetchMyTrades pagination limit by [@carlosmiei](https://github.com/carlosmiei) in [#24062](https://github.com/ccxt/ccxt/pull/24062)
* fix(kucoin) - createDepositAddress & static tests by [@ttodua](https://github.com/ttodua) in [#24057](https://github.com/ccxt/ccxt/pull/24057)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24064](https://github.com/ccxt/ccxt/pull/24064)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.21...4.4.22](https://github.com/ccxt/ccxt/compare/4.4.21...4.4.22)
[Changes][4.4.22]
# [4.4.21](https://github.com/ccxt/ccxt/releases/tag/4.4.21) - 2024-10-21 [#4421---2024-10-21]
## What's Changed [#whats-changed-154]
* Bingx withdraw tag fix by [@AresArtemius](https://github.com/AresArtemius) in [#24019](https://github.com/ccxt/ccxt/pull/24019)
* htx.fetchMarkets docstring [@see](https://github.com/see) by [@samgermain](https://github.com/samgermain) in [#24018](https://github.com/ccxt/ccxt/pull/24018)
* feat(kucoin): add announcements and avgDealPrice by [@carlosmiei](https://github.com/carlosmiei) in [#24021](https://github.com/ccxt/ccxt/pull/24021)
* fix(paradex): circular dependencies by [@egorbulat98](https://github.com/egorbulat98) in [#24022](https://github.com/ccxt/ccxt/pull/24022)
* feat(bybit): add fetchBorrowRateHistory by [@carlosmiei](https://github.com/carlosmiei) in [#24020](https://github.com/ccxt/ccxt/pull/24020)
* docs(ws) - fixes by [@ttodua](https://github.com/ttodua) in [#24032](https://github.com/ccxt/ccxt/pull/24032)
* feat(okx) - api updates by [@ttodua](https://github.com/ttodua) in [#24028](https://github.com/ccxt/ccxt/pull/24028)
* test(ndax) - skip ^ by [@ttodua](https://github.com/ttodua) in [#24030](https://github.com/ccxt/ccxt/pull/24030)
* feat(cli) - request ^ by [@ttodua](https://github.com/ttodua) in [#24026](https://github.com/ccxt/ccxt/pull/24026)
* fix(bybit): watchOHLCV normalize symbol by [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues) in [#24027](https://github.com/ccxt/ccxt/pull/24027)
* docs(ws) - unwatch by [@ttodua](https://github.com/ttodua) in [#24033](https://github.com/ccxt/ccxt/pull/24033)
* fix(hyperliquid): position size by [@carlosmiei](https://github.com/carlosmiei) in [#24035](https://github.com/ccxt/ccxt/pull/24035)
* htx docstrings by [@samgermain](https://github.com/samgermain) in [#24037](https://github.com/ccxt/ccxt/pull/24037)
* fix(kucoin): fetchDepositWithdrawFee parsing by [@carlosmiei](https://github.com/carlosmiei) in [#24039](https://github.com/ccxt/ccxt/pull/24039)
* fix: ws memory leak on watchMultiple by using watchable un promise as static dependency by [@pcriadoperez](https://github.com/pcriadoperez) in [#23988](https://github.com/ccxt/ccxt/pull/23988)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24040](https://github.com/ccxt/ccxt/pull/24040)
## New Contributors [#new-contributors-83]
* [@AresArtemius](https://github.com/AresArtemius) made their first contribution in [#24019](https://github.com/ccxt/ccxt/pull/24019)
* [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues) made their first contribution in [#24027](https://github.com/ccxt/ccxt/pull/24027)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.20...4.4.21](https://github.com/ccxt/ccxt/compare/4.4.20...4.4.21)
[Changes][4.4.21]
# [4.4.20](https://github.com/ccxt/ccxt/releases/tag/4.4.20) - 2024-10-17 [#4420---2024-10-17]
## What's Changed [#whats-changed-155]
* fix(bybit): fetchOpenInterest pagination by [@carlosmiei](https://github.com/carlosmiei) in [#24006](https://github.com/ccxt/ccxt/pull/24006)
* feat(phemex): fetchOpenInterest by [@samgermain](https://github.com/samgermain) in [#24009](https://github.com/ccxt/ccxt/pull/24009)
* docs(static-tests) - fix ^ by [@ttodua](https://github.com/ttodua) in [#24010](https://github.com/ccxt/ccxt/pull/24010)
* fix(coinbaseadvanced): alias for pro/sockets by [@samgermain](https://github.com/samgermain) in [#24008](https://github.com/ccxt/ccxt/pull/24008)
* fix(lbank): since/limit workaorund by [@carlosmiei](https://github.com/carlosmiei) in [#24012](https://github.com/ccxt/ccxt/pull/24012)
* fix(staticTests): phemex wrong format by [@carlosmiei](https://github.com/carlosmiei) in [#24015](https://github.com/ccxt/ccxt/pull/24015)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24014](https://github.com/ccxt/ccxt/pull/24014)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24017](https://github.com/ccxt/ccxt/pull/24017)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.19...4.4.20](https://github.com/ccxt/ccxt/compare/4.4.19...4.4.20)
[Changes][4.4.20]
# [4.4.19](https://github.com/ccxt/ccxt/releases/tag/4.4.19) - 2024-10-16 [#4419---2024-10-16]
## What's Changed [#whats-changed-156]
* fix(bitget): active market using strings by [@carlosmiei](https://github.com/carlosmiei) in [#23993](https://github.com/ccxt/ccxt/pull/23993)
* feat(kucoinfutures): add cancelOrders by [@carlosmiei](https://github.com/carlosmiei) in [#23994](https://github.com/ccxt/ccxt/pull/23994)
* feat(binance): add usdm convert endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#24000](https://github.com/ccxt/ccxt/pull/24000)
* fix(types): add limits.market by [@sc0Vu](https://github.com/sc0Vu) in [#23992](https://github.com/ccxt/ccxt/pull/23992)
* fix(hyperliquid): add more order status by [@sc0Vu](https://github.com/sc0Vu) in [#24001](https://github.com/ccxt/ccxt/pull/24001)
* htx docstrings by [@samgermain](https://github.com/samgermain) in [#23999](https://github.com/ccxt/ccxt/pull/23999)
* test(market) - skip min/max for inactive markets by [@ttodua](https://github.com/ttodua) in [#23996](https://github.com/ccxt/ccxt/pull/23996)
* fix(binance): options parsing and precision handling by [@carlosmiei](https://github.com/carlosmiei) in [#24002](https://github.com/ccxt/ccxt/pull/24002)
* feat(networks): bingx/bitget inconsistencies by [@carlosmiei](https://github.com/carlosmiei) in [#24003](https://github.com/ccxt/ccxt/pull/24003)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#24004](https://github.com/ccxt/ccxt/pull/24004)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.18...4.4.19](https://github.com/ccxt/ccxt/compare/4.4.18...4.4.19)
[Changes][4.4.19]
# [4.4.18](https://github.com/ccxt/ccxt/releases/tag/4.4.18) - 2024-10-14 [#4418---2024-10-14]
## What's Changed [#whats-changed-157]
* fix(bitso) - safeNetwork removal by [@ttodua](https://github.com/ttodua) in [#23541](https://github.com/ccxt/ccxt/pull/23541)
* htx.docstring [@see](https://github.com/see) by [@samgermain](https://github.com/samgermain) in [#23967](https://github.com/ccxt/ccxt/pull/23967)
* fix(okx): use oiUsd as openinterest value by [@sc0Vu](https://github.com/sc0Vu) in [#23971](https://github.com/ccxt/ccxt/pull/23971)
* fix(bitmart): correct change in ticker by [@sc0Vu](https://github.com/sc0Vu) in [#23966](https://github.com/ccxt/ccxt/pull/23966)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#23974](https://github.com/ccxt/ccxt/pull/23974)
* fix(mexc): createOrder parsing by [@carlosmiei](https://github.com/carlosmiei) in [#23978](https://github.com/ccxt/ccxt/pull/23978)
* feat(kucoinfutures): add tp+sl orders by [@carlosmiei](https://github.com/carlosmiei) in [#23979](https://github.com/ccxt/ccxt/pull/23979)
* fix(bingx): networks info by [@carlosmiei](https://github.com/carlosmiei) in [#23981](https://github.com/ccxt/ccxt/pull/23981)
* fix(bitget): watchOrders/MyTrades spot wildcard subscription by [@carlosmiei](https://github.com/carlosmiei) in [#23983](https://github.com/ccxt/ccxt/pull/23983)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23982](https://github.com/ccxt/ccxt/pull/23982)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.17...4.4.18](https://github.com/ccxt/ccxt/compare/4.4.17...4.4.18)
[Changes][4.4.18]
# [4.4.17](https://github.com/ccxt/ccxt/releases/tag/4.4.17) - 2024-10-11 [#4417---2024-10-11]
## What's Changed [#whats-changed-158]
* feat(base) - parseCurrencies & parseCurrency by [@ttodua](https://github.com/ttodua) in [#23943](https://github.com/ccxt/ccxt/pull/23943)
* feat(mexc): spotPrivateGetSelfSymbols by [@carlosmiei](https://github.com/carlosmiei) in [#23955](https://github.com/ccxt/ccxt/pull/23955)
* fix(binanceus) - margin currencies by [@ttodua](https://github.com/ttodua) in [#23960](https://github.com/ccxt/ccxt/pull/23960)
* feat(bingx): add fetchMarkPrice by [@sc0Vu](https://github.com/sc0Vu) in [#23954](https://github.com/ccxt/ccxt/pull/23954)
* fix(bybit): update error by [@sc0Vu](https://github.com/sc0Vu) in [#23962](https://github.com/ccxt/ccxt/pull/23962)
* feat(okx): add fetchMarkPrice by [@sc0Vu](https://github.com/sc0Vu) in [#23956](https://github.com/ccxt/ccxt/pull/23956)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23964](https://github.com/ccxt/ccxt/pull/23964)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.16...4.4.17](https://github.com/ccxt/ccxt/compare/4.4.16...4.4.17)
[Changes][4.4.17]
# [4.4.16](https://github.com/ccxt/ccxt/releases/tag/4.4.16) - 2024-10-10 [#4416---2024-10-10]
## What's Changed [#whats-changed-159]
* feat(okx): read indexPrice from index-tickers by [@carlosmiei](https://github.com/carlosmiei) in [#23933](https://github.com/ccxt/ccxt/pull/23933)
* few skips ^ by [@ttodua](https://github.com/ttodua) in [#23934](https://github.com/ccxt/ccxt/pull/23934)
* htx.fetchPosition docstring [@see](https://github.com/see) by [@samgermain](https://github.com/samgermain) in [#23930](https://github.com/ccxt/ccxt/pull/23930)
* tests - use proxy by [@ttodua](https://github.com/ttodua) in [#23936](https://github.com/ccxt/ccxt/pull/23936)
* feat(bitmart): add indexPrice to ticker by [@carlosmiei](https://github.com/carlosmiei) in [#23939](https://github.com/ccxt/ccxt/pull/23939)
* feat(binance): add fetchMarkPrice by [@sc0Vu](https://github.com/sc0Vu) in [#23938](https://github.com/ccxt/ccxt/pull/23938)
* feat(blofin): add fetchMarkPrice by [@carlosmiei](https://github.com/carlosmiei) in [#23940](https://github.com/ccxt/ccxt/pull/23940)
* Has spot by [@samgermain](https://github.com/samgermain) in [#23945](https://github.com/ccxt/ccxt/pull/23945)
* fetchPositions, fetchBorrowInterest docstrings by [@samgermain](https://github.com/samgermain) in [#23944](https://github.com/ccxt/ccxt/pull/23944)
* fetchDepositAddress, fetchDepositAddresses and fetchDepositAddressesByNetwork use DepositAddress and DepositAddress\[] types by [@Dan-krm](https://github.com/Dan-krm) in [#23947](https://github.com/ccxt/ccxt/pull/23947)
* fix(hyperliquid): update parsePosition by [@sc0Vu](https://github.com/sc0Vu) in [#23948](https://github.com/ccxt/ccxt/pull/23948)
* fix(lbank): fetchDepositWithdrawFees return by [@carlosmiei](https://github.com/carlosmiei) in [#23950](https://github.com/ccxt/ccxt/pull/23950)
* oxfun ws skip by [@ttodua](https://github.com/ttodua) in [#23953](https://github.com/ccxt/ccxt/pull/23953)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23951](https://github.com/ccxt/ccxt/pull/23951)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.15...4.4.16](https://github.com/ccxt/ccxt/compare/4.4.15...4.4.16)
[Changes][4.4.16]
# [4.4.15](https://github.com/ccxt/ccxt/releases/tag/4.4.15) - 2024-10-08 [#4415---2024-10-08]
## What's Changed [#whats-changed-160]
* Misc fixes by [@carlosmiei](https://github.com/carlosmiei) in [#23919](https://github.com/ccxt/ccxt/pull/23919)
* fix(onetrading): new url by [@carlosmiei](https://github.com/carlosmiei) in [#21109](https://github.com/ccxt/ccxt/pull/21109)
* upbit: add watchTickers by [@sc0Vu](https://github.com/sc0Vu) in [#23790](https://github.com/ccxt/ccxt/pull/23790)
* fix(tests) - oxfun skip ^ by [@ttodua](https://github.com/ttodua) in [#23926](https://github.com/ccxt/ccxt/pull/23926)
* feat(vertex): update encoding by [@sc0Vu](https://github.com/sc0Vu) in [#23903](https://github.com/ccxt/ccxt/pull/23903)
* htx rename FUD by [@ndubel](https://github.com/ndubel) in [#23927](https://github.com/ccxt/ccxt/pull/23927)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23928](https://github.com/ccxt/ccxt/pull/23928)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.14...4.4.15](https://github.com/ccxt/ccxt/compare/4.4.14...4.4.15)
[Changes][4.4.15]
# [4.4.14](https://github.com/ccxt/ccxt/releases/tag/4.4.14) - 2024-10-06 [#4414---2024-10-06]
## What's Changed [#whats-changed-161]
* fix(mexc): resolve until in fetchOrders by [@sc0Vu](https://github.com/sc0Vu) in [#23906](https://github.com/ccxt/ccxt/pull/23906)
* feat(bitget): fetchMarkPrice by [@carlosmiei](https://github.com/carlosmiei) in [#23901](https://github.com/ccxt/ccxt/pull/23901)
* feat(base) - fix currency to precision by [@ttodua](https://github.com/ttodua) in [#23887](https://github.com/ccxt/ccxt/pull/23887)
* feat(exchanges): fetchFundingInterval and fetchFundingIntervals by [@Dan-krm](https://github.com/Dan-krm) in [#23905](https://github.com/ccxt/ccxt/pull/23905)
* base tests- reorg (part 1) by [@ttodua](https://github.com/ttodua) in [#23895](https://github.com/ccxt/ccxt/pull/23895)
* feat(cryptocom): add v1PublicGetPublicGetRiskParameters by [@carlosmiei](https://github.com/carlosmiei) in [#23907](https://github.com/ccxt/ccxt/pull/23907)
* build(deps-dev): bump rollup from 2.79.1 to 2.79.2 by [@dependabot](https://github.com/dependabot) in [#23841](https://github.com/ccxt/ccxt/pull/23841)
* feat(okx): add watchMarkPrices by [@carlosmiei](https://github.com/carlosmiei) in [#23911](https://github.com/ccxt/ccxt/pull/23911)
* feat(tests): unnecessary vars by [@carlosmiei](https://github.com/carlosmiei) in [#23912](https://github.com/ccxt/ccxt/pull/23912)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#23914](https://github.com/ccxt/ccxt/pull/23914)
* fix(mexc): fetchDepositAddress/createDepositAddress network id by [@carlosmiei](https://github.com/carlosmiei) in [#23915](https://github.com/ccxt/ccxt/pull/23915)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23916](https://github.com/ccxt/ccxt/pull/23916)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.13...4.4.14](https://github.com/ccxt/ccxt/compare/4.4.13...4.4.14)
[Changes][4.4.14]
# [4.4.13](https://github.com/ccxt/ccxt/releases/tag/4.4.13) - 2024-10-03 [#4413---2024-10-03]
## What's Changed [#whats-changed-162]
* fix(tests) - inheritance refactor & props by [@ttodua](https://github.com/ttodua) in [#23817](https://github.com/ccxt/ccxt/pull/23817)
* feat(htx): add more static tests by [@carlosmiei](https://github.com/carlosmiei) in [#23866](https://github.com/ccxt/ccxt/pull/23866)
* fix(docs): maxPaginationCalls -> paginationCalls by [@carlosmiei](https://github.com/carlosmiei) in [#23891](https://github.com/ccxt/ccxt/pull/23891)
* fix(tests) - proxy ip (Q) by [@ttodua](https://github.com/ttodua) in [#23898](https://github.com/ccxt/ccxt/pull/23898)
* fix(tests) - oxfun skip (Q) by [@ttodua](https://github.com/ttodua) in [#23893](https://github.com/ccxt/ccxt/pull/23893)
* fix(tests) - kucoin taker (Q) by [@ttodua](https://github.com/ttodua) in [#23892](https://github.com/ccxt/ccxt/pull/23892)
* feat(woo): add watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23861](https://github.com/ccxt/ccxt/pull/23861)
* feat(types): add indexPrice and markPrice to ticker by [@carlosmiei](https://github.com/carlosmiei) in [#23889](https://github.com/ccxt/ccxt/pull/23889)
* fix(binance): add BNFCR currency by [@carlosmiei](https://github.com/carlosmiei) in [#23899](https://github.com/ccxt/ccxt/pull/23899)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23900](https://github.com/ccxt/ccxt/pull/23900)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.12...4.4.13](https://github.com/ccxt/ccxt/compare/4.4.12...4.4.13)
[Changes][4.4.13]
# [4.4.12](https://github.com/ccxt/ccxt/releases/tag/4.4.12) - 2024-10-02 [#4412---2024-10-02]
## What's Changed [#whats-changed-163]
* fix(kraken): createOrder, trailingLimitPercent by [@Dan-krm](https://github.com/Dan-krm) in [#23884](https://github.com/ccxt/ccxt/pull/23884)
* htx.fetchOrder docstring [@see](https://github.com/see) by [@samgermain](https://github.com/samgermain) in [#23882](https://github.com/ccxt/ccxt/pull/23882)
* createOrder: standardize hedged reduceOnly orders by [@Dan-krm](https://github.com/Dan-krm) in [#23871](https://github.com/ccxt/ccxt/pull/23871)
* fix(okx): fetchDepositAddress by [@carlosmiei](https://github.com/carlosmiei) in [#23885](https://github.com/ccxt/ccxt/pull/23885)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23886](https://github.com/ccxt/ccxt/pull/23886)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.11...4.4.12](https://github.com/ccxt/ccxt/compare/4.4.11...4.4.12)
[Changes][4.4.12]
# [4.4.11](https://github.com/ccxt/ccxt/releases/tag/4.4.11) - 2024-10-01 [#4411---2024-10-01]
## What's Changed [#whats-changed-164]
* fix(bitget): trx network unified by [@carlosmiei](https://github.com/carlosmiei) in [#23867](https://github.com/ccxt/ccxt/pull/23867)
* feat(htx): rename NGL token by [@carlosmiei](https://github.com/carlosmiei) in [#23868](https://github.com/ccxt/ccxt/pull/23868)
* feat(binance): add /papi/v1/um/feeBurn by [@carlosmiei](https://github.com/carlosmiei) in [#23869](https://github.com/ccxt/ccxt/pull/23869)
* feat(okx): add error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#23876](https://github.com/ccxt/ccxt/pull/23876)
* fix(okx): watchMYTrades resolve by [@carlosmiei](https://github.com/carlosmiei) in [#23877](https://github.com/ccxt/ccxt/pull/23877)
* feat(exmo): add watchTickers by [@sc0Vu](https://github.com/sc0Vu) in [#23873](https://github.com/ccxt/ccxt/pull/23873)
* htx.setLeverage docstring see by [@samgermain](https://github.com/samgermain) in [#23870](https://github.com/ccxt/ccxt/pull/23870)
* fix(proxy) - change port by [@ttodua](https://github.com/ttodua) in [#23874](https://github.com/ccxt/ccxt/pull/23874)
* feat(deribit): add watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23872](https://github.com/ccxt/ccxt/pull/23872)
* feat(kraken): createOrder, add trailingPercent support by [@Dan-krm](https://github.com/Dan-krm) in [#23850](https://github.com/ccxt/ccxt/pull/23850)
* feat(mexc): unify until by [@carlosmiei](https://github.com/carlosmiei) in [#23880](https://github.com/ccxt/ccxt/pull/23880)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23881](https://github.com/ccxt/ccxt/pull/23881)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.10...4.4.11](https://github.com/ccxt/ccxt/compare/4.4.10...4.4.11)
[Changes][4.4.11]
# [4.4.10](https://github.com/ccxt/ccxt/releases/tag/4.4.10) - 2024-09-30 [#4410---2024-09-30]
## What's Changed [#whats-changed-165]
* fix(bybit): add hedged inside position by [@carlosmiei](https://github.com/carlosmiei) in [#23848](https://github.com/ccxt/ccxt/pull/23848)
* feat(oceanex): fetchDepositAddress by [@samgermain](https://github.com/samgermain) in [#23811](https://github.com/ccxt/ccxt/pull/23811)
* feat(docs) - string (fixed-point) math ^ by [@ttodua](https://github.com/ttodua) in [#23805](https://github.com/ccxt/ccxt/pull/23805)
* feat(bybit): add "reduceOnly" support to hedged orders by [@carlosmiei](https://github.com/carlosmiei) in [#23851](https://github.com/ccxt/ccxt/pull/23851)
* fix(hyperliquid): fetchMyTrade - correct fee currency by [@samgermain](https://github.com/samgermain) in [#23855](https://github.com/ccxt/ccxt/pull/23855)
* htx.fetchSettlementHistory docstring see by [@samgermain](https://github.com/samgermain) in [#23856](https://github.com/ccxt/ccxt/pull/23856)
* Add FundingRate and FundingRates type usage to fetchFundingRate(s) by [@Dan-krm](https://github.com/Dan-krm) in [#23844](https://github.com/ccxt/ccxt/pull/23844)
* fix(gate): until handling inside fetchClosedorders for spot market by [@carlosmiei](https://github.com/carlosmiei) in [#23860](https://github.com/ccxt/ccxt/pull/23860)
* fix(bitget): unify USDT networks by [@carlosmiei](https://github.com/carlosmiei) in [#23863](https://github.com/ccxt/ccxt/pull/23863)
* feat(deribit): add watchTickers by [@sc0Vu](https://github.com/sc0Vu) in [#23862](https://github.com/ccxt/ccxt/pull/23862)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23864](https://github.com/ccxt/ccxt/pull/23864)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.9...4.4.10](https://github.com/ccxt/ccxt/compare/4.4.9...4.4.10)
[Changes][4.4.10]
# [4.4.9](https://github.com/ccxt/ccxt/releases/tag/4.4.9) - 2024-09-28 [#449---2024-09-28]
## What's Changed [#whats-changed-166]
* feat(gate): networks mapping by [@carlosmiei](https://github.com/carlosmiei) in [#23824](https://github.com/ccxt/ccxt/pull/23824)
* bingx parseMarket fix by [@ndubel](https://github.com/ndubel) in [#23831](https://github.com/ccxt/ccxt/pull/23831)
* feat(p2b): add watchTickers by [@sc0Vu](https://github.com/sc0Vu) in [#23837](https://github.com/ccxt/ccxt/pull/23837)
* feat(hitbtc): update ws by [@sc0Vu](https://github.com/sc0Vu) in [#23827](https://github.com/ccxt/ccxt/pull/23827)
* hollaex: add [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#23826](https://github.com/ccxt/ccxt/pull/23826)
* fix(cs) - cli null exchanges by [@ttodua](https://github.com/ttodua) in [#23832](https://github.com/ccxt/ccxt/pull/23832)
* fix(binance): update watchBalance by [@sc0Vu](https://github.com/sc0Vu) in [#23839](https://github.com/ccxt/ccxt/pull/23839)
* okx: update ws error by [@sc0Vu](https://github.com/sc0Vu) in [#23840](https://github.com/ccxt/ccxt/pull/23840)
* feat(whitebit): add watchTickers by [@sc0Vu](https://github.com/sc0Vu) in [#23838](https://github.com/ccxt/ccxt/pull/23838)
* kucoin - new endpoints, new methods .. by [@ttodua](https://github.com/ttodua) in [#23835](https://github.com/ccxt/ccxt/pull/23835)
* fix(bybit): support hedged inside createOrder by [@carlosmiei](https://github.com/carlosmiei) in [#23845](https://github.com/ccxt/ccxt/pull/23845)
* htx.fetchAccounts, fetchCurrencies by [@samgermain](https://github.com/samgermain) in [#23842](https://github.com/ccxt/ccxt/pull/23842)
* feat(gate): add historical endpoint to fetchClosedOrders by [@carlosmiei](https://github.com/carlosmiei) in [#23846](https://github.com/ccxt/ccxt/pull/23846)
* feat(bigone):assets to v3 by [@cjh-cao](https://github.com/cjh-cao) in [#23825](https://github.com/ccxt/ccxt/pull/23825)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23847](https://github.com/ccxt/ccxt/pull/23847)
## New Contributors [#new-contributors-84]
* [@cjh-cao](https://github.com/cjh-cao) made their first contribution in [#23825](https://github.com/ccxt/ccxt/pull/23825)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.8...4.4.9](https://github.com/ccxt/ccxt/compare/4.4.8...4.4.9)
[Changes][4.4.9]
# [4.4.8](https://github.com/ccxt/ccxt/releases/tag/4.4.8) - 2024-09-25 [#448---2024-09-25]
## What's Changed [#whats-changed-167]
* fix(binance): margin markets loading by [@carlosmiei](https://github.com/carlosmiei) in [#23808](https://github.com/ccxt/ccxt/pull/23808)
* htx.fetchTicker docstring [@see](https://github.com/see) by [@samgermain](https://github.com/samgermain) in [#23812](https://github.com/ccxt/ccxt/pull/23812)
* bitvavo: add ws watchTickers / watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23813](https://github.com/ccxt/ccxt/pull/23813)
* feat(blofin): add watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23819](https://github.com/ccxt/ccxt/pull/23819)
* Bybit: add conversion trade methods by [@Dan-krm](https://github.com/Dan-krm) in [#23814](https://github.com/ccxt/ccxt/pull/23814)
* feat(binance): repayCrossMargin alternative endpoint by [@Dan-krm](https://github.com/Dan-krm) in [#23802](https://github.com/ccxt/ccxt/pull/23802)
* okx: add apis, update error code by [@sc0Vu](https://github.com/sc0Vu) in [#23758](https://github.com/ccxt/ccxt/pull/23758)
* feat(bitmart): add watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23750](https://github.com/ccxt/ccxt/pull/23750)
* htx(fetchOrderBook, fetchOrderTrades, fetchSpotOrderTrades): docstrings by [@samgermain](https://github.com/samgermain) in [#23820](https://github.com/ccxt/ccxt/pull/23820)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23821](https://github.com/ccxt/ccxt/pull/23821)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.7...4.4.8](https://github.com/ccxt/ccxt/compare/4.4.7...4.4.8)
[Changes][4.4.8]
# [4.4.7](https://github.com/ccxt/ccxt/releases/tag/4.4.7) - 2024-09-24 [#447---2024-09-24]
## What's Changed [#whats-changed-168]
* mexc docstring links by [@samgermain](https://github.com/samgermain) in [#23786](https://github.com/ccxt/ccxt/pull/23786)
* mexc: update by [@sc0Vu](https://github.com/sc0Vu) in [#23788](https://github.com/ccxt/ccxt/pull/23788)
* fix(networks): inconsistencies by [@carlosmiei](https://github.com/carlosmiei) in [#23789](https://github.com/ccxt/ccxt/pull/23789)
* feat(bitget,mexc): add networks by [@carlosmiei](https://github.com/carlosmiei) in [#23792](https://github.com/ccxt/ccxt/pull/23792)
* feat(mexc): setMarginMode by [@samgermain](https://github.com/samgermain) in [#23755](https://github.com/ccxt/ccxt/pull/23755)
* feat(cli): close connection by [@sc0Vu](https://github.com/sc0Vu) in [#23796](https://github.com/ccxt/ccxt/pull/23796)
* feat(okx): expose requestId in ws by [@sc0Vu](https://github.com/sc0Vu) in [#23795](https://github.com/ccxt/ccxt/pull/23795)
* feat(bitget): add watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23803](https://github.com/ccxt/ccxt/pull/23803)
* feat(bitmart): add editOrder with trigger, sl/tp support by [@Dan-krm](https://github.com/Dan-krm) in [#23799](https://github.com/ccxt/ccxt/pull/23799)
* fix(fetchPaginatedCallCursor): search cursor by [@carlosmiei](https://github.com/carlosmiei) in [#23800](https://github.com/ccxt/ccxt/pull/23800)
* fix(bybit): parseLedgerEntry, parseToNumeric on undefined value by [@Dan-krm](https://github.com/Dan-krm) in [#23801](https://github.com/ccxt/ccxt/pull/23801)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23804](https://github.com/ccxt/ccxt/pull/23804)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.6...4.4.7](https://github.com/ccxt/ccxt/compare/4.4.6...4.4.7)
[Changes][4.4.7]
# [4.4.6](https://github.com/ccxt/ccxt/releases/tag/4.4.6) - 2024-09-22 [#446---2024-09-22]
## What's Changed [#whats-changed-169]
* htx: add [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#23760](https://github.com/ccxt/ccxt/pull/23760)
* mexc has by [@samgermain](https://github.com/samgermain) in [#23754](https://github.com/ccxt/ccxt/pull/23754)
* refactor(bitmart): fetchTickers, fetchTicker, fetchMarkets swap response by [@Dan-krm](https://github.com/Dan-krm) in [#23761](https://github.com/ccxt/ccxt/pull/23761)
* feat(bybit): load preLaunch markets by [@carlosmiei](https://github.com/carlosmiei) in [#23762](https://github.com/ccxt/ccxt/pull/23762)
* feat(mexc,kraken,bitget): add adjustTimeDifference option by [@carlosmiei](https://github.com/carlosmiei) in [#23763](https://github.com/ccxt/ccxt/pull/23763)
* kraken: add watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23759](https://github.com/ccxt/ccxt/pull/23759)
* feat(bitmart): createOrder, add stopLossPrice and takeProfitPrice by [@Dan-krm](https://github.com/Dan-krm) in [#23767](https://github.com/ccxt/ccxt/pull/23767)
* Coinbase: clearly document fetchDeposits/Withdrawals/Ledger by [@Bomper](https://github.com/Bomper) in [#23773](https://github.com/ccxt/ccxt/pull/23773)
* Update Manual.md: clarify trade vs. transaction structure by [@Bomper](https://github.com/Bomper) in [#23768](https://github.com/ccxt/ccxt/pull/23768)
* Update API key format in coinbase-fetch-all-balances.js by [@Bomper](https://github.com/Bomper) in [#23770](https://github.com/ccxt/ccxt/pull/23770)
* fix(bitflyer): fix handleErrors by [@carlosmiei](https://github.com/carlosmiei) in [#23782](https://github.com/ccxt/ccxt/pull/23782)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#23781](https://github.com/ccxt/ccxt/pull/23781)
* fix(mexc): bsc-> bep20 mapping by [@carlosmiei](https://github.com/carlosmiei) in [#23783](https://github.com/ccxt/ccxt/pull/23783)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23764](https://github.com/ccxt/ccxt/pull/23764)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.5...4.4.6](https://github.com/ccxt/ccxt/compare/4.4.5...4.4.6)
[Changes][4.4.6]
# [4.4.5](https://github.com/ccxt/ccxt/releases/tag/4.4.5) - 2024-09-19 [#445---2024-09-19]
## What's Changed [#whats-changed-170]
* fix(paradex): update api by [@sc0Vu](https://github.com/sc0Vu) in [#23743](https://github.com/ccxt/ccxt/pull/23743)
* mexc docstring [@see](https://github.com/see) by [@samgermain](https://github.com/samgermain) in [#23747](https://github.com/ccxt/ccxt/pull/23747)
* feat(bybit) - fetchOrder by [@ttodua](https://github.com/ttodua) in [#23746](https://github.com/ccxt/ccxt/pull/23746)
* lykke parseBalance fix by [@ndubel](https://github.com/ndubel) in [#23752](https://github.com/ccxt/ccxt/pull/23752)
* feat(hyperliquid): add watchTicker by [@sc0Vu](https://github.com/sc0Vu) in [#23751](https://github.com/ccxt/ccxt/pull/23751)
* feat(bitget): add margin in fetchMarkets by [@sc0Vu](https://github.com/sc0Vu) in [#23738](https://github.com/ccxt/ccxt/pull/23738)
* feat(binanceus): skip margin loading by [@carlosmiei](https://github.com/carlosmiei) in [#23749](https://github.com/ccxt/ccxt/pull/23749)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23753](https://github.com/ccxt/ccxt/pull/23753)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.4...4.4.5](https://github.com/ccxt/ccxt/compare/4.4.4...4.4.5)
[Changes][4.4.5]
# [4.4.4](https://github.com/ccxt/ccxt/releases/tag/4.4.4) - 2024-09-18 [#444---2024-09-18]
## What's Changed [#whats-changed-171]
* fix(mexc) - loading rl by [@ttodua](https://github.com/ttodua) in [#23698](https://github.com/ccxt/ccxt/pull/23698)
* kucoin handleErrors full message by [@ndubel](https://github.com/ndubel) in [#23706](https://github.com/ccxt/ccxt/pull/23706)
* feat(okx): add error code by [@carlosmiei](https://github.com/carlosmiei) in [#23714](https://github.com/ccxt/ccxt/pull/23714)
* Mexc transfer method docstrings by [@samgermain](https://github.com/samgermain) in [#23717](https://github.com/ccxt/ccxt/pull/23717)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#23718](https://github.com/ccxt/ccxt/pull/23718)
* docs(mexc): docstring [@see](https://github.com/see) links by [@samgermain](https://github.com/samgermain) in [#23722](https://github.com/ccxt/ccxt/pull/23722)
* fix(examples): update import path by [@sc0Vu](https://github.com/sc0Vu) in [#23725](https://github.com/ccxt/ccxt/pull/23725)
* added pop method to BaseCache by [@cheunhong](https://github.com/cheunhong) in [#23720](https://github.com/ccxt/ccxt/pull/23720)
* refactor(Exchange): add usage of the LedgerEntry type in fetchLedger by [@Dan-krm](https://github.com/Dan-krm) in [#23681](https://github.com/ccxt/ccxt/pull/23681)
* feat(test) - repeat pause increase by [@ttodua](https://github.com/ttodua) in [#23727](https://github.com/ccxt/ccxt/pull/23727)
* readme - build ohlc bars !Q by [@ttodua](https://github.com/ttodua) in [#21587](https://github.com/ccxt/ccxt/pull/21587)
* hyperliquid: update precision mode by [@sc0Vu](https://github.com/sc0Vu) in [#23560](https://github.com/ccxt/ccxt/pull/23560)
* fix(build) broken jsdoc syntax for mexc by [@olegtaranenko](https://github.com/olegtaranenko) in [#23730](https://github.com/ccxt/ccxt/pull/23730)
* docs(mexc): docstring [@see](https://github.com/see) by [@samgermain](https://github.com/samgermain) in [#23729](https://github.com/ccxt/ccxt/pull/23729)
* feat(hyperliquid): add min cost by [@carlosmiei](https://github.com/carlosmiei) in [#23732](https://github.com/ccxt/ccxt/pull/23732)
* fix(deno): check whether self is undefined by [@sc0Vu](https://github.com/sc0Vu) in [#23733](https://github.com/ccxt/ccxt/pull/23733)
* feat(readme): trading campaign by [@carlosmiei](https://github.com/carlosmiei) in [#23734](https://github.com/ccxt/ccxt/pull/23734)
* feat(mexc): add watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23652](https://github.com/ccxt/ccxt/pull/23652)
* feat(bybit): add watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23644](https://github.com/ccxt/ccxt/pull/23644)
* p2b docstring fixes by [@samgermain](https://github.com/samgermain) in [#23736](https://github.com/ccxt/ccxt/pull/23736)
* build(deps): bump next from 14.1.1 to 14.2.10 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#23735](https://github.com/ccxt/ccxt/pull/23735)
* fix(python) - unclosed connection leak by [@ttodua](https://github.com/ttodua) in [#23470](https://github.com/ccxt/ccxt/pull/23470)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23742](https://github.com/ccxt/ccxt/pull/23742)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.3...4.4.4](https://github.com/ccxt/ccxt/compare/4.4.3...4.4.4)
[Changes][4.4.4]
# [4.4.3](https://github.com/ccxt/ccxt/releases/tag/4.4.3) - 2024-09-14 [#443---2024-09-14]
## What's Changed [#whats-changed-172]
* cryptocom: update [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#23693](https://github.com/ccxt/ccxt/pull/23693)
* feat(cryptocom): update ws by [@sc0Vu](https://github.com/sc0Vu) in [#23689](https://github.com/ccxt/ccxt/pull/23689)
* binance - `trigger` by [@ttodua](https://github.com/ttodua) in [#23688](https://github.com/ccxt/ccxt/pull/23688)
* feat(phemex): add watchTickers by [@sc0Vu](https://github.com/sc0Vu) in [#23696](https://github.com/ccxt/ccxt/pull/23696)
* mexc: add watchTickers by [@sc0Vu](https://github.com/sc0Vu) in [#23670](https://github.com/ccxt/ccxt/pull/23670)
* bybit error mapping by [@ndubel](https://github.com/ndubel) in [#23697](https://github.com/ccxt/ccxt/pull/23697)
* feat(c#): add arrayConcat helper by [@carlosmiei](https://github.com/carlosmiei) in [#23705](https://github.com/ccxt/ccxt/pull/23705)
* fix(okx): allow custom params in watchPositions by [@sc0Vu](https://github.com/sc0Vu) in [#23704](https://github.com/ccxt/ccxt/pull/23704)
* fix(mexc): swap watchTickers by [@sc0Vu](https://github.com/sc0Vu) in [#23702](https://github.com/ccxt/ccxt/pull/23702)
* feat(woofipro): add watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23701](https://github.com/ccxt/ccxt/pull/23701)
* feat(oxfun): add watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23703](https://github.com/ccxt/ccxt/pull/23703)
* xt parseMarket fix by [@ndubel](https://github.com/ndubel) in [#23699](https://github.com/ccxt/ccxt/pull/23699)
* bitmart cancelAllOrders new endpoint by [@ndubel](https://github.com/ndubel) in [#23707](https://github.com/ccxt/ccxt/pull/23707)
* fix(c#): rename name by [@carlosmiei](https://github.com/carlosmiei) in [#23709](https://github.com/ccxt/ccxt/pull/23709)
* fetchPositionMode, setPositionMode docstrings by [@samgermain](https://github.com/samgermain) in [#23710](https://github.com/ccxt/ccxt/pull/23710)
* bitstamp update fee tiers by [@ndubel](https://github.com/ndubel) in [#23708](https://github.com/ccxt/ccxt/pull/23708)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.2...4.4.3](https://github.com/ccxt/ccxt/compare/4.4.2...4.4.3)
[Changes][4.4.3]
# [4.4.2](https://github.com/ccxt/ccxt/releases/tag/4.4.2) - 2024-09-11 [#442---2024-09-11]
## What's Changed [#whats-changed-173]
* fix(Unsubscription): clean subscription safely by [@carlosmiei](https://github.com/carlosmiei) in [#23667](https://github.com/ccxt/ccxt/pull/23667)
* feat(kucoin): add unWatchOrderBook/unWatchTrades \[wip] by [@carlosmiei](https://github.com/carlosmiei) in [#23668](https://github.com/ccxt/ccxt/pull/23668)
* Mexc docstrings by [@samgermain](https://github.com/samgermain) in [#23672](https://github.com/ccxt/ccxt/pull/23672)
* bitmex: add [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#23669](https://github.com/ccxt/ccxt/pull/23669)
* fix(binance): watchBidsAsks by [@sc0Vu](https://github.com/sc0Vu) in [#23676](https://github.com/ccxt/ccxt/pull/23676)
* fix(cli) - readable stringify by [@ttodua](https://github.com/ttodua) in [#23674](https://github.com/ccxt/ccxt/pull/23674)
* feat(binance) - margin field in fetchCurrencies & margin data in fetchMarkets by [@ttodua](https://github.com/ttodua) in [#22913](https://github.com/ccxt/ccxt/pull/22913)
* fix(docs) - cross isolated readme ^Q by [@ttodua](https://github.com/ttodua) in [#23678](https://github.com/ccxt/ccxt/pull/23678)
* fix(currencycom,htx,mexc) - unrealized Pnl by [@ttodua](https://github.com/ttodua) in [#23679](https://github.com/ccxt/ccxt/pull/23679)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23682](https://github.com/ccxt/ccxt/pull/23682)
* fix(xt): OHLCV spot volume by [@carlosmiei](https://github.com/carlosmiei) in [#23683](https://github.com/ccxt/ccxt/pull/23683)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23687](https://github.com/ccxt/ccxt/pull/23687)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.4.1...4.4.2](https://github.com/ccxt/ccxt/compare/4.4.1...4.4.2)
[Changes][4.4.2]
# [4.4.1](https://github.com/ccxt/ccxt/releases/tag/4.4.1) - 2024-09-09 [#441---2024-09-09]
## What's Changed [#whats-changed-174]
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#23664](https://github.com/ccxt/ccxt/pull/23664)
* feat(hyperliquid): add unWatchTrades/OrderBook/OHLCV/Tickers by [@carlosmiei](https://github.com/carlosmiei) in [#23665](https://github.com/ccxt/ccxt/pull/23665)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.98...4.4.1](https://github.com/ccxt/ccxt/compare/4.3.98...4.4.1)
[Changes][4.4.1]
# [4.3.98](https://github.com/ccxt/ccxt/releases/tag/4.3.98) - 2024-09-07 [#4398---2024-09-07]
## What's Changed [#whats-changed-175]
* kraken: update doc by [@sc0Vu](https://github.com/sc0Vu) in [#23651](https://github.com/ccxt/ccxt/pull/23651)
* feat(htx): update watchOrderbook levels by [@zgayjjf](https://github.com/zgayjjf) in [#23649](https://github.com/ccxt/ccxt/pull/23649)
* fix(doc) - trigger order lines by [@ttodua](https://github.com/ttodua) in [#23643](https://github.com/ccxt/ccxt/pull/23643)
* fix(gate): createOrderWs swap market orders by [@carlosmiei](https://github.com/carlosmiei) in [#23654](https://github.com/ccxt/ccxt/pull/23654)
* bitget error mapping by [@ndubel](https://github.com/ndubel) in [#23658](https://github.com/ccxt/ccxt/pull/23658)
* kucoin fetchBalance funding account by [@ndubel](https://github.com/ndubel) in [#23655](https://github.com/ccxt/ccxt/pull/23655)
* fix(whitebit) cross market fetchOpenOrders by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#23657](https://github.com/ccxt/ccxt/pull/23657)
* feat(kucoin): add unWatchOrderBook by [@carlosmiei](https://github.com/carlosmiei) in [#23662](https://github.com/ccxt/ccxt/pull/23662)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23663](https://github.com/ccxt/ccxt/pull/23663)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.97...4.3.98](https://github.com/ccxt/ccxt/compare/4.3.97...4.3.98)
[Changes][4.3.98]
# [4.3.97](https://github.com/ccxt/ccxt/releases/tag/4.3.97) - 2024-09-06 [#4397---2024-09-06]
## What's Changed [#whats-changed-176]
* feat(gate): add unWatchOrderBook/unWatchTradesForSymbols by [@carlosmiei](https://github.com/carlosmiei) in [#23647](https://github.com/ccxt/ccxt/pull/23647)
* coinex parseTrade fee by [@ndubel](https://github.com/ndubel) in [#23646](https://github.com/ccxt/ccxt/pull/23646)
* feat(kucoin): add unWatchTrades by [@carlosmiei](https://github.com/carlosmiei) in [#23554](https://github.com/ccxt/ccxt/pull/23554)
* fix(binance): use maxLimit when using since+until by [@olegtaranenko](https://github.com/olegtaranenko) in [#23620](https://github.com/ccxt/ccxt/pull/23620)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.96...4.3.97](https://github.com/ccxt/ccxt/compare/4.3.96...4.3.97)
[Changes][4.3.97]
# [4.3.96](https://github.com/ccxt/ccxt/releases/tag/4.3.96) - 2024-09-05 [#4396---2024-09-05]
## What's Changed [#whats-changed-177]
* feat(hyperliquid): fetchLedger / fetchDeposits / fetchWithdrawals by [@sc0Vu](https://github.com/sc0Vu) in [#23616](https://github.com/ccxt/ccxt/pull/23616)
* fix(bybit): update fetchLedger endpoint for classic accounts by [@carlosmiei](https://github.com/carlosmiei) in [#23630](https://github.com/ccxt/ccxt/pull/23630)
* feat(binance, bybit): add unWatchOHLCVForSymbols by [@carlosmiei](https://github.com/carlosmiei) in [#23631](https://github.com/ccxt/ccxt/pull/23631)
* Mexc docstring [@see](https://github.com/see) by [@samgermain](https://github.com/samgermain) in [#23634](https://github.com/ccxt/ccxt/pull/23634)
* fix(hyperliquid): correct market id in fetchMytrade by [@sc0Vu](https://github.com/sc0Vu) in [#23636](https://github.com/ccxt/ccxt/pull/23636)
* feat(bybit): add pagination to fetchLedger by [@carlosmiei](https://github.com/carlosmiei) in [#23638](https://github.com/ccxt/ccxt/pull/23638)
* feat(okx, cryptocom): add unWatchOHLCVForSymbols/unWatchX by [@carlosmiei](https://github.com/carlosmiei) in [#23639](https://github.com/ccxt/ccxt/pull/23639)
* feat(kucoin): remove hf detection by [@carlosmiei](https://github.com/carlosmiei) in [#23640](https://github.com/ccxt/ccxt/pull/23640)
* fix(bitbay, hitbtc3) - remove aliases by [@ttodua](https://github.com/ttodua) in [#23641](https://github.com/ccxt/ccxt/pull/23641)
* feat(okx): add watchBidsAsks and unwatchTickers by [@sc0Vu](https://github.com/sc0Vu) in [#23584](https://github.com/ccxt/ccxt/pull/23584)
* fix(exchange) - remove fetchPermissions by [@ttodua](https://github.com/ttodua) in [#23642](https://github.com/ccxt/ccxt/pull/23642)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23645](https://github.com/ccxt/ccxt/pull/23645)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.95...4.3.96](https://github.com/ccxt/ccxt/compare/4.3.95...4.3.96)
[Changes][4.3.96]
# [4.3.95](https://github.com/ccxt/ccxt/releases/tag/4.3.95) - 2024-09-03 [#4395---2024-09-03]
## What's Changed [#whats-changed-178]
* fix(mexc): withdraw by [@carlosmiei](https://github.com/carlosmiei) in [#23611](https://github.com/ccxt/ccxt/pull/23611)
* feat(okx) - bills history since 2021 by [@ttodua](https://github.com/ttodua) in [#23622](https://github.com/ccxt/ccxt/pull/23622)
* fix(indodax): create limit order by [@jazarja](https://github.com/jazarja) in [#23619](https://github.com/ccxt/ccxt/pull/23619)
* fix(skip) - bingx skip by [@ttodua](https://github.com/ttodua) in [#23623](https://github.com/ccxt/ccxt/pull/23623)
* exchanges - promise.all by [@ttodua](https://github.com/ttodua) in [#23600](https://github.com/ccxt/ccxt/pull/23600)
* feat(hyperliquid): add fetchOrders/ClosedOrder and other fixes by [@carlosmiei](https://github.com/carlosmiei) in [#23626](https://github.com/ccxt/ccxt/pull/23626)
* fix(parseOHLCVs): tail cut by [@carlosmiei](https://github.com/carlosmiei) in [#23625](https://github.com/ccxt/ccxt/pull/23625)
## New Contributors [#new-contributors-85]
* [@jazarja](https://github.com/jazarja) made their first contribution in [#23619](https://github.com/ccxt/ccxt/pull/23619)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.94...4.3.95](https://github.com/ccxt/ccxt/compare/4.3.94...4.3.95)
[Changes][4.3.95]
# [4.3.94](https://github.com/ccxt/ccxt/releases/tag/4.3.94) - 2024-09-02 [#4394---2024-09-02]
## What's Changed [#whats-changed-179]
* fix(bingx): swap reduceOnly order by [@carlosmiei](https://github.com/carlosmiei) in [#23608](https://github.com/ccxt/ccxt/pull/23608)
* feat(tests) - static data updater by [@ttodua](https://github.com/ttodua) in [#23612](https://github.com/ccxt/ccxt/pull/23612)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.93...4.3.94](https://github.com/ccxt/ccxt/compare/4.3.93...4.3.94)
[Changes][4.3.94]
# [4.3.93](https://github.com/ccxt/ccxt/releases/tag/4.3.93) - 2024-09-01 [#4393---2024-09-01]
## What's Changed [#whats-changed-180]
* fix(hyperliquid): fetchTickers by [@carlosmiei](https://github.com/carlosmiei) in [#23605](https://github.com/ccxt/ccxt/pull/23605)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#23603](https://github.com/ccxt/ccxt/pull/23603)
* feat(kucoin): add hf sync endpoints by [@carlosmiei](https://github.com/carlosmiei) in [#23604](https://github.com/ccxt/ccxt/pull/23604)
* fix(hyperliquid): spot balance parsing by [@carlosmiei](https://github.com/carlosmiei) in [#23606](https://github.com/ccxt/ccxt/pull/23606)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23607](https://github.com/ccxt/ccxt/pull/23607)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.92...4.3.93](https://github.com/ccxt/ccxt/compare/4.3.92...4.3.93)
[Changes][4.3.93]
# [4.3.92](https://github.com/ccxt/ccxt/releases/tag/4.3.92) - 2024-08-31 [#4392---2024-08-31]
## What's Changed [#whats-changed-181]
* kucoin - corrections of 'safe' methods by [@ttodua](https://github.com/ttodua) in [#23590](https://github.com/ccxt/ccxt/pull/23590)
* build(deps-dev): bump webpack from 5.90.0 to 5.94.0 by [@dependabot](https://github.com/dependabot) in [#23574](https://github.com/ccxt/ccxt/pull/23574)
* fix(kucoin) - static tests by [@ttodua](https://github.com/ttodua) in [#23593](https://github.com/ccxt/ccxt/pull/23593)
* fix(hyperliquid): fetchOrder with clientOrderId by [@carlosmiei](https://github.com/carlosmiei) in [#23595](https://github.com/ccxt/ccxt/pull/23595)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23598](https://github.com/ccxt/ccxt/pull/23598)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.91...4.3.92](https://github.com/ccxt/ccxt/compare/4.3.91...4.3.92)
[Changes][4.3.92]
# [4.3.91](https://github.com/ccxt/ccxt/releases/tag/4.3.91) - 2024-08-30 [#4391---2024-08-30]
## What's Changed [#whats-changed-182]
* hitbtc transaction status by [@ndubel](https://github.com/ndubel) in [#23578](https://github.com/ccxt/ccxt/pull/23578)
* feat(kucoinfutures): add fetchBidsAsks by [@carlosmiei](https://github.com/carlosmiei) in [#23579](https://github.com/ccxt/ccxt/pull/23579)
* feat(woo): add active flag by [@carlosmiei](https://github.com/carlosmiei) in [#23583](https://github.com/ccxt/ccxt/pull/23583)
* fix(binance): update rl for withdraw history api by [@sc0Vu](https://github.com/sc0Vu) in [#23585](https://github.com/ccxt/ccxt/pull/23585)
* fix(kucoin) - handle HighFrequency (hf) accounts by [@ttodua](https://github.com/ttodua) in [#23582](https://github.com/ccxt/ccxt/pull/23582)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23586](https://github.com/ccxt/ccxt/pull/23586)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23588](https://github.com/ccxt/ccxt/pull/23588)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.90...4.3.91](https://github.com/ccxt/ccxt/compare/4.3.90...4.3.91)
[Changes][4.3.91]
# [4.3.90](https://github.com/ccxt/ccxt/releases/tag/4.3.90) - 2024-08-29 [#4390---2024-08-29]
## What's Changed [#whats-changed-183]
* fix(bitfinex2) - remove safeNetwork by [@ttodua](https://github.com/ttodua) in [#23540](https://github.com/ccxt/ccxt/pull/23540)
* fix(huobijp) - remove safenetwork by [@ttodua](https://github.com/ttodua) in [#23538](https://github.com/ccxt/ccxt/pull/23538)
* fix(okx) - remove safenetwork by [@ttodua](https://github.com/ttodua) in [#23539](https://github.com/ccxt/ccxt/pull/23539)
* feat(binance): add some unSub methods by [@carlosmiei](https://github.com/carlosmiei) in [#23550](https://github.com/ccxt/ccxt/pull/23550)
* feat(okx): add unWatchTrades/OrderBook by [@carlosmiei](https://github.com/carlosmiei) in [#23553](https://github.com/ccxt/ccxt/pull/23553)
* fix(coinex) - remove safeNetwork by [@ttodua](https://github.com/ttodua) in [#23542](https://github.com/ccxt/ccxt/pull/23542)
* fix(bitget): fees signal by [@carlosmiei](https://github.com/carlosmiei) in [#23561](https://github.com/ccxt/ccxt/pull/23561)
* hitbtc transaction status by [@ndubel](https://github.com/ndubel) in [#23558](https://github.com/ccxt/ccxt/pull/23558)
* latoken transaction status by [@ndubel](https://github.com/ndubel) in [#23557](https://github.com/ccxt/ccxt/pull/23557)
* fix(bitmart) - remove safenetwork by [@ttodua](https://github.com/ttodua) in [#23556](https://github.com/ccxt/ccxt/pull/23556)
* Safe value to safe dict/list/bool by [@rayBastard](https://github.com/rayBastard) in [#23552](https://github.com/ccxt/ccxt/pull/23552)
* bingx: websocket pro, inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23336](https://github.com/ccxt/ccxt/pull/23336)
* fix(whitebit) error handling by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#23565](https://github.com/ccxt/ccxt/pull/23565)
* feat(bingx): createOrder, add hedged param and default to one way mode by [@Dan-krm](https://github.com/Dan-krm) in [#23564](https://github.com/ccxt/ccxt/pull/23564)
* feat(coinex): upgrade pro to v2 by [@Dan-krm](https://github.com/Dan-krm) in [#23189](https://github.com/ccxt/ccxt/pull/23189)
* bithumb: update doc by [@sc0Vu](https://github.com/sc0Vu) in [#23570](https://github.com/ccxt/ccxt/pull/23570)
* fix(bybit): update watchLiquidations by [@sc0Vu](https://github.com/sc0Vu) in [#23572](https://github.com/ccxt/ccxt/pull/23572)
* htx: update doc by [@sc0Vu](https://github.com/sc0Vu) in [#23571](https://github.com/ccxt/ccxt/pull/23571)
* lbank: update doc by [@sc0Vu](https://github.com/sc0Vu) in [#23569](https://github.com/ccxt/ccxt/pull/23569)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23573](https://github.com/ccxt/ccxt/pull/23573)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.89...4.3.90](https://github.com/ccxt/ccxt/compare/4.3.89...4.3.90)
[Changes][4.3.90]
# [4.3.89](https://github.com/ccxt/ccxt/releases/tag/4.3.89) - 2024-08-26 [#4389---2024-08-26]
## What's Changed [#whats-changed-184]
* remove cs Sending by [@ttodua](https://github.com/ttodua) in [#23521](https://github.com/ccxt/ccxt/pull/23521)
* fix(docs): fetchOrder jsdoc by [@carlosmiei](https://github.com/carlosmiei) in [#23526](https://github.com/ccxt/ccxt/pull/23526)
* fix(docs) - cors snippet example by [@ttodua](https://github.com/ttodua) in [#23523](https://github.com/ccxt/ccxt/pull/23523)
* fix(mexc) - remove networksById by [@ttodua](https://github.com/ttodua) in [#23534](https://github.com/ccxt/ccxt/pull/23534)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#23531](https://github.com/ccxt/ccxt/pull/23531)
* fix(kraken,mexc): network space fix by [@ttodua](https://github.com/ttodua) in [#23532](https://github.com/ccxt/ccxt/pull/23532)
* fix(ascendex) - remove safeNetwork by [@ttodua](https://github.com/ttodua) in [#23535](https://github.com/ccxt/ccxt/pull/23535)
* fix(bitrue) - remove safeNetwork by [@ttodua](https://github.com/ttodua) in [#23537](https://github.com/ccxt/ccxt/pull/23537)
* fix(cryptocom) - safeNetwork removal by [@ttodua](https://github.com/ttodua) in [#23536](https://github.com/ccxt/ccxt/pull/23536)
* fix(kraken, mexc): networks by [@carlosmiei](https://github.com/carlosmiei) in [#23546](https://github.com/ccxt/ccxt/pull/23546)
* fix(base): get\_object\_value\_from\_key\_list by [@sc0Vu](https://github.com/sc0Vu) in [#23549](https://github.com/ccxt/ccxt/pull/23549)
* fix(okcoin) - remove safeNetwork by [@ttodua](https://github.com/ttodua) in [#23544](https://github.com/ccxt/ccxt/pull/23544)
* fix(ascendex) - remove nbi ascendex by [@ttodua](https://github.com/ttodua) in [#23533](https://github.com/ccxt/ccxt/pull/23533)
* feat(bybit): unWatchTrades/OrderBook/ticker by [@carlosmiei](https://github.com/carlosmiei) in [#23513](https://github.com/ccxt/ccxt/pull/23513)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23545](https://github.com/ccxt/ccxt/pull/23545)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.88...4.3.89](https://github.com/ccxt/ccxt/compare/4.3.88...4.3.89)
[Changes][4.3.89]
# [4.3.88](https://github.com/ccxt/ccxt/releases/tag/4.3.88) - 2024-08-23 [#4388---2024-08-23]
## What's Changed [#whats-changed-185]
* fix(base): paginationTimestamp shoud add one for forward by [@sc0Vu](https://github.com/sc0Vu) in [#23519](https://github.com/ccxt/ccxt/pull/23519)
* fix(base): correct return type for fetchPositionHistory by [@sc0Vu](https://github.com/sc0Vu) in [#23518](https://github.com/ccxt/ccxt/pull/23518)
* feat: update ws docs by [@sc0Vu](https://github.com/sc0Vu) in [#23508](https://github.com/ccxt/ccxt/pull/23508)
* fix(c#) - parseToInt by [@ttodua](https://github.com/ttodua) in [#23506](https://github.com/ccxt/ccxt/pull/23506)
* feat(kucoin): add "asset/ndbroker/deposit/list" api endpoint under br… by [@martianatwork](https://github.com/martianatwork) in [#23520](https://github.com/ccxt/ccxt/pull/23520)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.87...4.3.88](https://github.com/ccxt/ccxt/compare/4.3.87...4.3.88)
[Changes][4.3.88]
# [4.3.87](https://github.com/ccxt/ccxt/releases/tag/4.3.87) - 2024-08-22 [#4387---2024-08-22]
## What's Changed [#whats-changed-186]
* feat(bitget): add multiple unWatch methods by [@carlosmiei](https://github.com/carlosmiei) in [#23481](https://github.com/ccxt/ccxt/pull/23481)
* feat(bitget): reject before resolve unWatchX by [@carlosmiei](https://github.com/carlosmiei) in [#23498](https://github.com/ccxt/ccxt/pull/23498)
* wazirx: update [@see](https://github.com/see) & doc by [@sc0Vu](https://github.com/sc0Vu) in [#23478](https://github.com/ccxt/ccxt/pull/23478)
* whitebit: update [@see](https://github.com/see) & doc by [@sc0Vu](https://github.com/sc0Vu) in [#23479](https://github.com/ccxt/ccxt/pull/23479)
* vertex: update doc by [@sc0Vu](https://github.com/sc0Vu) in [#23480](https://github.com/ccxt/ccxt/pull/23480)
* probit: update [@see](https://github.com/see) & doc by [@sc0Vu](https://github.com/sc0Vu) in [#23494](https://github.com/ccxt/ccxt/pull/23494)
* Kraken: fix since and until by [@Dan-krm](https://github.com/Dan-krm) in [#23456](https://github.com/ccxt/ccxt/pull/23456)
* feat(hashkey): add id test by [@carlosmiei](https://github.com/carlosmiei) in [#23499](https://github.com/ccxt/ccxt/pull/23499)
* poloniexfutures: update doc by [@sc0Vu](https://github.com/sc0Vu) in [#23495](https://github.com/ccxt/ccxt/pull/23495)
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#23500](https://github.com/ccxt/ccxt/pull/23500)
* upbit: add watchTradesForSymbols by [@sc0Vu](https://github.com/sc0Vu) in [#23497](https://github.com/ccxt/ccxt/pull/23497)
* fix(errors): UnsubscribeError by [@carlosmiei](https://github.com/carlosmiei) in [#23502](https://github.com/ccxt/ccxt/pull/23502)
* chore: update auth method in upbit.ts file by [@danke02](https://github.com/danke02) in [#23492](https://github.com/ccxt/ccxt/pull/23492)
* poloniex: add watchTradesForSymbols by [@sc0Vu](https://github.com/sc0Vu) in [#23496](https://github.com/ccxt/ccxt/pull/23496)
* kraken: exchange specific end param by [@Dan-krm](https://github.com/Dan-krm) in [#23507](https://github.com/ccxt/ccxt/pull/23507)
* fix(build) broken build after adding 'hashkey' by [@olegtaranenko](https://github.com/olegtaranenko) in [#23505](https://github.com/ccxt/ccxt/pull/23505)
* fix(readme) - watchOrderBookForSymbols by [@ttodua](https://github.com/ttodua) in [#23488](https://github.com/ccxt/ccxt/pull/23488)
* p2b: add watchTradesForSymbols by [@sc0Vu](https://github.com/sc0Vu) in [#23509](https://github.com/ccxt/ccxt/pull/23509)
* fix(bingx): active flag by [@carlosmiei](https://github.com/carlosmiei) in [#23511](https://github.com/ccxt/ccxt/pull/23511)
## New Contributors [#new-contributors-86]
* [@danke02](https://github.com/danke02) made their first contribution in [#23492](https://github.com/ccxt/ccxt/pull/23492)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.86...4.3.87](https://github.com/ccxt/ccxt/compare/4.3.86...4.3.87)
[Changes][4.3.87]
# [4.3.86](https://github.com/ccxt/ccxt/releases/tag/4.3.86) - 2024-08-20 [#4386---2024-08-20]
## What's Changed [#whats-changed-187]
* fix(binance) - tickers inverse quote volume by [@ttodua](https://github.com/ttodua) in [#23406](https://github.com/ccxt/ccxt/pull/23406)
* feat(indodax): support market order by [@sungjinoh](https://github.com/sungjinoh) in [#23425](https://github.com/ccxt/ccxt/pull/23425)
* feat(wiki) - custom ws handling by [@ttodua](https://github.com/ttodua) in [#23426](https://github.com/ccxt/ccxt/pull/23426)
* bingx: update [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#23466](https://github.com/ccxt/ccxt/pull/23466)
* feat(hyperliquid): add createOrderWs and editOrderWs by [@watislaf](https://github.com/watislaf) in [#23461](https://github.com/ccxt/ccxt/pull/23461)
* feat(ascendex): add watchTradesForSymbols by [@sc0Vu](https://github.com/sc0Vu) in [#23463](https://github.com/ccxt/ccxt/pull/23463)
* woofipro: update doc by [@sc0Vu](https://github.com/sc0Vu) in [#23476](https://github.com/ccxt/ccxt/pull/23476)
* Hashkey integration by [@rayBastard](https://github.com/rayBastard) in [#23176](https://github.com/ccxt/ccxt/pull/23176)
* woo: update doc by [@sc0Vu](https://github.com/sc0Vu) in [#23477](https://github.com/ccxt/ccxt/pull/23477)
* fix(bitfinex): fetchTickers parsing by [@carlosmiei](https://github.com/carlosmiei) in [#23474](https://github.com/ccxt/ccxt/pull/23474)
* xt: update doc by [@sc0Vu](https://github.com/sc0Vu) in [#23472](https://github.com/ccxt/ccxt/pull/23472)
* fix(krakenfutures): patch parseOrder by [@sc0Vu](https://github.com/sc0Vu) in [#23471](https://github.com/ccxt/ccxt/pull/23471)
* mexc: update [@see](https://github.com/see) & doc by [@sc0Vu](https://github.com/sc0Vu) in [#23473](https://github.com/ccxt/ccxt/pull/23473)
* fix(hashkey): build and tests by [@carlosmiei](https://github.com/carlosmiei) in [#23482](https://github.com/ccxt/ccxt/pull/23482)
* fix(tests): remove exchangeHint by [@carlosmiei](https://github.com/carlosmiei) in [#23475](https://github.com/ccxt/ccxt/pull/23475)
* fix(hashkey): readme link by [@carlosmiei](https://github.com/carlosmiei) in [#23485](https://github.com/ccxt/ccxt/pull/23485)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23486](https://github.com/ccxt/ccxt/pull/23486)
* fix(base): use two parameters when call fetchPaginatedCallCursor in f… by [@sc0Vu](https://github.com/sc0Vu) in [#23484](https://github.com/ccxt/ccxt/pull/23484)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23489](https://github.com/ccxt/ccxt/pull/23489)
## New Contributors [#new-contributors-87]
* [@sungjinoh](https://github.com/sungjinoh) made their first contribution in [#23425](https://github.com/ccxt/ccxt/pull/23425)
* [@watislaf](https://github.com/watislaf) made their first contribution in [#23461](https://github.com/ccxt/ccxt/pull/23461)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.85...4.3.86](https://github.com/ccxt/ccxt/compare/4.3.85...4.3.86)
[Changes][4.3.86]
# [4.3.85](https://github.com/ccxt/ccxt/releases/tag/4.3.85) - 2024-08-19 [#4385---2024-08-19]
## What's Changed [#whats-changed-188]
* fix(binance): watchLiquidationsForSymbols should use lowercase id by [@sc0Vu](https://github.com/sc0Vu) in [#23441](https://github.com/ccxt/ccxt/pull/23441)
* feat(kucoinfutures): add maxOpenSize and allTickers endpoints by [@carlosmiei](https://github.com/carlosmiei) in [#23448](https://github.com/ccxt/ccxt/pull/23448)
* fix(okx): watchLiquidationsForSymbols subscription by [@carlosmiei](https://github.com/carlosmiei) in [#23451](https://github.com/ccxt/ccxt/pull/23451)
* fix(okx): error on closing positions: by [@pcriadoperez](https://github.com/pcriadoperez) in [#23455](https://github.com/ccxt/ccxt/pull/23455)
* mexc fetchSpotMarkets fix by [@ndubel](https://github.com/ndubel) in [#23458](https://github.com/ccxt/ccxt/pull/23458)
* feat(errors) - ManualInteractionRequired ^Q by [@ttodua](https://github.com/ttodua) in [#23437](https://github.com/ccxt/ccxt/pull/23437)
* Kraken: parseTrade, define takerOrMaker by [@Dan-krm](https://github.com/Dan-krm) in [#23454](https://github.com/ccxt/ccxt/pull/23454)
* feat(cryptocom): add feeRate endpoints by [@carlosmiei](https://github.com/carlosmiei) in [#23450](https://github.com/ccxt/ccxt/pull/23450)
* feat(bitget): add unWatchOrderBook by [@carlosmiei](https://github.com/carlosmiei) in [#23464](https://github.com/ccxt/ccxt/pull/23464)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23465](https://github.com/ccxt/ccxt/pull/23465)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.84...4.3.85](https://github.com/ccxt/ccxt/compare/4.3.84...4.3.85)
[Changes][4.3.85]
# [4.3.84](https://github.com/ccxt/ccxt/releases/tag/4.3.84) - 2024-08-16 [#4384---2024-08-16]
## What's Changed [#whats-changed-189]
* fix(binance): correct signature for simple-earn by [@sc0Vu](https://github.com/sc0Vu) in [#23428](https://github.com/ccxt/ccxt/pull/23428)
* fix(bitrue): populate authenticate error by [@sc0Vu](https://github.com/sc0Vu) in [#23433](https://github.com/ccxt/ccxt/pull/23433)
* bitfinex2: update exchange types by [@sc0Vu](https://github.com/sc0Vu) in [#23434](https://github.com/ccxt/ccxt/pull/23434)
* fix(binance): watchOHLCV - exchange-specific id by [@carlosmiei](https://github.com/carlosmiei) in [#23435](https://github.com/ccxt/ccxt/pull/23435)
* feat(kraken): remove requirement for currency code argument in fetchDeposits by [@ron7684](https://github.com/ron7684) in [#23432](https://github.com/ccxt/ccxt/pull/23432)
* fix(gate): handleErrors inside watchMethods by [@carlosmiei](https://github.com/carlosmiei) in [#23436](https://github.com/ccxt/ccxt/pull/23436)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23438](https://github.com/ccxt/ccxt/pull/23438)
## New Contributors [#new-contributors-88]
* [@ron7684](https://github.com/ron7684) made their first contribution in [#23432](https://github.com/ccxt/ccxt/pull/23432)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.83...4.3.84](https://github.com/ccxt/ccxt/compare/4.3.83...4.3.84)
[Changes][4.3.84]
# [4.3.83](https://github.com/ccxt/ccxt/releases/tag/4.3.83) - 2024-08-15 [#4383---2024-08-15]
## What's Changed [#whats-changed-190]
* chore: update readme by [@carlosmiei](https://github.com/carlosmiei) in [#23409](https://github.com/ccxt/ccxt/pull/23409)
* feat(binance): check 30 days interval in fetchConvertTradeHistory by [@sc0Vu](https://github.com/sc0Vu) in [#22315](https://github.com/ccxt/ccxt/pull/22315)
* fix(gate): edit order size type by [@carlosmiei](https://github.com/carlosmiei) in [#23418](https://github.com/ccxt/ccxt/pull/23418)
* fix(okx): watchTicker symbol by [@carlosmiei](https://github.com/carlosmiei) in [#23419](https://github.com/ccxt/ccxt/pull/23419)
* fix(phemex) - no closed orders in fetchOrders by [@ttodua](https://github.com/ttodua) in [#23411](https://github.com/ccxt/ccxt/pull/23411)
* fix(npm) - silent by [@ttodua](https://github.com/ttodua) in [#23410](https://github.com/ccxt/ccxt/pull/23410)
* feat(bybit): add withdraw request test by [@carlosmiei](https://github.com/carlosmiei) in [#23421](https://github.com/ccxt/ccxt/pull/23421)
* implement useV2 for param/options of other brand new v3 methods by [@olegtaranenko](https://github.com/olegtaranenko) in [#23412](https://github.com/ccxt/ccxt/pull/23412)
* fix(binance): parseLeverage by [@carlosmiei](https://github.com/carlosmiei) in [#23423](https://github.com/ccxt/ccxt/pull/23423)
* feat(phemex): add watchBalance flag by [@carlosmiei](https://github.com/carlosmiei) in [#23424](https://github.com/ccxt/ccxt/pull/23424)
* build: skip-tests \[ci deploy] by [@carlosmiei](https://github.com/carlosmiei) in [#23420](https://github.com/ccxt/ccxt/pull/23420)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.82...4.3.83](https://github.com/ccxt/ccxt/compare/4.3.82...4.3.83)
[Changes][4.3.83]
# [4.3.82](https://github.com/ccxt/ccxt/releases/tag/4.3.82) - 2024-08-14 [#4382---2024-08-14]
## What's Changed [#whats-changed-191]
* fix(waves) - createOrder params by [@ttodua](https://github.com/ttodua) in [#23400](https://github.com/ccxt/ccxt/pull/23400)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.81...4.3.82](https://github.com/ccxt/ccxt/compare/4.3.81...4.3.82)
[Changes][4.3.82]
# [4.3.81](https://github.com/ccxt/ccxt/releases/tag/4.3.81) - 2024-08-13 [#4381---2024-08-13]
## What's Changed [#whats-changed-192]
* checkaddress - unified by [@ttodua](https://github.com/ttodua) in [#23376](https://github.com/ccxt/ccxt/pull/23376)
* bybit: amount, price and cost precision helper methods by [@Dan-krm](https://github.com/Dan-krm) in [#23373](https://github.com/ccxt/ccxt/pull/23373)
* fix(base): remove starknet js json by [@sc0Vu](https://github.com/sc0Vu) in [#23401](https://github.com/ccxt/ccxt/pull/23401)
* fix(yobit) - BCHN to BSV by [@ttodua](https://github.com/ttodua) in [#23402](https://github.com/ccxt/ccxt/pull/23402)
* fix(exchange): watchOHLCVForSymbols in dotnet by [@carlosmiei](https://github.com/carlosmiei) in [#23403](https://github.com/ccxt/ccxt/pull/23403)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23405](https://github.com/ccxt/ccxt/pull/23405)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.80...4.3.81](https://github.com/ccxt/ccxt/compare/4.3.80...4.3.81)
[Changes][4.3.81]
# [4.3.80](https://github.com/ccxt/ccxt/releases/tag/4.3.80) - 2024-08-12 [#4380---2024-08-12]
## What's Changed [#whats-changed-193]
* fix(binance): adjust has flags by [@carlosmiei](https://github.com/carlosmiei) in [#23386](https://github.com/ccxt/ccxt/pull/23386)
* fix(Exchange): checkProxySettings accept camelcase and snake\_case by [@carlosmiei](https://github.com/carlosmiei) in [#23383](https://github.com/ccxt/ccxt/pull/23383)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#23388](https://github.com/ccxt/ccxt/pull/23388)
* feat(bybit): add inverse wallet ledger by [@carlosmiei](https://github.com/carlosmiei) in [#23390](https://github.com/ccxt/ccxt/pull/23390)
* fix(poloniex): fetchOpenOrders by [@carlosmiei](https://github.com/carlosmiei) in [#23392](https://github.com/ccxt/ccxt/pull/23392)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23394](https://github.com/ccxt/ccxt/pull/23394)
* fix(bitmart): update createSwapOrderRequest by [@sc0Vu](https://github.com/sc0Vu) in [#23395](https://github.com/ccxt/ccxt/pull/23395)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23396](https://github.com/ccxt/ccxt/pull/23396)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.79...4.3.80](https://github.com/ccxt/ccxt/compare/4.3.79...4.3.80)
[Changes][4.3.80]
# [4.3.79](https://github.com/ccxt/ccxt/releases/tag/4.3.79) - 2024-08-10 [#4379---2024-08-10]
## What's Changed [#whats-changed-194]
* fix(py) - remove this by [@ttodua](https://github.com/ttodua) in [#23382](https://github.com/ccxt/ccxt/pull/23382)
* fix: watchPositions - handleOption used instead of safeBool to get option for awaitPositionsSnapshot by [@samgermain](https://github.com/samgermain) in [#23295](https://github.com/ccxt/ccxt/pull/23295)
* binance: update apis by [@sc0Vu](https://github.com/sc0Vu) in [#23266](https://github.com/ccxt/ccxt/pull/23266)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.78...4.3.79](https://github.com/ccxt/ccxt/compare/4.3.78...4.3.79)
[Changes][4.3.79]
# [4.3.78](https://github.com/ccxt/ccxt/releases/tag/4.3.78) - 2024-08-09 [#4378---2024-08-09]
## What's Changed [#whats-changed-195]
* fix(binance) - watchLiquidations ^Q by [@ttodua](https://github.com/ttodua) in [#23371](https://github.com/ccxt/ccxt/pull/23371)
* fix(kraken): oflags by [@sc0Vu](https://github.com/sc0Vu) in [#23375](https://github.com/ccxt/ccxt/pull/23375)
* feat(kraken): update by [@sc0Vu](https://github.com/sc0Vu) in [#23374](https://github.com/ccxt/ccxt/pull/23374)
* fix(paradex): add missing loadMarkets() by [@carlosmiei](https://github.com/carlosmiei) in [#23377](https://github.com/ccxt/ccxt/pull/23377)
* exchange: update safeTicker by [@sc0Vu](https://github.com/sc0Vu) in [#23337](https://github.com/ccxt/ccxt/pull/23337)
* base - `safeTrade` ->cost to number by [@ttodua](https://github.com/ttodua) in [#14268](https://github.com/ccxt/ccxt/pull/14268)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23378](https://github.com/ccxt/ccxt/pull/23378)
* fix(build): response tests: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23380](https://github.com/ccxt/ccxt/pull/23380)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.77...4.3.78](https://github.com/ccxt/ccxt/compare/4.3.77...4.3.78)
[Changes][4.3.78]
# [4.3.77](https://github.com/ccxt/ccxt/releases/tag/4.3.77) - 2024-08-08 [#4377---2024-08-08]
## What's Changed [#whats-changed-196]
* fix(woo): watch private by [@sc0Vu](https://github.com/sc0Vu) in [#23359](https://github.com/ccxt/ccxt/pull/23359)
* feat(xt): add class header by [@carlosmiei](https://github.com/carlosmiei) in [#23361](https://github.com/ccxt/ccxt/pull/23361)
* bybit: createOrder, fix option qty param by [@Dan-krm](https://github.com/Dan-krm) in [#23360](https://github.com/ccxt/ccxt/pull/23360)
* feat(bithumb): update doc by [@sc0Vu](https://github.com/sc0Vu) in [#23363](https://github.com/ccxt/ccxt/pull/23363)
* feat(bybit): add demotrading for ws by [@sc0Vu](https://github.com/sc0Vu) in [#23364](https://github.com/ccxt/ccxt/pull/23364)
* feat(binance): fix fetchCurrencies return params by [@cozy-hn](https://github.com/cozy-hn) in [#23365](https://github.com/ccxt/ccxt/pull/23365)
* fix(kraken): oflags handling by [@carlosmiei](https://github.com/carlosmiei) in [#23366](https://github.com/ccxt/ccxt/pull/23366)
* fix(bitmart): trigger order placement by [@carlosmiei](https://github.com/carlosmiei) in [#23367](https://github.com/ccxt/ccxt/pull/23367)
* feat(static): remove typing\_extensions static dep by [@carlosmiei](https://github.com/carlosmiei) in [#23368](https://github.com/ccxt/ccxt/pull/23368)
* fix(json): serialize json, add tests, and fix c# base tests by [@pcriadoperez](https://github.com/pcriadoperez) in [#23357](https://github.com/ccxt/ccxt/pull/23357)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23369](https://github.com/ccxt/ccxt/pull/23369)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.76...4.3.77](https://github.com/ccxt/ccxt/compare/4.3.76...4.3.77)
[Changes][4.3.77]
# [4.3.76](https://github.com/ccxt/ccxt/releases/tag/4.3.76) - 2024-08-07 [#4376---2024-08-07]
## What's Changed [#whats-changed-197]
* fix(bybit): handle inverse futures subscription by [@carlosmiei](https://github.com/carlosmiei) in [#23343](https://github.com/ccxt/ccxt/pull/23343)
* fix(gemini) - add roles endpoint by [@ttodua](https://github.com/ttodua) in [#23344](https://github.com/ccxt/ccxt/pull/23344)
* feat(binance): add links by [@carlosmiei](https://github.com/carlosmiei) in [#23346](https://github.com/ccxt/ccxt/pull/23346)
* feat(coinbase): default spot fees by [@carlosmiei](https://github.com/carlosmiei) in [#23347](https://github.com/ccxt/ccxt/pull/23347)
* feat(htx): add some docs by [@carlosmiei](https://github.com/carlosmiei) in [#23348](https://github.com/ccxt/ccxt/pull/23348)
* feat(bitmart): update futures to v2 by [@samgermain](https://github.com/samgermain) in [#23267](https://github.com/ccxt/ccxt/pull/23267)
* fix(liquidations): var declaration by [@carlosmiei](https://github.com/carlosmiei) in [#23350](https://github.com/ccxt/ccxt/pull/23350)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23351](https://github.com/ccxt/ccxt/pull/23351)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.75...4.3.76](https://github.com/ccxt/ccxt/compare/4.3.75...4.3.76)
[Changes][4.3.76]
# [4.3.75](https://github.com/ccxt/ccxt/releases/tag/4.3.75) - 2024-08-06 [#4375---2024-08-06]
## What's Changed [#whats-changed-198]
* mexc: update withdraw by [@sc0Vu](https://github.com/sc0Vu) in [#23331](https://github.com/ccxt/ccxt/pull/23331)
* fix(whitebit) parseTicker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#23338](https://github.com/ccxt/ccxt/pull/23338)
* feat(bybit): add usePrivateInstrumentsInfo option by [@carlosmiei](https://github.com/carlosmiei) in [#23339](https://github.com/ccxt/ccxt/pull/23339)
* fix(binance) - php parsing by [@ttodua](https://github.com/ttodua) in [#23340](https://github.com/ccxt/ccxt/pull/23340)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23341](https://github.com/ccxt/ccxt/pull/23341)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.74...4.3.75](https://github.com/ccxt/ccxt/compare/4.3.74...4.3.75)
[Changes][4.3.75]
# [4.3.74](https://github.com/ccxt/ccxt/releases/tag/4.3.74) - 2024-08-05 [#4374---2024-08-05]
## What's Changed [#whats-changed-199]
* chore(ace): method param types by [@samgermain](https://github.com/samgermain) in [#23297](https://github.com/ccxt/ccxt/pull/23297)
* feat(binance): add callerName and links to watchTrades by [@carlosmiei](https://github.com/carlosmiei) in [#23318](https://github.com/ccxt/ccxt/pull/23318)
* feat(yobit) - fetchTickers all by [@ttodua](https://github.com/ttodua) in [#23317](https://github.com/ccxt/ccxt/pull/23317)
* feat(cli): add no-keys options by [@carlosmiei](https://github.com/carlosmiei) in [#23319](https://github.com/ccxt/ccxt/pull/23319)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#23321](https://github.com/ccxt/ccxt/pull/23321)
* c# - exception overwriting by [@ttodua](https://github.com/ttodua) in [#23250](https://github.com/ccxt/ccxt/pull/23250)
* fix(examples): poloniex-fetch-ohlcv-with-pagination.py by [@sc0Vu](https://github.com/sc0Vu) in [#23326](https://github.com/ccxt/ccxt/pull/23326)
* alpaca: add [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#23329](https://github.com/ccxt/ccxt/pull/23329)
* bitfinex: add [@see](https://github.com/see) by [@sc0Vu](https://github.com/sc0Vu) in [#23330](https://github.com/ccxt/ccxt/pull/23330)
* binance - new endpoints (fetchPositions / fetchAccountPositions / fetchPositionRisk) by [@ttodua](https://github.com/ttodua) in [#23225](https://github.com/ccxt/ccxt/pull/23225)
* fix(bybit): fetchTransfers with currency parsing by [@carlosmiei](https://github.com/carlosmiei) in [#23332](https://github.com/ccxt/ccxt/pull/23332)
* fix(binance): parseAccountPosition by [@carlosmiei](https://github.com/carlosmiei) in [#23334](https://github.com/ccxt/ccxt/pull/23334)
* fix(binance): temporarily disable php test by [@carlosmiei](https://github.com/carlosmiei) in [#23335](https://github.com/ccxt/ccxt/pull/23335)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23333](https://github.com/ccxt/ccxt/pull/23333)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.73...4.3.74](https://github.com/ccxt/ccxt/compare/4.3.73...4.3.74)
[Changes][4.3.74]
# [4.3.73](https://github.com/ccxt/ccxt/releases/tag/4.3.73) - 2024-08-02 [#4373---2024-08-02]
## What's Changed [#whats-changed-200]
* fix(exchange): set message queue to false by default by [@pcriadoperez](https://github.com/pcriadoperez) in [#23311](https://github.com/ccxt/ccxt/pull/23311)
* fix(kucoin): patch parseWsTrade by [@sc0Vu](https://github.com/sc0Vu) in [#23312](https://github.com/ccxt/ccxt/pull/23312)
* feat(woo): replace orderbook with orderbookupdate by [@sc0Vu](https://github.com/sc0Vu) in [#23300](https://github.com/ccxt/ccxt/pull/23300)
* feat(binance) - OHLCV with timezone param support by [@ttodua](https://github.com/ttodua) in [#23252](https://github.com/ccxt/ccxt/pull/23252)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23315](https://github.com/ccxt/ccxt/pull/23315)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.72...4.3.73](https://github.com/ccxt/ccxt/compare/4.3.72...4.3.73)
[Changes][4.3.73]
# [4.3.72](https://github.com/ccxt/ccxt/releases/tag/4.3.72) - 2024-08-01 [#4372---2024-08-01]
## What's Changed [#whats-changed-201]
* fix(paradex): update logo by [@carlosmiei](https://github.com/carlosmiei) in [#23306](https://github.com/ccxt/ccxt/pull/23306)
* fix cli ts/js by [@ttodua](https://github.com/ttodua) in [#23279](https://github.com/ccxt/ccxt/pull/23279)
* docker: update dockerignore file by [@egorbulat98](https://github.com/egorbulat98) in [#23281](https://github.com/ccxt/ccxt/pull/23281)
* fix(types): update MarketInterface so fields can be undefined by [@samgermain](https://github.com/samgermain) in [#23288](https://github.com/ccxt/ccxt/pull/23288)
* fix(cli) - ts by [@ttodua](https://github.com/ttodua) in [#23280](https://github.com/ccxt/ccxt/pull/23280)
* fix(package): add starkware module \[ci deploy] by [@carlosmiei](https://github.com/carlosmiei) in [#23308](https://github.com/ccxt/ccxt/pull/23308)
* build: skip-tests \[ci deploy] by [@carlosmiei](https://github.com/carlosmiei) in [#23309](https://github.com/ccxt/ccxt/pull/23309)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.71...4.3.72](https://github.com/ccxt/ccxt/compare/4.3.71...4.3.72)
[Changes][4.3.72]
# [4.3.71](https://github.com/ccxt/ccxt/releases/tag/4.3.71) - 2024-08-01 [#4371---2024-08-01]
## What's Changed [#whats-changed-202]
* fix(woo): fetchFundingHistory income parsing by [@carlosmiei](https://github.com/carlosmiei) in [#23278](https://github.com/ccxt/ccxt/pull/23278)
* fix(types.cs): remove duplicated info by [@carlosmiei](https://github.com/carlosmiei) in [#23293](https://github.com/ccxt/ccxt/pull/23293)
* fix(bequant): correctws url by [@sc0Vu](https://github.com/sc0Vu) in [#23286](https://github.com/ccxt/ccxt/pull/23286)
* fix(test): add -- before --sync in php test by [@sc0Vu](https://github.com/sc0Vu) in [#23285](https://github.com/ccxt/ccxt/pull/23285)
* New exchange: paradex by [@sc0Vu](https://github.com/sc0Vu) in [#22777](https://github.com/ccxt/ccxt/pull/22777)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23304](https://github.com/ccxt/ccxt/pull/23304)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.70...4.3.71](https://github.com/ccxt/ccxt/compare/4.3.70...4.3.71)
[Changes][4.3.71]
# [4.3.70](https://github.com/ccxt/ccxt/releases/tag/4.3.70) - 2024-07-31 [#4370---2024-07-31]
## What's Changed [#whats-changed-203]
* feat(coinbaseinternational): add missing methods by [@carlosmiei](https://github.com/carlosmiei) in [#23263](https://github.com/ccxt/ccxt/pull/23263)
* fix(doc): fetchMarginMode => fetchMarginModes by [@sc0Vu](https://github.com/sc0Vu) in [#23271](https://github.com/ccxt/ccxt/pull/23271)
* fix(okx): handle ws crude errors properly by [@carlosmiei](https://github.com/carlosmiei) in [#23264](https://github.com/ccxt/ccxt/pull/23264)
* fix(cryptocom,poloniex,hitbt): error handling by [@pcriadoperez](https://github.com/pcriadoperez) in [#23265](https://github.com/ccxt/ccxt/pull/23265)
* Blofin - WebSockets by [@ttodua](https://github.com/ttodua) in [#21184](https://github.com/ccxt/ccxt/pull/21184)
* fix(woo): new ws url by [@carlosmiei](https://github.com/carlosmiei) in [#23274](https://github.com/ccxt/ccxt/pull/23274)
* fix(bybit): fetchMyLiquidations safeMarket call by [@carlosmiei](https://github.com/carlosmiei) in [#23277](https://github.com/ccxt/ccxt/pull/23277)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23275](https://github.com/ccxt/ccxt/pull/23275)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.69...4.3.70](https://github.com/ccxt/ccxt/compare/4.3.69...4.3.70)
[Changes][4.3.70]
# [4.3.69](https://github.com/ccxt/ccxt/releases/tag/4.3.69) - 2024-07-30 [#4369---2024-07-30]
## What's Changed [#whats-changed-204]
* base - unify `describe` & other objects by [@ttodua](https://github.com/ttodua) in [#18990](https://github.com/ccxt/ccxt/pull/18990)
* fix(kucoin): fetchDepositWithdrawFees by [@carlosmiei](https://github.com/carlosmiei) in [#23234](https://github.com/ccxt/ccxt/pull/23234)
* bingx: fetchMyTrades, inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23240](https://github.com/ccxt/ccxt/pull/23240)
* fix(wiki): update links by [@sc0Vu](https://github.com/sc0Vu) in [#23245](https://github.com/ccxt/ccxt/pull/23245)
* fix(hyperliquid): set default limit to 5000 by [@sc0Vu](https://github.com/sc0Vu) in [#23244](https://github.com/ccxt/ccxt/pull/23244)
* update OrderBook type and added LedgerEntry for python types by [@DelAnt](https://github.com/DelAnt) in [#23235](https://github.com/ccxt/ccxt/pull/23235)
* fix(cs) - handling message by [@ttodua](https://github.com/ttodua) in [#23248](https://github.com/ccxt/ccxt/pull/23248)
* withdraw typo fixed in withdraw by [@rayBastard](https://github.com/rayBastard) in [#23256](https://github.com/ccxt/ccxt/pull/23256)
* feat(coinbaseinternational): add fetchFundingHistory by [@carlosmiei](https://github.com/carlosmiei) in [#23254](https://github.com/ccxt/ccxt/pull/23254)
* poloniex: update docs by [@sc0Vu](https://github.com/sc0Vu) in [#23255](https://github.com/ccxt/ccxt/pull/23255)
* fix(btcbox): signature by [@carlosmiei](https://github.com/carlosmiei) in [#23257](https://github.com/ccxt/ccxt/pull/23257)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23259](https://github.com/ccxt/ccxt/pull/23259)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.68...4.3.69](https://github.com/ccxt/ccxt/compare/4.3.68...4.3.69)
[Changes][4.3.69]
# [4.3.68](https://github.com/ccxt/ccxt/releases/tag/4.3.68) - 2024-07-26 [#4368---2024-07-26]
## What's Changed [#whats-changed-205]
* bingx: fetchOrder, inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23211](https://github.com/ccxt/ccxt/pull/23211)
* chore: remove delisted exchange by [@egorbulat98](https://github.com/egorbulat98) in [#23206](https://github.com/ccxt/ccxt/pull/23206)
* Update test.safeMethods.ts by [@yzh-pelle](https://github.com/yzh-pelle) in [#23118](https://github.com/ccxt/ccxt/pull/23118)
* tests: fix python tests in docker by [@egorbulat98](https://github.com/egorbulat98) in [#23213](https://github.com/ccxt/ccxt/pull/23213)
* bingx: fetchClosedOrders, fetchCanceledOrders inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23217](https://github.com/ccxt/ccxt/pull/23217)
* bingx: setMarginMode inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23219](https://github.com/ccxt/ccxt/pull/23219)
* bingx: fetchMarginMode, inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23218](https://github.com/ccxt/ccxt/pull/23218)
* fix(krakenfutures): concurrent authentication by [@carlosmiei](https://github.com/carlosmiei) in [#23221](https://github.com/ccxt/ccxt/pull/23221)
* fix(types.cs): watchBalance type cast by [@carlosmiei](https://github.com/carlosmiei) in [#23224](https://github.com/ccxt/ccxt/pull/23224)
* defaultNetworkCode fixed by [@rayBastard](https://github.com/rayBastard) in [#23226](https://github.com/ccxt/ccxt/pull/23226)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23227](https://github.com/ccxt/ccxt/pull/23227)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.67...4.3.68](https://github.com/ccxt/ccxt/compare/4.3.67...4.3.68)
[Changes][4.3.68]
# [4.3.67](https://github.com/ccxt/ccxt/releases/tag/4.3.67) - 2024-07-24 [#4367---2024-07-24]
## What's Changed [#whats-changed-206]
* update docker-compose.yml (fixed bug with php in docker) by [@egorbulat98](https://github.com/egorbulat98) in [#23172](https://github.com/ccxt/ccxt/pull/23172)
* chore: isFiat return type by [@samgermain](https://github.com/samgermain) in [#23183](https://github.com/ccxt/ccxt/pull/23183)
* chore: safe methods param types by [@samgermain](https://github.com/samgermain) in [#23188](https://github.com/ccxt/ccxt/pull/23188)
* chore: types for parameters on base exchange by [@samgermain](https://github.com/samgermain) in [#23182](https://github.com/ccxt/ccxt/pull/23182)
* chore: ping param types by [@samgermain](https://github.com/samgermain) in [#23187](https://github.com/ccxt/ccxt/pull/23187)
* chore: parseAccount types by [@samgermain](https://github.com/samgermain) in [#23186](https://github.com/ccxt/ccxt/pull/23186)
* chore: remove delisted exchange by [@carlosmiei](https://github.com/carlosmiei) in [#23190](https://github.com/ccxt/ccxt/pull/23190)
* fix(bithumb) - parallel requests & others by [@ttodua](https://github.com/ttodua) in [#23181](https://github.com/ccxt/ccxt/pull/23181)
* tests - multi updates by [@ttodua](https://github.com/ttodua) in [#23157](https://github.com/ccxt/ccxt/pull/23157)
* chore(tests): types for pro tests by [@samgermain](https://github.com/samgermain) in [#23131](https://github.com/ccxt/ccxt/pull/23131)
* build(deps): bump ws from 8.16.0 to 8.17.1 by [@dependabot](https://github.com/dependabot) in [#23163](https://github.com/ccxt/ccxt/pull/23163)
* bingx: fetchOpenOrders, inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23198](https://github.com/ccxt/ccxt/pull/23198)
* bingx: cancelOrder, add inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23197](https://github.com/ccxt/ccxt/pull/23197)
* fix(future.cs): protect resolve call by [@carlosmiei](https://github.com/carlosmiei) in [#23202](https://github.com/ccxt/ccxt/pull/23202)
* feat(okx): add sequence check to checksum check in orderbook and fix market reference by [@pcriadoperez](https://github.com/pcriadoperez) in [#23195](https://github.com/ccxt/ccxt/pull/23195)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23204](https://github.com/ccxt/ccxt/pull/23204)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.66...4.3.67](https://github.com/ccxt/ccxt/compare/4.3.66...4.3.67)
[Changes][4.3.67]
# [4.3.66](https://github.com/ccxt/ccxt/releases/tag/4.3.66) - 2024-07-22 [#4366---2024-07-22]
## What's Changed [#whats-changed-207]
* base: fix typo in loadProxyModules (httpsProxyAgentModule) by [@egorbulat98](https://github.com/egorbulat98) in [#23171](https://github.com/ccxt/ccxt/pull/23171)
* fix future reject hanging error by [@pcriadoperez](https://github.com/pcriadoperez) in [#23161](https://github.com/ccxt/ccxt/pull/23161)
* feat(Readme): add sponsor by [@carlosmiei](https://github.com/carlosmiei) in [#23175](https://github.com/ccxt/ccxt/pull/23175)
* feat(binance): update static-tests by [@sc0Vu](https://github.com/sc0Vu) in [#23173](https://github.com/ccxt/ccxt/pull/23173)
* independentreserve: fix circular dependency by [@egorbulat98](https://github.com/egorbulat98) in [#23169](https://github.com/ccxt/ccxt/pull/23169)
* feat(hyperliquid) - watchTickers by [@ttodua](https://github.com/ttodua) in [#23117](https://github.com/ccxt/ccxt/pull/23117)
* feat(kraken): add fetchStatus by [@carlosmiei](https://github.com/carlosmiei) in [#23178](https://github.com/ccxt/ccxt/pull/23178)
* fix(okx): crude messageHash using milliseconds by [@carlosmiei](https://github.com/carlosmiei) in [#23179](https://github.com/ccxt/ccxt/pull/23179)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23180](https://github.com/ccxt/ccxt/pull/23180)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.65...4.3.66](https://github.com/ccxt/ccxt/compare/4.3.65...4.3.66)
[Changes][4.3.66]
# [4.3.65](https://github.com/ccxt/ccxt/releases/tag/4.3.65) - 2024-07-21 [#4365---2024-07-21]
## What's Changed [#whats-changed-208]
* build(deps): bump ws from 8.14.2 to 8.17.1 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#22843](https://github.com/ccxt/ccxt/pull/22843)
* build(deps-dev): bump braces from 3.0.2 to 3.0.3 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#22789](https://github.com/ccxt/ccxt/pull/22789)
* fix(bybit): fetchBalance funding account by [@carlosmiei](https://github.com/carlosmiei) in [#23164](https://github.com/ccxt/ccxt/pull/23164)
* fix(bybit): read options inside fetchBalance by [@carlosmiei](https://github.com/carlosmiei) in [#23165](https://github.com/ccxt/ccxt/pull/23165)
* fix(mexc) - skip vwap test ^Q by [@ttodua](https://github.com/ttodua) in [#23162](https://github.com/ccxt/ccxt/pull/23162)
* feat(bigone): add more test by [@sc0Vu](https://github.com/sc0Vu) in [#23167](https://github.com/ccxt/ccxt/pull/23167)
* feat(ascendex): add more tests by [@sc0Vu](https://github.com/sc0Vu) in [#23166](https://github.com/ccxt/ccxt/pull/23166)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.64...4.3.65](https://github.com/ccxt/ccxt/compare/4.3.64...4.3.65)
[Changes][4.3.65]
# [4.3.64](https://github.com/ccxt/ccxt/releases/tag/4.3.64) - 2024-07-20 [#4364---2024-07-20]
## What's Changed [#whats-changed-209]
* feat(independentreserve): withdraw implementation by [@samgermain](https://github.com/samgermain) in [#23141](https://github.com/ccxt/ccxt/pull/23141)
* fix(woo): fetchfundingHistory docs by [@carlosmiei](https://github.com/carlosmiei) in [#23139](https://github.com/ccxt/ccxt/pull/23139)
* chore: isFiat types by [@samgermain](https://github.com/samgermain) in [#23136](https://github.com/ccxt/ccxt/pull/23136)
* chore: types for ids.length by [@samgermain](https://github.com/samgermain) in [#23135](https://github.com/ccxt/ccxt/pull/23135)
* alpaca: add checkRequiredCredentials (fixed NRE in c# if apiKey is null) by [@egorbulat98](https://github.com/egorbulat98) in [#23145](https://github.com/ccxt/ccxt/pull/23145)
* fix(base) - add watchTicker emulated and fix fetchtickerWs by [@ttodua](https://github.com/ttodua) in [#23137](https://github.com/ccxt/ccxt/pull/23137)
* fix(runtests) - remove unnecessary untils by [@ttodua](https://github.com/ttodua) in [#23148](https://github.com/ccxt/ccxt/pull/23148)
* python - fix by [@ttodua](https://github.com/ttodua) in [#23126](https://github.com/ccxt/ccxt/pull/23126)
* bingx: fetchTradingFee by [@Dan-krm](https://github.com/Dan-krm) in [#23152](https://github.com/ccxt/ccxt/pull/23152)
* feat(woo): add pagination to fetchFundingHistory by [@carlosmiei](https://github.com/carlosmiei) in [#23153](https://github.com/ccxt/ccxt/pull/23153)
* fix(tests): get\_test\_files fix by [@carlosmiei](https://github.com/carlosmiei) in [#23154](https://github.com/ccxt/ccxt/pull/23154)
* feat(kucoin): add publicGetMarkPriceAllSymbols by [@carlosmiei](https://github.com/carlosmiei) in [#23155](https://github.com/ccxt/ccxt/pull/23155)
* C# OptionChain type: rename variables by [@Dan-krm](https://github.com/Dan-krm) in [#23158](https://github.com/ccxt/ccxt/pull/23158)
* fix types & comparisons by [@ttodua](https://github.com/ttodua) in [#23146](https://github.com/ccxt/ccxt/pull/23146)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23159](https://github.com/ccxt/ccxt/pull/23159)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.63...4.3.64](https://github.com/ccxt/ccxt/compare/4.3.63...4.3.64)
[Changes][4.3.64]
# [4.3.63](https://github.com/ccxt/ccxt/releases/tag/4.3.63) - 2024-07-18 [#4363---2024-07-18]
## What's Changed [#whats-changed-210]
* base: fix links in jsdocs by [@egorbulat98](https://github.com/egorbulat98) in [#23107](https://github.com/ccxt/ccxt/pull/23107)
* feat(kraken): add watchBalance by [@sc0Vu](https://github.com/sc0Vu) in [#23112](https://github.com/ccxt/ccxt/pull/23112)
* feat(binance) - watchOhlcvForSymbols by [@ttodua](https://github.com/ttodua) in [#23053](https://github.com/ccxt/ccxt/pull/23053)
* bingx: fetchPosition, fetchPositions inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23111](https://github.com/ccxt/ccxt/pull/23111)
* ace: update requestTests by [@sc0Vu](https://github.com/sc0Vu) in [#23113](https://github.com/ccxt/ccxt/pull/23113)
* fix(ace): python signature by [@carlosmiei](https://github.com/carlosmiei) in [#23115](https://github.com/ccxt/ccxt/pull/23115)
* cryptocom: add new staking endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#23120](https://github.com/ccxt/ccxt/pull/23120)
* bingx: fetchBalance, add inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23121](https://github.com/ccxt/ccxt/pull/23121)
* fix(c#) - responses parsing by [@ttodua](https://github.com/ttodua) in [#23116](https://github.com/ccxt/ccxt/pull/23116)
* fix(base): correct the symbol in safeOpenInterest by [@sc0Vu](https://github.com/sc0Vu) in [#23114](https://github.com/ccxt/ccxt/pull/23114)
* feat(bybit) - watchOhlcvForSymbols by [@ttodua](https://github.com/ttodua) in [#23059](https://github.com/ccxt/ccxt/pull/23059)
* fix(binance) - open orders rate limits by [@ttodua](https://github.com/ttodua) in [#23119](https://github.com/ccxt/ccxt/pull/23119)
* Woo update (marginMode) by [@yzh-pelle](https://github.com/yzh-pelle) in [#23045](https://github.com/ccxt/ccxt/pull/23045)
* checksum handling unification by [@ttodua](https://github.com/ttodua) in [#22150](https://github.com/ccxt/ccxt/pull/22150)
* ace: update api by [@sc0Vu](https://github.com/sc0Vu) in [#23124](https://github.com/ccxt/ccxt/pull/23124)
* mercado.createOrder string math by [@samgermain](https://github.com/samgermain) in [#17098](https://github.com/ccxt/ccxt/pull/17098)
* alpaca: update static tests by [@sc0Vu](https://github.com/sc0Vu) in [#23138](https://github.com/ccxt/ccxt/pull/23138)
* fix(xt, coinbaseinternational): type string = undefined updated to STR by [@samgermain](https://github.com/samgermain) in [#23132](https://github.com/ccxt/ccxt/pull/23132)
* fix(errors.ts): ChecksumError type by [@samgermain](https://github.com/samgermain) in [#23128](https://github.com/ccxt/ccxt/pull/23128)
* bingx: fetchMyLiquidations, inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23130](https://github.com/ccxt/ccxt/pull/23130)
* fix(cryptocom): fetchOHLCV by [@sc0Vu](https://github.com/sc0Vu) in [#23140](https://github.com/ccxt/ccxt/pull/23140)
* fix(ace): number comparison php by [@carlosmiei](https://github.com/carlosmiei) in [#23143](https://github.com/ccxt/ccxt/pull/23143)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23144](https://github.com/ccxt/ccxt/pull/23144)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.62...4.3.63](https://github.com/ccxt/ccxt/compare/4.3.62...4.3.63)
[Changes][4.3.63]
# [4.3.62](https://github.com/ccxt/ccxt/releases/tag/4.3.62) - 2024-07-15 [#4362---2024-07-15]
## What's Changed [#whats-changed-211]
* vertex: fix fetchCurrencies test by [@egorbulat98](https://github.com/egorbulat98) in [#23079](https://github.com/ccxt/ccxt/pull/23079)
* tradeogre: fix maker fee in market struct by [@egorbulat98](https://github.com/egorbulat98) in [#23085](https://github.com/ccxt/ccxt/pull/23085)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#23088](https://github.com/ccxt/ccxt/pull/23088)
* fix(binance): inverse positions parsing by [@carlosmiei](https://github.com/carlosmiei) in [#23090](https://github.com/ccxt/ccxt/pull/23090)
* fix(bybit): watchLiquidations parsing by [@carlosmiei](https://github.com/carlosmiei) in [#23091](https://github.com/ccxt/ccxt/pull/23091)
* fix [#22662](https://github.com/ccxt/ccxt/issues/22662) - ws closing by [@pcriadoperez](https://github.com/pcriadoperez) in [#23094](https://github.com/ccxt/ccxt/pull/23094)
* fix(binance): resolve orderbook on receiving snapshot by [@pcriadoperez](https://github.com/pcriadoperez) in [#23093](https://github.com/ccxt/ccxt/pull/23093)
* base: fix links in jsdocs by [@egorbulat98](https://github.com/egorbulat98) in [#23092](https://github.com/ccxt/ccxt/pull/23092)
* fix(bybit): Move loadMarkets call earlier in fetchPositions function by [@cozy-hn](https://github.com/cozy-hn) in [#23102](https://github.com/ccxt/ccxt/pull/23102)
* fix(binance): fetchOpenInterest for option market by [@sc0Vu](https://github.com/sc0Vu) in [#23099](https://github.com/ccxt/ccxt/pull/23099)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23095](https://github.com/ccxt/ccxt/pull/23095)
* fix(xt): signature encoding by [@carlosmiei](https://github.com/carlosmiei) in [#23104](https://github.com/ccxt/ccxt/pull/23104)
* base(type): use Dictionary\
# [4.3.61](https://github.com/ccxt/ccxt/releases/tag/4.3.61) - 2024-07-13 [#4361---2024-07-13]
## What's Changed [#whats-changed-212]
* hyperliquid: c# fix NullReferenceException when get currency info by [@egorbulat98](https://github.com/egorbulat98) in [#23076](https://github.com/ccxt/ccxt/pull/23076)
* base: c# fix withdraw limits in Currency struct by [@egorbulat98](https://github.com/egorbulat98) in [#23075](https://github.com/ccxt/ccxt/pull/23075)
* fix(tests) - eslintrc \
# [4.3.60](https://github.com/ccxt/ccxt/releases/tag/4.3.60) - 2024-07-12 [#4360---2024-07-12]
## What's Changed [#whats-changed-213]
* bingx: cancelAllOrders, inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23029](https://github.com/ccxt/ccxt/pull/23029)
* fix(binance): cancelAllOrders - unified response for contract and portfolio margin orders by [@samgermain](https://github.com/samgermain) in [#23040](https://github.com/ccxt/ccxt/pull/23040)
* feat(dev): .gitignore - added .custom\_gitignore by [@samgermain](https://github.com/samgermain) in [#23039](https://github.com/ccxt/ccxt/pull/23039)
* fix(bitfinex): cancelOrder, cancelAllOrders - unified response by [@samgermain](https://github.com/samgermain) in [#22986](https://github.com/ccxt/ccxt/pull/22986)
* feat(okx): add some error codes by [@goznauk](https://github.com/goznauk) in [#23043](https://github.com/ccxt/ccxt/pull/23043)
* fix(phemex): phemex keepAlive value reduced to 9000 to fix keepAlive error by [@samgermain](https://github.com/samgermain) in [#23048](https://github.com/ccxt/ccxt/pull/23048)
* wiki: add debt in balance structure by [@sc0Vu](https://github.com/sc0Vu) in [#23047](https://github.com/ccxt/ccxt/pull/23047)
* bingx: fetchTicker, fetchTickers add inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23046](https://github.com/ccxt/ccxt/pull/23046)
* bingx: fetchLeverage, add inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23049](https://github.com/ccxt/ccxt/pull/23049)
* fix(run-tests) - periphericals by [@ttodua](https://github.com/ttodua) in [#23041](https://github.com/ccxt/ccxt/pull/23041)
* fix(cancelOrdersForSymbols): docs by [@carlosmiei](https://github.com/carlosmiei) in [#23051](https://github.com/ccxt/ccxt/pull/23051)
* feat(timex): cancelOrder - response unification by [@samgermain](https://github.com/samgermain) in [#22653](https://github.com/ccxt/ccxt/pull/22653)
* feat(bitso): add sandbox url and static tests by [@carlosmiei](https://github.com/carlosmiei) in [#23055](https://github.com/ccxt/ccxt/pull/23055)
* fix(cex): handleOrderBookUpdate - use safeInteger instead of safeNumber for incrementalId by [@samgermain](https://github.com/samgermain) in [#23062](https://github.com/ccxt/ccxt/pull/23062)
* bingx: setLeverage, add inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23056](https://github.com/ccxt/ccxt/pull/23056)
* fix(xt) - fetchCurrencies & watchOHLCV by [@ttodua](https://github.com/ttodua) in [#23060](https://github.com/ccxt/ccxt/pull/23060)
* bingx: closePosition, closeAllPositions inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23067](https://github.com/ccxt/ccxt/pull/23067)
* fix(kraken): fetchLedger - timestamp millisecond data parsed correctly by [@samgermain](https://github.com/samgermain) in [#23061](https://github.com/ccxt/ccxt/pull/23061)
* cryptocom: update fetchOHLCV by [@sc0Vu](https://github.com/sc0Vu) in [#23069](https://github.com/ccxt/ccxt/pull/23069)
* feat(kucoin): watchMyTrades - params\["method"] options, fixes: [#23057](https://github.com/ccxt/ccxt/issues/23057) by [@samgermain](https://github.com/samgermain) in [#23064](https://github.com/ccxt/ccxt/pull/23064)
* fix(php) - test for method by [@ttodua](https://github.com/ttodua) in [#23058](https://github.com/ccxt/ccxt/pull/23058)
* fix(bitso): update api url by [@carlosmiei](https://github.com/carlosmiei) in [#23072](https://github.com/ccxt/ccxt/pull/23072)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23070](https://github.com/ccxt/ccxt/pull/23070)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.59...4.3.60](https://github.com/ccxt/ccxt/compare/4.3.59...4.3.60)
[Changes][4.3.60]
# [4.3.59](https://github.com/ccxt/ccxt/releases/tag/4.3.59) - 2024-07-09 [#4359---2024-07-09]
## What's Changed [#whats-changed-214]
* upbit: update fetchOpenOrders, fetchClosedOrders and fetchCanceledOrders by [@Dan-krm](https://github.com/Dan-krm) in [#23019](https://github.com/ccxt/ccxt/pull/23019)
* bingx: createOrder, inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23005](https://github.com/ccxt/ccxt/pull/23005)
* fix(build.sh): run request-tests sync and async with a single exchange by [@carlosmiei](https://github.com/carlosmiei) in [#23022](https://github.com/ccxt/ccxt/pull/23022)
* hyperliquid: add fetchTradingFee & static-tests by [@sc0Vu](https://github.com/sc0Vu) in [#23020](https://github.com/ccxt/ccxt/pull/23020)
* fix(binance) - message hashes by [@ttodua](https://github.com/ttodua) in [#22998](https://github.com/ccxt/ccxt/pull/22998)
* feat(bitmart): add /contract/private/position-risk by [@carlosmiei](https://github.com/carlosmiei) in [#23023](https://github.com/ccxt/ccxt/pull/23023)
* feat(exceptions) - BadResponse & CancelPending moved by [@ttodua](https://github.com/ttodua) in [#23016](https://github.com/ccxt/ccxt/pull/23016)
* fix!(exceptions) - ProxyError into InvalidProxySettings by [@ttodua](https://github.com/ttodua) in [#23001](https://github.com/ccxt/ccxt/pull/23001)
* feat(FAQ): add createMarketBuyRequiresPrice explanation by [@carlosmiei](https://github.com/carlosmiei) in [#23024](https://github.com/ccxt/ccxt/pull/23024)
* tests - fix args by [@ttodua](https://github.com/ttodua) in [#23000](https://github.com/ccxt/ccxt/pull/23000)
* fix(bybit): typo on variable name by [@goznauk](https://github.com/goznauk) in [#23030](https://github.com/ccxt/ccxt/pull/23030)
* fix(bingx) - watchTrades issue by [@ttodua](https://github.com/ttodua) in [#23027](https://github.com/ccxt/ccxt/pull/23027)
* feat(wiki) - taker maker fees by [@ttodua](https://github.com/ttodua) in [#22974](https://github.com/ccxt/ccxt/pull/22974)
* fix(digifinex): cancelOrder(s) - unified response by [@samgermain](https://github.com/samgermain) in [#23032](https://github.com/ccxt/ccxt/pull/23032)
* feat(xt): websocket implementation by [@samgermain](https://github.com/samgermain) in [#17814](https://github.com/ccxt/ccxt/pull/17814)
* fix(deribit): cancelAllOrders - unified response by [@samgermain](https://github.com/samgermain) in [#23031](https://github.com/ccxt/ccxt/pull/23031)
* fix(htx) - commonCurrencies by [@ttodua](https://github.com/ttodua) in [#20541](https://github.com/ccxt/ccxt/pull/20541)
* fix(gate) - commoncurrencies by [@ttodua](https://github.com/ttodua) in [#20543](https://github.com/ccxt/ccxt/pull/20543)
* fix(mexc) - commonCurrencies by [@ttodua](https://github.com/ttodua) in [#20544](https://github.com/ccxt/ccxt/pull/20544)
* fix(btcbox): load markets dynamically by [@carlosmiei](https://github.com/carlosmiei) in [#23035](https://github.com/ccxt/ccxt/pull/23035)
* fix(xtWs): watchOrderBook by [@carlosmiei](https://github.com/carlosmiei) in [#23036](https://github.com/ccxt/ccxt/pull/23036)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23037](https://github.com/ccxt/ccxt/pull/23037)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.58...4.3.59](https://github.com/ccxt/ccxt/compare/4.3.58...4.3.59)
[Changes][4.3.59]
# [4.3.58](https://github.com/ccxt/ccxt/releases/tag/4.3.58) - 2024-07-07 [#4358---2024-07-07]
## What's Changed [#whats-changed-215]
* htx: set minDeposit value in fetchCurrencies by [@egorbulat98](https://github.com/egorbulat98) in [#22977](https://github.com/ccxt/ccxt/pull/22977)
* bingx: fetchOHLCV inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#22976](https://github.com/ccxt/ccxt/pull/22976)
* Bigone cancel all orders by [@samgermain](https://github.com/samgermain) in [#22983](https://github.com/ccxt/ccxt/pull/22983)
* fix(latoken): cancelAllOrders - unified response by [@samgermain](https://github.com/samgermain) in [#22981](https://github.com/ccxt/ccxt/pull/22981)
* feat(kucoin): add affiliate/inviter/statistics by [@carlosmiei](https://github.com/carlosmiei) in [#22985](https://github.com/ccxt/ccxt/pull/22985)
* fix(alpaca): cancelAllOrders - unified response by [@samgermain](https://github.com/samgermain) in [#22984](https://github.com/ccxt/ccxt/pull/22984)
* bingx: fetchOrderBook inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#22980](https://github.com/ccxt/ccxt/pull/22980)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22987](https://github.com/ccxt/ccxt/pull/22987)
* bingx: fetchFundingRate, inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#22991](https://github.com/ccxt/ccxt/pull/22991)
* feat(woo) - opf by [@ttodua](https://github.com/ttodua) in [#22992](https://github.com/ccxt/ccxt/pull/22992)
* doc(htx): fix example error msg in comment by [@goznauk](https://github.com/goznauk) in [#23006](https://github.com/ccxt/ccxt/pull/23006)
* bingx: fetchOpenInterest, add inverse swap support by [@Dan-krm](https://github.com/Dan-krm) in [#23004](https://github.com/ccxt/ccxt/pull/23004)
* coinone: fix handle errors if cloudflare in response by [@egorbulat98](https://github.com/egorbulat98) in [#23002](https://github.com/ccxt/ccxt/pull/23002)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#23007](https://github.com/ccxt/ccxt/pull/23007)
* coinmate: fix handle errors, update ratelimit and fees by [@egorbulat98](https://github.com/egorbulat98) in [#23008](https://github.com/ccxt/ccxt/pull/23008)
* fix(okx): handleErrors' response parameter expects dictionary input by [@goznauk](https://github.com/goznauk) in [#23003](https://github.com/ccxt/ccxt/pull/23003)
* docs(okx): fix old exchange name to current one by [@goznauk](https://github.com/goznauk) in [#22999](https://github.com/ccxt/ccxt/pull/22999)
* fix(okx): fetchDepositWithdrawFees by [@carlosmiei](https://github.com/carlosmiei) in [#23011](https://github.com/ccxt/ccxt/pull/23011)
* fix(gate): swap trigger market orders by [@carlosmiei](https://github.com/carlosmiei) in [#23012](https://github.com/ccxt/ccxt/pull/23012)
* fix [#22996](https://github.com/ccxt/ccxt/issues/22996) - remove resolved future when using messageQueue by [@pcriadoperez](https://github.com/pcriadoperez) in [#23015](https://github.com/ccxt/ccxt/pull/23015)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#23013](https://github.com/ccxt/ccxt/pull/23013)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.57...4.3.58](https://github.com/ccxt/ccxt/compare/4.3.57...4.3.58)
[Changes][4.3.58]
# [4.3.57](https://github.com/ccxt/ccxt/releases/tag/4.3.57) - 2024-07-05 [#4357---2024-07-05]
## What's Changed [#whats-changed-216]
* fix(bitget): cancelAllOrders - unified response by [@samgermain](https://github.com/samgermain) in [#22949](https://github.com/ccxt/ccxt/pull/22949)
* huobijp, htx: cancelAllOrders, cancelOrders - unified response by [@samgermain](https://github.com/samgermain) in [#22962](https://github.com/ccxt/ccxt/pull/22962)
* bingx: fetchInverseSwapMarkets by [@Dan-krm](https://github.com/Dan-krm) in [#22970](https://github.com/ccxt/ccxt/pull/22970)
* coinone: fix ratelimit and handle errors by [@egorbulat98](https://github.com/egorbulat98) in [#22969](https://github.com/ccxt/ccxt/pull/22969)
* feat(gate): add cancelOrders and cancelOrdersForSymbols by [@carlosmiei](https://github.com/carlosmiei) in [#22972](https://github.com/ccxt/ccxt/pull/22972)
* Create message queue for unresolved messages in WS client by [@pcriadoperez](https://github.com/pcriadoperez) in [#22768](https://github.com/ccxt/ccxt/pull/22768)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.56...4.3.57](https://github.com/ccxt/ccxt/compare/4.3.56...4.3.57)
[Changes][4.3.57]
# [4.3.56](https://github.com/ccxt/ccxt/releases/tag/4.3.56) - 2024-07-03 [#4356---2024-07-03]
## What's Changed [#whats-changed-217]
* btcmarkets: fill active in market structure by [@egorbulat98](https://github.com/egorbulat98) in [#22947](https://github.com/ccxt/ccxt/pull/22947)
* fix(lbank): cancelOrder, cancelAllOrders - unified response by [@samgermain](https://github.com/samgermain) in [#22948](https://github.com/ccxt/ccxt/pull/22948)
* fix(hyperliquid): add maxLeverage to market by [@carlosmiei](https://github.com/carlosmiei) in [#22952](https://github.com/ccxt/ccxt/pull/22952)
* fix(delta): cancelAllOrders - unified response by [@samgermain](https://github.com/samgermain) in [#22951](https://github.com/ccxt/ccxt/pull/22951)
* fix(gate): add createMarketBuyOrderRequiresPrice to options by [@carlosmiei](https://github.com/carlosmiei) in [#22954](https://github.com/ccxt/ccxt/pull/22954)
* chore: remove banner by [@carlosmiei](https://github.com/carlosmiei) in [#22955](https://github.com/ccxt/ccxt/pull/22955)
* fix(bitflyer): cancelOrder - unified response by [@samgermain](https://github.com/samgermain) in [#22950](https://github.com/ccxt/ccxt/pull/22950)
* feat(tests): sync response tests by [@carlosmiei](https://github.com/carlosmiei) in [#22956](https://github.com/ccxt/ccxt/pull/22956)
* fix(php): remove Use of "static" in callables is deprecated warning by [@carlosmiei](https://github.com/carlosmiei) in [#22957](https://github.com/ccxt/ccxt/pull/22957)
* base - functionality for method retry on failure by [@ttodua](https://github.com/ttodua) in [#22861](https://github.com/ccxt/ccxt/pull/22861)
* fix(bybit): fetch balance for unified inverse account by [@sc0Vu](https://github.com/sc0Vu) in [#22960](https://github.com/ccxt/ccxt/pull/22960)
* fix(binance) - exceptions for OpRejected by [@ttodua](https://github.com/ttodua) in [#22958](https://github.com/ccxt/ccxt/pull/22958)
* bingx: add coin-m endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#22963](https://github.com/ccxt/ccxt/pull/22963)
* fix(bybit): fee to number by [@carlosmiei](https://github.com/carlosmiei) in [#22964](https://github.com/ccxt/ccxt/pull/22964)
* btcmarkets: fix handle errors by [@egorbulat98](https://github.com/egorbulat98) in [#22946](https://github.com/ccxt/ccxt/pull/22946)
* fix(bitopro): cancelOrder - unified response by [@samgermain](https://github.com/samgermain) in [#22961](https://github.com/ccxt/ccxt/pull/22961)
* fix(eddsa): missing reassignment by [@carlosmiei](https://github.com/carlosmiei) in [#22967](https://github.com/ccxt/ccxt/pull/22967)
* fix(bingx): skip 0 timestamp by [@carlosmiei](https://github.com/carlosmiei) in [#22966](https://github.com/ccxt/ccxt/pull/22966)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22968](https://github.com/ccxt/ccxt/pull/22968)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.55...4.3.56](https://github.com/ccxt/ccxt/compare/4.3.55...4.3.56)
[Changes][4.3.56]
# [4.3.55](https://github.com/ccxt/ccxt/releases/tag/4.3.55) - 2024-07-01 [#4355---2024-07-01]
## What's Changed [#whats-changed-218]
* okx: fetchPositions returns empty list in some cases by [@Dan-krm](https://github.com/Dan-krm) in [#22929](https://github.com/ccxt/ccxt/pull/22929)
* feature(coinbase) Allow use of heartbeats channel by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#22892](https://github.com/ccxt/ccxt/pull/22892)
* fix(ascendex): cancelAllOrders - unified response by [@samgermain](https://github.com/samgermain) in [#22926](https://github.com/ccxt/ccxt/pull/22926)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#22931](https://github.com/ccxt/ccxt/pull/22931)
* tests - reorg; base-tests, etc.. by [@ttodua](https://github.com/ttodua) in [#22381](https://github.com/ccxt/ccxt/pull/22381)
* fix(kucoin): correct price and amount in watchMyTrades by [@sc0Vu](https://github.com/sc0Vu) in [#22934](https://github.com/ccxt/ccxt/pull/22934)
* Fix poloniex edit\_order response by [@quantitative-technologies](https://github.com/quantitative-technologies) in [#22933](https://github.com/ccxt/ccxt/pull/22933)
* fix(blockchaincom): update urls and fees in doc by [@egorbulat98](https://github.com/egorbulat98) in [#22932](https://github.com/ccxt/ccxt/pull/22932)
* doc: fix typo in parameter descriptions by [@goznauk](https://github.com/goznauk) in [#22935](https://github.com/ccxt/ccxt/pull/22935)
* feat(base) - add marginMode type by [@ttodua](https://github.com/ttodua) in [#22920](https://github.com/ccxt/ccxt/pull/22920)
* feat(tests): add safeMethdos test by [@carlosmiei](https://github.com/carlosmiei) in [#22936](https://github.com/ccxt/ccxt/pull/22936)
* kucoin - fetchMarkets, setLeverage, implicit api by [@ttodua](https://github.com/ttodua) in [#22903](https://github.com/ccxt/ccxt/pull/22903)
* fix(woo): spot market parsing by [@carlosmiei](https://github.com/carlosmiei) in [#22941](https://github.com/ccxt/ccxt/pull/22941)
* fix(vertex): timestamp inside ws trade by [@carlosmiei](https://github.com/carlosmiei) in [#22940](https://github.com/ccxt/ccxt/pull/22940)
* btcalpha: fix handleErrors by [@egorbulat98](https://github.com/egorbulat98) in [#22939](https://github.com/ccxt/ccxt/pull/22939)
* fix(woo): disable test temporarily by [@carlosmiei](https://github.com/carlosmiei) in [#22942](https://github.com/ccxt/ccxt/pull/22942)
* fix(woo): response test by [@carlosmiei](https://github.com/carlosmiei) in [#22943](https://github.com/ccxt/ccxt/pull/22943)
* fix(woo): response tests by [@carlosmiei](https://github.com/carlosmiei) in [#22944](https://github.com/ccxt/ccxt/pull/22944)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22945](https://github.com/ccxt/ccxt/pull/22945)
## New Contributors [#new-contributors-90]
* [@quantitative-technologies](https://github.com/quantitative-technologies) made their first contribution in [#22933](https://github.com/ccxt/ccxt/pull/22933)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.54...4.3.55](https://github.com/ccxt/ccxt/compare/4.3.54...4.3.55)
[Changes][4.3.55]
# [4.3.54](https://github.com/ccxt/ccxt/releases/tag/4.3.54) - 2024-06-28 [#4354---2024-06-28]
## What's Changed [#whats-changed-219]
* fix(bingx) - max leverage markets ^Q by [@ttodua](https://github.com/ttodua) in [#22908](https://github.com/ccxt/ccxt/pull/22908)
* fix(poloniex): createOrder return type by [@carlosmiei](https://github.com/carlosmiei) in [#22911](https://github.com/ccxt/ccxt/pull/22911)
* fix(bingx) - remove leverage by [@ttodua](https://github.com/ttodua) in [#22912](https://github.com/ccxt/ccxt/pull/22912)
* Update binance.ts: Simple Typo in comment by [@goznauk](https://github.com/goznauk) in [#22916](https://github.com/ccxt/ccxt/pull/22916)
* fix(kucoin): update watchMyTrades by [@sc0Vu](https://github.com/sc0Vu) in [#22918](https://github.com/ccxt/ccxt/pull/22918)
* fix(python) - ruff syntax by [@ttodua](https://github.com/ttodua) in [#22921](https://github.com/ccxt/ccxt/pull/22921)
* Bybit: enable unified USDC support on bybit by [@Dan-krm](https://github.com/Dan-krm) in [#22917](https://github.com/ccxt/ccxt/pull/22917)
* fix(phemex): cancelAllOrders response unification by [@samgermain](https://github.com/samgermain) in [#22914](https://github.com/ccxt/ccxt/pull/22914)
* fix(woo): createMarketBuy/Sell with cost by [@carlosmiei](https://github.com/carlosmiei) in [#22922](https://github.com/ccxt/ccxt/pull/22922)
* fix(vertex) - ticker ts by [@ttodua](https://github.com/ttodua) in [#22924](https://github.com/ccxt/ccxt/pull/22924)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22923](https://github.com/ccxt/ccxt/pull/22923)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.53...4.3.54](https://github.com/ccxt/ccxt/compare/4.3.53...4.3.54)
[Changes][4.3.54]
# [4.3.53](https://github.com/ccxt/ccxt/releases/tag/4.3.53) - 2024-06-27 [#4353---2024-06-27]
## What's Changed [#whats-changed-220]
* fix [#22794](https://github.com/ccxt/ccxt/issues/22794) - fix arraycachebysymbolbyside by [@pcriadoperez](https://github.com/pcriadoperez) in [#22877](https://github.com/ccxt/ccxt/pull/22877)
* hyperliquid: remove extend param by [@sc0Vu](https://github.com/sc0Vu) in [#22901](https://github.com/ccxt/ccxt/pull/22901)
* parseIsolatedBorrowRate - header params by [@samgermain](https://github.com/samgermain) in [#22899](https://github.com/ccxt/ccxt/pull/22899)
* fix(probit) improved error handling by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#22893](https://github.com/ccxt/ccxt/pull/22893)
* New exchange: vertex by [@sc0Vu](https://github.com/sc0Vu) in [#22509](https://github.com/ccxt/ccxt/pull/22509)
* feat(hyperliquid): load all spot markets by [@carlosmiei](https://github.com/carlosmiei) in [#22902](https://github.com/ccxt/ccxt/pull/22902)
* fix(vertex): correct request id in python by [@sc0Vu](https://github.com/sc0Vu) in [#22907](https://github.com/ccxt/ccxt/pull/22907)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22905](https://github.com/ccxt/ccxt/pull/22905)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.52...4.3.53](https://github.com/ccxt/ccxt/compare/4.3.52...4.3.53)
[Changes][4.3.53]
# [4.3.52](https://github.com/ccxt/ccxt/releases/tag/4.3.52) - 2024-06-25 [#4352---2024-06-25]
## What's Changed [#whats-changed-221]
* feat(build): update transpile script by [@sc0Vu](https://github.com/sc0Vu) in [#22881](https://github.com/ccxt/ccxt/pull/22881)
* feat(okx): add sprd/cancel-all-after by [@carlosmiei](https://github.com/carlosmiei) in [#22888](https://github.com/ccxt/ccxt/pull/22888)
* fix(okx): keepAlive changed to 18000 to fix ping-pong keepAlive error by [@samgermain](https://github.com/samgermain) in [#22883](https://github.com/ccxt/ccxt/pull/22883)
* fix(bybit): add pagination in fetchOpenOrders by [@sc0Vu](https://github.com/sc0Vu) in [#22889](https://github.com/ccxt/ccxt/pull/22889)
* fix(binance): cancelOrders signature by [@carlosmiei](https://github.com/carlosmiei) in [#22890](https://github.com/ccxt/ccxt/pull/22890)
* fix(krakenfutures): add history url in test api by [@sc0Vu](https://github.com/sc0Vu) in [#22894](https://github.com/ccxt/ccxt/pull/22894)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22895](https://github.com/ccxt/ccxt/pull/22895)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.51...4.3.52](https://github.com/ccxt/ccxt/compare/4.3.51...4.3.52)
[Changes][4.3.52]
# [4.3.51](https://github.com/ccxt/ccxt/releases/tag/4.3.51) - 2024-06-24 [#4351---2024-06-24]
## What's Changed [#whats-changed-222]
* feat(bybit): add cancelAllOrdersAfter by [@carlosmiei](https://github.com/carlosmiei) in [#22870](https://github.com/ccxt/ccxt/pull/22870)
* binance: new API documentation by [@Dan-krm](https://github.com/Dan-krm) in [#22847](https://github.com/ccxt/ccxt/pull/22847)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#22872](https://github.com/ccxt/ccxt/pull/22872)
* fix(handleErrors): body content in php by [@carlosmiei](https://github.com/carlosmiei) in [#22874](https://github.com/ccxt/ccxt/pull/22874)
* fix(exmo): fix ratelimit. 350ms -> 100ms delay between requests by [@egorbulat98](https://github.com/egorbulat98) in [#22876](https://github.com/ccxt/ccxt/pull/22876)
* fix(bigone): fix ratelimit. 1200ms -> 20ms delay between requests by [@egorbulat98](https://github.com/egorbulat98) in [#22875](https://github.com/ccxt/ccxt/pull/22875)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22880](https://github.com/ccxt/ccxt/pull/22880)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.50...4.3.51](https://github.com/ccxt/ccxt/compare/4.3.50...4.3.51)
[Changes][4.3.51]
# [4.3.50](https://github.com/ccxt/ccxt/releases/tag/4.3.50) - 2024-06-22 [#4350---2024-06-22]
## What's Changed [#whats-changed-223]
* fix (c#) null baseCurrency in market structure by [@egorbulat98](https://github.com/egorbulat98) in [#22862](https://github.com/ccxt/ccxt/pull/22862)
* feat(bitget): add reduceOnly to the docs by [@carlosmiei](https://github.com/carlosmiei) in [#22866](https://github.com/ccxt/ccxt/pull/22866)
* feat(trigger): add trigger support by [@carlosmiei](https://github.com/carlosmiei) in [#22865](https://github.com/ccxt/ccxt/pull/22865)
* fix(base): correct microseconds in c# by [@sc0Vu](https://github.com/sc0Vu) in [#22867](https://github.com/ccxt/ccxt/pull/22867)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22868](https://github.com/ccxt/ccxt/pull/22868)
## New Contributors [#new-contributors-91]
* [@egorbulat98](https://github.com/egorbulat98) made their first contribution in [#22862](https://github.com/ccxt/ccxt/pull/22862)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.49...4.3.50](https://github.com/ccxt/ccxt/compare/4.3.49...4.3.50)
[Changes][4.3.50]
# [4.3.49](https://github.com/ccxt/ccxt/releases/tag/4.3.49) - 2024-06-20 [#4349---2024-06-20]
## What's Changed [#whats-changed-224]
* fix(ace): signature for private methods, \[TypeError] Cannot use in operator to search for 0 in timeStamp by [@samgermain](https://github.com/samgermain) in [#22845](https://github.com/ccxt/ccxt/pull/22845)
* binance - migration to TICK\_SIZE by [@ttodua](https://github.com/ttodua) in [#22811](https://github.com/ccxt/ccxt/pull/22811)
* fix(exchange): update php handle errors by [@sc0Vu](https://github.com/sc0Vu) in [#22846](https://github.com/ccxt/ccxt/pull/22846)
* Kraken cancel order by [@samgermain](https://github.com/samgermain) in [#22753](https://github.com/ccxt/ccxt/pull/22753)
* fix(kraken): reduceOnly parsing by [@carlosmiei](https://github.com/carlosmiei) in [#22848](https://github.com/ccxt/ccxt/pull/22848)
* fix(php-syntax) new dex property broke the php syntax checking by [@olegtaranenko](https://github.com/olegtaranenko) in [#22850](https://github.com/ccxt/ccxt/pull/22850)
* fix build skips ^Q by [@ttodua](https://github.com/ttodua) in [#22851](https://github.com/ccxt/ccxt/pull/22851)
* fix(hyperliquid): cancelOrder(s) unified response by [@samgermain](https://github.com/samgermain) in [#22854](https://github.com/ccxt/ccxt/pull/22854)
* fix(coinbase): cancelOrder - unify response by [@samgermain](https://github.com/samgermain) in [#22855](https://github.com/ccxt/ccxt/pull/22855)
* fix(bitso): cancelOrder - unify response by [@samgermain](https://github.com/samgermain) in [#22856](https://github.com/ccxt/ccxt/pull/22856)
* fix(coinbaseinternational): loadMarkets at beginning of subscribe and subscribeMultiple by [@samgermain](https://github.com/samgermain) in [#22853](https://github.com/ccxt/ccxt/pull/22853)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22858](https://github.com/ccxt/ccxt/pull/22858)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.48...4.3.49](https://github.com/ccxt/ccxt/compare/4.3.48...4.3.49)
[Changes][4.3.49]
# [4.3.48](https://github.com/ccxt/ccxt/releases/tag/4.3.48) - 2024-06-18 [#4348---2024-06-18]
## What's Changed [#whats-changed-225]
* fix(tests) - oxfun related issues by [@ttodua](https://github.com/ttodua) in [#22832](https://github.com/ccxt/ccxt/pull/22832)
* fix(bingx): restore safeValue inside handleOHLCV by [@carlosmiei](https://github.com/carlosmiei) in [#22834](https://github.com/ccxt/ccxt/pull/22834)
* feat(krakenfutures): add assignment program endpoints by [@carlosmiei](https://github.com/carlosmiei) in [#22837](https://github.com/ccxt/ccxt/pull/22837)
* feat(gate): add crud ws by [@pcriadoperez](https://github.com/pcriadoperez) in [#22826](https://github.com/ccxt/ccxt/pull/22826)
* fix(gateWs): minor adjustments by [@carlosmiei](https://github.com/carlosmiei) in [#22839](https://github.com/ccxt/ccxt/pull/22839)
* feat(binance): add precison-related static tests by [@carlosmiei](https://github.com/carlosmiei) in [#22840](https://github.com/ccxt/ccxt/pull/22840)
* fix(bingx) - spot /swap candles by [@ttodua](https://github.com/ttodua) in [#22835](https://github.com/ccxt/ccxt/pull/22835)
* fix(woo): ohlcv endpoint access by [@carlosmiei](https://github.com/carlosmiei) in [#22841](https://github.com/ccxt/ccxt/pull/22841)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22842](https://github.com/ccxt/ccxt/pull/22842)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.47...4.3.48](https://github.com/ccxt/ccxt/compare/4.3.47...4.3.48)
[Changes][4.3.48]
# [4.3.47](https://github.com/ccxt/ccxt/releases/tag/4.3.47) - 2024-06-17 [#4347---2024-06-17]
## What's Changed [#whats-changed-226]
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#22822](https://github.com/ccxt/ccxt/pull/22822)
* fix(hyperliquid): withdraw parsing by [@carlosmiei](https://github.com/carlosmiei) in [#22821](https://github.com/ccxt/ccxt/pull/22821)
* fix(coinex): watchOrderBook symbol inference by [@carlosmiei](https://github.com/carlosmiei) in [#22823](https://github.com/ccxt/ccxt/pull/22823)
* fix(bitmart): clientOrderId parsing by [@carlosmiei](https://github.com/carlosmiei) in [#22824](https://github.com/ccxt/ccxt/pull/22824)
* fix!(base) - precisionFromString update, to handle `e` and `E` and al… by [@ttodua](https://github.com/ttodua) in [#22812](https://github.com/ccxt/ccxt/pull/22812)
* fix(bitget): spot margin with createMarketBuyOrderRequiresPrice = false by [@carlosmiei](https://github.com/carlosmiei) in [#22831](https://github.com/ccxt/ccxt/pull/22831)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22830](https://github.com/ccxt/ccxt/pull/22830)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.46...4.3.47](https://github.com/ccxt/ccxt/compare/4.3.46...4.3.47)
[Changes][4.3.47]
# [4.3.46](https://github.com/ccxt/ccxt/releases/tag/4.3.46) - 2024-06-15 [#4346---2024-06-15]
## What's Changed [#whats-changed-227]
* feat(okx): add fetchBalance params by [@carlosmiei](https://github.com/carlosmiei) in [#22804](https://github.com/ccxt/ccxt/pull/22804)
* fix(bingx) - migrate to ticksize by [@ttodua](https://github.com/ttodua) in [#22803](https://github.com/ccxt/ccxt/pull/22803)
* fix(coinmetro) - migrate to tick size by [@ttodua](https://github.com/ttodua) in [#22805](https://github.com/ccxt/ccxt/pull/22805)
* feat(binance): add new apis by [@sc0Vu](https://github.com/sc0Vu) in [#22806](https://github.com/ccxt/ccxt/pull/22806)
* fix(oxfun): rename by [@carlosmiei](https://github.com/carlosmiei) in [#22807](https://github.com/ccxt/ccxt/pull/22807)
* feat(oxfun): update logo by [@carlosmiei](https://github.com/carlosmiei) in [#22809](https://github.com/ccxt/ccxt/pull/22809)
* fix(bitteam) - ticksize migration by [@ttodua](https://github.com/ttodua) in [#22802](https://github.com/ccxt/ccxt/pull/22802)
* fix(tokocrypto) - migration to TICK\_SIZE by [@ttodua](https://github.com/ttodua) in [#22808](https://github.com/ccxt/ccxt/pull/22808)
* fix(binanceus): remove fees override by [@carlosmiei](https://github.com/carlosmiei) in [#22813](https://github.com/ccxt/ccxt/pull/22813)
* feat(mexc): update withdraw endpoint by [@carlosmiei](https://github.com/carlosmiei) in [#22817](https://github.com/ccxt/ccxt/pull/22817)
* hyperliquid: update signature for transfer and withdraw by [@sc0Vu](https://github.com/sc0Vu) in [#22816](https://github.com/ccxt/ccxt/pull/22816)
* feat(bitmart): add clientOrderId support for spot orders by [@carlosmiei](https://github.com/carlosmiei) in [#22819](https://github.com/ccxt/ccxt/pull/22819)
* feat(exchange): add dex flag by [@carlosmiei](https://github.com/carlosmiei) in [#22818](https://github.com/ccxt/ccxt/pull/22818)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22820](https://github.com/ccxt/ccxt/pull/22820)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.45...4.3.46](https://github.com/ccxt/ccxt/compare/4.3.45...4.3.46)
[Changes][4.3.46]
# [4.3.45](https://github.com/ccxt/ccxt/releases/tag/4.3.45) - 2024-06-13 [#4345---2024-06-13]
## What's Changed [#whats-changed-228]
* feat(exchange): remove cert by [@carlosmiei](https://github.com/carlosmiei) in [#22799](https://github.com/ccxt/ccxt/pull/22799)
* TICK\_SIZE - waves.exchange by [@ttodua](https://github.com/ttodua) in [#13689](https://github.com/ccxt/ccxt/pull/13689)
* kucoin: added some new endpoints by [@Dan-krm](https://github.com/Dan-krm) in [#22798](https://github.com/ccxt/ccxt/pull/22798)
* fix(luno): cancelOrder - response unification by [@samgermain](https://github.com/samgermain) in [#22797](https://github.com/ccxt/ccxt/pull/22797)
* Added support for missing currencies by [@tomitomazic15](https://github.com/tomitomazic15) in [#22800](https://github.com/ccxt/ccxt/pull/22800)
* New exchange: ox.fun by [@rayBastard](https://github.com/rayBastard) in [#22354](https://github.com/ccxt/ccxt/pull/22354)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22801](https://github.com/ccxt/ccxt/pull/22801)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.44...4.3.45](https://github.com/ccxt/ccxt/compare/4.3.44...4.3.45)
[Changes][4.3.45]
# [4.3.44](https://github.com/ccxt/ccxt/releases/tag/4.3.44) - 2024-06-12 [#4344---2024-06-12]
## What's Changed [#whats-changed-229]
* fix(bitmex): guard handleOrderBook by [@sc0Vu](https://github.com/sc0Vu) in [#22786](https://github.com/ccxt/ccxt/pull/22786)
* fix(ndax): cancelAllOrders - unified response by [@samgermain](https://github.com/samgermain) in [#22793](https://github.com/ccxt/ccxt/pull/22793)
* fix(poloniexfutures): cancelAllOrders - response wrapped in safeOrder by [@samgermain](https://github.com/samgermain) in [#22791](https://github.com/ccxt/ccxt/pull/22791)
* fix(lykke): cancelOrder, cancelAllOrders - response unification by [@samgermain](https://github.com/samgermain) in [#22792](https://github.com/ccxt/ccxt/pull/22792)
* fix(woo): keepAlive set to 9000 to fix ping-pong keepAlive error by [@samgermain](https://github.com/samgermain) in [#22790](https://github.com/ccxt/ccxt/pull/22790)
* feat(xt): restore by [@carlosmiei](https://github.com/carlosmiei) in [#22782](https://github.com/ccxt/ccxt/pull/22782)
* feat(idTests): add xt by [@carlosmiei](https://github.com/carlosmiei) in [#22795](https://github.com/ccxt/ccxt/pull/22795)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.43...4.3.44](https://github.com/ccxt/ccxt/compare/4.3.43...4.3.44)
[Changes][4.3.44]
# [4.3.43](https://github.com/ccxt/ccxt/releases/tag/4.3.43) - 2024-06-11 [#4343---2024-06-11]
## What's Changed [#whats-changed-230]
* feat(binance): add bbo static tests by [@carlosmiei](https://github.com/carlosmiei) in [#22759](https://github.com/ccxt/ccxt/pull/22759)
* chore: update changelog \[ci skip] by [@carlosmiei](https://github.com/carlosmiei) in [#22765](https://github.com/ccxt/ccxt/pull/22765)
* fix(bitget) - margin ws orders by [@ttodua](https://github.com/ttodua) in [#22762](https://github.com/ccxt/ccxt/pull/22762)
* fix(mexc): pro - keepAlive changed to 8000, fixes error: Connection to wss\://wbs.mexc.com/ws timed out due to a ping-pong keepalive missing on time by [@samgermain](https://github.com/samgermain) in [#22764](https://github.com/ccxt/ccxt/pull/22764)
* coinex: fetchCurrencies v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22755](https://github.com/ccxt/ccxt/pull/22755)
* feat(types): automate export process by [@carlosmiei](https://github.com/carlosmiei) in [#22771](https://github.com/ccxt/ccxt/pull/22771)
* fix(tradeogre): cancelAllOrders - unify response by [@samgermain](https://github.com/samgermain) in [#22778](https://github.com/ccxt/ccxt/pull/22778)
* fix(tradeogre): createOrder - BadRequest thrown if type is "market", ArgumentsRequired thrown if price argument is missing by [@samgermain](https://github.com/samgermain) in [#22776](https://github.com/ccxt/ccxt/pull/22776)
* fix(bybit): pro - changed keepAlive value to 18000 by [@samgermain](https://github.com/samgermain) in [#22585](https://github.com/ccxt/ccxt/pull/22585)
* feat(phemex): add fetchOrder for USDT settled swaps by [@carlosmiei](https://github.com/carlosmiei) in [#22781](https://github.com/ccxt/ccxt/pull/22781)
* feat(binance): add internal payment history by [@sc0Vu](https://github.com/sc0Vu) in [#22772](https://github.com/ccxt/ccxt/pull/22772)
* Zonda cancel order unification by [@samgermain](https://github.com/samgermain) in [#22773](https://github.com/ccxt/ccxt/pull/22773)
* fix(wazirx): cancelAllOrders response unification by [@samgermain](https://github.com/samgermain) in [#22774](https://github.com/ccxt/ccxt/pull/22774)
* fix(wavesexchange): cancelOrder - response wrapped in safeOrder by [@samgermain](https://github.com/samgermain) in [#22775](https://github.com/ccxt/ccxt/pull/22775)
* fix(btcmarkets): cancelOrder(s) - unified response by [@samgermain](https://github.com/samgermain) in [#22685](https://github.com/ccxt/ccxt/pull/22685)
* build: skip-test by [@carlosmiei](https://github.com/carlosmiei) in [#22787](https://github.com/ccxt/ccxt/pull/22787)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22788](https://github.com/ccxt/ccxt/pull/22788)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.42...4.3.43](https://github.com/ccxt/ccxt/compare/4.3.42...4.3.43)
[Changes][4.3.43]
# [4.3.42](https://github.com/ccxt/ccxt/releases/tag/4.3.42) - 2024-06-07 [#4342---2024-06-07]
## What's Changed [#whats-changed-231]
* fix(kraken): cancelOrder(s), cancelAllOrders - unify response by [@samgermain](https://github.com/samgermain) in [#22745](https://github.com/ccxt/ccxt/pull/22745)
* fix(coinex): content-type remove charset by [@carlosmiei](https://github.com/carlosmiei) in [#22743](https://github.com/ccxt/ccxt/pull/22743)
* woo: update doc by [@sc0Vu](https://github.com/sc0Vu) in [#22746](https://github.com/ccxt/ccxt/pull/22746)
* fix(krakenfutures): cancelAllOrders - unify response by [@samgermain](https://github.com/samgermain) in [#22744](https://github.com/ccxt/ccxt/pull/22744)
* fix(kucoin): cancelOrder - unify response by [@samgermain](https://github.com/samgermain) in [#22723](https://github.com/ccxt/ccxt/pull/22723)
* fix(bitget): watchOrders spot-margin resolver by [@carlosmiei](https://github.com/carlosmiei) in [#22749](https://github.com/ccxt/ccxt/pull/22749)
* fix(mexcWs): update contract url by [@carlosmiei](https://github.com/carlosmiei) in [#22751](https://github.com/ccxt/ccxt/pull/22751)
* fix(cs): stringContent protection by [@carlosmiei](https://github.com/carlosmiei) in [#22752](https://github.com/ccxt/ccxt/pull/22752)
* fix(upbit): ws options by [@sc0Vu](https://github.com/sc0Vu) in [#22754](https://github.com/ccxt/ccxt/pull/22754)
* fix(blockchaincom): cancelOrder, cancelAllOrders unified response by [@samgermain](https://github.com/samgermain) in [#22678](https://github.com/ccxt/ccxt/pull/22678)
* bitmart: updated the fetchTickers spot endpoint by [@Dan-krm](https://github.com/Dan-krm) in [#22680](https://github.com/ccxt/ccxt/pull/22680)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.41...4.3.42](https://github.com/ccxt/ccxt/compare/4.3.41...4.3.42)
[Changes][4.3.42]
# [4.3.41](https://github.com/ccxt/ccxt/releases/tag/4.3.41) - 2024-06-05 [#4341---2024-06-05]
## What's Changed [#whats-changed-232]
* Bitstamp cancel order by [@samgermain](https://github.com/samgermain) in [#22669](https://github.com/ccxt/ccxt/pull/22669)
* fix(bingx) - watch multiple by [@ttodua](https://github.com/ttodua) in [#22629](https://github.com/ccxt/ccxt/pull/22629)
* fix(woo): cancelAllOrders - unified response by [@samgermain](https://github.com/samgermain) in [#22710](https://github.com/ccxt/ccxt/pull/22710)
* fix(coinmate): cancelOrder - unified response by [@samgermain](https://github.com/samgermain) in [#22713](https://github.com/ccxt/ccxt/pull/22713)
* fix(bithumb): cancelOrder - unified response by [@samgermain](https://github.com/samgermain) in [#22711](https://github.com/ccxt/ccxt/pull/22711)
* fix(coinspot): cancelOrder - unified response, remove dynamic method call by [@samgermain](https://github.com/samgermain) in [#22715](https://github.com/ccxt/ccxt/pull/22715)
* fix(coinone): cancelOrder - unified response by [@samgermain](https://github.com/samgermain) in [#22714](https://github.com/ccxt/ccxt/pull/22714)
* fix(bitget): watchOrders spot margin by [@carlosmiei](https://github.com/carlosmiei) in [#22718](https://github.com/ccxt/ccxt/pull/22718)
* okx: add new endpoints 2024-06-03 by [@Dan-krm](https://github.com/Dan-krm) in [#22725](https://github.com/ccxt/ccxt/pull/22725)
* feat(binance): add copyTrading endpoints by [@carlosmiei](https://github.com/carlosmiei) in [#22730](https://github.com/ccxt/ccxt/pull/22730)
* fix(indodax): cancelOrder - unified response by [@samgermain](https://github.com/samgermain) in [#22722](https://github.com/ccxt/ccxt/pull/22722)
* feat(orderbook): type variable by [@carlosmiei](https://github.com/carlosmiei) in [#22729](https://github.com/ccxt/ccxt/pull/22729)
* feat(upbit): watch private topic by [@sc0Vu](https://github.com/sc0Vu) in [#22724](https://github.com/ccxt/ccxt/pull/22724)
* fix(bitget) - watchOrder calculation of remaining & filled by [@ttodua](https://github.com/ttodua) in [#22728](https://github.com/ccxt/ccxt/pull/22728)
* feat(types.cs): handle info by [@carlosmiei](https://github.com/carlosmiei) in [#22731](https://github.com/ccxt/ccxt/pull/22731)
* fix(independentreserve): cancelOrder - unify response by [@samgermain](https://github.com/samgermain) in [#22721](https://github.com/ccxt/ccxt/pull/22721)
* fix(coinlist): cancelOrders - unify response by [@samgermain](https://github.com/samgermain) in [#22692](https://github.com/ccxt/ccxt/pull/22692)
* fix(bitfinex2): createOrder parsing by [@carlosmiei](https://github.com/carlosmiei) in [#22733](https://github.com/ccxt/ccxt/pull/22733)
* fix(appveyor): cinst replacement by [@carlosmiei](https://github.com/carlosmiei) in [#22738](https://github.com/ccxt/ccxt/pull/22738)
* fix(cs): update charset and fix uuid() by [@carlosmiei](https://github.com/carlosmiei) in [#22740](https://github.com/ccxt/ccxt/pull/22740)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22742](https://github.com/ccxt/ccxt/pull/22742)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.40...4.3.41](https://github.com/ccxt/ccxt/compare/4.3.40...4.3.41)
[Changes][4.3.41]
# [4.3.40](https://github.com/ccxt/ccxt/releases/tag/4.3.40) - 2024-06-04 [#4340---2024-06-04]
## What's Changed [#whats-changed-233]
* fix(binance): add swap to accountsByType by [@carlosmiei](https://github.com/carlosmiei) in [#22707](https://github.com/ccxt/ccxt/pull/22707)
* fix(hitbtc): currency network withdrawal and deposit status by [@emad-eldeen](https://github.com/emad-eldeen) in [#22705](https://github.com/ccxt/ccxt/pull/22705)
* Woofipro cancel order by [@samgermain](https://github.com/samgermain) in [#22709](https://github.com/ccxt/ccxt/pull/22709)
## New Contributors [#new-contributors-92]
* [@emad-eldeen](https://github.com/emad-eldeen) made their first contribution in [#22705](https://github.com/ccxt/ccxt/pull/22705)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.39...4.3.40](https://github.com/ccxt/ccxt/compare/4.3.39...4.3.40)
[Changes][4.3.40]
# [4.3.39](https://github.com/ccxt/ccxt/releases/tag/4.3.39) - 2024-06-03 [#4339---2024-06-03]
## What's Changed [#whats-changed-234]
* fix(CS): urlencode, handle special cases by [@carlosmiei](https://github.com/carlosmiei) in [#22704](https://github.com/ccxt/ccxt/pull/22704)
* fix(coinlist): cancelOrders encoding by [@carlosmiei](https://github.com/carlosmiei) in [#22706](https://github.com/ccxt/ccxt/pull/22706)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.38...4.3.39](https://github.com/ccxt/ccxt/compare/4.3.38...4.3.39)
[Changes][4.3.39]
# [4.3.38](https://github.com/ccxt/ccxt/releases/tag/4.3.38) - 2024-06-02 [#4338---2024-06-02]
## What's Changed [#whats-changed-235]
* fix(coinex): fetchBalance switch statements by [@carlosmiei](https://github.com/carlosmiei) in [#22683](https://github.com/ccxt/ccxt/pull/22683)
* feat(okx): Simple earn fixed endpoints by [@samgermain](https://github.com/samgermain) in [#22688](https://github.com/ccxt/ccxt/pull/22688)
* fix(btcturk): cancelOrder - response unification by [@samgermain](https://github.com/samgermain) in [#22686](https://github.com/ccxt/ccxt/pull/22686)
* fix(btcalpha): cancelOrder - unified response by [@samgermain](https://github.com/samgermain) in [#22684](https://github.com/ccxt/ccxt/pull/22684)
* fix(coincheck): cancelOrder - unified response by [@samgermain](https://github.com/samgermain) in [#22690](https://github.com/ccxt/ccxt/pull/22690)
* bitmart: update the fetchTrades spot endpoint by [@Dan-krm](https://github.com/Dan-krm) in [#22694](https://github.com/ccxt/ccxt/pull/22694)
* fix(coinbase): fetchAccounts default limit by [@carlosmiei](https://github.com/carlosmiei) in [#22698](https://github.com/ccxt/ccxt/pull/22698)
* fix(coinex): cancelAllOrders - unified response by [@samgermain](https://github.com/samgermain) in [#22691](https://github.com/ccxt/ccxt/pull/22691)
* feat(bl3p): cancelOrder - response unification by [@samgermain](https://github.com/samgermain) in [#22676](https://github.com/ccxt/ccxt/pull/22676)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.37...4.3.38](https://github.com/ccxt/ccxt/compare/4.3.37...4.3.38)
[Changes][4.3.38]
# [4.3.37](https://github.com/ccxt/ccxt/releases/tag/4.3.37) - 2024-05-31 [#4337---2024-05-31]
## What's Changed [#whats-changed-236]
* feat(kraken): adjust rl by [@carlosmiei](https://github.com/carlosmiei) in [#22661](https://github.com/ccxt/ccxt/pull/22661)
* feat(htx): closePosition by [@samgermain](https://github.com/samgermain) in [#20604](https://github.com/ccxt/ccxt/pull/20604)
* feat(bitbank): cancelOrder - response unification by [@samgermain](https://github.com/samgermain) in [#22667](https://github.com/ccxt/ccxt/pull/22667)
* feat(bingx): cancelOrders, cancelAllOrders - response unification by [@samgermain](https://github.com/samgermain) in [#22665](https://github.com/ccxt/ccxt/pull/22665)
* fix(woofipro): signHash in php by [@sc0Vu](https://github.com/sc0Vu) in [#22673](https://github.com/ccxt/ccxt/pull/22673)
* fix(cli.py): remove call reg to suppress warning by [@carlosmiei](https://github.com/carlosmiei) in [#22677](https://github.com/ccxt/ccxt/pull/22677)
* fix(bitmart): remove abs for percentage in ticker by [@sc0Vu](https://github.com/sc0Vu) in [#22674](https://github.com/ccxt/ccxt/pull/22674)
* fix(kraken): div trading fee by 100 by [@sc0Vu](https://github.com/sc0Vu) in [#22679](https://github.com/ccxt/ccxt/pull/22679)
* fix(static): disable failing static test by [@carlosmiei](https://github.com/carlosmiei) in [#22682](https://github.com/ccxt/ccxt/pull/22682)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.36...4.3.37](https://github.com/ccxt/ccxt/compare/4.3.36...4.3.37)
[Changes][4.3.37]
# [4.3.36](https://github.com/ccxt/ccxt/releases/tag/4.3.36) - 2024-05-29 [#4336---2024-05-29]
## What's Changed [#whats-changed-237]
* bitget hedge mode by [@ttodua](https://github.com/ttodua) in [#22610](https://github.com/ccxt/ccxt/pull/22610)
* feat(whitebit): cancelOrder, cancelAllOrders - response unification by [@samgermain](https://github.com/samgermain) in [#22652](https://github.com/ccxt/ccxt/pull/22652)
* paymium: cancelOrder - unified response by [@samgermain](https://github.com/samgermain) in [#22654](https://github.com/ccxt/ccxt/pull/22654)
* feat(zonda): new deposit & withdrawal endpoints by [@samgermain](https://github.com/samgermain) in [#22649](https://github.com/ccxt/ccxt/pull/22649)
* bitmart: watchOrders edit spot support by [@Dan-krm](https://github.com/Dan-krm) in [#22656](https://github.com/ccxt/ccxt/pull/22656)
* feat(bit2c): cancelOrder - unified response by [@samgermain](https://github.com/samgermain) in [#22648](https://github.com/ccxt/ccxt/pull/22648)
* feat(zaif): cancelOrder - unification by [@samgermain](https://github.com/samgermain) in [#22651](https://github.com/ccxt/ccxt/pull/22651)
* fix(bingx): symbol inference on trades by [@carlosmiei](https://github.com/carlosmiei) in [#22659](https://github.com/ccxt/ccxt/pull/22659)
* feat(orderbook): type variable by [@carlosmiei](https://github.com/carlosmiei) in [#22660](https://github.com/ccxt/ccxt/pull/22660)
* fix(bitfinex2) handleOrderBook by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#22658](https://github.com/ccxt/ccxt/pull/22658)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.35...4.3.36](https://github.com/ccxt/ccxt/compare/4.3.35...4.3.36)
[Changes][4.3.36]
# [4.3.35](https://github.com/ccxt/ccxt/releases/tag/4.3.35) - 2024-05-28 [#4335---2024-05-28]
## What's Changed [#whats-changed-238]
* feat(base) - findNearestCeiling by [@ttodua](https://github.com/ttodua) in [#22630](https://github.com/ccxt/ccxt/pull/22630)
* feat(base): uncamelcase python/php base invocations programatically by [@ttodua](https://github.com/ttodua) in [#13882](https://github.com/ccxt/ccxt/pull/13882)
* alpaca cancelOrder unified response by [@samgermain](https://github.com/samgermain) in [#22635](https://github.com/ccxt/ccxt/pull/22635)
* coinex: withdraw v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22637](https://github.com/ccxt/ccxt/pull/22637)
* fix(bitmart): fetchTickers by [@carlosmiei](https://github.com/carlosmiei) in [#22640](https://github.com/ccxt/ccxt/pull/22640)
* fix(kraken): since handling by [@carlosmiei](https://github.com/carlosmiei) in [#22641](https://github.com/ccxt/ccxt/pull/22641)
* fix(kraken): since off by 1 fix by [@carlosmiei](https://github.com/carlosmiei) in [#22642](https://github.com/ccxt/ccxt/pull/22642)
* fix(bitget): watchOrders different subs by [@carlosmiei](https://github.com/carlosmiei) in [#22644](https://github.com/ccxt/ccxt/pull/22644)
* feat(coinbase): add fetchTradingFees by [@carlosmiei](https://github.com/carlosmiei) in [#22645](https://github.com/ccxt/ccxt/pull/22645)
* fix(okx) - await by [@ttodua](https://github.com/ttodua) in [#22647](https://github.com/ccxt/ccxt/pull/22647)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22646](https://github.com/ccxt/ccxt/pull/22646)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.34...4.3.35](https://github.com/ccxt/ccxt/compare/4.3.34...4.3.35)
[Changes][4.3.35]
# [4.3.34](https://github.com/ccxt/ccxt/releases/tag/4.3.34) - 2024-05-27 [#4334---2024-05-27]
## What's Changed [#whats-changed-239]
* feat(binance): add v1/account/info by [@carlosmiei](https://github.com/carlosmiei) in [#22627](https://github.com/ccxt/ccxt/pull/22627)
* fix(handleErrors): types by [@carlosmiei](https://github.com/carlosmiei) in [#22618](https://github.com/ccxt/ccxt/pull/22618)
* feat(exchange,binance, gate, bybit, okx, bitmex): add watchLiquidations and watchMyLiquidations, add tests for fetch and watchLiquidations by [@pcriadoperez](https://github.com/pcriadoperez) in [#19832](https://github.com/ccxt/ccxt/pull/19832)
* fix(coinbase) - add usePrivate option by [@ttodua](https://github.com/ttodua) in [#22579](https://github.com/ccxt/ccxt/pull/22579)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22628](https://github.com/ccxt/ccxt/pull/22628)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.33...4.3.34](https://github.com/ccxt/ccxt/compare/4.3.33...4.3.34)
[Changes][4.3.34]
# [4.3.33](https://github.com/ccxt/ccxt/releases/tag/4.3.33) - 2024-05-26 [#4333---2024-05-26]
## What's Changed [#whats-changed-240]
* fix broken docu build by [@olegtaranenko](https://github.com/olegtaranenko) in [#22620](https://github.com/ccxt/ccxt/pull/22620)
* chore: update changelog by [@carlosmiei](https://github.com/carlosmiei) in [#22624](https://github.com/ccxt/ccxt/pull/22624)
* fix(bitget): swap order placement weight adjustment by [@carlosmiei](https://github.com/carlosmiei) in [#22625](https://github.com/ccxt/ccxt/pull/22625)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.32...4.3.33](https://github.com/ccxt/ccxt/compare/4.3.32...4.3.33)
[Changes][4.3.33]
# [4.3.32](https://github.com/ccxt/ccxt/releases/tag/4.3.32) - 2024-05-25 [#4332---2024-05-25]
## What's Changed [#whats-changed-241]
* feat(cex): handleOrderBookSnapshot - string math by [@samgermain](https://github.com/samgermain) in [#19456](https://github.com/ccxt/ccxt/pull/19456)
* coinex: fetchLeverages v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22616](https://github.com/ccxt/ccxt/pull/22616)
* docs(mexc): pro - docstrings for pro methods updated from mexc3 to mexc by [@samgermain](https://github.com/samgermain) in [#22615](https://github.com/ccxt/ccxt/pull/22615)
* fix(coinbase) - WS fixes by [@ttodua](https://github.com/ttodua) in [#22612](https://github.com/ccxt/ccxt/pull/22612)
* fix(tests) - args by [@ttodua](https://github.com/ttodua) in [#22613](https://github.com/ccxt/ccxt/pull/22613)
* fix(base) - handleParamBool & handleParamBool2 by [@ttodua](https://github.com/ttodua) in [#22611](https://github.com/ccxt/ccxt/pull/22611)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.31...4.3.32](https://github.com/ccxt/ccxt/compare/4.3.31...4.3.32)
[Changes][4.3.32]
# [4.3.31](https://github.com/ccxt/ccxt/releases/tag/4.3.31) - 2024-05-24 [#4331---2024-05-24]
## What's Changed [#whats-changed-242]
* fix(bingx) websocket ticker timestamp/datetime by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#22591](https://github.com/ccxt/ccxt/pull/22591)
* feat(exchange): type request object by [@carlosmiei](https://github.com/carlosmiei) in [#22577](https://github.com/ccxt/ccxt/pull/22577)
* fix(binance): portfolioMargin postOnly handling by [@carlosmiei](https://github.com/carlosmiei) in [#22592](https://github.com/ccxt/ccxt/pull/22592)
* fix(poloniexfutures) - timestamp by [@ttodua](https://github.com/ttodua) in [#22598](https://github.com/ccxt/ccxt/pull/22598)
* chore: test file types by [@samgermain](https://github.com/samgermain) in [#21989](https://github.com/ccxt/ccxt/pull/21989)
* chore: types.ts - types by [@samgermain](https://github.com/samgermain) in [#22385](https://github.com/ccxt/ccxt/pull/22385)
* coinex: fetchDepositWithdrawFee v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22602](https://github.com/ccxt/ccxt/pull/22602)
* fix(parseLedgerEntry): type by [@carlosmiei](https://github.com/carlosmiei) in [#22596](https://github.com/ccxt/ccxt/pull/22596)
* feat(parseTransaction): type by [@carlosmiei](https://github.com/carlosmiei) in [#22595](https://github.com/ccxt/ccxt/pull/22595)
* feat(types): type aux methods by [@carlosmiei](https://github.com/carlosmiei) in [#22597](https://github.com/ccxt/ccxt/pull/22597)
* feat(binance): add feeBurn endpoints by [@carlosmiei](https://github.com/carlosmiei) in [#22604](https://github.com/ccxt/ccxt/pull/22604)
* feat(parseTrade): type by [@carlosmiei](https://github.com/carlosmiei) in [#22594](https://github.com/ccxt/ccxt/pull/22594)
* fix(parseOrder): type order by [@carlosmiei](https://github.com/carlosmiei) in [#22593](https://github.com/ccxt/ccxt/pull/22593)
* Leverage tiers types by [@samgermain](https://github.com/samgermain) in [#22465](https://github.com/ccxt/ccxt/pull/22465)
* fix(kraken): fetchOHLCV since handling by [@carlosmiei](https://github.com/carlosmiei) in [#22607](https://github.com/ccxt/ccxt/pull/22607)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22608](https://github.com/ccxt/ccxt/pull/22608)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.30...4.3.31](https://github.com/ccxt/ccxt/compare/4.3.30...4.3.31)
[Changes][4.3.31]
# [4.3.30](https://github.com/ccxt/ccxt/releases/tag/4.3.30) - 2024-05-23 [#4330---2024-05-23]
## What's Changed [#whats-changed-243]
* fix(manual): browserified version path by [@carlosmiei](https://github.com/carlosmiei) in [#22568](https://github.com/ccxt/ccxt/pull/22568)
* fix(vss): minified version by [@carlosmiei](https://github.com/carlosmiei) in [#22569](https://github.com/ccxt/ccxt/pull/22569)
* fix(future.py): add tests and fixes by [@carlosmiei](https://github.com/carlosmiei) in [#22461](https://github.com/ccxt/ccxt/pull/22461)
* fix(whitebit) - add market order by cost endpoint by [@ttodua](https://github.com/ttodua) in [#22572](https://github.com/ccxt/ccxt/pull/22572)
* coinex: fetchWithdrawals, fetchDeposits v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22574](https://github.com/ccxt/ccxt/pull/22574)
* bingx: patch cost in parseOrder by [@sc0Vu](https://github.com/sc0Vu) in [#22573](https://github.com/ccxt/ccxt/pull/22573)
* fix(whitebit): market sell with cost removal by [@carlosmiei](https://github.com/carlosmiei) in [#22576](https://github.com/ccxt/ccxt/pull/22576)
* fix(fetchLeverages): default market type by [@carlosmiei](https://github.com/carlosmiei) in [#22586](https://github.com/ccxt/ccxt/pull/22586)
* coinex: borrowIsolatedMargin, repayIsolatedMargin v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22583](https://github.com/ccxt/ccxt/pull/22583)
* coinex: fetchBorrowInterest v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22581](https://github.com/ccxt/ccxt/pull/22581)
* coinex: fetchIsolatedBorrowRate v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22580](https://github.com/ccxt/ccxt/pull/22580)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22587](https://github.com/ccxt/ccxt/pull/22587)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.29...4.3.30](https://github.com/ccxt/ccxt/compare/4.3.29...4.3.30)
[Changes][4.3.30]
# [4.3.29](https://github.com/ccxt/ccxt/releases/tag/4.3.29) - 2024-05-21 [#4329---2024-05-21]
## What's Changed [#whats-changed-244]
* feat(bitmart): add createOrders by [@carlosmiei](https://github.com/carlosmiei) in [#22557](https://github.com/ccxt/ccxt/pull/22557)
* whitebit parseBalance fix by [@ndubel](https://github.com/ndubel) in [#22559](https://github.com/ccxt/ccxt/pull/22559)
* bingx: update ratelimits by [@Dan-krm](https://github.com/Dan-krm) in [#22563](https://github.com/ccxt/ccxt/pull/22563)
* fix(kucoin): invalid order error mapping by [@carlosmiei](https://github.com/carlosmiei) in [#22565](https://github.com/ccxt/ccxt/pull/22565)
* fix(Orderbook.ts): typescript types by [@carlosmiei](https://github.com/carlosmiei) in [#22564](https://github.com/ccxt/ccxt/pull/22564)
* fix(npm): browser bundle by [@carlosmiei](https://github.com/carlosmiei) in [#22566](https://github.com/ccxt/ccxt/pull/22566)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22567](https://github.com/ccxt/ccxt/pull/22567)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.28...4.3.29](https://github.com/ccxt/ccxt/compare/4.3.28...4.3.29)
[Changes][4.3.29]
# [4.3.28](https://github.com/ccxt/ccxt/releases/tag/4.3.28) - 2024-05-20 [#4328---2024-05-20]
## What's Changed [#whats-changed-245]
* fix(coinbase) added datetime/timestamp to ws ticker by [@CH-EdwinB](https://github.com/CH-EdwinB) in [#22544](https://github.com/ccxt/ccxt/pull/22544)
* feat(bitget): add v2/earn/account/assets by [@carlosmiei](https://github.com/carlosmiei) in [#22546](https://github.com/ccxt/ccxt/pull/22546)
* feat(bitmart): add spot cancelOrders by [@carlosmiei](https://github.com/carlosmiei) in [#22529](https://github.com/ccxt/ccxt/pull/22529)
* chore: update changelog \[ci-skip] by [@carlosmiei](https://github.com/carlosmiei) in [#22548](https://github.com/ccxt/ccxt/pull/22548)
* docs(krakenfutures): fix docs url by [@pcriadoperez](https://github.com/pcriadoperez) in [#22553](https://github.com/ccxt/ccxt/pull/22553)
* fix(coinbase): fix parseOrder to use safeMarket - fix [#2250](https://github.com/ccxt/ccxt/issues/2250) by [@pcriadoperez](https://github.com/pcriadoperez) in [#22554](https://github.com/ccxt/ccxt/pull/22554)
* fix(bybit): fetchFundingRateHistory pagination by [@carlosmiei](https://github.com/carlosmiei) in [#22549](https://github.com/ccxt/ccxt/pull/22549)
* fix(bingx): sl/tp order parsing by [@carlosmiei](https://github.com/carlosmiei) in [#22556](https://github.com/ccxt/ccxt/pull/22556)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.27...4.3.28](https://github.com/ccxt/ccxt/compare/4.3.27...4.3.28)
[Changes][4.3.28]
# [4.3.27](https://github.com/ccxt/ccxt/releases/tag/4.3.27) - 2024-05-18 [#4327---2024-05-18]
## What's Changed [#whats-changed-246]
* build: \[ci deploy] \[skip-tests] by [@carlosmiei](https://github.com/carlosmiei) in [#22545](https://github.com/ccxt/ccxt/pull/22545)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.25...4.3.27](https://github.com/ccxt/ccxt/compare/4.3.25...4.3.27)
[Changes][4.3.27]
# [4.3.25](https://github.com/ccxt/ccxt/releases/tag/4.3.25) - 2024-05-17 [#4325---2024-05-17]
## What's Changed [#whats-changed-247]
* fix(phemex): swap order fees by [@carlosmiei](https://github.com/carlosmiei) in [#22517](https://github.com/ccxt/ccxt/pull/22517)
* feat(kraken): add createMarketBuyOrderWithCost by [@carlosmiei](https://github.com/carlosmiei) in [#22522](https://github.com/ccxt/ccxt/pull/22522)
* coinex: fetchTransfers v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22523](https://github.com/ccxt/ccxt/pull/22523)
* fix(omitZero): protect against non numeric inputs by [@carlosmiei](https://github.com/carlosmiei) in [#22524](https://github.com/ccxt/ccxt/pull/22524)
* feat(kraken): support multiple oflags by [@carlosmiei](https://github.com/carlosmiei) in [#22525](https://github.com/ccxt/ccxt/pull/22525)
* feat(base) - handleParamString2, handleParamInteger2 by [@ttodua](https://github.com/ttodua) in [#22042](https://github.com/ccxt/ccxt/pull/22042)
* fix(kraken): usdt market buy with cost by [@carlosmiei](https://github.com/carlosmiei) in [#22526](https://github.com/ccxt/ccxt/pull/22526)
* fix(editOrderWs): amount should be optional by [@carlosmiei](https://github.com/carlosmiei) in [#22528](https://github.com/ccxt/ccxt/pull/22528)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22527](https://github.com/ccxt/ccxt/pull/22527)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.24...4.3.25](https://github.com/ccxt/ccxt/compare/4.3.24...4.3.25)
[Changes][4.3.25]
# [4.3.24](https://github.com/ccxt/ccxt/releases/tag/4.3.24) - 2024-05-16 [#4324---2024-05-16]
## What's Changed [#whats-changed-248]
* feat(coinex): infer order type by [@carlosmiei](https://github.com/carlosmiei) in [#22501](https://github.com/ccxt/ccxt/pull/22501)
* feat(kucoin): add new validation header by [@carlosmiei](https://github.com/carlosmiei) in [#22503](https://github.com/ccxt/ccxt/pull/22503)
* fix(waves) - static tests by [@ttodua](https://github.com/ttodua) in [#22506](https://github.com/ccxt/ccxt/pull/22506)
* Deprecate CoinbasePro and add CoinbaseExchange by [@carlosmiei](https://github.com/carlosmiei) in [#22502](https://github.com/ccxt/ccxt/pull/22502)
* fix(bybit): fetchPaginatedCallCursor exception fix by [@carlosmiei](https://github.com/carlosmiei) in [#22507](https://github.com/ccxt/ccxt/pull/22507)
* fix(waves): static tests utils by [@carlosmiei](https://github.com/carlosmiei) in [#22508](https://github.com/ccxt/ccxt/pull/22508)
* fix(bitrue): sign with query params by [@sc0Vu](https://github.com/sc0Vu) in [#22504](https://github.com/ccxt/ccxt/pull/22504)
* fix(bitget) - watch parse orders by [@ttodua](https://github.com/ttodua) in [#22510](https://github.com/ccxt/ccxt/pull/22510)
* coinex: transfer v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22511](https://github.com/ccxt/ccxt/pull/22511)
* build: fix request tests by [@carlosmiei](https://github.com/carlosmiei) in [#22513](https://github.com/ccxt/ccxt/pull/22513)
* fix(bitrue): php array length by [@carlosmiei](https://github.com/carlosmiei) in [#22515](https://github.com/ccxt/ccxt/pull/22515)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22514](https://github.com/ccxt/ccxt/pull/22514)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.23...4.3.24](https://github.com/ccxt/ccxt/compare/4.3.23...4.3.24)
[Changes][4.3.24]
# [4.3.23](https://github.com/ccxt/ccxt/releases/tag/4.3.23) - 2024-05-15 [#4323---2024-05-15]
## What's Changed [#whats-changed-249]
* fix(poloniexfutures): fix watchOrderBook by [@pcriadoperez](https://github.com/pcriadoperez) in [#22487](https://github.com/ccxt/ccxt/pull/22487)
* fix(docs) - position mode by [@ttodua](https://github.com/ttodua) in [#22491](https://github.com/ccxt/ccxt/pull/22491)
* fix(coinbase) - fetchTickers market types by [@ttodua](https://github.com/ttodua) in [#22490](https://github.com/ccxt/ccxt/pull/22490)
* whitebit new endpoints by [@ndubel](https://github.com/ndubel) in [#22485](https://github.com/ccxt/ccxt/pull/22485)
* coinex fetchFundingHistory v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22489](https://github.com/ccxt/ccxt/pull/22489)
* probit commonCurrencies by [@ndubel](https://github.com/ndubel) in [#22486](https://github.com/ccxt/ccxt/pull/22486)
* feat(manual): mention to static tests by [@carlosmiei](https://github.com/carlosmiei) in [#22482](https://github.com/ccxt/ccxt/pull/22482)
* coinex error mapping by [@ndubel](https://github.com/ndubel) in [#22492](https://github.com/ccxt/ccxt/pull/22492)
* build(deps): bump next from 14.0.3 to 14.1.1 in /examples/ts/nextjs-page-router by [@dependabot](https://github.com/dependabot) in [#22453](https://github.com/ccxt/ccxt/pull/22453)
* fix(binance): update default value of options.leverageBrackets by [@sc0Vu](https://github.com/sc0Vu) in [#22496](https://github.com/ccxt/ccxt/pull/22496)
* coinex: fetchFundingRate, fetchFundingRates, fetchFundingRateHistory v2 by [@Dan-krm](https://github.com/Dan-krm) in [#22497](https://github.com/ccxt/ccxt/pull/22497)
* fix(phemex) - funding fees by [@ttodua](https://github.com/ttodua) in [#22443](https://github.com/ccxt/ccxt/pull/22443)
* build: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22499](https://github.com/ccxt/ccxt/pull/22499)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.22...4.3.23](https://github.com/ccxt/ccxt/compare/4.3.22...4.3.23)
[Changes][4.3.23]
# [4.3.22](https://github.com/ccxt/ccxt/releases/tag/4.3.22) - 2024-05-13 [#4322---2024-05-13]
## What's Changed [#whats-changed-250]
* feat(travis): create release by [@pcriadoperez](https://github.com/pcriadoperez) in [#20535](https://github.com/ccxt/ccxt/pull/20535)
* fix(php): spawn by [@pcriadoperez](https://github.com/pcriadoperez) in [#21895](https://github.com/ccxt/ccxt/pull/21895)
* fix(coinex): handleErrors should also check for "OK" by [@roelvv](https://github.com/roelvv) in [#22479](https://github.com/ccxt/ccxt/pull/22479)
* fix(tests): remove asyncio.gather from sync tests by [@carlosmiei](https://github.com/carlosmiei) in [#22480](https://github.com/ccxt/ccxt/pull/22480)
* fix(phemex): handle PT fees by [@carlosmiei](https://github.com/carlosmiei) in [#22481](https://github.com/ccxt/ccxt/pull/22481)
* chore: skip-tests by [@carlosmiei](https://github.com/carlosmiei) in [#22483](https://github.com/ccxt/ccxt/pull/22483)
**Full Changelog**: [https://github.com/ccxt/ccxt/compare/4.3.21...4.3.22](https://github.com/ccxt/ccxt/compare/4.3.21...4.3.22)
[Changes][4.3.22]
# [4.0.3](https://github.com/ccxt/ccxt/releases/tag/4.0.3) - 2023-07-01 [#403---2023-07-01]
We are happy to announce the release of CCXT version 4!
During the last months we have been working hard on a few major improvements to the library adding important upgrades, including:
* the merge of CCXT Pro Websocket APIs with the master repository of CCXT
* the ESM and TypeScript migration for type-safety and portability
* AST-based transpilation to support popular programming languages like C#
* unification of perpetual swaps and futures markets among the leading exchanges like Binance and BitMEX
* adding Bybit v3 and v5 APIs support
* cryptocom v1 upgrades
* per-exchange class method specifications: /docs/manual#/spec
* unified proxy support
* and many many more fixes and unifications
We highly recommend downloading and installing the most recent release of CCXT version 4.0.3+ in order to get a much smoother experience for your trading operations.
[Changes][4.0.3]
[v4.5.78]: https://github.com/ccxt/ccxt/compare/ccxt-mcp-v0.1.3...v4.5.78
[ccxt-mcp-v0.1.3]: https://github.com/ccxt/ccxt/compare/ccxt-mcp-v0.1.2...ccxt-mcp-v0.1.3
[ccxt-mcp-v0.1.2]: https://github.com/ccxt/ccxt/compare/ccxt-mcp-latest...ccxt-mcp-v0.1.2
[ccxt-mcp-latest]: https://github.com/ccxt/ccxt/compare/v4.5.77...ccxt-mcp-latest
[v4.5.77]: https://github.com/ccxt/ccxt/compare/v4.5.76...v4.5.77
[v4.5.76]: https://github.com/ccxt/ccxt/compare/v4.5.75...v4.5.76
[v4.5.75]: https://github.com/ccxt/ccxt/compare/v4.5.74...v4.5.75
[v4.5.74]: https://github.com/ccxt/ccxt/compare/v4.5.73...v4.5.74
[v4.5.73]: https://github.com/ccxt/ccxt/compare/v4.5.72...v4.5.73
[v4.5.72]: https://github.com/ccxt/ccxt/compare/v4.5.71...v4.5.72
[v4.5.71]: https://github.com/ccxt/ccxt/compare/v4.5.70...v4.5.71
[v4.5.70]: https://github.com/ccxt/ccxt/compare/v4.5.69...v4.5.70
[v4.5.69]: https://github.com/ccxt/ccxt/compare/v4.5.68...v4.5.69
[v4.5.68]: https://github.com/ccxt/ccxt/compare/v4.5.67...v4.5.68
[v4.5.67]: https://github.com/ccxt/ccxt/compare/v4.5.66...v4.5.67
[v4.5.66]: https://github.com/ccxt/ccxt/compare/v4.5.65...v4.5.66
[v4.5.65]: https://github.com/ccxt/ccxt/compare/v4.5.64...v4.5.65
[v4.5.64]: https://github.com/ccxt/ccxt/compare/v4.5.63...v4.5.64
[v4.5.63]: https://github.com/ccxt/ccxt/compare/v4.5.62...v4.5.63
[v4.5.62]: https://github.com/ccxt/ccxt/compare/v4.5.61...v4.5.62
[v4.5.61]: https://github.com/ccxt/ccxt/compare/v4.5.60...v4.5.61
[v4.5.60]: https://github.com/ccxt/ccxt/compare/v4.5.59...v4.5.60
[v4.5.59]: https://github.com/ccxt/ccxt/compare/v4.5.58...v4.5.59
[v4.5.58]: https://github.com/ccxt/ccxt/compare/v4.5.57...v4.5.58
[v4.5.57]: https://github.com/ccxt/ccxt/compare/v4.5.56...v4.5.57
[v4.5.56]: https://github.com/ccxt/ccxt/compare/v4.5.55...v4.5.56
[v4.5.55]: https://github.com/ccxt/ccxt/compare/v4.5.54...v4.5.55
[v4.5.54]: https://github.com/ccxt/ccxt/compare/v4.5.53...v4.5.54
[v4.5.53]: https://github.com/ccxt/ccxt/compare/v4.5.52...v4.5.53
[v4.5.52]: https://github.com/ccxt/ccxt/compare/v4.5.51...v4.5.52
[v4.5.51]: https://github.com/ccxt/ccxt/compare/v4.5.50...v4.5.51
[v4.5.50]: https://github.com/ccxt/ccxt/compare/v4.5.49...v4.5.50
[v4.5.49]: https://github.com/ccxt/ccxt/compare/v4.5.48...v4.5.49
[v4.5.48]: https://github.com/ccxt/ccxt/compare/v4.5.47...v4.5.48
[v4.5.47]: https://github.com/ccxt/ccxt/compare/v4.5.46...v4.5.47
[v4.5.46]: https://github.com/ccxt/ccxt/compare/v4.5.45...v4.5.46
[v4.5.45]: https://github.com/ccxt/ccxt/compare/v4.5.44...v4.5.45
[v4.5.44]: https://github.com/ccxt/ccxt/compare/v4.5.43...v4.5.44
[v4.5.43]: https://github.com/ccxt/ccxt/compare/v4.5.42...v4.5.43
[v4.5.42]: https://github.com/ccxt/ccxt/compare/v4.5.41...v4.5.42
[v4.5.41]: https://github.com/ccxt/ccxt/compare/v4.5.40...v4.5.41
[v4.5.40]: https://github.com/ccxt/ccxt/compare/v4.5.39...v4.5.40
[v4.5.39]: https://github.com/ccxt/ccxt/compare/v4.5.38...v4.5.39
[v4.5.38]: https://github.com/ccxt/ccxt/compare/v4.5.37...v4.5.38
[v4.5.37]: https://github.com/ccxt/ccxt/compare/v4.5.36...v4.5.37
[v4.5.36]: https://github.com/ccxt/ccxt/compare/v4.5.35...v4.5.36
[v4.5.35]: https://github.com/ccxt/ccxt/compare/v4.5.34...v4.5.35
[v4.5.34]: https://github.com/ccxt/ccxt/compare/v4.5.33...v4.5.34
[v4.5.33]: https://github.com/ccxt/ccxt/compare/v4.5.32...v4.5.33
[v4.5.32]: https://github.com/ccxt/ccxt/compare/v4.5.31...v4.5.32
[v4.5.31]: https://github.com/ccxt/ccxt/compare/v4.5.30...v4.5.31
[v4.5.30]: https://github.com/ccxt/ccxt/compare/v4.5.29...v4.5.30
[v4.5.29]: https://github.com/ccxt/ccxt/compare/v4.5.28...v4.5.29
[v4.5.28]: https://github.com/ccxt/ccxt/compare/v4.5.27...v4.5.28
[v4.5.27]: https://github.com/ccxt/ccxt/compare/v4.5.26...v4.5.27
[v4.5.26]: https://github.com/ccxt/ccxt/compare/v4.5.25...v4.5.26
[v4.5.25]: https://github.com/ccxt/ccxt/compare/v4.5.24...v4.5.25
[v4.5.24]: https://github.com/ccxt/ccxt/compare/v4.5.23...v4.5.24
[v4.5.23]: https://github.com/ccxt/ccxt/compare/v4.5.22...v4.5.23
[v4.5.22]: https://github.com/ccxt/ccxt/compare/v4.5.21...v4.5.22
[v4.5.21]: https://github.com/ccxt/ccxt/compare/v4.5.20...v4.5.21
[v4.5.20]: https://github.com/ccxt/ccxt/compare/v4.5.19...v4.5.20
[v4.5.19]: https://github.com/ccxt/ccxt/compare/v4.5.18...v4.5.19
[v4.5.18]: https://github.com/ccxt/ccxt/compare/v4.5.17...v4.5.18
[v4.5.17]: https://github.com/ccxt/ccxt/compare/v4.5.16...v4.5.17
[v4.5.16]: https://github.com/ccxt/ccxt/compare/v4.5.15...v4.5.16
[v4.5.15]: https://github.com/ccxt/ccxt/compare/v4.5.14...v4.5.15
[v4.5.14]: https://github.com/ccxt/ccxt/compare/v4.5.13...v4.5.14
[v4.5.13]: https://github.com/ccxt/ccxt/compare/v4.5.12...v4.5.13
[v4.5.12]: https://github.com/ccxt/ccxt/compare/v4.5.11...v4.5.12
[v4.5.11]: https://github.com/ccxt/ccxt/compare/v4.5.10...v4.5.11
[v4.5.10]: https://github.com/ccxt/ccxt/compare/v4.5.9...v4.5.10
[v4.5.9]: https://github.com/ccxt/ccxt/compare/v4.5.8...v4.5.9
[v4.5.8]: https://github.com/ccxt/ccxt/compare/v4.5.7...v4.5.8
[v4.5.7]: https://github.com/ccxt/ccxt/compare/v4.5.6...v4.5.7
[v4.5.6]: https://github.com/ccxt/ccxt/compare/v4.5.5...v4.5.6
[v4.5.5]: https://github.com/ccxt/ccxt/compare/v4.5.4...v4.5.5
[v4.5.4]: https://github.com/ccxt/ccxt/compare/v4.5.3...v4.5.4
[v4.5.3]: https://github.com/ccxt/ccxt/compare/v4.5.2...v4.5.3
[v4.5.2]: https://github.com/ccxt/ccxt/compare/v4.5.1...v4.5.2
[v4.5.1]: https://github.com/ccxt/ccxt/compare/v4.5.0...v4.5.1
[v4.5.0]: https://github.com/ccxt/ccxt/compare/v4.4.100...v4.5.0
[v4.4.100]: https://github.com/ccxt/ccxt/compare/v4.4.99...v4.4.100
[v4.4.99]: https://github.com/ccxt/ccxt/compare/v4.4.98...v4.4.99
[v4.4.98]: https://github.com/ccxt/ccxt/compare/v4.4.97...v4.4.98
[v4.4.97]: https://github.com/ccxt/ccxt/compare/v4.4.96...v4.4.97
[v4.4.96]: https://github.com/ccxt/ccxt/compare/v4.4.95...v4.4.96
[v4.4.95]: https://github.com/ccxt/ccxt/compare/v4.4.94...v4.4.95
[v4.4.94]: https://github.com/ccxt/ccxt/compare/v4.4.93...v4.4.94
[v4.4.93]: https://github.com/ccxt/ccxt/compare/v4.4.92...v4.4.93
[v4.4.92]: https://github.com/ccxt/ccxt/compare/v4.4.91...v4.4.92
[v4.4.91]: https://github.com/ccxt/ccxt/compare/v4.4.90...v4.4.91
[v4.4.90]: https://github.com/ccxt/ccxt/compare/v4.4.89...v4.4.90
[v4.4.89]: https://github.com/ccxt/ccxt/compare/v4.4.88...v4.4.89
[v4.4.88]: https://github.com/ccxt/ccxt/compare/v4.4.87...v4.4.88
[v4.4.87]: https://github.com/ccxt/ccxt/compare/v4.4.86...v4.4.87
[v4.4.86]: https://github.com/ccxt/ccxt/compare/v4.4.85...v4.4.86
[v4.4.85]: https://github.com/ccxt/ccxt/compare/v4.4.82...v4.4.85
[v4.4.82]: https://github.com/ccxt/ccxt/compare/v4.4.80...v4.4.82
[v4.4.80]: https://github.com/ccxt/ccxt/compare/v4.4.79...v4.4.80
[v4.4.79]: https://github.com/ccxt/ccxt/compare/v4.4.78...v4.4.79
[v4.4.78]: https://github.com/ccxt/ccxt/compare/v4.4.77...v4.4.78
[v4.4.77]: https://github.com/ccxt/ccxt/compare/v4.4.76...v4.4.77
[v4.4.76]: https://github.com/ccxt/ccxt/compare/v4.4.75...v4.4.76
[v4.4.75]: https://github.com/ccxt/ccxt/compare/v4.4.74...v4.4.75
[v4.4.74]: https://github.com/ccxt/ccxt/compare/v4.4.73...v4.4.74
[v4.4.73]: https://github.com/ccxt/ccxt/compare/v4.4.72...v4.4.73
[v4.4.72]: https://github.com/ccxt/ccxt/compare/v4.4.71...v4.4.72
[v4.4.71]: https://github.com/ccxt/ccxt/compare/v4.4.70...v4.4.71
[v4.4.70]: https://github.com/ccxt/ccxt/compare/v4.4.69...v4.4.70
[v4.4.69]: https://github.com/ccxt/ccxt/compare/v4.4.68...v4.4.69
[v4.4.68]: https://github.com/ccxt/ccxt/compare/v4.4.67...v4.4.68
[v4.4.67]: https://github.com/ccxt/ccxt/compare/v4.4.66...v4.4.67
[v4.4.66]: https://github.com/ccxt/ccxt/compare/v4.4.65...v4.4.66
[v4.4.65]: https://github.com/ccxt/ccxt/compare/v4.4.64...v4.4.65
[v4.4.64]: https://github.com/ccxt/ccxt/compare/v4.4.63...v4.4.64
[v4.4.63]: https://github.com/ccxt/ccxt/compare/v4.4.62...v4.4.63
[v4.4.62]: https://github.com/ccxt/ccxt/compare/go/v4.4.61...v4.4.62
[go/v4.4.61]: https://github.com/ccxt/ccxt/compare/go/v4.4.60...go/v4.4.61
[go/v4.4.60]: https://github.com/ccxt/ccxt/compare/go/v4.4.59...go/v4.4.60
[go/v4.4.59]: https://github.com/ccxt/ccxt/compare/go/v4.4.58...go/v4.4.59
[go/v4.4.58]: https://github.com/ccxt/ccxt/compare/go/v4.4.57...go/v4.4.58
[go/v4.4.57]: https://github.com/ccxt/ccxt/compare/go/v4.4.56...go/v4.4.57
[go/v4.4.56]: https://github.com/ccxt/ccxt/compare/go/v4.4.54...go/v4.4.56
[go/v4.4.54]: https://github.com/ccxt/ccxt/compare/go/v4.4.53...go/v4.4.54
[go/v4.4.53]: https://github.com/ccxt/ccxt/compare/4.4.52...go/v4.4.53
[4.4.52]: https://github.com/ccxt/ccxt/compare/4.4.51...4.4.52
[4.4.51]: https://github.com/ccxt/ccxt/compare/4.4.50...4.4.51
[4.4.50]: https://github.com/ccxt/ccxt/compare/4.4.49...4.4.50
[4.4.49]: https://github.com/ccxt/ccxt/compare/4.4.48...4.4.49
[4.4.48]: https://github.com/ccxt/ccxt/compare/4.4.47...4.4.48
[4.4.47]: https://github.com/ccxt/ccxt/compare/4.4.46...4.4.47
[4.4.46]: https://github.com/ccxt/ccxt/compare/4.4.45...4.4.46
[4.4.45]: https://github.com/ccxt/ccxt/compare/4.4.44...4.4.45
[4.4.44]: https://github.com/ccxt/ccxt/compare/4.4.43...4.4.44
[4.4.43]: https://github.com/ccxt/ccxt/compare/4.4.42...4.4.43
[4.4.42]: https://github.com/ccxt/ccxt/compare/4.4.41...4.4.42
[4.4.41]: https://github.com/ccxt/ccxt/compare/4.4.40...4.4.41
[4.4.40]: https://github.com/ccxt/ccxt/compare/4.4.39...4.4.40
[4.4.39]: https://github.com/ccxt/ccxt/compare/4.4.38...4.4.39
[4.4.38]: https://github.com/ccxt/ccxt/compare/4.4.37...4.4.38
[4.4.37]: https://github.com/ccxt/ccxt/compare/4.4.36...4.4.37
[4.4.36]: https://github.com/ccxt/ccxt/compare/4.4.35...4.4.36
[4.4.35]: https://github.com/ccxt/ccxt/compare/4.4.34...4.4.35
[4.4.34]: https://github.com/ccxt/ccxt/compare/4.4.33...4.4.34
[4.4.33]: https://github.com/ccxt/ccxt/compare/4.4.32...4.4.33
[4.4.32]: https://github.com/ccxt/ccxt/compare/4.4.31...4.4.32
[4.4.31]: https://github.com/ccxt/ccxt/compare/4.4.30...4.4.31
[4.4.30]: https://github.com/ccxt/ccxt/compare/4.4.29...4.4.30
[4.4.29]: https://github.com/ccxt/ccxt/compare/4.4.28...4.4.29
[4.4.28]: https://github.com/ccxt/ccxt/compare/4.4.27...4.4.28
[4.4.27]: https://github.com/ccxt/ccxt/compare/4.4.26...4.4.27
[4.4.26]: https://github.com/ccxt/ccxt/compare/4.4.25...4.4.26
[4.4.25]: https://github.com/ccxt/ccxt/compare/4.4.24...4.4.25
[4.4.24]: https://github.com/ccxt/ccxt/compare/4.4.23...4.4.24
[4.4.23]: https://github.com/ccxt/ccxt/compare/4.4.22...4.4.23
[4.4.22]: https://github.com/ccxt/ccxt/compare/4.4.21...4.4.22
[4.4.21]: https://github.com/ccxt/ccxt/compare/4.4.20...4.4.21
[4.4.20]: https://github.com/ccxt/ccxt/compare/4.4.19...4.4.20
[4.4.19]: https://github.com/ccxt/ccxt/compare/4.4.18...4.4.19
[4.4.18]: https://github.com/ccxt/ccxt/compare/4.4.17...4.4.18
[4.4.17]: https://github.com/ccxt/ccxt/compare/4.4.16...4.4.17
[4.4.16]: https://github.com/ccxt/ccxt/compare/4.4.15...4.4.16
[4.4.15]: https://github.com/ccxt/ccxt/compare/4.4.14...4.4.15
[4.4.14]: https://github.com/ccxt/ccxt/compare/4.4.13...4.4.14
[4.4.13]: https://github.com/ccxt/ccxt/compare/4.4.12...4.4.13
[4.4.12]: https://github.com/ccxt/ccxt/compare/4.4.11...4.4.12
[4.4.11]: https://github.com/ccxt/ccxt/compare/4.4.10...4.4.11
[4.4.10]: https://github.com/ccxt/ccxt/compare/4.4.9...4.4.10
[4.4.9]: https://github.com/ccxt/ccxt/compare/4.4.8...4.4.9
[4.4.8]: https://github.com/ccxt/ccxt/compare/4.4.7...4.4.8
[4.4.7]: https://github.com/ccxt/ccxt/compare/4.4.6...4.4.7
[4.4.6]: https://github.com/ccxt/ccxt/compare/4.4.5...4.4.6
[4.4.5]: https://github.com/ccxt/ccxt/compare/4.4.4...4.4.5
[4.4.4]: https://github.com/ccxt/ccxt/compare/4.4.3...4.4.4
[4.4.3]: https://github.com/ccxt/ccxt/compare/4.4.2...4.4.3
[4.4.2]: https://github.com/ccxt/ccxt/compare/4.4.1...4.4.2
[4.4.1]: https://github.com/ccxt/ccxt/compare/4.3.98...4.4.1
[4.3.98]: https://github.com/ccxt/ccxt/compare/4.3.97...4.3.98
[4.3.97]: https://github.com/ccxt/ccxt/compare/4.3.96...4.3.97
[4.3.96]: https://github.com/ccxt/ccxt/compare/4.3.95...4.3.96
[4.3.95]: https://github.com/ccxt/ccxt/compare/4.3.94...4.3.95
[4.3.94]: https://github.com/ccxt/ccxt/compare/4.3.93...4.3.94
[4.3.93]: https://github.com/ccxt/ccxt/compare/4.3.92...4.3.93
[4.3.92]: https://github.com/ccxt/ccxt/compare/4.3.91...4.3.92
[4.3.91]: https://github.com/ccxt/ccxt/compare/4.3.90...4.3.91
[4.3.90]: https://github.com/ccxt/ccxt/compare/4.3.89...4.3.90
[4.3.89]: https://github.com/ccxt/ccxt/compare/4.3.88...4.3.89
[4.3.88]: https://github.com/ccxt/ccxt/compare/4.3.87...4.3.88
[4.3.87]: https://github.com/ccxt/ccxt/compare/4.3.86...4.3.87
[4.3.86]: https://github.com/ccxt/ccxt/compare/4.3.85...4.3.86
[4.3.85]: https://github.com/ccxt/ccxt/compare/4.3.84...4.3.85
[4.3.84]: https://github.com/ccxt/ccxt/compare/4.3.83...4.3.84
[4.3.83]: https://github.com/ccxt/ccxt/compare/4.3.82...4.3.83
[4.3.82]: https://github.com/ccxt/ccxt/compare/4.3.81...4.3.82
[4.3.81]: https://github.com/ccxt/ccxt/compare/4.3.80...4.3.81
[4.3.80]: https://github.com/ccxt/ccxt/compare/4.3.79...4.3.80
[4.3.79]: https://github.com/ccxt/ccxt/compare/4.3.78...4.3.79
[4.3.78]: https://github.com/ccxt/ccxt/compare/4.3.77...4.3.78
[4.3.77]: https://github.com/ccxt/ccxt/compare/4.3.76...4.3.77
[4.3.76]: https://github.com/ccxt/ccxt/compare/4.3.75...4.3.76
[4.3.75]: https://github.com/ccxt/ccxt/compare/4.3.74...4.3.75
[4.3.74]: https://github.com/ccxt/ccxt/compare/4.3.73...4.3.74
[4.3.73]: https://github.com/ccxt/ccxt/compare/4.3.72...4.3.73
[4.3.72]: https://github.com/ccxt/ccxt/compare/4.3.71...4.3.72
[4.3.71]: https://github.com/ccxt/ccxt/compare/4.3.70...4.3.71
[4.3.70]: https://github.com/ccxt/ccxt/compare/4.3.69...4.3.70
[4.3.69]: https://github.com/ccxt/ccxt/compare/4.3.68...4.3.69
[4.3.68]: https://github.com/ccxt/ccxt/compare/4.3.67...4.3.68
[4.3.67]: https://github.com/ccxt/ccxt/compare/4.3.66...4.3.67
[4.3.66]: https://github.com/ccxt/ccxt/compare/4.3.65...4.3.66
[4.3.65]: https://github.com/ccxt/ccxt/compare/4.3.64...4.3.65
[4.3.64]: https://github.com/ccxt/ccxt/compare/4.3.63...4.3.64
[4.3.63]: https://github.com/ccxt/ccxt/compare/4.3.62...4.3.63
[4.3.62]: https://github.com/ccxt/ccxt/compare/4.3.61...4.3.62
[4.3.61]: https://github.com/ccxt/ccxt/compare/4.3.60...4.3.61
[4.3.60]: https://github.com/ccxt/ccxt/compare/4.3.59...4.3.60
[4.3.59]: https://github.com/ccxt/ccxt/compare/4.3.58...4.3.59
[4.3.58]: https://github.com/ccxt/ccxt/compare/4.3.57...4.3.58
[4.3.57]: https://github.com/ccxt/ccxt/compare/4.3.56...4.3.57
[4.3.56]: https://github.com/ccxt/ccxt/compare/4.3.55...4.3.56
[4.3.55]: https://github.com/ccxt/ccxt/compare/4.3.54...4.3.55
[4.3.54]: https://github.com/ccxt/ccxt/compare/4.3.53...4.3.54
[4.3.53]: https://github.com/ccxt/ccxt/compare/4.3.52...4.3.53
[4.3.52]: https://github.com/ccxt/ccxt/compare/4.3.51...4.3.52
[4.3.51]: https://github.com/ccxt/ccxt/compare/4.3.50...4.3.51
[4.3.50]: https://github.com/ccxt/ccxt/compare/4.3.49...4.3.50
[4.3.49]: https://github.com/ccxt/ccxt/compare/4.3.48...4.3.49
[4.3.48]: https://github.com/ccxt/ccxt/compare/4.3.47...4.3.48
[4.3.47]: https://github.com/ccxt/ccxt/compare/4.3.46...4.3.47
[4.3.46]: https://github.com/ccxt/ccxt/compare/4.3.45...4.3.46
[4.3.45]: https://github.com/ccxt/ccxt/compare/4.3.44...4.3.45
[4.3.44]: https://github.com/ccxt/ccxt/compare/4.3.43...4.3.44
[4.3.43]: https://github.com/ccxt/ccxt/compare/4.3.42...4.3.43
[4.3.42]: https://github.com/ccxt/ccxt/compare/4.3.41...4.3.42
[4.3.41]: https://github.com/ccxt/ccxt/compare/4.3.40...4.3.41
[4.3.40]: https://github.com/ccxt/ccxt/compare/4.3.39...4.3.40
[4.3.39]: https://github.com/ccxt/ccxt/compare/4.3.38...4.3.39
[4.3.38]: https://github.com/ccxt/ccxt/compare/4.3.37...4.3.38
[4.3.37]: https://github.com/ccxt/ccxt/compare/4.3.36...4.3.37
[4.3.36]: https://github.com/ccxt/ccxt/compare/4.3.35...4.3.36
[4.3.35]: https://github.com/ccxt/ccxt/compare/4.3.34...4.3.35
[4.3.34]: https://github.com/ccxt/ccxt/compare/4.3.33...4.3.34
[4.3.33]: https://github.com/ccxt/ccxt/compare/4.3.32...4.3.33
[4.3.32]: https://github.com/ccxt/ccxt/compare/4.3.31...4.3.32
[4.3.31]: https://github.com/ccxt/ccxt/compare/4.3.30...4.3.31
[4.3.30]: https://github.com/ccxt/ccxt/compare/4.3.29...4.3.30
[4.3.29]: https://github.com/ccxt/ccxt/compare/4.3.28...4.3.29
[4.3.28]: https://github.com/ccxt/ccxt/compare/4.3.27...4.3.28
[4.3.27]: https://github.com/ccxt/ccxt/compare/4.3.25...4.3.27
[4.3.25]: https://github.com/ccxt/ccxt/compare/4.3.24...4.3.25
[4.3.24]: https://github.com/ccxt/ccxt/compare/4.3.23...4.3.24
[4.3.23]: https://github.com/ccxt/ccxt/compare/4.3.22...4.3.23
[4.3.22]: https://github.com/ccxt/ccxt/compare/4.0.3...4.3.22
[4.0.3]: https://github.com/ccxt/ccxt/tree/4.0.3
# CLI (/docs/cli)
# CCXT CLI (Command-Line Interface) [#ccxt-cli-command-line-interface]
CCXT includes an example that allows calling all exchange methods and properties from command line. One doesn't even have to be a programmer or write code – any user can use it!
The CLI interface is a program in CCXT that takes the exchange name and some params from the command line and executes a corresponding call from CCXT printing the output of the call back to the user. Thus, with CLI you can use CCXT out of the box, not a single line of code needed.
CCXT command line interface is very handy and useful for:
* bash api scripting
* cron/crontab trading automation
* resolving issues with your code
* debugging the exchange errors
* performing quick cryptocurrency trading from command-line
* aggregating data for backtesting
* adding interoperability with other systems and frameworks
* learning the basics of cryptocurrency exchange trading
* learning CCXT and the advanced aspects of APIs
* writing new exchange integrations
* contributing code to CCXT
For the CCXT library users – we highly recommend to try CLI at least a few times to get a feel of it.
For the CCXT library developers – CLI is more than just a recommendation, it's a must.
The best way to learn and understand CCXT CLI – is by experimentation, trial and error. **Warning: CLI executes your command and does not ask for a confirmation after you launch it, so be careful with numbers, confusing amounts with prices can cause a loss of funds.**
The same CLI design is implemented in all supported languages, TypeScript, JavaScript, Python and PHP – for the purposes of example code for the developers.
In other words, the existing CLI contains three implementations that are in many ways identical. The code in those three CLI examples is intended to be "easily understandable".
The source code of the CLI is available here:
* [https://github.com/ccxt/ccxt/blob/master/examples/ts/cli.ts](https://github.com/ccxt/ccxt/blob/master/examples/ts/cli.ts)
* [https://github.com/ccxt/ccxt/blob/master/examples/js/cli.js](https://github.com/ccxt/ccxt/blob/master/examples/js/cli.js)
* [https://github.com/ccxt/ccxt/blob/master/examples/py/cli.py](https://github.com/ccxt/ccxt/blob/master/examples/py/cli.py)
* [https://github.com/ccxt/ccxt/blob/master/examples/php/cli.php](https://github.com/ccxt/ccxt/blob/master/examples/php/cli.php)
## Install globally [#install-globally]
```bash
npm -g ccxt
```
* Update using `npm update ccxt -g`
## Install [#install]
1. Clone the CCXT repository:
```bash
git clone https://github.com/ccxt/ccxt
```
2. Change directory to the cloned repository:
```bash
cd ccxt
```
3. Install the dependencies:
* Node.js + npm: `npm install`
* PHP + Composer: `composer install`
4. Run the script:
* Node.js: `node examples/js/cli okx fetchTicker ETH/USDT`
* Python: `python3 examples/py/cli.py okx fetch_ticker ETH/USDT`
* PHP: `php -f examples/php/cli.php okx fetch_ticker ETH/USDT`
## Usage [#usage]
The CLI script requires at least one argument, that is, the exchange id ([the list of supported exchanges and their ids](https://github.com/ccxt/ccxt#supported-cryptocurrency-exchange-markets)). If you don't specify the exchange id, the script will print the list of all exchange ids for reference.
Upon launch, CLI will create and initialize the exchange instance and will also call [exchange.loadMarkets()](/docs/manual#loading-markets) on that exchange.
If you don't specify any other command-line arguments to CLI except the exchange id argument, then the CLI script will print out all the contents of the exchange object, including the list of all the methods and properties and all the loaded markets (the output may be extremely long in that case).
Normally, following the exchange id argument one would specify a method name to call with its arguments or an exchange property to inspect on the exchange instance.
### Inspecting Exchange Properties [#inspecting-exchange-properties]
If the only parameter you specify to CLI is the exchange id, then it will print out the contents of the exchange instance including all properties, methods, markets, currencies, etc. **Warning: exchange contents are HUGE and this will dump A LOT of output to your screen!**
```bash
node examples/js/cli bybit
```
You can specify the name of the property of the exchange to narrow the output down to a reasonable size.
```bash
node examples/js/cli okx markets # will print out the list of all the loaded markets
node examples/js/cli binance currencies # will print out a table of all the loaded currencies
node examples/js/cli gate options # will print out the contents of the exchange-specific options
```
You can easily view which methods are supported on the various exchanges:
```bash
node examples/js/exchange-capabilities | less -S -R
```
### Calling A Unified Method By Name [#calling-a-unified-method-by-name]
Calling unified methods is easy:
```bash
node examples/js/cli okx fetchOrderBook BTC/USDT # will fetch the orderbook from exchange instance and will print it out as a table
node examples/js/cli binance fetchTrades ETH/USDT # will fetch a list of most recent public trades and will print a table of them
node examples/js/cli bitget fetchTickers # will fetch all tickers one by one
node examples/js/cli bitget fetchTickers --table # will fetch all tickers and will print them out as a table
node examples/js/cli bitget fetchTickers '["BTC/USDT","ETH/USDT"]' # will fetch the tickers specified in the array argument
```
Exchange specific parameters can be set in the last argument of every unified method:
```bash
node examples/js/cli bybit setMarginMode isolated BTC/USDT '{"leverage":"8"}' # set the margin mode while specifying the exchange specific leverage parameter
```
### Calling An Exchange-Specific Method By Name [#calling-an-exchange-specific-method-by-name]
Here's an example of fetching the order book on okx in sandbox mode using the implicit API and the exchange specific instId and sz parameters:
```bash
node examples/js/cli okx publicGetMarketBooks '{"instId":"BTC-USDT","sz":"3"}' --sandbox
```
## Authentication And Overrides [#authentication-and-overrides]
Public exchange APIs don't require authentication. You can use the CLI to call any method of a public API. The difference between public APIs and private APIs is described in the Manual, here: [Public/Private API](/docs/manual#publicprivate-api).
For private API calls, by default the CLI script will look for API keys in the `keys.local.json` file in the root of the repository cloned to your working directory and will also look up exchange credentials in the environment variables. More details here: [Adding Exchange Credentials](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#adding-exchange-credentials).
## Unified API vs Exchange-Specific API [#unified-api-vs-exchange-specific-api]
CLI supports all possible methods and properties that exist on the exchange instance.
### Run with jq [#run-with-jq]
Install jq
#### **Ubuntu** [#ubuntu]
```bash
sudo apt-get install jq
```
#### **Brew (Mac)** [#brew-mac]
```bash
brew install jq
```
#### **Choco (Windows)** [#choco-windows]
```bash
choco install jq -y
```
#### Examples [#examples]
* Get ticker price of BTC/USDT: \`ccxt binance fetchTicker BTC/USDT | jq '.price'
* watch price and amount of trades:
```bash
`ccxt binance watchTrades BTC/USDT --raw | jq -c '[.[] | {price: .price, amount: .amount}]'`
```
* fuzzy search between trades (requires fzf):
```bash
`ccxt binance fetchTrades --raw | jq -c '.[]' | fzf`
```

# Contributing (/docs/contributing)
# Contributing To The CCXT Library [#contributing-to-the-ccxt-library]
* [How To Submit A Question Or Issue](#how-to-submit-an-issue)
* [How To Contribute Code](#how-to-contribute-code)
* [What You Need To Have](#what-you-need-to-have)
* [What You Need To Know](#what-you-need-to-know)
## How To Submit An Issue [#how-to-submit-an-issue]
Read the notes when opening a [new issue on github](https://github.com/ccxt/ccxt/issues/new/choose) and provide the requested details, so we can assist you better. You can also read the [Troubleshooting](/docs/manual#troubleshooting) section.
### Reporting Vulnerabilities And Critical Issues [#reporting-vulnerabilities-and-critical-issues]
If you found a security issue or a critical vulnerability and reporting it in public would impose risk – please feel free to send us a message to [info@ccxt.trade](mailto:info@ccxt.trade).
## How To Contribute Code [#how-to-contribute-code]
* **[MAKE SURE YOUR CODE IS UNIFIED](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#derived-exchange-classes)!**
**↑ This is the most important rule of all!!!**
* **BEFORE ANY PUSH MAKE SURE YOU RUN THIS COMMAND LOCALLY: `git config core.hooksPath .git-templates/hooks`**
* **PLEASE, DO NOT COMMIT THE FOLLOWING FILES IN PULL REQUESTS:**
* `/build/*` (these are generated automatically)
* `/js/*` (these are compiled from the typescript version)
* `/php/*` (except for base classes)
* `/python/*` (except for base classes)
* `/cs/*` (except for base classes)
* `/ccxt.js`
* `/README.md` (exchange lists are generated automatically)
* `/package.json`
* `/package.lock`
* `/wiki/*` (except for real edits, exchange lists are generated automatically)
* `/dist/ccxt.browser.js` (this is also browserified automatically)
These files are generated ([explained below](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#multilanguage-support)) and will be overwritten upon build. Please don't commit them to avoid bloating the repository which is already quite large. Most often, you have to commit just one single source file to submit an edit to the implementation of an exchange.
* **PLEASE, SUBMIT ATOMIC EDITS, ONE PULL REQUEST PER ONE EXCHANGE, DO NOT MIX THEM**
* **MAKE SURE YOUR CODE PASSES ALL SYNTAX CHECKS BY RUNNING `npm run build`**
## Pending Tasks [#pending-tasks]
Below is a list of functionality we would like to have implemented and fully **unified** in the library in the first place at this time. Most of these tasks are already in progress, implemented for some exchanges, but not all of them:
* Margin trading
* Leverage
* Derivatives (futures, options)
* Main account / subaccounts
* Conditional orders (stop loss, take profit)
* `transfer` between subaccounts and main account
* `fetchTransfer`
* `fetchTransfers`
* `fetchLedger`
* `fetchPositions`
* `closePosition`
* `closePositions`
If you want to contribute by submitting partial implementations be sure to look up examples of how it's done inside the library (where implemented already) and copy the adopted practices.
If your proposal, suggestion or improvement does not relate to the above list of tasks before submitting it make sure it is:
1. really needed by the majority of ccxt users
2. designed to be a general-purpose solution, not hardcoded for your specific needs
3. done in a generalized way compatible with all exchanges (not exchange-specific)
4. portable (available in all supported languages)
5. robust
6. explicit in what it's doing
7. doesn't break anything (if you change a method, make sure that all other methods calling the edited method are not broken)
The following is a set of rules for contributing to the ccxt library codebase.
## What You Need To Have [#what-you-need-to-have]
If you're not going to develop CCXT and contribute code to the CCXT library, then you don't need the Docker image nor the CCXT repository. If you just want to use CCXT inside your project simply install it as a regular package into the project folder as documented in the Manual (/docs/install):
* [JavaScript / Node.js / NPM](/docs/install#javascript-npm)
```bash
# JavaScript / Node.js / NPM
npm install ccxt
```
* [Python / PIP](/docs/install#python)
```bash
# Python
pip install ccxt # or pip3 install ccxt
```
* [PHP / Composer](/docs/install#php)
```bash
# PHP / Composer
composer install ccxt
```
* [C# / Nugget](/docs/install#netc)
```bash
# C# / Nugget
dotnet add ccxt
```
* [Java / Gradle](/docs/install#java)
```bash
# Java (clone and build from source)
git clone https://github.com/ccxt/ccxt.git --depth 1
cd ccxt/java && ./gradlew :lib:build
```
### With Docker [#with-docker]
The easiest way is to use Docker to run an isolated build & test environment with all the dependencies installed:
```bash
docker-compose run --rm ccxt
```
That builds a container and opens a shell, where the `npm run build` and `node run-tests` commands should simply work out of the box.
The CCXT folder is mapped inside of the container, except the `node_modules` folder — the container would have its own ephemeral copy — so that won't mess up your locally installed modules. This means that you can edit sources on your host machine using your favorite editor and build/test them in the running container.
This way you can keep the build tools and processes isolated, not having to work through the painful process of installing all those dependencies to your host machine manually.
### Without Docker [#without-docker]
#### Dependencies [#dependencies]
* Git
* [Node.js](https://nodejs.org/en/download/) 8+
* [Python](https://www.python.org/downloads/) 3.5.3+
* requests (`pip install requests`)
* [aiohttp](https://docs.aiohttp.org/) (`pip install aiohttp`)
* [ruff](https://docs.astral.sh/ruff/) (`pip install ruff`)
* [tox](https://tox.readthedocs.io)
* via pip: `pip install tox`
* MacOS with [brew](https://brew.sh): `brew install tox`
* Ubuntu Linux: `apt-get install tox`
* [PHP](https://secure.php.net/downloads.php) 8.1+ with the following extensions installed and enabled:
* cURL
* iconv
* mbstring
* PCRE
* gmp
* [C#](https://dotnet.microsoft.com/en-us/download) 7.0
* [Java](https://adoptium.net/) 21+ with Gradle
#### Build Steps [#build-steps]
```bash
git clone https://github.com/ccxt/ccxt.git
```
```bash
cd ccxt
```
```bash
npm install
```
```bash
npm run build
```
## What You Need To Know [#what-you-need-to-know]
### Repository Structure [#repository-structure]
The contents of the repository are structured as follows:
```bash
/ # root directory aka npm module/package folder for Node.js
/.babelrc # babel config used for making the ES5 version of the library
/.eslintrc # linter
/.gitattributes # contains linguist settings for language detection in repo
/.gitignore # ignore it
/.npmignore # files to exclude from the NPM package
/.travis.yml # a YAML config for travis-ci (continuous integration)
/CONTRIBUTING.md # this file
/LICENSE.txt # MIT
/README.md # master markdown for GitHub, npmjs.com, npms.io, yarn and others
/build/ # build scripts
/build/export-exchanges.js # used to create tables of exchanges in the docs during the build
/build/transpile.ts # the transpilation script
/build/update-badges.js # a JS script to update badges in the README and in docs
/build/vss.js # reads single-sourced version from package.json and writes it everywhere
/dist/ # a folder for the generated browser bundle of CCXT
/ccxt.js # entry point for the master JS version of the ccxt library
/ccxt.php # entry point for the PHP version of the ccxt library
/js/ # the JS version of the library
/ts/ # the TypeScript version of the library
/php/ # PHP ccxt module/package folder
/cs/ # C#/dotnet package folder
/python/ # Python ccxt module/package folder for PyPI
/python/__init__.py # entry point for the Python version of the ccxt.library
/python/async_support/ # asynchronous version of the ccxt.library for Python 3.5.3+ asyncio
/python/base/ # base code for the Python version of the ccxt library
/python/README.md # a copy of README.md for PyPI
/python/tox.ini # tox config for Python
/examples/ # self-explanatory
/examples/js # ...
/examples/php # ...
/examples/py # ...
/java/examples/ # Java examples (Gradle module)
/exchanges.cfg # custom bundle config for including only the exchanges you need
/package.json # npm package file, version single-sourced into pyproject.toml and other files via `npm run vss`
/pyproject.toml # metadata and build config (pip/setuptools) for the ccxt package in Python
/run-tests.js # a front-end to run individual tests of all exchanges in all languages (JS/PHP/Python)
/wiki/ # the source of all docs (edits go here)
```
### Multilanguage Support [#multilanguage-support]
The ccxt library is available in several different languages (TypeScript, JavaScript, Python, PHP, C#, Go, Java and Rust). We encourage developers to design *portable* code, so that a single-language user could read the code in other languages and understand it easily. This helps the adoption of the library. The main goal is to provide a generalized, unified, consistent and robust interface to as many existing cryptocurrency exchanges as possible.
At first, all language-specific versions were developed in parallel, but separately from each other. But when it became too hard to maintain and keep the code consistent among all supported languages we have decided to switch to what we call a *source/generated* process. There is now a single source version in one language, that is TypeScript. Other language-specific versions are syntactically derived (transpiled, generated) automatically from the source version. But it doesn't mean that you have to be a TS or a JS coder to contribute. The portability principle allows Python and PHP devs to effectively participate in developing the source version as well.
The module entry points are:
* `./python/__init__.py` for the Python pip package
* `./python/async/__init__.py` for the Python 3.7.0+ ccxt.async\_support subpackage
* `./js/ccxt.js` for the Node.js npm package
* `./ts/ccxt.ts` for TypeScript
* `./dist/ccxt.browser.js` for the browser bundle
* `./ccxt.php` for PHP
* `./java/lib/src/main/java/io/github/ccxt/` for Java
Generated versions and docs are transpiled from the source `ts/src` folder by the `npm run build` command.
### Base WS Runtime Changes Require Their Mirrors [#base-ws-runtime-changes-require-their-mirrors]
The files under `ts/src/base/ws/` (caches, orderbooks, futures, client plumbing) are **not** transpiled - each language carries a hand-written mirror:
| ts source | mirrors |
| -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ts/src/base/ws/Cache.ts` | `python/ccxt/async_support/base/ws/cache.py`, `php/pro/ArrayCache*.php`, `cs/ccxt/ws/ArrayCache.cs`, `go/v4/exchange_cache.go`, `java/lib/src/main/java/io/github/ccxt/ws/ArrayCache.java` |
| `ts/src/base/ws/OrderBook.ts` + `OrderBookSide.ts` | `python/ccxt/async_support/base/ws/order_book*.py`, `php/pro/OrderBook*.php` + `Asks/Bids`, `cs/ccxt/ws/OrderBook*.cs`, `go/v4/exchange_ws_orderbook*.go`, `java/lib/src/main/java/io/github/ccxt/ws/*OrderBook*.java` |
| `ts/src/base/ws/Future.ts` / `Client.ts` | the per-language `Future` / client files (`php/pro/Future.php`, `php/pro/ClientTrait.php`, `cs/ccxt/ws/Future.cs`, ...) |
Two rules:
1. **A PR that changes base WS behavior in ts must change the mirrors in the same PR.** The shared base ws tests (`ts/src/pro/test/base/*.ts`) are regenerated per language on every CI run, so a ts-only behavioral merge ships assertions the other runtimes cannot satisfy and breaks every subsequent PR's build gates. Genuinely non-behavioral ts changes (comments, type annotations, formatting) are exempt - say so in the PR description.
2. **Native (non-transpiled) base WS tests state ts-derived expectations only.** Write expected values by reading the ts source or running the shared js test - never by running the local implementation and recording what it produces. A mirror bug must never certify itself.
### Transpiled (generated) files [#transpiled-generated-files]
* All derived exchange classes are transpiled by `tsc` from TypeScript to JavaScript and by our custom transpiler from TypeScript to PHP and Python. The source files are language-agnostic, easily mapped line-to-line to any other language and written in a cross-language-compatible way. Any coder can read it (by design).
* Base classes are **not** entirely transpiled and are only transpiled partially, as they are language-specific.
#### Base types [#base-types]
The base type declarations are generated from `ts/src/base/types.ts` by `npm run transpile-types`:
* `python/ccxt/base/types.py`
* `cs/ccxt/base/Exchange.Types.cs`, `cs/ccxt/base/PredictionTypes.cs`
* `go/v4/exchange_types.go`
* `java/lib/src/main/java/io/github/ccxt/types/*.java`
Do not edit them by hand — edit `ts/src/base/types.ts` and regenerate. `npm run transpile-types-check` fails the build when they are out of sync. PHP needs no type file (unified structures are plain associative arrays) and the JS/TS declarations are emitted by `tsc`.
#### JavaScript [#javascript]
The `ccxt.browser.js` is generated with Babel from source.
#### Python [#python]
These files containing derived exchange classes are transpiled from TS into Python:
* `ts/[_a-z].ts` → `python/ccxt/async/[_a-z].py`
* `python/ccxt/async[_a-z].py` → `python/ccxt/[_a-z].py` (Python 3 asyncio → Python sync transpilation stage)
* `python/ccxt/test/test_async.py` → `python/ccxt/test/test_sync.py` (the sync test is generated from the async test)
These Python base classes and files are not transpiled:
* `python/ccxt/base/*` (except `types.py`, see [Base types](#base-types))
* `python/ccxt/async/base/*`
#### PHP [#php]
These files containing derived exchange classes are transpiled from TS into C#:
* `ts/[_a-z].ts` → `php/[_a-z].php`
These PHP base classes and files are not transpiled:
* `php/Exchange.php php/ExchangeError.php php/Precise.php ...`
#### C\# [#c]
These files containing derived exchange classes are transpiled from TS into C#:
* `ts/src/[_a-z].ts` → `cs/src/exchanges/[_a-z].cs`
These C# base classes and files are not transpiled:
* `cs/base/*`
#### Java [#java]
These files containing derived exchange classes are transpiled from TS into Java:
* `ts/src/[_a-z].ts` → `java/lib/src/main/java/io/github/ccxt/exchanges/[A-Z]*.java`
These Java base classes and files are not transpiled:
* `java/lib/src/main/java/io/github/ccxt/base/*`
* `java/lib/src/main/java/io/github/ccxt/ws/*`
* `java/lib/src/main/java/io/github/ccxt/Exchange.java`
#### Typescript [#typescript]
* Development is made using these files
### Base Class [#base-class]
` CONSTRUCTION`
### Derived Exchange Classes [#derived-exchange-classes]
Transpiler is regex-based and heavily relies on specific formatting rules. If you break them then the transpiler will either
fail to generate Python/PHP classes at all or will generate malformed Python/PHP syntax.
Below are key notes on how to keep the JS code transpileable.
Use the linter `npm run lint js/your-exchange-implementation.js` before you build. It will cover many (but not all) the issues,
so manual checking will still be required if transpilation fails.
If you see a `[TypeError] Cannot read property '1' of null` exception or any other transpilation error when you `npm run build`, check if your code satisfies the following rules:
* don't put empty lines inside your methods
* always use Python-style indentation, it is preserved as is for all languages
* indent with 4 spaces **exactly**, avoid tabs
* put an empty line between each of your methods
* avoid mixed comment styles, use double-slash `//` in JS for line comments
* avoid multi-line comments
If the transpiling process finishes successfully, but generates incorrect Python/PHP syntax, check for the following:
* every opening bracket like `(` or `{` should have a space before it!
* do not use language-specific code syntax sugar, even if you really want to
* unfold all maps and comprehensions to basic for-loops
* don't change the arguments of overridden inherited methods, keep them uniform across all exchanges
* everything should be done using base class methods only (for example, use `this.json ()` for converting objects to json)
* always put a semicolon `;` at the end of each statement, as in PHP/C-style
* all associative keys must be single-quoted strings everywhere (`array['good']`), do not use the dot notation (`array.bad`)
* never use the `var` keyword, instead use `const` for constants or `let` for variables
And structurally:
* if you need another base method you will have to implement it in all three languages
* try not to issue more than one HTTP request from a unified method
* avoid changing the contents of the arguments and params passed by reference into function calls
* keep it simple, don't do more than one statement in one line
* try to reduce syntax & logic (if possible) to basic one-liner expressions
* multiple lines are ok, but you should avoid deep nesting with lots of brackets
* do not use conditional statements that are too complex (heavy if-bracketing)
* do not use heavy ternary conditionals
* avoid operators clutter (**don't do this**: `a && b || c ? d + 80 : e ** f`)
* do not use `.includes()`, use `.indexOf()` instead!
* never use `.toString()` on floats: `Number (0.00000001).toString () === '1e-8'`
* do not use closures, `a.map` or `a.filter (x => (x === 'foobar'))` is not acceptable in derived classes
* do not use the `in` operator to check if a value is in a non-associative array (list)
* don't add custom currency or symbol/pair conversions and formatting, copy from existing code instead
* **don't access non-existent keys, `array['key'] || {}` won't work in other languages!**
* an empty container is ambiguous in PHP: `{}` and `[]` are both `array()` there, so `isDictionary` returns `true` for an empty array in PHP while every other language can tell them apart and returns `false` — never branch dict-vs-list logic on a possibly-empty container, and don't assert empty containers in shared tests, see [https://github.com/ccxt/ccxt/pull/29704](https://github.com/ccxt/ccxt/pull/29704) and [https://github.com/ccxt/ccxt/pull/29698](https://github.com/ccxt/ccxt/pull/29698)
#### Sending Market Ids [#sending-market-ids]
Most of exchanges' API endpoints will require an exchange-specific market symbol or trading pair or instrument to be specified in the request.
**We don't send unified symbols to exchanges directly!** They are not interchangeable! There is a significant difference between *exchange-specific market-ids* and *unified symbols*! This is explained in the Manual, here:
* /docs/manual#markets
* /docs/manual#symbols-and-market-ids
**NEVER DO THIS:**
```javascript
async fetchTicker (symbol, params = {}) {
const request = {
'pair': symbol, // very bad, sending unified symbols to the exchange directly
};
const response = await this.publicGetEndpoint (request);
// parse in a unified way...
}
```
**DO NOT DO THIS EITHER:**
```javascript
async fetchTicker (symbol, params = {}) {
const request = {
'symbol': symbol, // very bad, sending unified symbols to the exchange directly
};
const response = await this.publicGetEndpoint (request);
// parse in a unified way...
}
```
Instead of sending a unified CCXT symbol to the exchange, we **always** take the exchange-specific market-`id` that corresponds to that symbol. If it so happens that an exchange specific market-id is exactly the same as the CCXT unified symbol – that's a happy coincidence, but we never rely on that in the unified CCXT API.
To get the exchange-specific market-id by a unified CCXT symbol, use the following methods:
* `this.market (symbol)` – returns the entire unified market structure, containing the `id`, `baseId`, `quoteId`, and many other interesting things
* `this.marketId (symbol)` – returns just the exchange-specific `id` of a market by a unified symbol (if you don't need anything else)
**GOOD EXAMPLES:**
```javascript
async fetchTicker (symbol, params = {}) {
const market = this.market (symbol); // the entire market structure
const request = {
'pair': market['id'], // good, they may be equal, but often differ, it's ok
};
const response = await this.publicGetEndpoint (this.extend (request, params));
// parse in a unified way...
}
```
```javascript
async fetchTicker (symbol, params = {}) {
const marketId = this.marketId (symbol); // just the id
const request = {
'symbol': marketId, // good, they may be equal, but often differ, it's ok
};
const response = await this.publicGetEndpoint (this.extend (request, params));
// parse in a unified way...
}
```
#### Parsing Symbols [#parsing-symbols]
When sending requests to the exchange unified symbols have to be *"converted"* to exchange-specific market-`id`s like shown above. The same is true on the other end – when receiving an exchange response it has an exchange-specific market-`id` inside it that has to be *"converted back"* to a unified CCXT symbol.
**We don't put exchange-specific market-`id`s in unified structures directly!** We can't freely interchange symbols with ids! There is a significant difference between an *exchange-specific market-ids* and *unified symbols*! This is explained in the Manual, here:
* /docs/manual#markets
* /docs/manual#symbols-and-market-ids
**NEVER DO THIS:**:
```javascript
parseTrade (trade, market = undefined) {
// parsing code...
return {
'info': trade,
'symbol': trade['pair'], // very bad, returning exchange-specific market-ids in a unified structure!
// other fields...
};
}
```
**DO NOT DO THIS EITHER**
```javascript
parseTrade (trade, market = undefined) {
// parsing code...
return {
'info': trade,
'symbol': trade['symbol'], // very bad, returning exchange-specific market-ids in a unified structure!
// other fields...
};
}
```
In order to handle the market-`id` properly it has to be looked-up in the info cached on this exchange with `loadMarkets()`:
**GOOD EXAMPLE:**
```javascript
parseTrade (trade, market = undefined) {
const marketId = this.safeString (trade, 'pair');
// safeSymbol is used to parse the market id to a unified symbol
const symbol = this.safeSymbol (marketId, market);
return {
'info': trade,
'symbol': symbol, // very good, a unified symbol here now
// other fields...
};
}
```
#### Accessing Dictionary Keys [#accessing-dictionary-keys]
In JavaScript, dictionary keys can be accessed in two notations:
* `object['key']` (single-quoted string key notation)
* `object.key` (property notation)
Both work almost identically, and one is implicitly converted to another upon executing the JavaScript code.
While the above does work in JavaScript, **it will not work in Python or PHP**. In most languages, associative dictionary keys are not treated in the same way as properties. Therefore, in Python `object.key` is not the same as `object['key']`. In PHP `$object->key` is not the same as `$object['key']` as well. Languages that differentiate between associative keys and properties use different notations for the two.
To keep the code transpileable, please, remember this simple rule: *always use the single-quoted string key notation `object['key']` for accessing all associative dictionary keys in all languages everywhere throughout this library!*
#### Sanitizing Input With `safe`-Methods [#sanitizing-input-with-safe-methods]
JavaScript is less restrictive than other languages. It will tolerate an attempt to dereference a non-existent key where other languages will throw an Exception:
```javascript
// JavaScript
const someObject = {}
if (someObject['nonExistentKey']) {
// the body of this conditional will not execute in JavaScript
// because someObject['nonExistentKey'] === undefined === false
// but JavaScript will not throw an exception on the if-clause
}
```
However, the above logic with *"an undefined value by default"* will not work in Python or PHP.
```python
# Python
some_dictionary = {}
# breaks
if some_dictionary['nonExistentKey']:
# in Python the attempt to dereference the nonExistentKey value
# will throw a standard built-in KeyError exception
# works
if 'nonExistentKey' in some_dictionary and some_dictionary['nonExistentKey']:
# this is a way to check if the key exists before accessing the value
# also works
if some_dictionary.get('nonExistentKey'):
# another a way to check if the key exists before accessing the value...
```
Most languages will not tolerate an attempt to access a non-existent key in an object.
For the above reasons, please, **never do this** in the transpiled JS files:
```javascript
// JavaScript
const value = object['key'] || other_value; // will not work in Python or PHP!
if (object['key'] || other_value) { /* will not work in Python or PHP! */ }
```
Therefore we have a family of `safe*` functions:
* `safeInteger (object, key, default)`, `safeInteger2 (object, key1, key2, default)` –for parsing timestamps in milliseconds
* `safeNumber (object, key, default)`, `safeNumber2 (object, key1, key2, default)` – for parsing amounts, prices, costs
* `safeString (object, key, default)`, `safeString2 (object, key1, key2, default)` – for parsing ids, types, statuses
* `safeStringLower (object, key, default)`, `safeStringLower2 (object, key1, key2, default)` – for parsing and turning to lowercase
* `safeStringUpper (object, key, default)`, `safeStringUpper2 (object, key1, key2, default)` – for parsing and turning to uppercase
* `safeBool(object, key, default)` - for parsing bools inside dictionaries and arrays/lists
* `safeList(object, key, default)` - for parsing lists/arrays inside dictionaries and arrays/lists
* `safeDict(object, key, default)` - for parsing dictionaries inside dictionaries and arrays/lists
* `safeValue (object, key, default)`, `safeValue2 (object, key1, key2, default)` – for parsing objects (dictionaries) and arrays (lists)
* `safeTimestamp (object, key, default)`, `safeTimestamp2 (object, key1, key2, default)` – for parsing UNIX timestamps in seconds
The `safeValue` function is used for objects inside objects, arrays inside objects and boolean `true/false` values (**deprecated, use it only when you don't know exactly which type is going to be returned, otherwise prefer** `safeBool/safeDict/safeList`).
If you need to search for several different keys within an object you have available the `safeMethodN` function's family that allows for a search with an arbitrary number of keys by accepting an array of keys as an argument.
```javascript
const price = this.safeStringN (object, [ 'key1', 'key2', 'key3' ], defaultValue)
```
For every safe method listed above, there is the correspondent `safeMethodN` too.
The above safe-functions will check for the existence of the `key` (or `key1`, `key2`) in the object and will properly return `undefined/None/null` values for JS/Python/PHP. Each function also accepts the `default` value to be returned instead of `undefined/None/null` in the last argument.
Alternatively, you could check for the key existence first...
So, you have to change this:
```javascript
if (params['foo'] !== undefined) {
}
```
↓
```javascript
const foo = this.safeValue (params, 'foo');
if (foo !== undefined) {
}
```
Or:
```javascript
if ('foo' in params) {
}
```
#### Using Base Class Cryptography Methods For Authentication [#using-base-class-cryptography-methods-for-authentication]
Do not reinvent the wheel. Always use base-class methods for cryptography.
The CCXT library supports the following authentication algorithms and cryptography algorithms:
* HMAC
* JWT (JSON Web Token)
* RSA
* ECDSA Elliptic Curve Cryptography
* NIST P256
* secp256k1
* OTP 2FA (one-time password 2-factor authentication)
The base `Exchange` class offers several methods that are key to practically all cryptography in this lib. Derived exchange implementations must not use external dependencies for cryptography, everything should be done with base methods only.
* `hash (message, hash = 'md5', digest = 'hex')`
* `hmac (message, secret, hash = 'sha256', digest = 'hex')`
* `jwt (message, secret, hash = 'HS256')`
* `rsa (message, secret, alg = 'RS256')`
* `ecdsa (request, secret, algorithm = 'p256', hash = undefined)`
* `totp (secret)`
* `stringToBase64()`, `base64ToBinary()`, `binaryToBase64()`...
The `hash()` method supports the following `hash` algorithms:
* `'md5'`
* `'sha1'`
* `'sha3'`
* `'sha256'`
* `'sha384'`
* `'sha512'`
* `'keccak'`
The `digest` encoding argument accepts the following values:
* `'hex'`
* `'binary'`
The `hmac()` method also supports `'base64'` for the `digest` argument. This is for `hmac()` only, other implementations should use `'binary'` with `binaryToBase64()`.
#### Timestamps [#timestamps]
**All timestamps throughout all unified structures within this library are integer UTC timestamps *in milliseconds*!**
In order to convert to milliseconds timestamps, CCXT implements the following methods:
```javascript
const data = {
'unixTimestampInSeconds': 1565242530,
'unixTimestampInMilliseconds': 1565242530165,
'unixTimestampAsDecimal': 1565242530.165,
'stringInSeconds': '1565242530',
};
// convert to integer if the underlying value is already in milliseconds
const timestamp = this.safeInteger (data, 'unixTimestampInMilliseconds'); // === 1565242530165
// convert to integer and multiply by a thousand if the value has milliseconds after dot
const timestamp = this.safeTimestamp (data, 'unixTimestampAsDecimal'); // === 1565242530165
// convert to integer and multiply by a thousand if the value is a UNIX timestamp in seconds
const timestamp = this.safeTimestamp (data, 'unixTimestampInSeconds'); // === 1565242530000
// convert to integer and multiply by a thousand if the value is in seconds
const timestamp = this.safeTimestamp (data, 'stringInSeconds'); // === 1565242530000
```
#### Working With Array Lengths [#working-with-array-lengths]
In JavaScript the common syntax to get a length of a string or an array is to reference the `.length` property like shown here:
```javascript
someArray.length
// or
someString.length
```
And it works for both strings and arrays. In Python this is done in a similar way:
```python
len(some_array)
# or
len(some_string)
```
So the length is accessible in the same way for both strings and arrays and both work fine.
However, with PHP this is different, so the syntax for string lengths and array lengths is different:
```php
count(some_array);
// or
strlen(some_string); // or mb_strlen
```
Because the transpiler works line-by-line and does no code introspection, it cannot tell arrays from strings and cannot properly transpile `.length` to PHP without additional hinting. It will always transpile JS `.length` to PHP `strlen` and will prefer string lengths over array lengths. In order to indicate an array length properly we have to do the following:
```javascript
const arrayLength = someArray.length;
// the above line ends with .length;
// that ending is a hint for the transpiler that will recognize someArray
// as an array variable in this place, rather than a string type variable
// now we can use arrayLength for the arithmetic
```
That `.length;` line ending does the trick. The only case when the array `.length` is preferred over the string `.length` is the `for` loop. In the header of the `for` loop, the `.length` always refers to array length (not string length).
#### Adding Numbers And Concatenating Strings [#adding-numbers-and-concatenating-strings]
In JS the arithmetic addition `+` operator handles both strings and numbers. So, it can concatenate strings with `+` and can sum up numbers with `+` as well. The same is true with Python. With PHP this is different, so it has different operators for string concatenation (the "dot" operator `.`) and for arithmetic addition (the "plus" operator `+`). Once again, because the transpiler does no code introspection it cannot tell if you're adding up numbers or strings in JS. This works fine until you want to transpile this to other languages, be it PHP or whatever other language it is.
There's this aspect of representation of numbers throughout the lib.
The existing approach documented in the Manual says that the library will accept and will return "floats everywhere" for amounts, prices, costs, etc.
Using floats is the easiest way of onboarding new users.
This has known quirks, it's impossible to represent exact numbers with floats ([https://0.30000000000000004.com/](https://0.30000000000000004.com/))
To address that, we are switching to string-based representations everywhere.
So, we are now in the process of moving towards strings in a non-breaking way.
The new approach is:
We are adding an internal layer for string-based representations and string-based maths in the response parsers.
That internal layer is built on top of the base `Precise` class, that is used to do all string-based maths.
That class requires strings to operate on them and it will return strings as well.
All existing old parsers must be rewritten to use `Precise` string-based representations, on first-encounter.
All new code of all new parsers must be initially written with `Precise` string-based representations.
What exactly that means:
Compare this pseudocode showing how it was done **before** (an example of some arbitrary parsing code for the purpose of explaining it):
```javascript
const amount = this.safeFloat (order, 'amount');
const remaining = this.safeFloat (order, 'remaining');
if (remaining > 0) {
status = 'open';
} else {
status = 'closed';
}
// ...
return {
// ...
'amount': amount,
'remaining': remaining,
'status': status,
// ...
};
```
This is how we should do it **from now on**:
```javascript
const amount = this.safeNumber (order, 'amount'); // internal string-layer
const remaining = this.safeString (order, 'remaining'); // internal string-layer
if (Precise.stringGt (remaining, '0')) { // internal string-layer
status = 'open';
} else {
status = 'closed';
}
// ...
return {
// ...
'amount': amount, // external layer, goes to the user
'remaining': this.parseNumber (remaining), // external layer, goes to the user
'status': status,
// ...
};
```
In all new code of all parsers we should use string-based numbers throughout the body of the parser. Also we should add `parseNumber` as the last step of handling numeric values upon returning the result to the caller. The above two snippets are just examples, showing the usage of `Precise` with `safeString` and `parseNumber`. The actual parsers of orders also involve safeOrder-methods: [https://github.com/ccxt/ccxt/pulls?q=safeOrder2](https://github.com/ccxt/ccxt/pulls?q=safeOrder2).
The user will ultimately have an option to choose which implementation of parseNumber he wants: the one returning floats or the one returning strings. This way everyone will remain happy and the library will work both ways in a non-breaking fashion.
The rule of thumb is: **`+` is for string concatenation only (!)** and **ALL arithmetic operations must use `Precise`**.
#### Formatting Decimal Numbers To Precision [#formatting-decimal-numbers-to-precision]
This section covers the request-assembly part. The `.toFixed ()` method has [known rounding bugs](https://www.google.com/search?q=toFixed+bug) in JavaScript, and so do the other rounding methods in the other languages as well. In order to work with number formatting consistently use the [`decimalToPrecision` method as described in the Manual](/docs/manual#methods-for-formatting-decimals).
#### Escaped Control Characters [#escaped-control-characters]
When using strings containing control characters like `"\n"`, `"\t"`, always enclose them in double quotes (`"`), not single quotes (`'`)! Single-quoted strings are not parsed for control characters and are treated as is in many languages apart from TypeScript. Therefore for tabs and newlines to work in PHP, we need to surround them with double quotes (especially in the `sign()` implementation).
Bad:
```javascript
const a = 'GET' + method.toLowerCase () + '\n' + path;
const b = 'api\nfoobar.com\n';
```
Good:
```javascript
const a = 'GET' + method.toLowerCase () + "\n" + path; // eslint-disable-line quotes
// eslint-disable-next-line quotes
const b = "api\nfoobar.com\n";
```
**↑ The `eslint-*` comments are mandatory!**
#### Using Ternary Conditionals [#using-ternary-conditionals]
Do not use heavy ternary (`?:`) conditionals, **always use brackets in ternary operators!**
Despite that there is operator precedence in the programming languages themselves, the transpiler is regex-based and it does no code introspection, therefore it treats everything as plaintext.
The brackets are needed to hint the transpiler which part of the conditional is which. In the absence of brackets it's hard to understand the line and the intent of the developer.
Here are some examples of a badly-designed code that will break the transpiler:
```javascript
// this is an example of bad code style that will likely break the transpiler
const foo = {
'bar': 'a' + qux === 'baz' ? this.a () : this.b () + 'b',
};
```
```javascript
// this confuses the transpiler and a human developer as well
const foo = 'bar' + baz + qux ? 'a' : '' + this.c ();
```
Adding surrounding brackets to corresponding parts would be a more or less correct way to resolve it.
```javascript
const foo = {
'bar': (qux === 'baz') ? this.a () : this.b (), // much better now
};
```
The universally-working way to solve it is to just break the complex line into a few simpler lines, even at a cost of adding extra lines and conditionals:
```javascript
// before:
// const foo = {
// 'bar': 'a' + qux === 'baz' ? this.a () : this.b () + 'b',
// };
// ----------------------------------------------------------------------------
// after:
const bar = (qux === 'baz') ? this.a () : this.b ();
const foo = {
'bar': 'a' + bar + 'b',
};
```
Or even:
```javascript
// before:
// const foo = 'bar' + baz + qux ? 'a' : '' + this.c ();
// ----------------------------------------------------------------------------
// after:
let foo = 'bar' + baz;
if (qux) {
foo += 'a';
};
foo += this.c ();
```
***
### New Exchange Integrations [#new-exchange-integrations]
**REMEMBER:** The key reason why this library is used at all is **Unification**. When developing a new exchange file the goal is not to implement it somehow, but to implement it in a very pedantic, precise and exact way, just as the other exchanges are implemented. For that we have to copy bits of logic from other exchanges and make sure that the new exchange conforms to the Manual in the following aspects:
* market ids, trading pair symbols, currency ids, token codes, symbolic unification and `commonCurrencies` must be standardized in all parsing methods (`fetchMarkets`, `fetchCurrencies`, `parseTrade`, `parseOrder`, ...)
* all unified API method names and arguments are standard – can't add or change them freely
* all parser input must be `safe`-sanitized as [described above](#sanitizing-input-with-safe-methods)
* for bulk operations the base methods should be used (`parseTrades`, `parseOrders`, note the `s` plural ending)
* use as much of base functionality as you can, do not reinvent the wheel, nor the bicycle, nor the bicycle wheel
* respect default argument values in `fetch`-methods, check if `since` and `limit` are `undefined` and do not send them to the exchange, we intentionally use the exchanges' defaults in such cases
* when implementing a unified method that has some arguments – we can't ignore or miss any of those arguments
* all structures returned from the unified methods must conform to their specifications from the Manual
* all API endpoints have to be listed out with proper support for params substituted in the URLs
Please, see the following document for new integrations: /docs/requirements
A quick merge of a Pull Request for a new exchange integration depends on consistency and compliance with the above unified rules and standards. Breaking one of those is the key reason for not merging a Pull Request.
**If you want to add (support for) another exchange, or implement a new method for a particular exchange, then the best way to make it a consistent improvement is to learn from example. Take a look at how same things are implemented in other exchanges (we recommend certified exchanges) and try to copy the code flow and style.**
The basic JSON-skeleton for a new exchange integration is as follows:
```
{
'id': 'example',
'name': 'Example Exchange',
'country': [ 'US', 'EU', 'CN', 'RU' ],
'rateLimit': 1000,
'version': '1',
'comment': 'This comment is optional',
'urls': {
'logo': 'https://example.com/image.jpg',
'api': 'https://api.example.com/api',
'www': 'https://www.example.com',
'doc': [
'https://www.example.com/docs/api',
'https://www.example.com/docs/howto',
'https://github.com/example/docs',
],
},
'api': {
'public': {
'get': [
'endpoint/example',
'orderbook/{pair}/full',
'{pair}/ticker',
],
},
'private': {
'post': [
'balance',
],
},
},
}
```
### Implicit API Methods [#implicit-api-methods]
In the code for each exchange, you'll notice that the functions that make API requests aren't explicitly defined. This is because the `api` definition in the exchange description JSON is used to create *magic functions* (aka *partial functions* or *closures*) inside the exchange subclass. That implicit injection is done by the `defineRestApi/define_rest_api` base exchange method.
Each partial function takes a dictionary of `params` and returns the API response. In the example JSON above, the `'endpoint/example'` results in the injection of a `this.publicGetEndpointExample` function. Similarly, the `'orderbook/{pair}/full'` results in a `this.publicGetOrderbookPairFull` function, that takes a `pair` parameter (again, passed in the `params` argument).
Upon instantiation the base exchange class takes each URL from its list of endpoints, splits it into words, and then makes up a callable function name from those words by using a partial construct. That process is the same in JS, Python and PHP as well. It is also described here:
* /docs/manual#api-methods--endpoints
* /docs/manual#implicit-api-methods
* [https://github.com/ccxt-dev/ccxt/wiki/Manual#api-method-naming-conventions](https://github.com/ccxt-dev/ccxt/wiki/Manual#api-method-naming-conventions)
` CONSTRUCTION`
### Docstrings [#docstrings]
* when a method takes another parameter as a property on params (ex. `params['something']`) add that parameter to the docstring, as params.something
* if that parameter is required, the type is `{str}`, `{int}`, `{etc}`, if it's optional the type is `{str|undefined}`, `{int|undefined}`, `{etc|undefined}`
* when a parameter's default value is `undefined`, but the method contains something like `if (symbol === undefined) { throw new ArgumentsRequired('...')}`, then set the type of that parameter as `{str}`, `{int}`, `{etc}`. If an error is not thrown, then the type is `{str|undefined}`, `{int|undefined}`, `{etc|undefined}`
* if a method doesn't use one of the unified parameters, set the description of that parameter to `not used by exchange_name.method_name ()` (replace `exchange_name` and `method_name` with the real exchange and method names)
* if the method has any other special case uses, put these in the description of the docstring, these cases can be included in the class docstring as well
### Continuous Integration [#continuous-integration]
Builds are automated with [Travis CI](https://app.travis-ci.com/github/ccxt/ccxt). The build steps for Travis CI are described in the [`.travis.yml`](https://github.com/ccxt/ccxt/blob/master/.travis.yml) file.
Windows builds are automated with [Appveyor](https://ci.appveyor.com/project/ccxt/ccxt). The build steps for Appveyor are in the [`appveyor.yml`](https://github.com/ccxt/ccxt/blob/master/appveyor.yml) file.
Incoming pull requests are automatically validated by the CI service. You can watch the build process online here: [app.travis-ci.com/github/ccxt/ccxt/builds](https://app.travis-ci.com/github/ccxt/ccxt/builds).
### How To Build & Run Tests On Your Local Machine [#how-to-build--run-tests-on-your-local-machine]
### Offline tests [#offline-tests]
CCXT has various offline tests that help ensure we don't introduce regressions upon adding a new feature or patching a bug. They are effortless and fast to run (since they don't require access to the exchanges), so they should be part of our development flow at CCXT.
They include the base tests (precision, crypto, orderbook, etc) and static (request/response) tests.
These tests are located in the folder `ts/src/test/base/functions/`; most of their content is automatically transpilable to every language; therefore, the same code conventions apply.
You can run them by doing: `npm run test-base` and `npm run-test-ws`
Static tests are also offline but they work differently because they emulate a unified ccxt call (createOrder/fetchTickers/etc) and they mock the server's response and/or assert the validity of the generated HTTP request.
**Request-static**:
* They emulate the HTTP request, stop it before it tries to connect and assert that the url/body are properly formed.
Folder: `ts/src/test/static/request/`
You can create a static-request test by running this command and pasting the result in the correct file (eg: `static/request/binance.json`)
```bash
npm run cli.ts -- binance fetchTrades "BTC/USDT:USDT" --request
```
The `output` field holds the expected HTTP body. When that body is itself JSON, store it
as a JSON object (or array) so the fixture stays valid RFC 8259 and readable:
```json
"output": { "symbol": "BTC_USDT_PERP", "side": "BUY", "type": "LIMIT", "sz": "1", "px": "84000" }
```
The request comparator already parses string `output` values as JSON when `outputType` is
`json`, so an object and a stringified object compare the same. Query-string bodies stay
plain strings (`"symbol=BTCUSDT&side=BUY"`).
**Response-static**
* Emulate a mocked response from the server and assert the CCXT parses the raw HTTP response correctly.
Folder: `ts/src/test/static/response/binance.json`
You can create a static-response test by running this command and pasting the result in the correct file (eg: `static/response/binance.json`)
```bash
npm run cli.ts -- binance fetchTrades "BTC/USDT:USDT" undefined 1 --response
```
#### Adding Exchange Credentials [#adding-exchange-credentials]
CCXT has tests for both the public API and the private authenticated API. By default, CCXT's built-in tests will only test the public APIs, because the code repository does not include the [API keys](/docs/manual#authentication) that are required for the private API tests. Also, the included private tests will not alter the balance of the account in any way, all tests are non-intrusive. In order to enable private API testing, one must configure the API keys. That can be done either in `keys.local.json` or with the `env` variables.
##### Configuring API keys and options in `keys.local.json` [#configuring-api-keys-and-options-in-keyslocaljson]
Exchange API keys can be added to the `keys.local.json` in the root folder inside the repository. If it does not exist on your side – create it first. That file is in `.gitignore` and in `.npmignore`. You can add exchange credentials and various options for different exchanges to the `keys.local.json` file.
An example of `keys.local.json` file:
```json
{
"okx": {
"apiKey": "XXX",
"secret": "YYY"
},
"binance": {
"apiKey": "XXX",
"secret": "YYY",
"options": {
"some-option": "some value"
}
},
// ...
}
```
##### Configuring API keys as environment variables [#configuring-api-keys-as-environment-variables]
You can also define API keys as `env` variables:
* [https://www.google.com/search?q=set+env+variable+linux](https://www.google.com/search?q=set+env+variable+linux)
* [https://www.google.com/search?q=set+env+variable+mac](https://www.google.com/search?q=set+env+variable+mac)
* [https://www.google.com/search?q=set+env+variable+windows](https://www.google.com/search?q=set+env+variable+windows)
Consult the docs for your OS and shell on how to set an environment variable. Most of the time a `set` command, or a `export` command will work. The `env` command might help check the already-set environment variables.
Examples of `env` variables: `BINANCE_APIKEY`, `BINANCE_SECRET`, `KRAKEN_APIKEY`, `KRAKEN_SECRET`, etc.
#### Building [#building]
Before building for the first time, install Node dependencies (skip this step if you're running our Docker image):
```
npm install
```
The command below will build everything and generate PHP/Python versions from source TS files:
```
npm run build
```
#### Testing [#testing]
The following command will test the built generated files (for all exchanges, symbols and languages):
```
node run-tests
```
You can restrict tests to a specific language, a particular exchange or symbol:
```
node run-tests [--js] [--python] [--python-async] [--php] [--php-async] [exchange] [symbol]
```
The `node run-tests exchangename` will try 5 tests: `js`, `python`, `python-async`, `php`, `php-async`. You can control that like so:
```
node run-tests exchange --js
node run-tests exchange --js --python-async
node run-tests exchange --js --php
node run-tests exchange --python --python-async
...
```
However, if that fails, you might have to bury one level lower and run language-specific tests to see what exactly is wrong:
```
node js/test/test exchange --verbose
python3 python/ccxt/test/test_sync.py exchange --verbose
python3 python/ccxt/test/test_async.py exchange --verbose
php -f php/test/test_sync.php exchange --verbose
php -f php/test/test_async.php exchange --verbose
```
The `test_sync` is just a synchronous version of `test_async`, so in most cases just running `test_async.py` and `test_async.php` is enough:
```
node js/test/test exchange --verbose
python3 python/ccxt/test/test_async.py exchange --verbose
php -f php/test/test_async.php exchange --verbose
```
When all of the language-specific tests work, then node run-tests will also succeed. In order to run those tests you want to make sure that the build has completed successfully.
For example, the first of the following lines will only test the source JS version of the library (`ccxt.js`). It does not require an `npm run build` before running it (can be useful if you need to verify quickly whether your changes break the code or not):
```bash
node run-tests --js # test master ccxt.js, all exchanges
# other examples require the 'npm run build' to run
node run-tests --python # test Python sync version, all exchanges
node run-tests --php bitfinex # test Bitfinex with PHP
node run-tests --python-async kraken # test Kraken with Python async test, requires 'npm run build'
```
#### Writing Tests [#writing-tests]
Follow this steps to add a test:
* Create a file in [ts/tests/Exchange](https://github.com/ccxt/ccxt/tree/master/ts/test/Exchange) following syntax that can be transpiled.
* Add test to `runPrivateTests` or `runPublicTests` to [ts/src/test/tests.ts](https://github.com/ccxt/ccxt/blob/master/ts/src/test/tests.ts#L354) or for ccxt.pro endpoints to [ts/src/pro/test/tests.ts](https://github.com/ccxt/ccxt/blob/master/ts/src/pro/test/tests.ts#L121)
* run `npm run transpile` to generate the test file in javascript, python and php.
* Call tests `node run-tests`
## Committing Changes To The Repository [#committing-changes-to-the-repository]
The build process generates many changes in the transpiled exchange files, e.g. for Python and PHP. **You should NOT commit them to GitHub, commit only the base (TS) file changes please**.
## Financial Contributions [#financial-contributions]
We also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/ccxt).
## Credits [#credits]
### Contributors [#contributors]
Thank you to all the people who have already contributed to ccxt!
### Backers [#backers]
Thank you to all our backers! \[[Become a backer](https://opencollective.com/ccxt#backer)]
### Supporters [#supporters]
Support this project by becoming a supporter. Your avatar will show up here with a link to your website.
\[[Become a supporter](https://opencollective.com/ccxt#supporter)]
### Sponsors [#sponsors]
Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/ccxt#sponsor))
\[[Become a sponsor](https://opencollective.com/ccxt#sponsor)]
# Examples Overview (/docs/examples-overview)
# CCXT Cryptocurrency Trading Library Examples [#ccxt-cryptocurrency-trading-library-examples]

# [Examples](#examples) · [Citations](#ccxt-citations-in-papers-and-theses) · [Tutorials](#see-also) [#examples--citations--tutorials]
## Examples [#examples]
To run the ccxt examples from any folder type one of the following commands in console.
### Typescript [#typescript]
[Typescript Examples](/docs/examples/ts/)
***
### JavaScript [#javascript]
[JavaScript Examples](/docs/examples/js/)
```bash
node path/to/example.js # substitute for actual filename here
```
These examples might require the following super-useful high-quality Node.js modules by [xpl](https://github.com/xpl):
* [ololog](https://github.com/xpl/ololog): Platform-agnostic logging with blackjack and hookers ([ololog @ npm](https://npmjs.com/package/ololog))
* [ansicolor](https://github.com/xpl/ansicolor): A quality JavaScript library for the ANSI color/style management ([ansicolor @ npm](https://npmjs.com/package/ansicolor))
* [as-table](https://github.com/xpl/as-table): A simple function that prints objects as ASCII tables ([as-table @ npm](https://npmjs.com/package/as-table))
All of the modules above are installed with the ccxt library devDependencies by npm automatically.
***
### PHP [#php]
[PHP Examples](/docs/examples/php/)
```bash
php -f path/to/example.php # substitute for actual filename here
```
***
### Python [#python]
[Python Examples](/docs/examples/py/)

```bash
python path/to/example.py # substitute for actual filename here
```
***
### Rust [#rust]
[Rust Examples](/docs/examples/rust/)
The Rust examples are cargo binaries declared in `examples/rust/Cargo.toml` — run one by
its `[[bin]]` name:
```bash
cargo run --manifest-path examples/rust/Cargo.toml --bin binance_basics
```
The WebSocket (`watch*`) examples pull in the `ccxt-pro` crate, which is behind the `ws`
feature:
```bash
cargo run --manifest-path examples/rust/Cargo.toml --features ws --bin watch_trades
```
***
## CCXT Citations In Papers And Theses [#ccxt-citations-in-papers-and-theses]
* [Developing Predictive and Explainable Models for Cryptocurrency Delistings: A Case Study of Binance Exchange](https://onlinelibrary.wiley.com/doi/epdf/10.1111/ajfs.70045) 2026, **Sungju Yang**, **Hunyeong Kwon** (School of Cybersecurity, Korea University)
* [Do Whitepaper Claims Predict Market Behavior?](https://arxiv.org/pdf/2601.20336) 2026, **Murad Farzulla** (Dissensus AI, King’s College London)
* [An Adaptive Neuro-Fuzzy Blockchain–AI Framework for Secure and Intelligent FinTech Transactions](https://arxiv.org/pdf/2603.23829) 2026, **Gunjan Mishraa**, **Yash Mishrab** (Lakshmipat University)
* [A Unified GRU Model for Cryptocurrency Price Prediction and Harsh Price Movement Detection Using Enhanced Sentiment Analysis]() 2026, **Mahmood Mohammadi Nezhad**, **Saeed Rouhani**, **Navid Mohammadi** (University of Tehran), **Ali Shahedi** (Sharif University of Technology)
* [Bitcoin Price Prediction Using Machine Learning in Python]() 2025, **Thillainayagi S**, **Pavan P**, **Shashank S**, **Preetham LV**, **Vishwanath BY** (East West College of Engineering, Bangalore, India)
* [Evaluating machine learning models for predictive accuracy in cryptocurrency price forecasting](https://peerj.com/articles/cs-2626.pdf) 2025, **Shavez Mushtaq Qureshi**, **Asad Rehman Khattak**, **Muhammad Shah Rukh** (Qarshi University), **Atif Saeed**, **Farooq Ahmad** (COMSATS University Islamabad), **Sultan H. Almotiri**, **Mohammed A. Al Ghamdi** (Umm Al-Qura University)
* [Machine Learning-Based Detection of Pump-and-Dump Schemes in Real-Time](https://arxiv.org/pdf/2412.18848) 2024, **Manuel Bolz**, **Kevin Bründler**, **Liam Kane**, **Panagiotis Patsias**, **Liam Tessendorf**, **Krzysztof M. Gogol**, **Taehoon Kim**, **Claudio J. Tessone** (University of Zurich)
* [Forecasting cryptocurrency's buy signal with a bagged tree learning approach to enhance purchase decisions](https://pmc.ncbi.nlm.nih.gov/articles/PMC11112015/) 2024, **Raed Alsini**, **Abdulaziz A Alsulami**, **Abdulaziz A Alqurashi**, **Nawaf Alhebaishi**, **Badraddin Alturki**, **Mouhamad D Mashat** (King Abdulaziz University), **Qasem Abu Al-Haija** (Jordan University of Science and Technology), **Ali Alqahtani**, (Najran University)
* [A Hybrid COMTE-LEFTIST Time-Series Explanation Method For a Time-series Classification Bitcoin Recommendation System](https://openreview.net/pdf?id=IepDSQDWWv) 2024, **Lucas Rabelo de Araujo Morais**, **Teresa Bernarda Ludermir** (Universidade Federal de Pernambuco)
* [Deep Complex Networks: Applications in Financial Systems Modeling](https://discovery.ucl.ac.uk/10201193/13/Briola_10201193_thesis.pdf) 2024, **Antonio Briola** (University College London)
* [FTX’s downfall and Binance’s consolidation: the fragility of Centralized Digital Finance](https://arxiv.org/pdf/2302.11371) 2023, **David Vidal-Tom´as**, **Antonio Briola**, **Tomaso Astea** (University College London)
* [Detecting Pump-and-Dumps with Crypto-Assets](https://www.mdpi.com/2225-1146/11/3/22) 2023, **Dean Fantazzini**, **Yufeng Xiao** (Moscow State University)
* [Detecting Depegs: Towards Safer Passive Liquidity Provision on Curve Finance](https://arxiv.org/pdf/2306.10612) 2023, **Thomas Cintra**, **Max Holloway** (Xenophon Labs)
* [Development Of A Cryptocurrency Bot](https://upcommons.upc.edu/bitstream/handle/2117/385422/DevelopmentOfACryptocurrencyBot.pdf) 2023, **José Manuel Rodríguez Lomeña** (Universitat Polit\`ecnica de Catalunya)
* [Dependency Structures in Cryptocurrency Market from High to Low Frequency](https://researchonline.lse.ac.uk/id/eprint/117410/1/entropy_24_01548_v2.pdf) 2022, **Antonio Briola** (University College London), **Tomaso Astea** (London School Of Economics)
* [Anatomy of a Stablecoin’s failure: the Terra-Luna case](https://arxiv.org/pdf/2207.13914) 2022, **Antonio Briola**, **David Vidal-Tom´as**, **Yuanrong Wanga** (University College London), **Tomaso Astea** (London School Of Economics)
* [FreqAI: generalizing adaptive modeling for chaotic time-series forecasting](https://joss.theoj.org/papers/10.21105/joss.04864.pdf) 2022, **Robert A. Caulk**, **Elin Törnquist**, **Matthias Voppichler**, **Andrew R. Lawless**, **Ryan McMullan**, **Wagner Costa Santos**, **Timothy C. Pogue**, **Johan van der Vlugt**, **Stefan P. Gehring**, **Pascal Schmidt** (Freqtrade)
* [Analysis and Implementation of Arbitrage Bots in Centralized and Decentralized Finance](https://capuana.ifi.uzh.ch/publications/PDFs/22625_Analysis_and_Implementation_of_Arbitrage_Bots_in_Centralized_and_Decentralized_Finance.pdf) 2022, **Claudio Gebbia** (University of Zurich)
* [Hybrid Cryptocurrency Pump and Dump Detection](https://arxiv.org/pdf/2003.06551) 2020, **Hadi Mansourifar**, **Weidong Shi** (University of Houston), **Lin Chen** (Texas Tech University)
* [Cryptocurrency Trading: A Comprehensive Survey](https://arxiv.org/pdf/2003.11352) 2020, **Fan Fang**, **Carmine Ventre**, **Michail Basios**, **Leslie Kanthan**, **David Martinez-Rego**, **Fan Wu**, **Lingbo Li** (King’s College London)
* [Algorithm for cryptocurrency price discrepancy detection](https://oa.upm.es/64889/1/TFM_DANIEL_MINGUEZ_CAMACHO.pdf) 2020, **Imre Lendak**, **Marta Patiño Martínez**, **Gergely Tyukodi**, **Daniel Minguez Camacho** (Universidad Politécnica de Madrid)
* [An Empirical Analysis of the Python Package Index (PyPI)](https://arxiv.org/pdf/1907.11073.pdf) 2019, **Ethan Bommarito**, **Michael J Bommarito II** (University of Michigan)
* [To the moon: defining and detecting cryptocurrency pump-and-dumps](https://link.springer.com/content/pdf/10.1186/s40163-018-0093-5.pdf) 2018, **Josh Kamps** (VU University Amsterdam), **Bennett Kleinberg** (University College London)
***
# Exchanges by Country (/docs/exchange-markets-by-country)
# Exchanges By Country [#exchanges-by-country]
The ccxt library currently supports the following cryptocurrency exchange markets and trading APIs:
| country / region | logo | id | name | ver |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | -------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------: |
| Australia | [](https://btcmarkets.net) | btcmarkets | [BTC Markets](https://btcmarkets.net) | [](https://api.btcmarkets.net/doc/v3) |
| Australia | [](https://www.coinspot.com.au/register?code=PJURCU) | coinspot | [CoinSpot](https://www.coinspot.com.au/register?code=PJURCU) | [](https://www.coinspot.com.au/api) |
| Australia | [](https://www.independentreserve.com) | independentreserve | [Independent Reserve](https://www.independentreserve.com) | [](https://www.independentreserve.com/API) |
| Austria | [](https://onetrading.com/) | onetrading | [One Trading](https://onetrading.com/) | [](https://docs.onetrading.com) |
| Bermuda | [](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | hashkey | [HashKey Global](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | [](https://hashkeyglobal-apidoc.readme.io/) |
| Brazil | [](https://www.mercadobitcoin.com.br) | mercado | [Mercado Bitcoin](https://www.mercadobitcoin.com.br) | [](https://www.mercadobitcoin.com.br/api-doc) |
| British Virgin Islands | [](https://www.bitfinex.com) | bitfinex | [Bitfinex](https://www.bitfinex.com) | [](https://docs.bitfinex.com/v2/docs/) |
| British Virgin Islands | [](https://www.btse.com/referral/o2tjIXx5) | btse | [BTSE](https://www.btse.com/referral/o2tjIXx5) | [](https://support.btse.com/en/support/solutions/articles/43000044751-btse-api) |
| British Virgin Islands | [](https://www.bybit.com/invite?ref=XDK12WP) | bybit | [Bybit](https://www.bybit.com/invite?ref=XDK12WP) | [](https://bybit-exchange.github.io/docs/inverse/) |
| Canada | [](https://app.cryptomus.com/signup/?ref=JRP4yj) | cryptomus | [Cryptomus](https://app.cryptomus.com/signup/?ref=JRP4yj) | [](https://doc.cryptomus.com/personal) |
| Canada | [](https://one.ndax.io/bfQiSL) | ndax | [NDAX](https://one.ndax.io/bfQiSL) | [](https://apidoc.ndax.io/) |
| Cayman Islands | [](https://latoken.com/invite?r=mvgp2djk) | latoken | [Latoken](https://latoken.com/invite?r=mvgp2djk) | [](https://api.latoken.com) |
| Cayman Islands | [](https://trade.mode.network?ref=MODETRADE) | modetrade | [Mode Trade](https://trade.mode.network?ref=MODETRADE) | [](https://orderly.network/docs/build-on-omnichain/building-on-omnichain) |
| Cayman Islands | [](https://nado.xyz) | nado | [Nado](https://nado.xyz) | [](https://docs.nado.xyz/) |
| Cayman Islands | [](https://www.toobit.com/en-US/r?i=dvCpJj) | toobit | [Toobit](https://www.toobit.com/en-US/r?i=dvCpJj) | [](https://api-docs.toobit.com/) |
| Cayman Islands | [](https://woox.io/register?ref=DIJT0CNL) | woo | [WOO X](https://woox.io/register?ref=DIJT0CNL) | [](https://developer.woox.io/) |
| Cayman Islands | [](https://dex.woo.org/en/trade?ref=CCXT) | woofipro | [WOOFI PRO](https://dex.woo.org/en/trade?ref=CCXT) | [](https://orderly.network/docs/build-on-omnichain/building-on-omnichain) |
| China | [](https://b1.run/users/new?code=D3LLBVFT) | bigone | [BigONE](https://b1.run/users/new?code=D3LLBVFT) | [](https://open.big.one/docs/api.html) |
| China | [](https://www.coinex.com/register?refer_code=yw5fz) | coinex | [CoinEx](https://www.coinex.com/register?refer_code=yw5fz) | [](https://docs.coinex.com/api/v2) |
| China | [](https://www.htx.com/invite/en-us/1h?invite_code=6rmm2223) | htx | [HTX](https://www.htx.com/invite/en-us/1h?invite_code=6rmm2223) | [](https://huobiapi.github.io/docs/spot/v1/en/) |
| China | [](https://www.lbank.com/login/?icode=7QCY) | lbank | [LBank](https://www.lbank.com/login/?icode=7QCY) | [](https://www.lbank.com/en-US/docs/index.html) |
| China | [](https://www.my.okx.com/join/CCXT2023) | myokx | [MyOKX (EEA)](https://www.my.okx.com/join/CCXT2023) | [](https://my.okx.com/docs-v5/en/#overview) |
| China | [](https://www.okx.com/join/CCXTCOM) | okx | [OKX](https://www.okx.com/join/CCXTCOM) | [](https://www.okx.com/docs-v5/en/) |
| China | [](https://www.app.okx.com/join/CCXT2023) | okxus | [OKX (US)](https://www.app.okx.com/join/CCXT2023) | [](https://app.okx.com/docs-v5/en/#overview) |
| China | [](https://phemex.com/register?referralCode=EDNVJ) | phemex | [Phemex](https://phemex.com/register?referralCode=EDNVJ) | [](https://phemex-docs.github.io/#overview) |
| Cyprus | [](https://cex.io/r/0/up105393824/0/) | cex | [CEX.IO](https://cex.io/r/0/up105393824/0/) | [](https://trade.cex.io/docs/) |
| Czech Republic | [](https://coinmate.io?referral=YTFkM1RsOWFObVpmY1ZjMGREQmpTRnBsWjJJNVp3PT0) | coinmate | [CoinMate](https://coinmate.io?referral=YTFkM1RsOWFObVpmY1ZjMGREQmpTRnBsWjJJNVp3PT0) | [](https://coinmate.docs.apiary.io) |
| EU | [](https://www.bybit.com/invite?ref=XDK12WP) | bybiteu | [Bybit EU](https://www.bybit.com/invite?ref=XDK12WP) | [](https://bybit-exchange.github.io/docs/inverse/) |
| EU | [](https://cex.io/r/0/up105393824/0/) | cex | [CEX.IO](https://cex.io/r/0/up105393824/0/) | [](https://trade.cex.io/docs/) |
| EU | [](https://coinmate.io?referral=YTFkM1RsOWFObVpmY1ZjMGREQmpTRnBsWjJJNVp3PT0) | coinmate | [CoinMate](https://coinmate.io?referral=YTFkM1RsOWFObVpmY1ZjMGREQmpTRnBsWjJJNVp3PT0) | [](https://coinmate.docs.apiary.io) |
| EU | [](https://www.gate.com/share/CCXTGATE) | gateeu | [Gate EU](https://www.gate.com/share/CCXTGATE) | [](https://www.gate.com/docs/developers/apiv4/en) |
| EU | [](https://www.paymium.com/page/sign-up?referral=eDAzPoRQFMvaAB8sf-qj) | paymium | [Paymium](https://www.paymium.com/page/sign-up?referral=eDAzPoRQFMvaAB8sf-qj) | [](https://github.com/Paymium/api-documentation) |
| Estonia | [](https://whitebit.com/referral/d9bdf40e-28f2-4b52-b2f9-cd1415d82963) | whitebit | [WhiteBit](https://whitebit.com/referral/d9bdf40e-28f2-4b52-b2f9-cd1415d82963) | [](https://github.com/whitebit-exchange/api-docs) |
| France | [](https://www.paymium.com/page/sign-up?referral=eDAzPoRQFMvaAB8sf-qj) | paymium | [Paymium](https://www.paymium.com/page/sign-up?referral=eDAzPoRQFMvaAB8sf-qj) | [](https://github.com/Paymium/api-documentation) |
| Germany | [](https://bullish.com/) | bullish | [Bullish](https://bullish.com/) | [](https://api.exchange.bullish.com/docs/api/rest/) |
| Hong Kong | [](https://hitbtc.com/?ref_id=5a5d39a65d466) | hitbtc | [HitBTC](https://hitbtc.com/?ref_id=5a5d39a65d466) | [](https://api.hitbtc.com) |
| Hong Kong | [](https://opinion.trade) | opinion | [Opinion](https://opinion.trade) | [](https://docs.opinion.trade) |
| India | [](https://ref.bitbns.com/1090961) | bitbns | [Bitbns](https://ref.bitbns.com/1090961) | [](https://bitbns.com/trade/#/api-trading/) |
| India | [](https://mudrex.com) | mudrex | [Mudrex](https://mudrex.com) | [](https://docs.trade.mudrex.com/docs) |
| India | [](https://www.zebpay.com) | zebpay | [Zebpay](https://www.zebpay.com) | [](https://github.com/zebpay/zebpay-api-references) |
| Indonesia | [](https://coincheck.com) | coincheck | [Coincheck](https://coincheck.com) | [](https://coincheck.com/documents/exchange/api) |
| Indonesia | [](https://indodax.com/ref/testbitcoincoid/1) | indodax | [INDODAX](https://indodax.com/ref/testbitcoincoid/1) | [](https://github.com/btcid/indodax-official-api-docs) |
| Indonesia | [](https://tokocrypto.com) | tokocrypto | [Tokocrypto](https://tokocrypto.com) | [](https://www.tokocrypto.com/apidocs/) |
| Indonesia | [](https://upbit.com) | upbit | [Upbit](https://upbit.com) | [](https://docs.upbit.com/kr) |
| Israel | [](https://bit2c.co.il/Aff/63bfed10-e359-420c-ab5a-ad368dab0baf) | bit2c | [Bit2C](https://bit2c.co.il/Aff/63bfed10-e359-420c-ab5a-ad368dab0baf) | [](https://www.bit2c.co.il/home/api) |
| Japan | [](https://backpack.exchange/join/ccxt) | backpack | [Backpack](https://backpack.exchange/join/ccxt) | [](https://docs.backpack.exchange/) |
| Japan | [](https://bitbank.cc/) | bitbank | [bitbank](https://bitbank.cc/) | [](https://docs.bitbank.cc/) |
| Japan | [](https://bitflyer.com) | bitflyer | [bitFlyer](https://bitflyer.com) | [](https://lightning.bitflyer.com/docs?lang=en) |
| Japan | [](https://www.bittrade.co.jp/register/?invite_code=znnq3) | bittrade | [BitTrade](https://www.bittrade.co.jp/register/?invite_code=znnq3) | [](https://api-doc.bittrade.co.jp) |
| Japan | [](https://www.btcbox.co.jp/) | btcbox | [BtcBox](https://www.btcbox.co.jp/) | [](https://blog.btcbox.jp/en/archives/8762) |
| Japan | [](https://coincheck.com) | coincheck | [Coincheck](https://coincheck.com) | [](https://coincheck.com/documents/exchange/api) |
| Japan | [](https://zaif.jp) | zaif | [Zaif](https://zaif.jp) | [](https://techbureau-api-document.readthedocs.io/ja/latest/index.html) |
| Lithuania | [](https://p2pb2b.com?referral=ee784c53) | p2b | [p2b](https://p2pb2b.com?referral=ee784c53) | [](https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md) |
| Malta | [](https://bequant.io/referral/dd104e3bee7634ec) | bequant | [Bequant](https://bequant.io/referral/dd104e3bee7634ec) | [](https://api.bequant.io/) |
| Malta | [](https://crypto.com/exch/kdacthrnxt) | cryptocom | [Crypto.com](https://crypto.com/exch/kdacthrnxt) | [](https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html) |
| Mexico | [](https://bitso.com/?ref=itej) | bitso | [Bitso](https://bitso.com/?ref=itej) | [](https://bitso.com/api_info) |
| Netherlands | [](https://bitvavo.com/?a=24F34952F7) | bitvavo | [Bitvavo](https://bitvavo.com/?a=24F34952F7) | [](https://docs.bitvavo.com/) |
| Netherlands | [](https://www.deribit.com/reg-1189.4038) | deribit | [Deribit](https://www.deribit.com/reg-1189.4038) | [](https://docs.deribit.com/v2) |
| New Zealand | [](https://www.independentreserve.com) | independentreserve | [Independent Reserve](https://www.independentreserve.com) | [](https://www.independentreserve.com/API) |
| Philippines | [](https://www.coins.ph/en-ph/register?invite_code=1371062463303277512\&broker=9001) | coinsph | [Coins.ph](https://www.coins.ph/en-ph/register?invite_code=1371062463303277512\&broker=9001) | [](https://coins-docs.github.io/rest-api) |
| Russia | [](https://cex.io/r/0/up105393824/0/) | cex | [CEX.IO](https://cex.io/r/0/up105393824/0/) | [](https://trade.cex.io/docs/) |
| Saint Kitts and Nevis | [](https://fmfw.io/referral/da948b21d6c92d69) | fmfwio | [FMFW.io](https://fmfw.io/referral/da948b21d6c92d69) | [](https://api.fmfw.io/) |
| Seychelles | [](https://www.bitmex.com/app/register/NZTR1q) | bitmex | [BitMEX](https://www.bitmex.com/app/register/NZTR1q) | [](https://www.bitmex.com/app/apiOverview) |
| Seychelles | [](https://www.kucoin.com/ucenter/signup?rcode=E5wkqe) | kucoin | [KuCoin](https://www.kucoin.com/ucenter/signup?rcode=E5wkqe) | [](https://docs.kucoin.com) |
| Seychelles | [](https://futures.kucoin.com/?rcode=E5wkqe) | kucoinfutures | [KuCoin Futures](https://futures.kucoin.com/?rcode=E5wkqe) | [](https://docs.kucoin.com) |
| Seychelles | [](https://www.mexc.com/register?inviteCode=mexc-1FQ1GNu1) | mexc | [MEXC Global](https://www.mexc.com/register?inviteCode=mexc-1FQ1GNu1) | [](https://www.mexc.com/api-docs/spot-v3/introduction) |
| Seychelles | [](https://www.xt.com/en/accounts/register?ref=9PTM9VW) | xt | [XT](https://www.xt.com/en/accounts/register?ref=9PTM9VW) | [](https://doc.xt.com/) |
| Singapore | [](https://www.bitget.com/expressly?languageType=0\&channelCode=ccxt\&vipCode=tg9j) | bitget | [Bitget](https://www.bitget.com/expressly?languageType=0\&channelCode=ccxt\&vipCode=tg9j) | [](https://www.bitget.com/api-doc/common/intro) |
| Singapore | [](https://www.bitrue.com/affiliate/landing?cn=600000\&inviteCode=EZWETQE) | bitrue | [Bitrue](https://www.bitrue.com/affiliate/landing?cn=600000\&inviteCode=EZWETQE) | [](https://github.com/Bitrue-exchange/bitrue-official-api-docs) |
| Singapore | [](https://partner.bydfi.com/j/DilWutCI) | bydfi | [BYDFi](https://partner.bydfi.com/j/DilWutCI) | [](https://developers.bydfi.com/en/) |
| Singapore | [](https://s.deepcoin.com/UzkyODgy) | deepcoin | [DeepCoin](https://s.deepcoin.com/UzkyODgy) | [](https://www.deepcoin.com/docs) |
| Singapore | [](https://www.digifinex.com/en-ww/from/DhOzBg?channelCode=ljaUPp) | digifinex | [DigiFinex](https://www.digifinex.com/en-ww/from/DhOzBg?channelCode=ljaUPp) | [](https://docs.digifinex.com) |
| Singapore | [](https://app.extended.exchange) | extended | [Extended](https://app.extended.exchange) | [](https://api.docs.extended.exchange) |
| Singapore | [](https://grvt.io/?ref=WBLS9D1) | grvt | [GRVT](https://grvt.io/?ref=WBLS9D1) | [](https://api-docs.grvt.io/) |
| Singapore | [](https://www.luno.com/invite/44893A) | luno | [Luno](https://www.luno.com/invite/44893A) | [](https://www.luno.com/en/developers/api) |
| Singapore | [](https://upbit.com) | upbit | [Upbit](https://upbit.com) | [](https://docs.upbit.com/kr) |
| Singapore | [](https://www.weex.com/register?vipCode=qfyh) | weex | [Weex](https://www.weex.com/register?vipCode=qfyh) | [](https://www.weex.com/api-doc) |
| South Africa | [](https://www.luno.com/invite/44893A) | luno | [Luno](https://www.luno.com/invite/44893A) | [](https://www.luno.com/en/developers/api) |
| South Korea | [](https://www.bithumb.com) | bithumb | [Bithumb](https://www.bithumb.com) | [](https://apidocs.bithumb.com) |
| South Korea | [](https://coinone.co.kr) | coinone | [CoinOne](https://coinone.co.kr) | [](https://doc.coinone.co.kr) |
| South Korea | [](https://www.gate.com/share/CCXTGATE) | gate | [Gate](https://www.gate.com/share/CCXTGATE) | [](https://www.gate.com/docs/developers/apiv4/en) |
| South Korea | [](https://pro.hollaex.com/signup?affiliation_code=QSWA6G) | hollaex | [HollaEx](https://pro.hollaex.com/signup?affiliation_code=QSWA6G) | [](https://apidocs.hollaex.com) |
| South Korea | [](https://upbit.com) | upbit | [Upbit](https://upbit.com) | [](https://docs.upbit.com/kr) |
| St. Vincent & Grenadines | [](https://www.delta.exchange/app/signup/?code=IULYNB) | delta | [Delta Exchange](https://www.delta.exchange/app/signup/?code=IULYNB) | [](https://docs.delta.exchange) |
| Taiwan | [](https://www.bitopro.com) | bitopro | [BitoPro](https://www.bitopro.com) | [](https://github.com/bitoex/bitopro-offical-api-docs/blob/master/v3-1/rest-1/rest.md) |
| Thailand | [](https://upbit.com) | upbit | [Upbit](https://upbit.com) | [](https://docs.upbit.com/kr) |
| Turkey | [](https://www.btcturk.com) | btcturk | [BTCTurk](https://www.btcturk.com) | [](https://github.com/BTCTrader/broker-api-docs) |
| UK | [](https://www.bitstamp.net) | bitstamp | [Bitstamp](https://www.bitstamp.net) | [](https://www.bitstamp.net/api) |
| UK | [](https://bit.team/auth/sign-up?ref=bitboy2023) | bitteam | [BIT.TEAM](https://bit.team/auth/sign-up?ref=bitboy2023) | [](https://bit.team/trade/api/documentation) |
| UK | [](https://cex.io/r/0/up105393824/0/) | cex | [CEX.IO](https://cex.io/r/0/up105393824/0/) | [](https://trade.cex.io/docs/) |
| UK | [](https://coinmate.io?referral=YTFkM1RsOWFObVpmY1ZjMGREQmpTRnBsWjJJNVp3PT0) | coinmate | [CoinMate](https://coinmate.io?referral=YTFkM1RsOWFObVpmY1ZjMGREQmpTRnBsWjJJNVp3PT0) | [](https://coinmate.docs.apiary.io) |
| UK | [](https://www.luno.com/invite/44893A) | luno | [Luno](https://www.luno.com/invite/44893A) | [](https://www.luno.com/en/developers/api) |
| UK | [](https://exchange.revolut.com) | revolutx | [Revolut X](https://exchange.revolut.com) | [](https://developer.revolut.com/docs/api/revolut-x-crypto-exchange) |
| US | [](https://alpaca.markets) | alpaca | [Alpaca](https://alpaca.markets) | [](https://alpaca.markets/docs/) |
| US | [](https://www.asterdex.com/en/referral/aA1c2B) | aster | [Aster](https://www.asterdex.com/en/referral/aA1c2B) | [](https://github.com/asterdex/api-docs) |
| US | [](https://www.binance.us/?ref=35005074) | binanceus | [Binance US](https://www.binance.us/?ref=35005074) | [](https://github.com/binance-us/binance-official-api-docs) |
| US | [](https://bingx.com/invite/OHETOM) | bingx | [BingX](https://bingx.com/invite/OHETOM) | [](https://bingx-api.github.io/docs/) |
| US | [](https://blofin.com/register?referral_code=f79EsS) | blofin | [BloFin](https://blofin.com/register?referral_code=f79EsS) | [](https://blofin.com/docs) |
| US | [](https://www.coinbase.com/join/58cbe25a355148797479dbd2) | coinbase | [Coinbase Advanced](https://www.coinbase.com/join/58cbe25a355148797479dbd2) | [](https://docs.cdp.coinbase.com/coinbase-app/introduction/welcome) |
| US | [](https://coinbase.com/) | coinbaseexchange | [Coinbase Exchange](https://coinbase.com/) | [](https://docs.cloud.coinbase.com/exchange/docs/) |
| US | [](https://international.coinbase.com) | coinbaseinternational | [Coinbase International](https://international.coinbase.com) | [](https://docs.cloud.coinbase.com/intx/docs) |
| US | [](https://dydx.trade?ref=ccxt) | dydx | [dYdX](https://dydx.trade?ref=ccxt) | [](https://docs.dydx.xyz) |
| US | [](https://gemini.com/) | gemini | [Gemini](https://gemini.com/) | [](https://docs.gemini.com/rest-api) |
| US | [](https://hibachi.xyz/r/ZBL2YFWIHU) | hibachi | [Hibachi](https://hibachi.xyz/r/ZBL2YFWIHU) |  |
| US | [](https://kalshi.com) | kalshi | [Kalshi](https://kalshi.com) | [](https://trading-api.readme.io/reference/getting-started) |
| US | [](https://www.kraken.com) | kraken | [Kraken](https://www.kraken.com) | [](https://docs.kraken.com/api-reference/) |
| US | [](https://futures.kraken.com/) | krakenfutures | [Kraken Futures](https://futures.kraken.com/) | [](https://docs.kraken.com/api/docs/futures-api/trading/market-data/) |
| US | [](https://www.my.okx.com/join/CCXT2023) | myokx | [MyOKX (EEA)](https://www.my.okx.com/join/CCXT2023) | [](https://my.okx.com/docs-v5/en/#overview) |
| US | [](https://www.okx.com/join/CCXTCOM) | okx | [OKX](https://www.okx.com/join/CCXTCOM) | [](https://www.okx.com/docs-v5/en/) |
| US | [](https://www.app.okx.com/join/CCXT2023) | okxus | [OKX (US)](https://www.app.okx.com/join/CCXT2023) | [](https://app.okx.com/docs-v5/en/#overview) |
| US | [](https://poloniex.com/signup?c=UBFZJRPJ) | poloniex | [Poloniex](https://poloniex.com/signup?c=UBFZJRPJ) | [](https://api-docs.poloniex.com/spot/) |
| US | [](https://polymarket.com) | polymarket | [Polymarket](https://polymarket.com) | [](https://docs.polymarket.com) |
# Supported Exchanges (/docs/exchange-markets)
# Supported Exchanges [#supported-exchanges]
CCXT supports **104 cryptocurrency** exchanges and **7 prediction-market** exchanges. Search, filter by type, and sort any column.
```exchanges-table
[{"id":"alpaca","name":"Alpaca","site":"https://alpaca.markets","logo":"https://github.com/user-attachments/assets/e9476df8-a450-4c3e-ab9a-1a7794219e1b","version":"*","doclink":"https://alpaca.markets/docs/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/alpaca"},{"id":"apex","name":"Apex","site":"https://omni.apex.exchange/trade","logo":"https://github.com/user-attachments/assets/8ba7fbfa-0dd0-4ab9-8b72-ff60abe08ac6","version":"3","doclink":"https://api-docs.omni.apex.exchange","type":"DEX","certified":false,"pro":true,"docs":"/docs/exchanges/apex"},{"id":"aster","name":"Aster","site":"https://www.asterdex.com/en/referral/aA1c2B","logo":"https://github.com/user-attachments/assets/5e5909d6-c4de-4435-992f-4339c80edbd7","version":"1","doclink":"https://github.com/asterdex/api-docs","type":"DEX","certified":false,"pro":true,"docs":"/docs/exchanges/aster"},{"id":"backpack","name":"Backpack","site":"https://backpack.exchange/join/ccxt","logo":"https://github.com/user-attachments/assets/7f682234-3eb1-48ab-a5ec-250a3227c985","version":"1","doclink":"https://docs.backpack.exchange/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/backpack"},{"id":"bequant","name":"Bequant","site":"https://bequant.io/referral/dd104e3bee7634ec","logo":"https://github.com/user-attachments/assets/01e199a6-5c65-4b03-83ab-7f9827c140f9","version":"3","doclink":"https://api.bequant.io/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/bequant"},{"id":"bigone","name":"BigONE","site":"https://b1.run/users/new?code=D3LLBVFT","logo":"https://github.com/user-attachments/assets/4e5cfd53-98cc-4b90-92cd-0d7b512653d1","version":"3","doclink":"https://open.big.one/docs/api.html","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/bigone"},{"id":"binance","name":"Binance","site":"https://accounts.binance.com/register?ref=CCXTCOM","logo":"https://github.com/user-attachments/assets/e9419b93-ccb0-46aa-9bff-c883f096274b","version":"*","doclink":"https://developers.binance.com/en","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/binance"},{"id":"binancecoinm","name":"Binance COIN-M","site":"https://accounts.binance.com/register?ref=CCXTCOM","logo":"https://github.com/user-attachments/assets/387cfc4e-5f33-48cd-8f5c-cd4854dabf0c","version":"*","doclink":"https://binance-docs.github.io/apidocs/delivery/en/","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/binancecoinm"},{"id":"binanceus","name":"Binance US","site":"https://www.binance.us/?ref=35005074","logo":"https://github.com/user-attachments/assets/a9667919-b632-4d52-a832-df89f8a35e8c","version":"*","doclink":"https://github.com/binance-us/binance-official-api-docs","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/binanceus"},{"id":"binanceusdm","name":"Binance USDⓈ-M","site":"https://accounts.binance.com/register?ref=CCXTCOM","logo":"https://github.com/user-attachments/assets/871cbea7-eebb-4b28-b260-c1c91df0487a","version":"*","doclink":"https://binance-docs.github.io/apidocs/futures/en/","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/binanceusdm"},{"id":"bingx","name":"BingX","site":"https://bingx.com/invite/OHETOM","logo":"https://github-production-user-asset-6210df.s3.amazonaws.com/1294454/253675376-6983b72e-4999-4549-b177-33b374c195e3.jpg","version":"1","doclink":"https://bingx-api.github.io/docs/","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/bingx"},{"id":"bit2c","name":"Bit2C","site":"https://bit2c.co.il/Aff/63bfed10-e359-420c-ab5a-ad368dab0baf","logo":"https://github.com/user-attachments/assets/db0bce50-6842-4c09-a1d5-0c87d22118aa","version":"*","doclink":"https://www.bit2c.co.il/home/api","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/bit2c"},{"id":"bitbank","name":"bitbank","site":"https://bitbank.cc/","logo":"https://github.com/user-attachments/assets/9d616de0-8a88-4468-8e38-d269acab0348","version":"1","doclink":"https://docs.bitbank.cc/","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/bitbank"},{"id":"bitbns","name":"Bitbns","site":"https://ref.bitbns.com/1090961","logo":"https://github.com/user-attachments/assets/a5b9a562-cdd8-4bea-9fa7-fd24c1dad3d9","version":"2","doclink":"https://bitbns.com/trade/#/api-trading/","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/bitbns"},{"id":"bitfinex","name":"Bitfinex","site":"https://www.bitfinex.com","logo":"https://github.com/user-attachments/assets/4a8e947f-ab46-481a-a8ae-8b20e9b03178","version":"2","doclink":"https://docs.bitfinex.com/v2/docs/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/bitfinex"},{"id":"bitflyer","name":"bitFlyer","site":"https://bitflyer.com","logo":"https://github.com/user-attachments/assets/d0217747-e54d-4533-8416-0d553dca74bb","version":"1","doclink":"https://lightning.bitflyer.com/docs?lang=en","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/bitflyer"},{"id":"bitget","name":"Bitget","site":"https://www.bitget.com/expressly?languageType=0&channelCode=ccxt&vipCode=tg9j","logo":"https://github.com/user-attachments/assets/b54bb4c2-416d-4231-8968-85a77748ba45","version":"2","doclink":"https://www.bitget.com/api-doc/common/intro","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/bitget"},{"id":"bithumb","name":"Bithumb","site":"https://www.bithumb.com","logo":"https://github.com/user-attachments/assets/c9e0eefb-4777-46b9-8f09-9d7f7c4af82d","version":"*","doclink":"https://apidocs.bithumb.com","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/bithumb"},{"id":"bitmex","name":"BitMEX","site":"https://www.bitmex.com/app/register/NZTR1q","logo":"https://github.com/user-attachments/assets/3360333d-35a6-4503-bbba-92a6bc0c174f","version":"1","doclink":"https://www.bitmex.com/app/apiOverview","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/bitmex"},{"id":"bitopro","name":"BitoPro","site":"https://www.bitopro.com","logo":"https://github.com/user-attachments/assets/affc6337-b95a-44bf-aacd-04f9722364f6","version":"3","doclink":"https://github.com/bitoex/bitopro-offical-api-docs/blob/master/v3-1/rest-1/rest.md","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/bitopro"},{"id":"bitrue","name":"Bitrue","site":"https://www.bitrue.com/affiliate/landing?cn=600000&inviteCode=EZWETQE","logo":"https://github.com/user-attachments/assets/67abe346-1273-461a-bd7c-42fa32907c8e","version":"1","doclink":"https://github.com/Bitrue-exchange/bitrue-official-api-docs","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/bitrue"},{"id":"bitso","name":"Bitso","site":"https://bitso.com/?ref=itej","logo":"https://github.com/user-attachments/assets/3d0c1e5e-8aaa-419f-968a-2b7409381ce4","version":"3","doclink":"https://bitso.com/api_info","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/bitso"},{"id":"bitstamp","name":"Bitstamp","site":"https://www.bitstamp.net","logo":"https://github.com/user-attachments/assets/d5480572-1fee-43cb-b900-d38c522d0024","version":"2","doclink":"https://www.bitstamp.net/api","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/bitstamp"},{"id":"bitteam","name":"BIT.TEAM","site":"https://bit.team/auth/sign-up?ref=bitboy2023","logo":"https://github.com/user-attachments/assets/b41b5e0d-98e5-4bd3-8a6e-aeb230a4a135","version":"2.0.6","doclink":"https://bit.team/trade/api/documentation","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/bitteam"},{"id":"bittrade","name":"BitTrade","site":"https://www.bittrade.co.jp/register/?invite_code=znnq3","logo":"https://github.com/user-attachments/assets/c5996ed2-0d56-42d8-ac40-7eaf8116dbae","version":"1","doclink":"https://api-doc.bittrade.co.jp","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/bittrade"},{"id":"bitvavo","name":"Bitvavo","site":"https://bitvavo.com/?a=24F34952F7","logo":"https://github.com/user-attachments/assets/35d690b1-5710-47f6-86e9-d638ce38685a","version":"2","doclink":"https://docs.bitvavo.com/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/bitvavo"},{"id":"blockchaincom","name":"Blockchain.com","site":"https://blockchain.com","logo":"https://github.com/user-attachments/assets/975e3054-3399-4363-bcee-ec3c6d63d4e8","version":"3","doclink":"https://api.blockchain.com/v3","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/blockchaincom"},{"id":"blofin","name":"BloFin","site":"https://blofin.com/register?referral_code=f79EsS","logo":"https://github.com/user-attachments/assets/67edf117-6217-4cb8-95e7-9b03f314b1b1","version":"1","doclink":"https://blofin.com/docs","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/blofin"},{"id":"btcbox","name":"BtcBox","site":"https://www.btcbox.co.jp/","logo":"https://github.com/user-attachments/assets/1e2cb499-8d0f-4f8f-9464-3c015cfbc76b","version":"1","doclink":"https://blog.btcbox.jp/en/archives/8762","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/btcbox"},{"id":"btcmarkets","name":"BTC Markets","site":"https://btcmarkets.net","logo":"https://github.com/user-attachments/assets/8c8d6907-3873-4cc4-ad20-e22fba28247e","version":"3","doclink":"https://api.btcmarkets.net/doc/v3","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/btcmarkets"},{"id":"btcturk","name":"BTCTurk","site":"https://www.btcturk.com","logo":"https://github.com/user-attachments/assets/710711ff-1278-4e7a-9b03-b5503dd85b59","version":"*","doclink":"https://github.com/BTCTrader/broker-api-docs","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/btcturk"},{"id":"btse","name":"BTSE","site":"https://www.btse.com/referral/o2tjIXx5","logo":"https://github.com/user-attachments/assets/879ce771-6db1-4d8f-868a-77c9621635dc","version":"3","doclink":"https://support.btse.com/en/support/solutions/articles/43000044751-btse-api","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/btse"},{"id":"bullish","name":"Bullish","site":"https://bullish.com/","logo":"https://github.com/user-attachments/assets/68f0686b-84f0-4da9-a751-f7089af3a9ed","version":"3","doclink":"https://api.exchange.bullish.com/docs/api/rest/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/bullish"},{"id":"bybit","name":"Bybit","site":"https://www.bybit.com/invite?ref=XDK12WP","logo":"https://github.com/user-attachments/assets/97a5d0b3-de10-423d-90e1-6620960025ed","version":"5","doclink":"https://bybit-exchange.github.io/docs/inverse/","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/bybit"},{"id":"bybiteu","name":"Bybit EU","site":"https://www.bybit.com/invite?ref=XDK12WP","logo":"https://github.com/user-attachments/assets/97a5d0b3-de10-423d-90e1-6620960025ed","version":"5","doclink":"https://bybit-exchange.github.io/docs/inverse/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/bybiteu"},{"id":"bydfi","name":"BYDFi","site":"https://partner.bydfi.com/j/DilWutCI","logo":"https://github.com/user-attachments/assets/0e9319dc-b5f5-458b-bcfd-b21b50e162ea","version":"1","doclink":"https://developers.bydfi.com/en/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/bydfi"},{"id":"cex","name":"CEX.IO","site":"https://cex.io/r/0/up105393824/0/","logo":"https://github.com/user-attachments/assets/6105a195-3bae-4a08-a1bd-b2a86e3e8f99","version":"*","doclink":"https://trade.cex.io/docs/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/cex"},{"id":"coinbase","name":"Coinbase Advanced","site":"https://www.coinbase.com/join/58cbe25a355148797479dbd2","logo":"https://user-images.githubusercontent.com/1294454/40811661-b6eceae2-653a-11e8-829e-10bfadb078cf.jpg","version":"2","doclink":"https://docs.cdp.coinbase.com/coinbase-app/introduction/welcome","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/coinbase"},{"id":"coinbaseexchange","name":"Coinbase Exchange","site":"https://coinbase.com/","logo":"https://github.com/user-attachments/assets/a99ef849-a4b2-4dd4-87fe-458ef17db7fd","version":"*","doclink":"https://docs.cloud.coinbase.com/exchange/docs/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/coinbaseexchange"},{"id":"coinbaseinternational","name":"Coinbase International","site":"https://international.coinbase.com","logo":"https://github.com/ccxt/ccxt/assets/43336371/866ae638-6ab5-4ebf-ab2c-cdcce9545625","version":"1","doclink":"https://docs.cloud.coinbase.com/intx/docs","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/coinbaseinternational"},{"id":"coincheck","name":"Coincheck","site":"https://coincheck.com","logo":"https://user-images.githubusercontent.com/51840849/87182088-1d6d6380-c2ec-11ea-9c64-8ab9f9b289f5.jpg","version":"*","doclink":"https://coincheck.com/documents/exchange/api","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/coincheck"},{"id":"coinex","name":"CoinEx","site":"https://www.coinex.com/register?refer_code=yw5fz","logo":"https://user-images.githubusercontent.com/51840849/87182089-1e05fa00-c2ec-11ea-8da9-cc73b45abbbc.jpg","version":"2","doclink":"https://docs.coinex.com/api/v2","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/coinex"},{"id":"coinmate","name":"CoinMate","site":"https://coinmate.io?referral=YTFkM1RsOWFObVpmY1ZjMGREQmpTRnBsWjJJNVp3PT0","logo":"https://user-images.githubusercontent.com/51840849/87460806-1c9f3f00-c616-11ea-8c46-a77018a8f3f4.jpg","version":"*","doclink":"https://coinmate.docs.apiary.io","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/coinmate"},{"id":"coinone","name":"CoinOne","site":"https://coinone.co.kr","logo":"https://user-images.githubusercontent.com/1294454/38003300-adc12fba-323f-11e8-8525-725f53c4a659.jpg","version":"2","doclink":"https://doc.coinone.co.kr","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/coinone"},{"id":"coinsph","name":"Coins.ph","site":"https://www.coins.ph/en-ph/register?invite_code=1371062463303277512&broker=9001","logo":"https://user-images.githubusercontent.com/1294454/225719995-48ab2026-4ddb-496c-9da7-0d7566617c9b.jpg","version":"1","doclink":"https://coins-docs.github.io/rest-api","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/coinsph"},{"id":"coinspot","name":"CoinSpot","site":"https://www.coinspot.com.au/register?code=PJURCU","logo":"https://user-images.githubusercontent.com/1294454/28208429-3cacdf9a-6896-11e7-854e-4c79a772a30f.jpg","version":"*","doclink":"https://www.coinspot.com.au/api","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/coinspot"},{"id":"cryptocom","name":"Crypto.com","site":"https://crypto.com/exch/kdacthrnxt","logo":"https://user-images.githubusercontent.com/1294454/147792121-38ed5e36-c229-48d6-b49a-48d05fc19ed4.jpeg","version":"2","doclink":"https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/cryptocom"},{"id":"cryptomus","name":"Cryptomus","site":"https://app.cryptomus.com/signup/?ref=JRP4yj","logo":"https://github.com/user-attachments/assets/cce42038-d22e-49bc-8a9a-b9c92a2859a0","version":"2","doclink":"https://doc.cryptomus.com/personal","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/cryptomus"},{"id":"deepcoin","name":"DeepCoin","site":"https://s.deepcoin.com/UzkyODgy","logo":"https://github.com/user-attachments/assets/ddf3e178-c3b6-409d-8f9f-af8b7cf80454","version":"1","doclink":"https://www.deepcoin.com/docs","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/deepcoin"},{"id":"delta","name":"Delta Exchange","site":"https://www.delta.exchange/app/signup/?code=IULYNB","logo":"https://user-images.githubusercontent.com/1294454/99450025-3be60a00-2931-11eb-9302-f4fd8d8589aa.jpg","version":"2","doclink":"https://docs.delta.exchange","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/delta"},{"id":"deribit","name":"Deribit","site":"https://www.deribit.com/reg-1189.4038","logo":"https://user-images.githubusercontent.com/1294454/41933112-9e2dd65a-798b-11e8-8440-5bab2959fcb8.jpg","version":"2","doclink":"https://docs.deribit.com/v2","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/deribit"},{"id":"derive","name":"Derive","site":"https://www.derive.xyz/invite/3VB0B","logo":"https://github.com/user-attachments/assets/9e640700-c870-41f9-8907-fba58e120fed","version":"1","doclink":"https://docs.derive.xyz/docs/","type":"DEX","certified":false,"pro":true,"docs":"/docs/exchanges/derive"},{"id":"digifinex","name":"DigiFinex","site":"https://www.digifinex.com/en-ww/from/DhOzBg?channelCode=ljaUPp","logo":"https://user-images.githubusercontent.com/51840849/87443315-01283a00-c5fe-11ea-8628-c2a0feaf07ac.jpg","version":"3","doclink":"https://docs.digifinex.com","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/digifinex"},{"id":"dydx","name":"dYdX","site":"https://dydx.trade?ref=ccxt","logo":"https://github.com/user-attachments/assets/def0a54a-020a-4286-ba95-0f84e50a944d","version":"4","doclink":"https://docs.dydx.xyz","type":"DEX","certified":false,"pro":true,"docs":"/docs/exchanges/dydx"},{"id":"extended","name":"Extended","site":"https://app.extended.exchange","logo":"https://github.com/user-attachments/assets/e2fe2bdf-6b28-4af8-b30f-38db496dc079","version":"2","doclink":"https://api.docs.extended.exchange","type":"DEX","certified":false,"pro":true,"docs":"/docs/exchanges/extended"},{"id":"fmfwio","name":"FMFW.io","site":"https://fmfw.io/referral/da948b21d6c92d69","logo":"https://user-images.githubusercontent.com/1294454/159177712-b685b40c-5269-4cea-ac83-f7894c49525d.jpg","version":"3","doclink":"https://api.fmfw.io/","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/fmfwio"},{"id":"foxbit","name":"Foxbit","site":"https://app.foxbit.com.br","logo":"https://github.com/user-attachments/assets/1f8faca2-ae2f-4222-b33e-5671e7d873dd","version":"1","doclink":"https://docs.foxbit.com.br","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/foxbit"},{"id":"gate","name":"Gate","site":"https://www.gate.com/share/CCXTGATE","logo":"https://github.com/user-attachments/assets/b4fd9d41-eaed-46fe-8a7b-b2677edface0","version":"4","doclink":"https://www.gate.com/docs/developers/apiv4/en","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/gate"},{"id":"gateeu","name":"Gate EU","site":"https://www.gate.com/share/CCXTGATE","logo":"https://github.com/user-attachments/assets/b4fd9d41-eaed-46fe-8a7b-b2677edface0","version":"4","doclink":"https://www.gate.com/docs/developers/apiv4/en","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/gateeu"},{"id":"gemini","name":"Gemini","site":"https://gemini.com/","logo":"https://user-images.githubusercontent.com/1294454/27816857-ce7be644-6096-11e7-82d6-3c257263229c.jpg","version":"1","doclink":"https://docs.gemini.com/rest-api","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/gemini"},{"id":"grvt","name":"GRVT","site":"https://grvt.io/?ref=WBLS9D1","logo":"https://github.com/user-attachments/assets/cff0d37c-e594-40cb-88b3-90650ddadc18","version":"1","doclink":"https://api-docs.grvt.io/","type":"DEX","certified":false,"pro":true,"docs":"/docs/exchanges/grvt"},{"id":"hashkey","name":"HashKey Global","site":"https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN","logo":"https://github.com/user-attachments/assets/3dd65db2-5da9-4ecc-93ac-6d420f36261c","version":"1","doclink":"https://hashkeyglobal-apidoc.readme.io/","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/hashkey"},{"id":"hibachi","name":"Hibachi","site":"https://hibachi.xyz/r/ZBL2YFWIHU","logo":"https://github.com/user-attachments/assets/f267bf5b-5c6c-45e2-9ce4-fb0af8a9d9ab","version":"*","doclink":"undefined","type":"DEX","certified":false,"pro":false,"docs":"/docs/exchanges/hibachi"},{"id":"hitbtc","name":"HitBTC","site":"https://hitbtc.com/?ref_id=5a5d39a65d466","logo":"https://user-images.githubusercontent.com/1294454/27766555-8eaec20e-5edc-11e7-9c5b-6dc69fc42f5e.jpg","version":"3","doclink":"https://api.hitbtc.com","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/hitbtc"},{"id":"hollaex","name":"HollaEx","site":"https://pro.hollaex.com/signup?affiliation_code=QSWA6G","logo":"https://user-images.githubusercontent.com/1294454/75841031-ca375180-5ddd-11ea-8417-b975674c23cb.jpg","version":"2","doclink":"https://apidocs.hollaex.com","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/hollaex"},{"id":"htx","name":"HTX","site":"https://www.htx.com/invite/en-us/1h?invite_code=6rmm2223","logo":"https://user-images.githubusercontent.com/1294454/76137448-22748a80-604e-11ea-8069-6e389271911d.jpg","version":"1","doclink":"https://huobiapi.github.io/docs/spot/v1/en/","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/htx"},{"id":"hyperliquid","name":"Hyperliquid","site":"https://app.hyperliquid.xyz/","logo":"https://github.com/user-attachments/assets/550769b3-d270-461e-9e02-8e8b8c0210b8","version":"1","doclink":"https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api","type":"DEX","certified":true,"pro":true,"docs":"/docs/exchanges/hyperliquid"},{"id":"independentreserve","name":"Independent Reserve","site":"https://www.independentreserve.com","logo":"https://user-images.githubusercontent.com/51840849/87182090-1e9e9080-c2ec-11ea-8e49-563db9a38f37.jpg","version":"*","doclink":"https://www.independentreserve.com/API","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/independentreserve"},{"id":"indodax","name":"INDODAX","site":"https://indodax.com/ref/testbitcoincoid/1","logo":"https://user-images.githubusercontent.com/51840849/87070508-9358c880-c221-11ea-8dc5-5391afbbb422.jpg","version":"2.0","doclink":"https://github.com/btcid/indodax-official-api-docs","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/indodax"},{"id":"kraken","name":"Kraken","site":"https://www.kraken.com","logo":"https://user-images.githubusercontent.com/51840849/76173629-fc67fb00-61b1-11ea-84fe-f2de582f58a3.jpg","version":"0","doclink":"https://docs.kraken.com/api-reference/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/kraken"},{"id":"krakenfutures","name":"Kraken Futures","site":"https://futures.kraken.com/","logo":"https://user-images.githubusercontent.com/24300605/81436764-b22fd580-9172-11ea-9703-742783e6376d.jpg","version":"3","doclink":"https://docs.kraken.com/api/docs/futures-api/trading/market-data/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/krakenfutures"},{"id":"kucoin","name":"KuCoin","site":"https://www.kucoin.com/ucenter/signup?rcode=E5wkqe","logo":"https://user-images.githubusercontent.com/51840849/87295558-132aaf80-c50e-11ea-9801-a2fb0c57c799.jpg","version":"2","doclink":"https://docs.kucoin.com","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/kucoin"},{"id":"kucoinfutures","name":"KuCoin Futures","site":"https://futures.kucoin.com/?rcode=E5wkqe","logo":"https://user-images.githubusercontent.com/1294454/147508995-9e35030a-d046-43a1-a006-6fabd981b554.jpg","version":"2","doclink":"https://docs.kucoin.com","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/kucoinfutures"},{"id":"latoken","name":"Latoken","site":"https://latoken.com/invite?r=mvgp2djk","logo":"https://user-images.githubusercontent.com/1294454/61511972-24c39f00-aa01-11e9-9f7c-471f1d6e5214.jpg","version":"2","doclink":"https://api.latoken.com","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/latoken"},{"id":"lbank","name":"LBank","site":"https://www.lbank.com/login/?icode=7QCY","logo":"https://user-images.githubusercontent.com/1294454/38063602-9605e28a-3302-11e8-81be-64b1e53c4cfb.jpg","version":"2","doclink":"https://www.lbank.com/en-US/docs/index.html","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/lbank"},{"id":"lighter","name":"Lighter","site":"https://app.lighter.xyz/?referral=715955W9","logo":"https://github.com/user-attachments/assets/5aa1158d-0734-49fc-9155-501d94b76a0b","version":"1","doclink":"https://apidocs.lighter.xyz/","type":"DEX","certified":false,"pro":true,"docs":"/docs/exchanges/lighter"},{"id":"luno","name":"Luno","site":"https://www.luno.com/invite/44893A","logo":"https://user-images.githubusercontent.com/1294454/27766607-8c1a69d8-5ede-11e7-930c-540b5eb9be24.jpg","version":"1","doclink":"https://www.luno.com/en/developers/api","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/luno"},{"id":"mercado","name":"Mercado Bitcoin","site":"https://www.mercadobitcoin.com.br","logo":"https://user-images.githubusercontent.com/1294454/27837060-e7c58714-60ea-11e7-9192-f05e86adb83f.jpg","version":"3","doclink":"https://www.mercadobitcoin.com.br/api-doc","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/mercado"},{"id":"mexc","name":"MEXC Global","site":"https://www.mexc.com/register?inviteCode=mexc-1FQ1GNu1","logo":"https://user-images.githubusercontent.com/1294454/137283979-8b2a818d-8633-461b-bfca-de89e8c446b2.jpg","version":"3","doclink":"https://www.mexc.com/api-docs/spot-v3/introduction","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/mexc"},{"id":"modetrade","name":"Mode Trade","site":"https://trade.mode.network?ref=MODETRADE","logo":"https://github.com/user-attachments/assets/bbde7d00-6e40-404f-8f34-8fb15893eb24","version":"1","doclink":"https://orderly.network/docs/build-on-omnichain/building-on-omnichain","type":"DEX","certified":false,"pro":true,"docs":"/docs/exchanges/modetrade"},{"id":"mudrex","name":"Mudrex","site":"https://mudrex.com","logo":"https://github.com/user-attachments/assets/72368864-84ed-43eb-8c75-d4fb77023b42","version":"1","doclink":"https://docs.trade.mudrex.com/docs","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/mudrex"},{"id":"myokx","name":"MyOKX (EEA)","site":"https://www.my.okx.com/join/CCXT2023","logo":"https://user-images.githubusercontent.com/1294454/152485636-38b19e4a-bece-4dec-979a-5982859ffc04.jpg","version":"5","doclink":"https://my.okx.com/docs-v5/en/#overview","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/myokx"},{"id":"nado","name":"Nado","site":"https://nado.xyz","logo":"https://github.com/user-attachments/assets/811f4e1a-a8b5-4b9e-84c2-0f88997bd274","version":"1","doclink":"https://docs.nado.xyz/","type":"DEX","certified":false,"pro":true,"docs":"/docs/exchanges/nado"},{"id":"ndax","name":"NDAX","site":"https://one.ndax.io/bfQiSL","logo":"https://user-images.githubusercontent.com/1294454/108623144-67a3ef00-744e-11eb-8140-75c6b851e945.jpg","version":"*","doclink":"https://apidoc.ndax.io/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/ndax"},{"id":"okx","name":"OKX","site":"https://www.okx.com/join/CCXTCOM","logo":"https://user-images.githubusercontent.com/1294454/152485636-38b19e4a-bece-4dec-979a-5982859ffc04.jpg","version":"5","doclink":"https://www.okx.com/docs-v5/en/","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/okx"},{"id":"okxus","name":"OKX (US)","site":"https://www.app.okx.com/join/CCXT2023","logo":"https://user-images.githubusercontent.com/1294454/152485636-38b19e4a-bece-4dec-979a-5982859ffc04.jpg","version":"5","doclink":"https://app.okx.com/docs-v5/en/#overview","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/okxus"},{"id":"onetrading","name":"One Trading","site":"https://onetrading.com/","logo":"https://github.com/user-attachments/assets/341a1b01-7660-402a-9a2b-876391e52f15","version":"1","doclink":"https://docs.onetrading.com","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/onetrading"},{"id":"p2b","name":"p2b","site":"https://p2pb2b.com?referral=ee784c53","logo":"https://github.com/user-attachments/assets/122f0c86-f3a6-4334-910f-4d8edc865696","version":"2","doclink":"https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/p2b"},{"id":"pacifica","name":"Pacifica","site":"https://app.pacifica.fi?referral=ccxt","logo":"https://github.com/user-attachments/assets/03ed021f-cdec-43c8-acb4-941f1282f610","version":"1","doclink":"https://docs.pacifica.fi/api-documentation/api/rest-api","type":"DEX","certified":false,"pro":true,"docs":"/docs/exchanges/pacifica"},{"id":"paradex","name":"Paradex","site":"https://app.paradex.trade/r/ccxt24","logo":"https://github.com/user-attachments/assets/84628770-784e-4ec4-a759-ec2fbb2244ea","version":"1","doclink":"https://docs.api.testnet.paradex.trade/","type":"DEX","certified":false,"pro":true,"docs":"/docs/exchanges/paradex"},{"id":"paymium","name":"Paymium","site":"https://www.paymium.com/page/sign-up?referral=eDAzPoRQFMvaAB8sf-qj","logo":"https://user-images.githubusercontent.com/51840849/87153930-f0f02200-c2c0-11ea-9c0a-40337375ae89.jpg","version":"1","doclink":"https://github.com/Paymium/api-documentation","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/paymium"},{"id":"phemex","name":"Phemex","site":"https://phemex.com/register?referralCode=EDNVJ","logo":"https://user-images.githubusercontent.com/1294454/85225056-221eb600-b3d7-11ea-930d-564d2690e3f6.jpg","version":"1","doclink":"https://phemex-docs.github.io/#overview","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/phemex"},{"id":"poloniex","name":"Poloniex","site":"https://poloniex.com/signup?c=UBFZJRPJ","logo":"https://user-images.githubusercontent.com/1294454/27766817-e9456312-5ee6-11e7-9b3c-b628ca5626a5.jpg","version":"*","doclink":"https://api-docs.poloniex.com/spot/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/poloniex"},{"id":"revolutx","name":"Revolut X","site":"https://exchange.revolut.com","logo":"https://github.com/user-attachments/assets/594ab1a5-3985-4f79-89f4-c40ef7c33867","version":"*","doclink":"https://developer.revolut.com/docs/api/revolut-x-crypto-exchange","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/revolutx"},{"id":"tokocrypto","name":"Tokocrypto","site":"https://tokocrypto.com","logo":"https://user-images.githubusercontent.com/1294454/183870484-d3398d0c-f6a1-4cce-91b8-d58792308716.jpg","version":"1","doclink":"https://www.tokocrypto.com/apidocs/","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/tokocrypto"},{"id":"toobit","name":"Toobit","site":"https://www.toobit.com/en-US/r?i=dvCpJj","logo":"https://github.com/user-attachments/assets/58e1b718-c6fd-49e2-8a49-797da6b9c008","version":"1","doclink":"https://api-docs.toobit.com/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/toobit"},{"id":"upbit","name":"Upbit","site":"https://upbit.com","logo":"https://user-images.githubusercontent.com/1294454/49245610-eeaabe00-f423-11e8-9cba-4b0aed794799.jpg","version":"1","doclink":"https://docs.upbit.com/kr","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/upbit"},{"id":"weex","name":"Weex","site":"https://www.weex.com/register?vipCode=qfyh","logo":"https://github.com/user-attachments/assets/bc67b9f2-75d2-4b8d-963a-18f2fcd9d13c","version":"3","doclink":"https://www.weex.com/api-doc","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/weex"},{"id":"whitebit","name":"WhiteBit","site":"https://whitebit.com/referral/d9bdf40e-28f2-4b52-b2f9-cd1415d82963","logo":"https://user-images.githubusercontent.com/1294454/66732963-8eb7dd00-ee66-11e9-849b-10d9282bb9e0.jpg","version":"4","doclink":"https://github.com/whitebit-exchange/api-docs","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/whitebit"},{"id":"woo","name":"WOO X","site":"https://woox.io/register?ref=DIJT0CNL","logo":"https://user-images.githubusercontent.com/1294454/150730761-1a00e5e0-d28c-480f-9e65-089ce3e6ef3b.jpg","version":"1","doclink":"https://developer.woox.io/","type":"CEX","certified":true,"pro":true,"docs":"/docs/exchanges/woo"},{"id":"woofipro","name":"WOOFI PRO","site":"https://dex.woo.org/en/trade?ref=CCXT","logo":"https://github.com/user-attachments/assets/9ba21b8a-a9c7-4770-b7f1-ce3bcbde68c1","version":"1","doclink":"https://orderly.network/docs/build-on-omnichain/building-on-omnichain","type":"DEX","certified":true,"pro":true,"docs":"/docs/exchanges/woofipro"},{"id":"xt","name":"XT","site":"https://www.xt.com/en/accounts/register?ref=9PTM9VW","logo":"https://github.com/user-attachments/assets/1f916564-6507-4549-af96-22837bb0a0c7","version":"4","doclink":"https://doc.xt.com/","type":"CEX","certified":false,"pro":true,"docs":"/docs/exchanges/xt"},{"id":"zaif","name":"Zaif","site":"https://zaif.jp","logo":"https://github.com/user-attachments/assets/c6c97d18-5bde-46ed-8eb1-85404d36150e","version":"1","doclink":"https://techbureau-api-document.readthedocs.io/ja/latest/index.html","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/zaif"},{"id":"zebpay","name":"Zebpay","site":"https://www.zebpay.com","logo":"https://github.com/user-attachments/assets/0e88d86a-a1cd-49df-a826-054cd8caafa6","version":"1","doclink":"https://github.com/zebpay/zebpay-api-references","type":"CEX","certified":false,"pro":false,"docs":"/docs/exchanges/zebpay"},{"id":"binance","name":"Binance","site":"https://www.binance.com/en/markets/prediction","logo":"https://github.com/user-attachments/assets/e9419b93-ccb0-46aa-9bff-c883f096274b","version":"1","doclink":"https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading","type":"Prediction","certified":false,"pro":false,"docs":"/docs/prediction/binance"},{"id":"hyperliquid","name":"Hyperliquid","site":"https://app.hyperliquid.xyz/","logo":"https://github.com/user-attachments/assets/550769b3-d270-461e-9e02-8e8b8c0210b8","version":"1","doclink":"https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api","type":"Prediction","certified":false,"pro":false,"docs":"/docs/prediction/hyperliquid"},{"id":"kalshi","name":"Kalshi","site":"https://kalshi.com","logo":"https://github.com/user-attachments/assets/74fc2acb-58d0-4db0-b316-3124e7dc24db","version":"*","doclink":"https://trading-api.readme.io/reference/getting-started","type":"Prediction","certified":false,"pro":false,"docs":"/docs/prediction/kalshi"},{"id":"limitless","name":"Limitless","site":"https://limitless.exchange","logo":"https://github.com/user-attachments/assets/bb10c8b4-7b97-49f5-927c-057709dbaf7e","version":"1","doclink":"https://docs.limitless.exchange","type":"Prediction","certified":false,"pro":false,"docs":"/docs/prediction/limitless"},{"id":"myriad","name":"Myriad","site":"https://myriad.markets","logo":"https://github.com/user-attachments/assets/a393c885-99e8-4943-897d-ebc0555c3773","version":"*","doclink":"https://docs.myriad.markets","type":"Prediction","certified":false,"pro":false,"docs":"/docs/prediction/myriad"},{"id":"opinion","name":"Opinion","site":"https://opinion.trade","logo":"https://github.com/user-attachments/assets/9905d9d4-3eb3-48d2-bdb3-551a9ddc7559","version":"1","doclink":"https://docs.opinion.trade","type":"Prediction","certified":false,"pro":false,"docs":"/docs/prediction/opinion"},{"id":"polymarket","name":"Polymarket","site":"https://polymarket.com","logo":"https://github.com/user-attachments/assets/89e1a2c4-a682-44e7-ad50-9fb15b534437","version":"1","doclink":"https://docs.polymarket.com","type":"Prediction","certified":false,"pro":false,"docs":"/docs/prediction/polymarket"}]
```
# FAQ (/docs/faq)
# Frequently Asked Questions [#frequently-asked-questions]
## I'm trying to run the code, but it's not working, how do I fix it? [#im-trying-to-run-the-code-but-its-not-working-how-do-i-fix-it]
If your question is formulated in a short manner like the above, we won't help. We don't teach programming. If you're unable to read and understand the [Manual](/docs) or you can't follow precisely the guides from the [CONTRIBUTING](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md) doc on how to report an issue, we won't help either. Read the CONTRIBUTING guides on how to report an issue and read the Manual. You should not risk anyone's money and time without reading the entire Manual very carefully. You should not risk anything if you're not used to a lot of reading with tons of details. Also, if you don't have the confidence with the programming language you're using, there are much better places for coding fundamentals and practice. Search for `python tutorials`, `js videos`, play with examples, this is how other people climb up the learning curve. No shortcuts, if you want to learn something.
## What is required to get help? [#what-is-required-to-get-help]
When asking a question:
* Use the search button for duplicates first!
* **Post your request and response in `verbose` mode!** Add `exchange.verbose = true` right before the line you're having issues with, and copypaste what you see on your screen. It's written and mentioned everywhere, in the [Troubleshooting](/docs/manual#troubleshooting) section, in the [README](https://github.com/ccxt/ccxt/blob/master/README.md) and in many answers to similar questions among [previous issues](https://github.com/ccxt/ccxt/issues) and [pull requests](https://github.com/ccxt/ccxt/pulls). No excuses. The verbose output should include both the request and response from the exchange.
* Include the full error callstack!
* Write your programming language **and language version number**
* Write the CCXT / CCXT Pro library version number
* Which exchange it is
* Which method you're trying to call
* **Post your code** to reproduce the problem. Make it a complete short runnable program, don't swallow the lines and make it as compact as you can (5-10 lines of code), including the exchange instantation code. Remove all irrelevant parts from it, leaving just the essence of the code to reproduce the issue.
* **DON'T POST SCREENSHOTS OF CODE OR ERRORS, POST THE OUTPUT AND CODE IN PLAIN TEXT!**
* **Surround code and output with triple backticks: \`\`\`GOOD\`\`\`**.
* Don't confuse the backtick symbol (\`) with the quote symbol ('): '''BAD'''
* Don't confuse a single backtick with triple backticks: \`BAD\`
* **DO NOT POST YOUR `apiKey` AND `secret`!** Keep them safe (remove them before posting)!
## I am calling a method and I get an error, what am I doing wrong? [#i-am-calling-a-method-and-i-get-an-error-what-am-i-doing-wrong]
You're not reporting the issue properly ) Please, help the community to help you ) Read this and follow the steps: [https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-submit-an-issue](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-submit-an-issue). Once again, your code to reproduce the issue and your verbose request and response **ARE REQUIRED**. *Just the error traceback, or just the response, or just the request, or just the code – is not enough!*
## I got an incorrect result from a method call, can you help? [#i-got-an-incorrect-result-from-a-method-call-can-you-help]
Basically the same answer as the previous question. Read and follow **precisely**: [https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-submit-an-issue](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-submit-an-issue). Once again, your code to reproduce the issue and your verbose request and response **ARE REQUIRED**. *Just the error traceback, or just the response, or just the request, or just the code – is not enough!*
## Can you implement feature `foo` in exchange `bar`? [#can-you-implement-feature-foo-in-exchange-bar]
Yes, we can. And we will, if nobody else does that before us. There's very little point in asking this type of questions, because the answer is always positive. When someone asks if we can do this or that, the question is not about our abilities, it all boils down to time and management needed for implementing all accumulated feature requests.
Moreover, this is an open-source library which is a work in progress. This means, that this project is intended to be developed by the community of users, who are using it. What you're asking is not whether we can or cannot implement it, in fact you're actually telling us to go do that particular task and this is not how we see a voluntary collaboration. Your contributions, PRs and commits are welcome: [https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code).
We don't give promises or estimates on the free open-source work. If you wish to speed it up, feel free to reach out to us via [info@ccxt.trade](mailto:info@ccxt.trade).
## When will you add feature `foo` for exchange `bar` ? What's the estimated time? When should we expect this? [#when-will-you-add-feature-foo-for-exchange-bar--whats-the-estimated-time-when-should-we-expect-this]
We don't give promises or estimates on the open-source work. The reasoning behind this is explained in the previous paragraph.
## When will you add the support for an exchange requested in the Issues? [#when-will-you-add-the-support-for-an-exchange-requested-in-the-issues]
Again, we can't promise on the dates for adding this or that exchange, due to reasons outlined above. The answer will always remain the same: *as soon as we can*.
## How long should I wait for a feature to be added? I need to decide whether to implement it myself or to wait for the CCXT Dev Team to implement it for me. [#how-long-should-i-wait-for-a-feature-to-be-added-i-need-to-decide-whether-to-implement-it-myself-or-to-wait-for-the-ccxt-dev-team-to-implement-it-for-me]
Please, go for implemeting it yourself, do not wait for us. We will add it as soon as we can. Also, your contributions are very welcome:
* [https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code)
## What's your progress on adding the feature `foo` that was requested earlier? How do you do implementing exchange `bar`? [#whats-your-progress-on-adding-the-feature-foo-that-was-requested-earlier-how-do-you-do-implementing-exchange-bar]
This type of questions is usually a waste of time, because answering it usually requires too much time for context-switching, and it often takes more time to answer this question, than to actually satisfy the request with code for a new feature or a new exchange. The progress of this open-source project is also open, so, whenever you're wondering how it is doing, take a look into commit history.
## What is the status of this PR? Any update? [#what-is-the-status-of-this-pr-any-update]
If it is not merged, it means that the PR contains errors, that should be fixed first. If it could be merged as is – we would merge it, and you wouldn't have asked this question in the first place. The most frequent reason for not merging a PR is a violation of any of the [CONTRIBUTING guidelines](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#derived-exchange-classes). Those guidelines should be taken literally, cannot skip a single line or word from there if you want your PR to be merged quickly. Code contributions that do not break the guidelines get merged almost immediately (usually, within hours).
## Can you point out the errors or what should I edit in my PR to get it merged into master branch? [#can-you-point-out-the-errors-or-what-should-i-edit-in-my-pr-to-get-it-merged-into-master-branch]
Unfortunately, we don't always have the time to quickly list out each and every single error in the code that prevents it from merging. It is often easier and faster to just go and fix the error rather than explain what one should do to fix it. Most of them are already outlined in the [CONTRIBUTING guidelines](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#derived-exchange-classes). The main rule of thumb is to follow **all guidelines literally**.
## Hey! The fix you've uploaded is in TypeScript, would you fix JavaScript / Python / PHP as well, please? [#hey-the-fix-youve-uploaded-is-in-typescript-would-you-fix-javascript--python--php-as-well-please]
Our build system generates exchange-specific JavaScript, Python, PHP, C#, Go, Java and Rust code for us automatically, so it is transpiled from TypeScript, and there's no need to fix all languages separately one by one.
Thus, if it is fixed in TypeScript, it is fixed in JavaScript NPM, Python pip, PHP Composer, C# NuGet, Go, Java and Rust (crates.io) as well. The automatic build usually takes 15-20 minutes. Just upgrade your version with `npm`, `pip` or `composer` **after the new version arrives** and you'll be fine.
More about it here:
* [https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#multilanguage-support](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#multilanguage-support)
* [https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#transpiled-generated-files](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#transpiled-generated-files)
## How to create an order with takeProfit+stopLoss? [#how-to-create-an-order-with-takeprofitstoploss]
Some exchanges support `createOrder` with the additional "attached" `stopLoss` & `takeProfit` sub-orders - view [StopLoss And TakeProfit Orders Attached To A Position](/docs/manual#stoploss-and-takeprofit-orders-attached-to-a-position).
However, some exchanges might not support that feature and you will need to run separate `createOrder` methods to add conditional order (e.g. \***trigger order | stoploss order | takeprofit order**) to the already open position - view [Conditional orders](/docs/manual#conditional-orders).
You can also check them by looking at `exchange.has['createOrderWithTakeProfitAndStopLoss']`, `exchange.has['createStopLossOrder']` and `exchange.has['createTakeProfitOrder']`, however they are not as precise as `.features` property.
## What is the difference between `takeProfit/stopLoss` and `takeProfitPrice/stopLossPrice` orders [#what-is-the-difference-between-takeprofitstoploss-and-takeprofitpricestoplossprice-orders]
At CCXT, we distinguish between several types of takeProfit/stopLoss orders. If you want to place an order that opens a position and simultaneously attaches a take-profit or stop-loss order within the same request (provided the exchange supports this feature), you should use the `takeProfit/stopLoss` syntax.
We refer to these attached TP/SL orders **type 3**.
Example:
```python
params = {
'stopLoss': {
'triggerPrice': 12.34, # at what price it will trigger
'price': 12.00, # if exchange supports, 'price' param would be limit price (for market orders, don't include this param)
},
'takeProfit': {
# similar params here
}
}
order = exchange.create_order ('SOL/USDT', 'limit', 'buy', 0.5, 13, params)
```
If the exchange does not support these attached orders, or you want to place an independent order that will act as a stop Loss/take profit order then you can place a `stopLossPrice` **or** `takeProfitPrice` order, we call these independent sl/tp orders **type 2**.
Example
```python
symbol = 'ADA/USDT:USDT'
main_order = await binance.create_order(symbol, 'market', 'buy', 50) # open position
tp_order = await binance.create_order(symbol, 'limit', 'sell', 50, 1.5, {"takeProfitPrice": 1.6}) # take profit order
sl_order = await binance.create_order(symbol, 'limit', 'sell', 50, 0.24, {"stopLossPrice": 0.25}) # stop loss order
```
## How do trailing orders work? [#how-do-trailing-orders-work]
Some exchanges support using `createOrder` to create a `trailingPercent` or `trailingAmount` order - view: [Trailing Orders](/docs/manual#trailing-orders)
Trailing orders follow behind the current market price by either a percentange or a quote amount. The order trails in one direction but not the other so that it can eventually be executed. The executed order can be a market order or a limit order. A trailing order can usually be placed to open a position, or combined with the `reduceOnly` parameter set to true in order to close a position. These details about what orders are allowed depends on the exchange. Trailing orders often support a `trailingTriggerPrice` parameter and if the current market price crosses that value it will start the trailing function set by `trailingPercent` or `trailingAmount`.
Some exchanges might not support this trailing feature. You can check the `.features` property. You can also check if `createOrder` on the exchange you're using has `trailingPercent` or `trailingAmount` as an available parameter in the docstring. Some exchanges might have `exchange.has['createTrailingPercentOrder']`, or `exchange.has['createTrailingAmountOrder']` set to true, which signals that the `trailingPercent` or `trailingAmount` parameters are available in `createOrder`.
Examples of creating `trailingPercent` and `trailingAmount` orders:
```python
params = {
'trailingPercent': 1.0, # percentage away from the current market price, 1.0 means 1%
# 'trailingAmount': 100.0, # quote amount away from the current market price, for a SOL/USDT pair this is 100 USDT away from the current market price.
# 'trailingTriggerPrice': 44500.0, # the price to trigger activating a trailing stop order
'reduceOnly': True, # set to true if you want to close a position, set to false if you want to open a new position
}
order = exchange.create_order ('SOL/USDT:USDT', 'market', 'sell', 0.5, None, params)
```
```python
trailingAmount = 100.0
trailingTriggerPrice = 115.0
params = {
'reduceOnly': True,
}
order = exchange.create_trailing_amount_order ('SOL/USDT:USDT', 'market', 'sell', 0.5, None, trailingAmount, trailingTriggerPrice, params)
```
```python
trailingPercent = 1.0
trailingTriggerPrice = 115.0
params = {
'reduceOnly': False,
}
order = exchange.create_trailing_percent_order ('SOL/USDT:USDT', 'limit', 'buy', 0.5, 13, trailingPercent, trailingTriggerPrice, params)
```
## How to create a spot market buy with cost? [#how-to-create-a-spot-market-buy-with-cost]
To create a market-buy order with cost, first, you need to check if the exchange supports that feature (`exchange.has['createMarketBuyOrderWithCost']).
If it does, then you can use the `createMarketBuyOrderWithCost\` method.
Example:
```python
order = await exchange.createMarketBuyOrderWithCost(symbol, cost)
```
## What does the `createMarketBuyRequiresPrice` option mean? [#what-does-the-createmarketbuyrequiresprice-option-mean]
Many exchanges require the amount to be in the quote currency (they don't accept the base amount) when placing spot-market buy orders. In those cases, the exchange will have the option `createMarketBuyRequiresPrice` set to `true`.
Example: If you wanted to buy BTC/USDT with a market buy-order, you would need to provide an amount = 5 USDT instead of 0.000X. We have a check to prevent errors that explicitly require the price because users will usually provide the amount in the base currency.
So by default, if you do, `create_order(symbol, 'market,' 'buy,' 10)` will throw an error if the exchange has that option (`createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false...`).
If the exchange requires the cost and the user provided the base amount, we need to request an extra parameter **price** and multiply them to get the cost. If you're aware of this behavior, you can simply disable `createMarketBuyOrderRequiresPrice` and pass the cost in the amount parameter, but disabling it does not mean you can place the order using the base amount instead of the quote.
If you do `create_order(symbol, 'market', 'buy', 0.001, 20000)` ccxt will use the required price to calculate the cost by doing `0.01*20000` and send that value to the exchange.
If you want to provide the cost directly in the amount argument, you can do `exchange.options['createMarketBuyOrderRequiresPrice'] = False` (you acknowledge that the amount will be the cost for market-buy) and then you can do `create_order(symbol, 'market', 'buy', 10)`
This is basically to avoid a user doing this: `create_order('SHIB/USDT', market, buy, 1000000)` and thinking he's trying to buy 1kk of shib but in reality he's buying 1kk USDT worth of SHIB. For that reason, by default ccxt always accepts the base currency in the amount parameter.
Alternatively, you can use the functions `createMarketBuyOrderWithCost`/ `createMarketSellOrderWithCost` if they are available.
See more: [Market Buys](/docs/manual#market-buys)
## What's the difference between trading spot and swap/perpetual futures? [#whats-the-difference-between-trading-spot-and-swapperpetual-futures]
Spot trading involves buying or selling a financial instrument (like a cryptocurrency) for immediate delivery. It's straightforward, involving the direct exchange of assets.
Swap trading, on the other hand, involves derivative contracts where two parties exchange financial instruments or cash flows at a set date in the future, based on the underlying asset. Swaps are often used for leverage, speculation, or hedging and do not necessarily involve the exchange of the underlying asset until the contract expires.
Besides that, you will be handling contracts if you're trading swaps and not the base currency (e.g., BTC) directly, so if you create an order with `amount = 1`, the amount in BTC will vary depending on the `contractSize`. You can check the contract size by doing:
```python
await exchange.loadMarkets()
symbol = 'XRP/USDT:USDT'
market = exchange.market(symbol)
print(market['contractSize'])
```
## Why am I getting an error that says "must be greater than minimum amount precision of 1"? [#why-am-i-getting-an-error-that-says-must-be-greater-than-minimum-amount-precision-of-1]
This is a common error that happens when creating orders for contract markets. This error happens when the exchange is expecting a natural number of contracts (1,2,3, etc) in the amount argument of createOrder.
Each contract is worth a certain amount of the base asset, determined by the contractSize. You can retrieve the contractSize from a symbols market structure like this:
```python
await exchange.loadMarkets()
symbol = 'SOL/USDT:USDT'
market = exchange.market(symbol)
print(market['contractSize'])
```
If you create an order with `amount = 1`, the amount of the base asset that is used for the order will vary depending on the symbols `contractSize`.
Below is a formula and example to find the number of `contracts` that you should use for the amount argument if you want to use 0.5 of the base asset:
```python
await exchange.loadMarkets()
symbol = 'SOL/USDT:USDT'
market = exchange.market(symbol)
# Converting a 0.5 base amount to the number of contracts:
# Formula: contracts = (base amount / contract size)
contracts = round(0.5 / market['contractSize'])
```
Here is an example of finding the base amount that will be used with an amount argument of 1 contract:
```python
await exchange.loadMarkets()
symbol = 'SOL/USDT:USDT'
market = exchange.market(symbol)
# Finding the base amount that will be used with 1 contract:
# Formula: base amount = (contracts * contract size)
contracts = 1
base_amount = (contracts * market['contractSize'])
```
## How to place a reduceOnly order? [#how-to-place-a-reduceonly-order]
A reduceOnly order is a type of order that can only reduce a position, not increase it. To place a reduceOnly order, you typically use the createOrder method with a reduceOnly parameter set to true. This ensures that the order will only execute if it decreases the size of an open position, and it will either partially fill or not fill at all if executing it would increase the position size.
JavaScript
Python
PHP
```javascript
const params = {
'reduceOnly': true, // set to true if you want to close a position, set to false if you want to open a new position
}
const order = await exchange.createOrder (symbol, type, side, amount, price, params)
```
```python
params = {
'reduceOnly': True, # set to True if you want to close a position, set to False if you want to open a new position
}
order = exchange.create_order (symbol, type, side, amount, price, params)
```
```php
$params = {
'reduceOnly': true, // set to true if you want to close a position, set to false if you want to open a new position
}
$order = $exchange->create_order ($symbol, $type, $side, $amount, $price, $params);
```
## How to check the endpoint used by the unified method? [#how-to-check-the-endpoint-used-by-the-unified-method]
To check the endpoint used by a unified method in the CCXT library, you would typically need to refer to the source code of the library for the specific exchange implementation you're interested in. The unified methods in CCXT abstract away the details of the specific endpoints they interact with, so this information is not directly exposed via the library's API. For detailed inspection, you can look at the implementation of the method for the particular exchange in the CCXT library's source code on GitHub.
See more: [Unified API](/docs/manual#unified-api)
## How to differentiate between previousFundingRate, fundingRate and nextFundingRate in the funding rate structure? [#how-to-differentiate-between-previousfundingrate-fundingrate-and-nextfundingrate-in-the-funding-rate-structure]
The funding rate structure has three different funding rate values that can be returned:
1. `previousFundingRate`refers to the most recently completed rate.
2. `fundingRate` is the upcoming rate. This value is always changing until the funding time passes and then it becomes the previousFundingRate.
3. `nextFundingRate` is only supported on a few exchanges and is the predicted funding rate after the upcoming rate. This value is two funding rates from now.
As an example, say it is 12:30. The `previousFundingRate` happened at 12:00 and we're looking to see what the upcoming funding rate will be by checking the `fundingRate` value. In this example, given 4-hour intervals, the `fundingRate` will happen in the future at 4:00 and the `nextFundingRate` is the predicted rate that will happen at 8:00.
## How to use the Lighter Exchange in CCXT? [#how-to-use-the-lighter-exchange-in-ccxt]
Lighter is available as part of CCXT and it works similarly to any other CCXT exchange, but it has some particularities that might be confusing for some users but we will explain it in detail below. We just need to set some basic credentials and dependencies.
After the latest upgrade CCXT has simplified the authentication process and now using the L1 private key is enough.
### Credentials requirements [#credentials-requirements]
Lighter requires the following :
* `privateKey`: the L1 private key **mandatory**
* `accountIndex` (an integer) in `exchange.options`: — **optional** CCXT will fetch it if not available, set it if using a subAccount
* `apiKeyIndex` (an integer) in `exchange.options`: **optional** CCXT will use a default value (254)
Example
```python
lighter = ccxt.lighter({
'privateKey': 'XXXXXXX', # l1 private key
})
```
### Dependencies requirements [#dependencies-requirements]
Since the signing algorithms and structs are not supported natively in all languages CCXT is using the officially distributed binaries and interacting with them in order to do the signing process (via FFI/WASM), so depending on the language you need to provide a path for that binary.
### Python/C#/PHP users: [#pythoncphp-users]
* The binaries can be downloaded here: [https://github.com/elliottech/lighter-python/tree/8bac9f56b9d0dd0eedaeb53a00ccb4fc9d77082e/lighter/signers](https://github.com/elliottech/lighter-python/tree/8bac9f56b9d0dd0eedaeb53a00ccb4fc9d77082e/lighter/signers)
* If they don't support the os you used, you can clone and build library from their lighter-go: [https://github.com/elliottech/lighter-go/tree/25847e7e39603dbb90a0bf60b689b571116b7187](https://github.com/elliottech/lighter-go/tree/25847e7e39603dbb90a0bf60b689b571116b7187)
* The path to the binary needs to be provided as `libraryPath`
* You need to choose the binary according to your OS/architecture
```python
lighter = ccxt.lighter({
'options': {
'libraryPath': 'path/to/lighter-signer-linux-arm64.so',
}
})
```
### Javascript/Typescript users [#javascripttypescript-users]
* CCXT is using the WASM binary built from the official package and it can be downloaded here [https://github.com/ccxt/lighter-wasm](https://github.com/ccxt/lighter-wasm) or built from the source
* You also need to provide the path to `exec_wasm.js`, you can either download it from the same repo or check the path to your local file (assuming Go is installed)
```javascript
lighter = ccxt.lighter({
'options': {
'libraryPath': '/user/cjg/Git/lighter-wasm/lighter.wasm',
'wasmExecPath': '/opt/homebrew/opt/go/libexec/lib/wasm/wasm_exec.js'
}
})
```
### GO users [#go-users]
* Nothing is required, CCXT is consuming the official GO package you just need to provide the credentials
## How to use the DyDx Exchange in CCXT? [#how-to-use-the-dydx-exchange-in-ccxt]
DyDx is available as part of CCXT and it works similarly to any other CCXT exchange, but it has some particularities that might be confusing for some users but we will explain it in detail below. We just need to set some basic credentials and dependencies.
Due to current signing-related dependency requirements, the exchange is available only in Python and JavaScript. Support for additional languages will be introduced once the necessary dependencies have been ported.
## Credentials requirements [#credentials-requirements-1]
DyDx requires one of the following :
* `privateKey`: the l1 private key (hex) used on dydx, or you can set l2 mnemonic in options
* `mnemonic` in `exchange.options`: the 24 words to retrieve your l2 private key, you can find it on the web UI
Example
```python
dydx = ccxt.dydx({
'privateKey': 'XXXXXXX',
})
# or
dydx = ccxt.dydx({
'options': {
'mnemonic': 'test test ...',
}
})
```
### Dependencies requirements [#dependencies-requirements-1]
DyDx requires another dependency for python users. Before use it, you need to install pycryptodom locally.
```bash
$ pip3 install pycryptodom
```
Additionally, protobuf is also required, but it is not a direct dependency of CCXT. You will need to install it manually:
```
npm install protobufjs // javascript/typescript
pip install "protobuf==5.29.5" // python
```
### Usage [#usage]
Usage is largely consistent with other exchanges, though certain behaviors differ.
For example, while orders can be placed normally, cancelling an order on dYdX does not use the traditional orderId. Instead, dYdX requires additional fields such as:
* clientOrderId, not the orderId
* orderFlags (0 for market and non-limit GTT orders, 64 for limit GTT orders, and 32 for conditional orders), ccxt assumes 64 as default
* goodTillBlockTimeInSeconds (required for long-term and conditional orders; CCXT assumes a default of 30 days)
* subAccountId, ccxt assumes 0 as default
CCXT provides sensible defaults for the most common use cases; however, you may need to override these values (using params or options) depending on your specific requirements.
### How to use the GRVT Exchange in CCXT? [#how-to-use-the-grvt-exchange-in-ccxt]
GRVT works similarly to any other CCXT DEX and only requires the l1 private key of the wallet.
An example on how to instantiate the GRVT exchange:
```
exchange = ccxt.grvt({
'privateKey': 'XXXXXXX', // the l1 private key (hex)
})
```
Note: Users who signed up via email, their wallet is powered by Privy (GRVT's embedded wallet solution). To export the private key:
1. Go to [https://home.privy.io](https://home.privy.io)
2. Log in with the same email/Google account used to sign up on GRVT
3. From there, you can export the private key
*(If you need a help, you can visit [https://support.privy.io](https://support.privy.io))*
CCXT is also a builder on GRVT meaning that by default users will pay 1bps (0.01%) extra for using it through CCXT, however this fee is totally optional and can be disabled by providing the option `builderFee: False` in options. Howerer, your contribution is much appreciated.
```
exchange.options['builderFee'] = False
```
### How to use the Extended Exchange in CCXT? [#how-to-use-the-extended-exchange-in-ccxt]
Extended works similarly to any other CCXT DEX and only requires the StarkKey private key and the API Key, both can be retrieved using the website.
* Go to this page: [https://app.extended.exchange/api-management](https://app.extended.exchange/api-management)
* Click Generate API Key
* Copy the API Key and Stark Key Private

An example on how to instantiate the extended exchange:
```
exchange = ccxt.extended({
'apiKey: 'AAAA', // apiKey
'privateKey': 'XXXXXXX', // the star key private key
})
```
CCXT is also a builder on Extended meaning that by default users will pay 1bps (0.01%) extra for using it through CCXT, however this fee is totally optional and can be disabled by providing the option `builderFee: False` in options. Howerer, your contribution is much appreciated.
```
exchange.options['builderFee'] = False
```
### How to use the Apex Exchange in CCXT? [#how-to-use-the-apex-exchange-in-ccxt]
An example on how to instantiate the Apex exchange:
```
exchange = ccxt.apex({
'apiKey': 'your api Key',
'secret': 'your api secret',
'walletAddress': 'your eth address',
'options': {
'accountId': 'your account id',
'passphrase': 'your api passphrase',
'seeds': 'your zklink omni seed',
},
})
```
## How to use the Prediction Exchanges in CCXT? [#how-to-use-the-prediction-exchanges-in-ccxt]
Prediction-market exchanges (Polymarket, Kalshi, Hyperliquid, Limitless, Myriad) live in their own `prediction` namespace and work like any other CCXT exchange, with one key difference: instead of a market `symbol` you address an **outcome** — a handle of the form `MARKET:LABEL` (for example `TRUMP_WIN_2024:YES`). Wherever an outcome is accepted you can pass either the unified handle or the venue's raw `outcomeId` (a Polymarket token id, a Kalshi ticker, ...) — both resolve to the same outcome. Prices are probabilities between 0 and 1, amounts are shares, and costs are in the collateral currency (usually USDC/USD).
Everything on a prediction venue is organized as a three-level hierarchy — **Event → Markets → Outcomes**:
* an **event** is the real-world topic being traded ("US Presidential Election 2024")
* each event contains one or more **markets** — a concrete yes/no or multi-choice question within the topic ("Will Trump win?")
* each market contains its **outcomes** — the individual sides you can actually buy and sell (`YES` / `NO`, or one outcome per candidate)
```text
Event "US Presidential Election 2024"
├── Market "Will Trump win?"
│ ├── Outcome TRUMP_WIN_2024:YES
│ └── Outcome TRUMP_WIN_2024:NO
└── Market "Will Biden win?"
├── Outcome BIDEN_WIN_2024:YES
└── Outcome BIDEN_WIN_2024:NO
```
`fetchEvents` returns this full hierarchy (events carrying their markets, markets carrying their outcomes), and all trading and market-data methods operate at the bottom level — the outcome handle is what you pass wherever a regular exchange would take a symbol.
The namespace per language:
```python
import ccxt.prediction
exchange = ccxt.prediction.polymarket({...})
```
```javascript
const exchange = new ccxt.prediction.polymarket ({...})
```
```php
$exchange = new \ccxt\prediction\polymarket([...]);
```
```go
import ccxtprediction "github.com/ccxt/ccxt/go/v4/prediction"
exchange := ccxtprediction.NewPolymarket(map[string]any{...})
```
```java
import io.github.ccxt.exchanges.prediction.Polymarket;
Polymarket exchange = new Polymarket();
```
C# uses `new ccxt.prediction.polymarket(...)`.
> **Note:** unlike regular exchanges, do **not** start with `loadMarkets()` / `fetchMarkets()` on prediction exchanges. Use `fetchEvents(params)` as the entry point instead: it searches the venue and returns full event structures, and the outcome handles it returns are resolved on demand by every unified method, no market loading required.
The usual entry point is `fetchEvents`, which returns event structures (each carrying its markets and their outcomes). It must be scoped by at least one selector — `query` (free-text search), `tags`, `eventId` or `slug` — and also accepts `status`, `sort` and `limit`:
```python
# search events by free text
events = await exchange.fetch_events({'query': 'bitcoin', 'limit': 10})
for event in events:
print(event['title'])
for market in event['markets']:
for outcome in market['outcomes']:
print(' ', outcome['outcome'], '->', outcome['price']) # price = probability 0..1
# or address a known event directly by its slug
events = await exchange.fetch_events({'slug': 'will-bitcoin-hit-150k-in-2026'})
# every unified method takes the outcome handle where a symbol would normally go
outcome = events[0]['markets'][0]['outcomes'][0]['outcome'] # "MARKET:LABEL" handle
ticker = await exchange.fetch_ticker(outcome)
order = await exchange.create_order(outcome, 'limit', 'buy', 5, 0.02)
```
All the familiar unified methods (`fetchTicker`, `fetchOrderBook`, `fetchTrades`, `fetchOHLCV`, `createOrder`, `cancelOrder`, `fetchBalance`, `fetchPositions`, `watch*`, ...) take the outcome handle where a symbol would normally go. Complete runnable end-to-end examples for every language live under `examples//prediction/`.
### How to use the Prediction Exchange Polymarket? [#how-to-use-the-prediction-exchange-polymarket]
Polymarket requires two credentials:
* `privateKey`: the private key of the EOA (the wallet you log in with) — used to derive the L2 API credentials and to sign orders
* `walletAddress`: your **polymarket account wallet** — the proxy / deposit wallet shown in your polymarket profile, **not** the EOA itself (the EOA holds no funds; polymarket keeps your USDC in a proxy wallet it created for your account)
```python
exchange = ccxt.prediction.polymarket({
'privateKey': '0x...', # EOA private key
'walletAddress': '0x...', # polymarket account wallet (profile / deposit wallet)
})
```
You can find the account wallet address in your polymarket profile page (it is also returned as `proxyWallet` by `https://gamma-api.polymarket.com/public-profile?address=`).
Notes:
* Accounts created recently use the **deposit wallet** flow and work with the defaults shown above.
* Older accounts (browser-wallet / Gnosis-Safe proxies) need the signature type switched: `exchange.options['signatureType'] = 2` — and if you pass your EOA as `walletAddress`, also set `exchange.options['funder']` to the proxy wallet that holds the USDC.
* Alternatively to the `privateKey`, you can supply previously created L2 API credentials directly as `apiKey`, `secret` and `password` (the POLY passphrase).
### How to use the Prediction Exchange Kalshi? [#how-to-use-the-prediction-exchange-kalshi]
Kalshi uses classic API credentials generated in the account settings ([https://kalshi.com/account/profile](https://kalshi.com/account/profile) → API keys):
* `apiKey`: the access key (a UUID, sent as `KALSHI-ACCESS-KEY`)
* `privateKey`: the RSA private key (PEM) that kalshi generates alongside the access key — requests are RSA-signed, there is no `secret`
```python
exchange = ccxt.prediction.kalshi({
'apiKey': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
'privateKey': '-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----',
})
```
### How to use the Prediction Exchange Hyperliquid? [#how-to-use-the-prediction-exchange-hyperliquid]
Hyperliquid prediction markets use exactly the same credentials as the regular hyperliquid DEX:
* `walletAddress`: your wallet address
* `privateKey`: the private key of that wallet (or of an API/agent wallet created on [https://app.hyperliquid.xyz/API](https://app.hyperliquid.xyz/API) — in that case `walletAddress` stays your main wallet address and `privateKey` is the agent key)
```python
exchange = ccxt.prediction.hyperliquid({
'walletAddress': '0x...',
'privateKey': '0x...',
})
```
The id `hyperliquid` exists both as a regular crypto DEX (`ccxt.hyperliquid`) and as a prediction exchange (`ccxt.prediction.hyperliquid`) — the prediction class only exposes the prediction markets, addressed by outcome handles. Public market data works without any credentials.
## How to fetch an RPI orderbook? [#how-to-fetch-an-rpi-orderbook]
OKX publishes a second order book that merges its regular liquidity with RPI (Retail Price Improvement) liquidity. Pass `rpi` to `fetchOrderBook` — either per call or once in `options` — and CCXT routes to that endpoint instead of the regular one. Everything else is unchanged, the returned [order book structure](/docs/manual#order-book-structure) is the same.
```python
exchange = ccxt.okx()
# per call
orderbook = exchange.fetch_order_book('BTC/USDT', 5, {'rpi': True})
# or for every call
exchange.options['fetchOrderBook'] = {'rpi': True}
orderbook = exchange.fetch_order_book('BTC/USDT', 5)
print(orderbook['bids'][0], orderbook['asks'][0])
```
The RPI book is capped at 400 entries per side, a larger `limit` is reduced to it.
Binance has one too, but only for linear (USDⓈ-M) futures, and only as a per-call parameter:
```python
exchange = ccxt.binance()
orderbook = exchange.fetch_order_book('BTC/USDT:USDT', 5, {'rpi': True})
```
# CCXT Documentation (/docs)
Welcome to the ccxt wiki!
> We recommend to visit our full documentation at /docs/manual
## General Information [#general-information]
* [Supported Exchanges](/docs/exchange-markets)
* [Exchanges By Country](/docs/exchange-markets-by-country)
## How To Install [#how-to-install]
* [Install](/docs/install)
* [Node.js](/docs/install#nodejs)
* [Python](/docs/install#python)
* [PHP](/docs/install#php)
* [C#](/docs/install#netc)
* [Go](/docs/install#go)
* [Java](/docs/install#java)
* [Rust](/docs/install#rust)
* [Web Browsers](/docs/install#web-browsers)
* [Docker](/docs/install#docker)
* [Proxy](/docs/install#proxy)
* [CORS (Access-Control-Allow-Origin)](/docs/install#cors-access-control-allow-origin)
## How To Use [#how-to-use]
* [User Manual](/docs/manual)
* [Architecture Overview](/docs/manual#overview)
* [Instantiation](/docs/manual#instantiation)
* [Exchange Structure](/docs/manual#exchange-structure)
* [Exchange Properties](/docs/manual#exchange-properties)
* [Rate Limit](/docs/manual#rate-limit)
* [Markets](/docs/manual#markets)
* [Symbols And Market Ids](/docs/manual##symbols-and-market-ids)
* [API Methods / Endpoints](/docs/manual#api-methods--endpoints)
* [Implicit API Methods](/docs/manual#implicit-api-methods)
* [Public/Private API](/docs/manual#publicprivate-api)
* [Synchronous vs Asynchronous Calls](/docs/manual#synchronous-vs-asynchronous-calls)
* [Unified API](/docs/manual#unified-api)
* [Overriding Params](/docs/manual#overriding-unified-api-params)
* [Pagination](/docs/manual#pagination)
* [Automatic Pagination](/docs/manual#automatic-pagination)
* [Public API](/docs/manual#public-api)
* [Order Book](/docs/manual#order-book)
* [Market Depth](/docs/manual#market-depth)
* [Price Tickers](/docs/manual#price-tickers)
* [OHLCV Candlestick Charts](/docs/manual#ohlcv-candlestick-charts)
* [Public Trades](/docs/manual#trades-executions-transactions)
* [Private API](/docs/manual#private-api)
* [Authentication](/docs/manual#authentication)
* [API Keys Setup](/docs/manual#api-keys-setup)
* [Querying Account Balance](/docs/manual#account-balance)
* [Orders](/docs/manual#orders)
* [Querying Orders](/docs/manual#querying-orders)
* [By Order Id](/docs/manual#by-order-id)
* [All Orders](/docs/manual#all-orders)
* [Open Orders](/docs/manual#open-orders)
* [Closed Orders](/docs/manual#closed-orders)
* [Order Structure](/docs/manual#order-structure)
* [Placing Orders](/docs/manual#placing-orders)
* [Market Orders](/docs/manual#market-orders)
* [Limit Orders](/docs/manual#limit-orders)
* [Custom Params](/docs/manual#custom-order-params)
* [Canceling Orders](/docs/manual#canceling-orders)
* [Personal Trades](/docs/manual#personal-trades)
* [Funding Your Account](/docs/manual#ledger)
* [Deposit](/docs/manual#deposit)
* [Withdraw](/docs/manual#withdraw)
* [Transactions](/docs/manual#transactions)
* [Deposit](/docs/manual#deposit)
* [Withdrawal](/docs/manual#withdrawal)
* [All Transactions](/docs/manual#transaction-structure)
* [Fees](/docs/manual#fees)
* [Trading Fees](/docs/manual#trading-fees)
* [Transaction Fees](/docs/manual#transaction-fees)
## WebSocket Support [#websocket-support]
* [CCXT Pro](/docs/pro)
## AI Agents [#ai-agents]
* [AI Skills](/docs/ai-skills)
## Troubleshooting [#troubleshooting]
* [Frequently Asked Questions](/docs/faq)
* [Overriding The Nonce](/docs/manual#overriding-the-nonce)
* [Error Handling](/docs/manual#error-handling)
* [Troubleshooting](/docs/manual#troubleshooting)
* [How To Submit An Issue](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-submit-an-issue)
* [CCXT CLI: Command-Line Interface](/docs/cli)
## Examples [#examples]
* [Usage Examples](/docs/examples-overview)
## New Exchanges [#new-exchanges]
* [Certification](/docs/certification)
* [Requirements](/docs/requirements)
## API Reference [#api-reference]
* [API Reference](/docs/manual)
# Install (/docs/install)
## Install [#install]
> **Just want an AI agent or your terminal to use CCXT?** You may not need to install the library at all:
>
> * **[CCXT MCP Server](/docs/mcp)** — connect Claude Desktop/Code, Cursor, VS Code, Windsurf or any MCP host to 100+ exchanges and prediction markets. One line: `claude mcp add ccxt -- npx -y ccxt-mcp`.
> * **[CCXT CLI](/docs/cli)** — call any unified method straight from your shell.
The easiest way to install the ccxt library is to use builtin package managers:
* [ccxt in **NPM**](http://npmjs.com/package/ccxt) (JavaScript / Node v15+)
* [ccxt in **PyPI**](https://pypi.python.org/pypi/ccxt) (Python 3)
This library is shipped as an all-in-one module implementation with minimalistic dependencies and requirements:
* [ccxt.js](https://github.com/ccxt/ccxt/blob/master/js/ccxt.js) in JavaScript
* [./python/](https://github.com/ccxt/ccxt/blob/master/python/) in Python (generated from JS)
* [ccxt.php](https://github.com/ccxt/ccxt/blob/master/ccxt.php) in PHP (generated from JS)
* [./java/](https://github.com/ccxt/ccxt/blob/master/java/) in Java (generated from TS)
You can also clone it into your project directory from [ccxt GitHub repository](https://github.com/ccxt/ccxt) and copy files
manually into your working directory with language extension appropriate for your environment.
```bash
git clone https://github.com/ccxt/ccxt.git
```
An alternative way of installing this library is to build a custom bundle from source. Choose exchanges you need in `exchanges.cfg`.
### JavaScript (NPM) [#javascript-npm]
JavaScript version of ccxt works both in Node and web browsers. Requires ES6 and `async/await` syntax support (Node 18+). When compiling with Rspack (or Webpack) and Babel, make sure it is [not excluded](https://github.com/ccxt-dev/ccxt/issues/225#issuecomment-331582275) in your `babel-loader` config.
[ccxt crypto trading library in npm](http://npmjs.com/package/ccxt)
```bash
npm install ccxt
```
```javascript
var ccxt = require ('ccxt')
console.log (ccxt.exchanges) // print all available exchanges
```
### JavaScript (for use with the `
```
The default entry point for the browser is `window.ccxt` and it creates a global ccxt object:
```javascript
console.log (ccxt.exchanges) // print all available exchanges
```
### Custom JavaScript Builds [#custom-javascript-builds]
It takes time to load all scripts and resources. The problem with in-browser usage is that the entire CCXT library weighs a few megabytes which is a lot for a web application. Sometimes it is also critical for a Node app. Therefore to lower the loading time you might want to make your own custom build of CCXT for your app with just the exchanges you need. CCXT uses rspack to remove dead code paths to make the package smaller.
Follow these steps:
```bash
# 1. clone the repository
git clone --depth 1 https://github.com/ccxt/ccxt.git
# 2. go to the cloned repository
cd ccxt
# 3. install dependencies
npm install
# 4. edit exchanges.cfg for the exchanges of your interest
echo -e "binance\nokx" > exchanges.cfg
# 5. build the library
npm run export-exchanges
npm run bundle-browser
# 6a. copy the browser file to your project folder if you are buildig a web application
cp dist/ccxt.browser.js path/to/your/html/project
# 6b. or link against the library if you are building a Node.js application
npm link
cd path/to/your/node/project
npm link ccxt
# 6c. directly import ccxt from the entry point
touch app.js
# inside of app.js
import ccxt from './js/ccxt.js'
console.log (ccxt)
# now you can run your app like so
node app.js
```
### Python [#python]
[ccxt algotrading library in PyPI](https://pypi.python.org/pypi/ccxt)
```bash
pip install ccxt
```
```python
import ccxt
print(ccxt.exchanges) # print a list of all available exchange classes
```
The library supports concurrent asynchronous mode with asyncio and async/await in Python 3.5.3+
```python
import ccxt.async_support as ccxt # link against the asynchronous version of ccxt
```
### PHP [#php]
The autoloadable version of ccxt can be installed with [**Packagist/Composer**](https://packagist.org/packages/ccxt/ccxt) (PHP 8.1+).
It can also be installed from the source code: [**`ccxt.php`**](https://raw.githubusercontent.com/ccxt/ccxt/master/php)
It requires common PHP modules:
* cURL
* mbstring (using UTF-8 is highly recommended)
* PCRE
* iconv
* gmp
```php
include "ccxt.php";
var_dump (\ccxt\Exchange::$exchanges); // print a list of all available exchange classes
```
The library supports concurrent asynchronous mode using tools from [ReactPHP](https://reactphp.org/) in PHP 8.1+. Read the [Manual](/docs) for more details.
### .net/C\# [#netc]
[ccxt in C# with **Nugget**](https://www.nuget.org/packages/ccxt) (netstandard 2.0 and netstandard 2.1)
```c#
using ccxt;
Console.WriteLine(ccxt.Exchanges) // check this later
```
### Java [#java]
Java version of CCXT requires Java 21+ and uses Gradle as its build system.
Clone and build from source:
```bash
git clone https://github.com/ccxt/ccxt.git --depth 1
cd ccxt/java
./gradlew :lib:build
```
```java
import io.github.ccxt.exchanges.Binance;
import io.github.ccxt.types.Ticker;
Binance exchange = new Binance();
exchange.loadMarkets(false);
Ticker ticker = exchange.fetchTicker("BTC/USDT");
System.out.println(ticker.symbol + " " + ticker.last);
```
Run the examples:
```bash
cd java
./gradlew :examples:run -PmainClass=examples.FetchTicker
./gradlew :examples:run -PmainClass=examples.WatchOrderBook
```
See [java/examples/](https://github.com/ccxt/ccxt/tree/master/java/examples) for the full list of examples.
### Rust [#rust]
[ccxt in Rust with **crates.io**](https://crates.io/crates/ccxt) ([docs.rs](https://docs.rs/ccxt))
```bash
cargo add ccxt tokio --features tokio/full
cargo add ccxt-pro
```
```toml
[dependencies]
ccxt = "4.5.75"
ccxt-pro = "4.5.75"
tokio = { version = "1", features = ["full"] }
```
`ccxt` carries the REST exchanges; `ccxt-pro` adds the WebSocket (`watch*`) ones and is only needed if you stream. Both are async and expect a Tokio runtime.
```rust
use ccxt::{Binance, Params};
let mut exchange = Binance::new(None);
exchange.load_markets(false).await;
let ticker = exchange.fetch_ticker("BTC/USDT", Params::none()).await?;
println!("{} {:?}", ticker.symbol, ticker.last);
```
See [examples/rust/](https://github.com/ccxt/ccxt/tree/master/examples/rust) for the full list of examples.
### Docker [#docker]
You can get CCXT installed in a container along with all the supported languages and dependencies. This may be useful if you want to contribute to CCXT (e.g. run the build scripts and tests — please see the [Contributing](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md) document for the details on that).
You don't need the Docker image if you're not going to develop CCXT. If you just want to use CCXT – just install it as a regular package into your project.
Using `docker-compose` (in the cloned CCXT repository):
```bash
docker-compose run --rm ccxt
```
Alternatively:
```bash
docker build . --tag ccxt
docker run -it ccxt
```
## Proxy [#proxy]
If you are unable to obtain data from exchanges due to location restrictions read the [proxy](/docs/manual#proxy) section.
# Manual (/docs/manual)
# Overview [#overview]
The ccxt library is a collection of available crypto *exchanges* or exchange classes. Each class implements the public and private API for a particular crypto exchange. All exchanges are derived from the base Exchange class and share a set of common methods. To access a particular exchange from ccxt library you need to create an instance of corresponding exchange class. Supported exchanges are updated frequently and new exchanges are added regularly.
The structure of the library can be outlined as follows:
```text
User
+-------------------------------------------------------------+
| CCXT |
+------------------------------+------------------------------+
| Public | Private |
+=============================================================+
│ . |
│ The Unified CCXT API |
│ . |
| loadMarkets . fetchBalance |
| fetchMarkets . createOrder |
| fetchCurrencies . cancelOrder |
| fetchTicker . fetchOrder |
| fetchTickers . fetchOrders |
| fetchOrderBook . fetchOpenOrders |
| fetchOHLCV . fetchClosedOrders |
| fetchStatus . fetchMyTrades |
| fetchTrades . deposit |
| . withdraw |
│ . |
+=============================================================+
│ . |
| Custom Exchange API |
| (Derived Classes And Their Implicit Methods) |
│ . |
| publicGet... . privateGet... |
| publicPost... . privatePost... |
| . privatePut... |
| . privateDelete... |
| . sign |
│ . |
+=============================================================+
│ . |
| Base Exchange Class |
│ . |
+=============================================================+
```
Full public and private HTTP REST APIs for all exchanges are implemented in JavaScript, Python, PHP, C#, Go, Java and Rust. WebSocket implementations are available in [CCXT Pro](https://ccxt.pro), with support for WebSocket streams.
* [**Exchanges**](#exchanges)
* [**Markets**](#markets)
* [**Implicit API**](#implicit-api)
* [**Unified API**](#unified-api)
* [**Public API**](#public-api)
* [**Private API**](#private-api)
* [**Error Handling**](#error-handling)
* [**Troubleshooting**](#troubleshooting)
* [**CCXT Pro**](#ccxt-pro)
## Social [#social]
* [](https://twitter.com/ccxt_official) Follow us on Twitter
* [](https://medium.com/@ccxt) Read our blog on Medium
* [](https://discord.gg/dhzSKYU) Join our Discord
* [](https://t.me/ccxt_chat) CCXT Chat on Telegram (technical support)
* Announcement channels:
* * [](https://t.me/ccxt_announcements)
* * [](https://discord.com/channels/690203284119617602/1057748769690619984)
# Exchanges [#exchanges]
* [Instantiation](#instantiation)
* [Exchange Structure](#exchange-structure)
* [Rate Limit](#rate-limit)
The CCXT library currently supports the following 104 cryptocurrency exchange markets and trading APIs:
| logo | id | name | ver | type | certified | pro |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | -------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------: | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| [](https://alpaca.markets) | alpaca | [Alpaca](https://alpaca.markets) | [](https://alpaca.markets/docs/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://omni.apex.exchange/trade) | apex | [Apex](https://omni.apex.exchange/trade) | [](https://api-docs.omni.apex.exchange) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.asterdex.com/en/referral/aA1c2B) | aster | [Aster](https://www.asterdex.com/en/referral/aA1c2B) | [](https://github.com/asterdex/api-docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://backpack.exchange/join/ccxt) | backpack | [Backpack](https://backpack.exchange/join/ccxt) | [](https://docs.backpack.exchange/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://bequant.io/referral/dd104e3bee7634ec) | bequant | [Bequant](https://bequant.io/referral/dd104e3bee7634ec) | [](https://api.bequant.io/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://b1.run/users/new?code=D3LLBVFT) | bigone | [BigONE](https://b1.run/users/new?code=D3LLBVFT) | [](https://open.big.one/docs/api.html) |  | | |
| [](https://accounts.binance.com/register?ref=CCXTCOM) | binance | [Binance](https://accounts.binance.com/register?ref=CCXTCOM) | [](https://developers.binance.com/en) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://accounts.binance.com/register?ref=CCXTCOM) | binancecoinm | [Binance COIN-M](https://accounts.binance.com/register?ref=CCXTCOM) | [](https://binance-docs.github.io/apidocs/delivery/en/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.binance.us/?ref=35005074) | binanceus | [Binance US](https://www.binance.us/?ref=35005074) | [](https://github.com/binance-us/binance-official-api-docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://accounts.binance.com/register?ref=CCXTCOM) | binanceusdm | [Binance USDⓈ-M](https://accounts.binance.com/register?ref=CCXTCOM) | [](https://binance-docs.github.io/apidocs/futures/en/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://bingx.com/invite/OHETOM) | bingx | [BingX](https://bingx.com/invite/OHETOM) | [](https://bingx-api.github.io/docs/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://bit2c.co.il/Aff/63bfed10-e359-420c-ab5a-ad368dab0baf) | bit2c | [Bit2C](https://bit2c.co.il/Aff/63bfed10-e359-420c-ab5a-ad368dab0baf) | [](https://www.bit2c.co.il/home/api) |  | | |
| [](https://bitbank.cc/) | bitbank | [bitbank](https://bitbank.cc/) | [](https://docs.bitbank.cc/) |  | | |
| [](https://ref.bitbns.com/1090961) | bitbns | [Bitbns](https://ref.bitbns.com/1090961) | [](https://bitbns.com/trade/#/api-trading/) |  | | |
| [](https://www.bitfinex.com) | bitfinex | [Bitfinex](https://www.bitfinex.com) | [](https://docs.bitfinex.com/v2/docs/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://bitflyer.com) | bitflyer | [bitFlyer](https://bitflyer.com) | [](https://lightning.bitflyer.com/docs?lang=en) |  | | |
| [](https://www.bitget.com/expressly?languageType=0\&channelCode=ccxt\&vipCode=tg9j) | bitget | [Bitget](https://www.bitget.com/expressly?languageType=0\&channelCode=ccxt\&vipCode=tg9j) | [](https://www.bitget.com/api-doc/common/intro) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bithumb.com) | bithumb | [Bithumb](https://www.bithumb.com) | [](https://apidocs.bithumb.com) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bitmex.com/app/register/NZTR1q) | bitmex | [BitMEX](https://www.bitmex.com/app/register/NZTR1q) | [](https://www.bitmex.com/app/apiOverview) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bitopro.com) | bitopro | [BitoPro](https://www.bitopro.com) | [](https://github.com/bitoex/bitopro-offical-api-docs/blob/master/v3-1/rest-1/rest.md) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bitrue.com/affiliate/landing?cn=600000\&inviteCode=EZWETQE) | bitrue | [Bitrue](https://www.bitrue.com/affiliate/landing?cn=600000\&inviteCode=EZWETQE) | [](https://github.com/Bitrue-exchange/bitrue-official-api-docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://bitso.com/?ref=itej) | bitso | [Bitso](https://bitso.com/?ref=itej) | [](https://bitso.com/api_info) |  | | |
| [](https://www.bitstamp.net) | bitstamp | [Bitstamp](https://www.bitstamp.net) | [](https://www.bitstamp.net/api) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://bit.team/auth/sign-up?ref=bitboy2023) | bitteam | [BIT.TEAM](https://bit.team/auth/sign-up?ref=bitboy2023) | [](https://bit.team/trade/api/documentation) |  | | |
| [](https://www.bittrade.co.jp/register/?invite_code=znnq3) | bittrade | [BitTrade](https://www.bittrade.co.jp/register/?invite_code=znnq3) | [](https://api-doc.bittrade.co.jp) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://bitvavo.com/?a=24F34952F7) | bitvavo | [Bitvavo](https://bitvavo.com/?a=24F34952F7) | [](https://docs.bitvavo.com/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://blockchain.com) | blockchaincom | [Blockchain.com](https://blockchain.com) | [](https://api.blockchain.com/v3) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://blofin.com/register?referral_code=f79EsS) | blofin | [BloFin](https://blofin.com/register?referral_code=f79EsS) | [](https://blofin.com/docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.btcbox.co.jp/) | btcbox | [BtcBox](https://www.btcbox.co.jp/) | [](https://blog.btcbox.jp/en/archives/8762) |  | | |
| [](https://btcmarkets.net) | btcmarkets | [BTC Markets](https://btcmarkets.net) | [](https://api.btcmarkets.net/doc/v3) |  | | |
| [](https://www.btcturk.com) | btcturk | [BTCTurk](https://www.btcturk.com) | [](https://github.com/BTCTrader/broker-api-docs) |  | | |
| [](https://www.btse.com/referral/o2tjIXx5) | btse | [BTSE](https://www.btse.com/referral/o2tjIXx5) | [](https://support.btse.com/en/support/solutions/articles/43000044751-btse-api) |  | | |
| [](https://bullish.com/) | bullish | [Bullish](https://bullish.com/) | [](https://api.exchange.bullish.com/docs/api/rest/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bybit.com/invite?ref=XDK12WP) | bybit | [Bybit](https://www.bybit.com/invite?ref=XDK12WP) | [](https://bybit-exchange.github.io/docs/inverse/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bybit.com/invite?ref=XDK12WP) | bybiteu | [Bybit EU](https://www.bybit.com/invite?ref=XDK12WP) | [](https://bybit-exchange.github.io/docs/inverse/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://partner.bydfi.com/j/DilWutCI) | bydfi | [BYDFi](https://partner.bydfi.com/j/DilWutCI) | [](https://developers.bydfi.com/en/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://cex.io/r/0/up105393824/0/) | cex | [CEX.IO](https://cex.io/r/0/up105393824/0/) | [](https://trade.cex.io/docs/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.coinbase.com/join/58cbe25a355148797479dbd2) | coinbase | [Coinbase Advanced](https://www.coinbase.com/join/58cbe25a355148797479dbd2) | [](https://docs.cdp.coinbase.com/coinbase-app/introduction/welcome) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://coinbase.com/) | coinbaseexchange | [Coinbase Exchange](https://coinbase.com/) | [](https://docs.cloud.coinbase.com/exchange/docs/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://international.coinbase.com) | coinbaseinternational | [Coinbase International](https://international.coinbase.com) | [](https://docs.cloud.coinbase.com/intx/docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://coincheck.com) | coincheck | [Coincheck](https://coincheck.com) | [](https://coincheck.com/documents/exchange/api) |  | | |
| [](https://www.coinex.com/register?refer_code=yw5fz) | coinex | [CoinEx](https://www.coinex.com/register?refer_code=yw5fz) | [](https://docs.coinex.com/api/v2) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://coinmate.io?referral=YTFkM1RsOWFObVpmY1ZjMGREQmpTRnBsWjJJNVp3PT0) | coinmate | [CoinMate](https://coinmate.io?referral=YTFkM1RsOWFObVpmY1ZjMGREQmpTRnBsWjJJNVp3PT0) | [](https://coinmate.docs.apiary.io) |  | | |
| [](https://coinone.co.kr) | coinone | [CoinOne](https://coinone.co.kr) | [](https://doc.coinone.co.kr) |  | | |
| [](https://www.coins.ph/en-ph/register?invite_code=1371062463303277512\&broker=9001) | coinsph | [Coins.ph](https://www.coins.ph/en-ph/register?invite_code=1371062463303277512\&broker=9001) | [](https://coins-docs.github.io/rest-api) |  | | |
| [](https://www.coinspot.com.au/register?code=PJURCU) | coinspot | [CoinSpot](https://www.coinspot.com.au/register?code=PJURCU) | [](https://www.coinspot.com.au/api) |  | | |
| [](https://crypto.com/exch/kdacthrnxt) | cryptocom | [Crypto.com](https://crypto.com/exch/kdacthrnxt) | [](https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://app.cryptomus.com/signup/?ref=JRP4yj) | cryptomus | [Cryptomus](https://app.cryptomus.com/signup/?ref=JRP4yj) | [](https://doc.cryptomus.com/personal) |  | | |
| [](https://s.deepcoin.com/UzkyODgy) | deepcoin | [DeepCoin](https://s.deepcoin.com/UzkyODgy) | [](https://www.deepcoin.com/docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.delta.exchange/app/signup/?code=IULYNB) | delta | [Delta Exchange](https://www.delta.exchange/app/signup/?code=IULYNB) | [](https://docs.delta.exchange) |  | | |
| [](https://www.deribit.com/reg-1189.4038) | deribit | [Deribit](https://www.deribit.com/reg-1189.4038) | [](https://docs.deribit.com/v2) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.derive.xyz/invite/3VB0B) | derive | [Derive](https://www.derive.xyz/invite/3VB0B) | [](https://docs.derive.xyz/docs/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.digifinex.com/en-ww/from/DhOzBg?channelCode=ljaUPp) | digifinex | [DigiFinex](https://www.digifinex.com/en-ww/from/DhOzBg?channelCode=ljaUPp) | [](https://docs.digifinex.com) |  | | |
| [](https://dydx.trade?ref=ccxt) | dydx | [dYdX](https://dydx.trade?ref=ccxt) | [](https://docs.dydx.xyz) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://app.extended.exchange) | extended | [Extended](https://app.extended.exchange) | [](https://api.docs.extended.exchange) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://fmfw.io/referral/da948b21d6c92d69) | fmfwio | [FMFW.io](https://fmfw.io/referral/da948b21d6c92d69) | [](https://api.fmfw.io/) |  | | |
| [](https://app.foxbit.com.br) | foxbit | [Foxbit](https://app.foxbit.com.br) | [](https://docs.foxbit.com.br) |  | | |
| [](https://www.gate.com/share/CCXTGATE) | gate | [Gate](https://www.gate.com/share/CCXTGATE) | [](https://www.gate.com/docs/developers/apiv4/en) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.gate.com/share/CCXTGATE) | gateeu | [Gate EU](https://www.gate.com/share/CCXTGATE) | [](https://www.gate.com/docs/developers/apiv4/en) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://gemini.com/) | gemini | [Gemini](https://gemini.com/) | [](https://docs.gemini.com/rest-api) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://grvt.io/?ref=WBLS9D1) | grvt | [GRVT](https://grvt.io/?ref=WBLS9D1) | [](https://api-docs.grvt.io/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | hashkey | [HashKey Global](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | [](https://hashkeyglobal-apidoc.readme.io/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://hibachi.xyz/r/ZBL2YFWIHU) | hibachi | [Hibachi](https://hibachi.xyz/r/ZBL2YFWIHU) |  |  | | |
| [](https://hitbtc.com/?ref_id=5a5d39a65d466) | hitbtc | [HitBTC](https://hitbtc.com/?ref_id=5a5d39a65d466) | [](https://api.hitbtc.com) |  | | |
| [](https://pro.hollaex.com/signup?affiliation_code=QSWA6G) | hollaex | [HollaEx](https://pro.hollaex.com/signup?affiliation_code=QSWA6G) | [](https://apidocs.hollaex.com) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.htx.com/invite/en-us/1h?invite_code=6rmm2223) | htx | [HTX](https://www.htx.com/invite/en-us/1h?invite_code=6rmm2223) | [](https://huobiapi.github.io/docs/spot/v1/en/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://app.hyperliquid.xyz/) | hyperliquid | [Hyperliquid](https://app.hyperliquid.xyz/) | [](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.independentreserve.com) | independentreserve | [Independent Reserve](https://www.independentreserve.com) | [](https://www.independentreserve.com/API) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://indodax.com/ref/testbitcoincoid/1) | indodax | [INDODAX](https://indodax.com/ref/testbitcoincoid/1) | [](https://github.com/btcid/indodax-official-api-docs) |  | | |
| [](https://www.kraken.com) | kraken | [Kraken](https://www.kraken.com) | [](https://docs.kraken.com/api-reference/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://futures.kraken.com/) | krakenfutures | [Kraken Futures](https://futures.kraken.com/) | [](https://docs.kraken.com/api/docs/futures-api/trading/market-data/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.kucoin.com/ucenter/signup?rcode=E5wkqe) | kucoin | [KuCoin](https://www.kucoin.com/ucenter/signup?rcode=E5wkqe) | [](https://docs.kucoin.com) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://futures.kucoin.com/?rcode=E5wkqe) | kucoinfutures | [KuCoin Futures](https://futures.kucoin.com/?rcode=E5wkqe) | [](https://docs.kucoin.com) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://latoken.com/invite?r=mvgp2djk) | latoken | [Latoken](https://latoken.com/invite?r=mvgp2djk) | [](https://api.latoken.com) |  | | |
| [](https://www.lbank.com/login/?icode=7QCY) | lbank | [LBank](https://www.lbank.com/login/?icode=7QCY) | [](https://www.lbank.com/en-US/docs/index.html) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://app.lighter.xyz/?referral=715955W9) | lighter | [Lighter](https://app.lighter.xyz/?referral=715955W9) | [](https://apidocs.lighter.xyz/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.luno.com/invite/44893A) | luno | [Luno](https://www.luno.com/invite/44893A) | [](https://www.luno.com/en/developers/api) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.mercadobitcoin.com.br) | mercado | [Mercado Bitcoin](https://www.mercadobitcoin.com.br) | [](https://www.mercadobitcoin.com.br/api-doc) |  | | |
| [](https://www.mexc.com/register?inviteCode=mexc-1FQ1GNu1) | mexc | [MEXC Global](https://www.mexc.com/register?inviteCode=mexc-1FQ1GNu1) | [](https://www.mexc.com/api-docs/spot-v3/introduction) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://trade.mode.network?ref=MODETRADE) | modetrade | [Mode Trade](https://trade.mode.network?ref=MODETRADE) | [](https://orderly.network/docs/build-on-omnichain/building-on-omnichain) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://mudrex.com) | mudrex | [Mudrex](https://mudrex.com) | [](https://docs.trade.mudrex.com/docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.my.okx.com/join/CCXT2023) | myokx | [MyOKX (EEA)](https://www.my.okx.com/join/CCXT2023) | [](https://my.okx.com/docs-v5/en/#overview) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://nado.xyz) | nado | [Nado](https://nado.xyz) | [](https://docs.nado.xyz/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://one.ndax.io/bfQiSL) | ndax | [NDAX](https://one.ndax.io/bfQiSL) | [](https://apidoc.ndax.io/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.okx.com/join/CCXTCOM) | okx | [OKX](https://www.okx.com/join/CCXTCOM) | [](https://www.okx.com/docs-v5/en/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.app.okx.com/join/CCXT2023) | okxus | [OKX (US)](https://www.app.okx.com/join/CCXT2023) | [](https://app.okx.com/docs-v5/en/#overview) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://onetrading.com/) | onetrading | [One Trading](https://onetrading.com/) | [](https://docs.onetrading.com) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://p2pb2b.com?referral=ee784c53) | p2b | [p2b](https://p2pb2b.com?referral=ee784c53) | [](https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://app.pacifica.fi?referral=ccxt) | pacifica | [Pacifica](https://app.pacifica.fi?referral=ccxt) | [](https://docs.pacifica.fi/api-documentation/api/rest-api) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://app.paradex.trade/r/ccxt24) | paradex | [Paradex](https://app.paradex.trade/r/ccxt24) | [](https://docs.api.testnet.paradex.trade/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.paymium.com/page/sign-up?referral=eDAzPoRQFMvaAB8sf-qj) | paymium | [Paymium](https://www.paymium.com/page/sign-up?referral=eDAzPoRQFMvaAB8sf-qj) | [](https://github.com/Paymium/api-documentation) |  | | |
| [](https://phemex.com/register?referralCode=EDNVJ) | phemex | [Phemex](https://phemex.com/register?referralCode=EDNVJ) | [](https://phemex-docs.github.io/#overview) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://poloniex.com/signup?c=UBFZJRPJ) | poloniex | [Poloniex](https://poloniex.com/signup?c=UBFZJRPJ) | [](https://api-docs.poloniex.com/spot/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://exchange.revolut.com) | revolutx | [Revolut X](https://exchange.revolut.com) | [](https://developer.revolut.com/docs/api/revolut-x-crypto-exchange) |  | | |
| [](https://tokocrypto.com) | tokocrypto | [Tokocrypto](https://tokocrypto.com) | [](https://www.tokocrypto.com/apidocs/) |  | | |
| [](https://www.toobit.com/en-US/r?i=dvCpJj) | toobit | [Toobit](https://www.toobit.com/en-US/r?i=dvCpJj) | [](https://api-docs.toobit.com/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://upbit.com) | upbit | [Upbit](https://upbit.com) | [](https://docs.upbit.com/kr) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.weex.com/register?vipCode=qfyh) | weex | [Weex](https://www.weex.com/register?vipCode=qfyh) | [](https://www.weex.com/api-doc) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://whitebit.com/referral/d9bdf40e-28f2-4b52-b2f9-cd1415d82963) | whitebit | [WhiteBit](https://whitebit.com/referral/d9bdf40e-28f2-4b52-b2f9-cd1415d82963) | [](https://github.com/whitebit-exchange/api-docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://woox.io/register?ref=DIJT0CNL) | woo | [WOO X](https://woox.io/register?ref=DIJT0CNL) | [](https://developer.woox.io/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://dex.woo.org/en/trade?ref=CCXT) | woofipro | [WOOFI PRO](https://dex.woo.org/en/trade?ref=CCXT) | [](https://orderly.network/docs/build-on-omnichain/building-on-omnichain) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.xt.com/en/accounts/register?ref=9PTM9VW) | xt | [XT](https://www.xt.com/en/accounts/register?ref=9PTM9VW) | [](https://doc.xt.com/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://zaif.jp) | zaif | [Zaif](https://zaif.jp) | [](https://techbureau-api-document.readthedocs.io/ja/latest/index.html) |  | | |
| [](https://www.zebpay.com) | zebpay | [Zebpay](https://www.zebpay.com) | [](https://github.com/zebpay/zebpay-api-references) |  | | |
Besides making basic market and limit orders, some exchanges offer margin trading (leverage), various derivatives (like futures contracts and options) and also have [dark pools](https://en.wikipedia.org/wiki/Dark_pool), [OTC](https://en.wikipedia.org/wiki/Over-the-counter_\(finance\)) (over-the-counter trading), merchant APIs and much more.
## Instantiation [#instantiation]
To connect to an exchange and start trading you need to instantiate an exchange class from ccxt library.
To get the full list of ids of supported exchanges programmatically:
JavaScript
Python
PHP
Go
C#
Java
```javascript
const ccxt = require ('ccxt')
console.log (ccxt.exchanges)
```
```python
import ccxt
print (ccxt.exchanges)
```
```php
include 'ccxt.php';
var_dump (\ccxt\Exchange::$exchanges);
```
```go
import (
"fmt"
"github.com/ccxt/ccxt/go/v4"
)
fmt.Println(ccxt.Exchanges)
```
```csharp
using ccxt;
Console.WriteLine(string.Join(", ", ccxt.Exchange.exchanges));
```
```java
import io.github.ccxt.Exchange;
// use Exchange.dynamicallyCreateInstance(id, config) to create exchanges
```
An exchange can be instantiated like shown in the examples below:
JavaScript
Python
```javascript
const ccxt = require ('ccxt')
let exchange = new ccxt.kraken () // default id
let kraken1 = new ccxt.kraken ({ id: 'kraken1' })
let kraken2 = new ccxt.kraken ({ id: 'kraken2' })
let id = 'coinbaseexchange'
let coinbaseexchange = new ccxt[id] ();
// from variable id
const exchangeId = 'binance'
, exchangeClass = ccxt[exchangeId]
, exchange = new exchangeClass ({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
})
```
```python
import ccxt
exchange = ccxt.okcoin () # default id
okcoin1 = ccxt.okcoin ({ 'id': 'okcoin1' })
okcoin2 = ccxt.okcoin ({ 'id': 'okcoin2' })
id = 'btcchina'
btcchina = eval ('ccxt.%s ()' % id)
coinbaseexchange = getattr (ccxt, 'coinbaseexchange') ()
# from variable id
exchange_id = 'binance'
exchange_class = getattr(ccxt, exchange_id)
exchange = exchange_class({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
})
```
#### **PHP** [#php]
The ccxt library in PHP uses builtin UTC/GMT time functions, therefore you are required to set date.timezone in your php.ini or call [date\_default\_timezone\_set()](http://php.net/manual/en/function.date-default-timezone-set.php) function before using the PHP version of the library. The recommended timezone setting is `"UTC"`.
```php
// PHP
date_default_timezone_set('UTC');
include 'ccxt.php';
$bitfinex = new \ccxt\bitfinex();
$id = 'kraken';
$exchange = '\\ccxt\\' . $id;
$kraken = new $exchange();
// from variable id
$exchange_id = 'binance';
$exchange_class = "\\ccxt\\$exchange_id";
$exchange = new $exchange_class(array(
'apiKey' => 'YOUR_API_KEY',
'secret' => 'YOUR_SECRET',
));
```
Go
C#
Java
```go
import (
"github.com/ccxt/ccxt/go/v4"
)
bitfinex := ccxt.NewBitfinex(nil) // default id
// from variable id
exchange := ccxt.CreateExchange("binance", map[string]interface{}{
"apiKey": "YOUR_API_KEY",
"secret": "YOUR_SECRET",
})
```
```csharp
using ccxt;
var kraken = new Kraken(); // default id
// with config
var binance = new Binance(new Dictionary() {
{ "apiKey", "YOUR_API_KEY" },
{ "secret", "YOUR_SECRET" },
});
```
```java
import io.github.ccxt.exchanges.Kraken;
import io.github.ccxt.exchanges.Binance;
import java.util.HashMap;
import java.util.Map;
Kraken kraken = new Kraken();
// with config
Map config = new HashMap<>();
config.put("apiKey", "YOUR_API_KEY");
config.put("secret", "YOUR_SECRET");
Binance binance = new Binance(config);
```
### Features [#features]
Major exchanges have the `.features` property available, where you can see what methods and functionalities are supported for each market-type (if any method is set to `null/undefined` it means method is "not supported" by the exchange)
*this feature is currently a work in progress and might be incomplete, feel free to report any issues you find in it*
```javascript
const exchange = new ccxt.binance()
console.log(exchange.features);
// outputs like:
{
spot: {
sandbox: true, // whether testnet is supported
createOrder: {
triggerPrice: true, // if trigger order is supported
triggerPriceType: undefined, // if trigger price type is supported (last, mark, index)
triggerDirection: false, // if trigger direction is supported (ascending, descending)
stopLossPrice: true, // if you can use createOrder to place a standalone stop-loss order (read "Stop Loss Orders" paragraph)
takeProfitPrice: true, // ... similar as above
stopLoss: { // if attached stopLoss can be sent together with an primary entry order
triggerPriceType: {
last: true,
mark: true,
index: true,
},
price: true, // if 'limit' price is supported to be set (otherwise only market order would be supported)
},
takeProfit : ..., // ... similar as above
marginMode: true, // if `marginMode` param is supported (cross, isolated)
timeInForce: { // supported TIF types
GTC: true,
IOC: true,
FOK: true,
PO: true,
GTD: false
},
hedged: false, // if `hedged` param is supported (true, false)
leverage: false, // if `leverage` param is supported (true, false)
selfTradePrevention: true, // if `selfTradePrevention` param is supported (true, false)
trailing: true, // if trailing order is supported
iceberg: true, // if iceberg order is supported
marketBuyByCost: true, // if creating market buy order is possible with `cost` param
marketBuyRequiresPrice: true,// if creating market buy order (if 'cost' not used) requires `price` param to be set
},
createOrders: {
'max': 50, // if batch order creation is supported
},
fetchMyTrades: {
limit: 1000, // max limit per call
daysBack: undefined, // max historical period that can be accessed
untilDays: 1 // if `until` param is supported, then this is permitted distance from `since`
},
fetchOrder: {
marginMode: true, // when supported, margin order should be fetched with this flag
trigger: false, // similar as above
trailing: false // similar as above
},
// other methods have similar properties
fetchOpenOrders: {
limit: undefined,
marginMode: true,
trigger: false,
trailing: false
},
fetchOrders: {
limit: 1000,
daysBack: undefined,
untilDays: 10000,
marginMode: true,
trigger: false,
trailing: false
},
fetchClosedOrders: {
limit: 1000,
daysBackClosed: undefined, // max days-back for closed orders
daysBackCanceled: undefined, // max days-back for canceled orders
untilDays: 10000,
marginMode: true,
trigger: false,
trailing: false
},
fetchOHLCV: {
paginate: true,
limit: 1000
}
},
swap: {
linear: { ... }, // similar to above dict
inverse: { ... }, // similar to above dict
}
future: {
linear: { ... }, // similar to above dict
inverse: { ... }, // similar to above dict
}
}
```
### Overriding Exchange Properties Upon Instantiation [#overriding-exchange-properties-upon-instantiation]
Most of exchange properties as well as specific options can be overrided upon exchange class instantiation or afterwards, like shown below:
JavaScript
Python
PHP
Go
C#
Java
```javascript
const exchange = new ccxt.binance ({
'rateLimit': 10000, // unified exchange property
'headers': {
'YOUR_CUSTOM_HTTP_HEADER': 'YOUR_CUSTOM_VALUE',
},
'options': {
'adjustForTimeDifference': true, // exchange-specific option
}
})
exchange.options['adjustForTimeDifference'] = false
```
```python
exchange = ccxt.binance ({
'rateLimit': 10000, # unified exchange property
'headers': {
'YOUR_CUSTOM_HTTP_HEADER': 'YOUR_CUSTOM_VALUE',
},
'options': {
'adjustForTimeDifference': True, # exchange-specific option
}
})
exchange.options['adjustForTimeDifference'] = False
```
```php
$exchange_id = 'binance';
$exchange_class = "\\ccxt\\$exchange_id";
$exchange = new $exchange_class(array(
'rateLimit' => 10000, // unified exchange property
'headers' => array(
'YOUR_CUSTOM_HTTP_HEADER' => 'YOUR_CUSTOM_VALUE',
),
'options' => array(
'adjustForTimeDifference' => true, // exchange-specific option
),
));
$exchange->options['adjustForTimeDifference'] = false;
```
```go
exchange := ccxt.NewBinance(map[string]interface{}{
"rateLimit": 10000, // unified exchange property
"headers": map[string]interface{}{
"YOUR_CUSTOM_HTTP_HEADER": "YOUR_CUSTOM_VALUE",
},
"options": map[string]interface{}{
"adjustForTimeDifference": true, // exchange-specific option
},
})
exchange.Options.Store("adjustForTimeDifference", false)
```
```csharp
var exchange = new Binance(new Dictionary() {
{ "rateLimit", 10000 }, // unified exchange property
{ "headers", new Dictionary() {
{ "YOUR_CUSTOM_HTTP_HEADER", "YOUR_CUSTOM_VALUE" },
} },
{ "options", new Dictionary() {
{ "adjustForTimeDifference", true }, // exchange-specific option
} },
});
exchange.options["adjustForTimeDifference"] = false;
```
```java
Map config = new HashMap<>();
config.put("rateLimit", 10000);
config.put("options", Map.of("adjustForTimeDifference", true));
Exchange exchange = Exchange.dynamicallyCreateInstance("binance", config);
((Map) exchange.options).put("adjustForTimeDifference", false);
```
### Overriding Exchange Methods [#overriding-exchange-methods]
In all CCXT-supported languages, you can override instance methods during runtime:
JavaScript
Python
PHP
```javascript
const ex = new ccxt.binance ();
ex.fetch_ticker = function (symbol, params = {}) {
// your codes go here
};
console.log (ex.fetch_ticker('BTC/USDT'));
```
```python
ex = ccxt.binance()
def my_overload(symbol, params = {}):
# your codes go here
ex.fetch_ticker = my_overload
print(ex.fetch_ticker('BTC/USDT'))
```
```php
$ex = new \ccxt\binance();
$ex->add_method('fetch_ticker', function($symbol, $params = []) {
// your codes go here
});
var_dump($ex->call_method('fetch_ticker', ['BTC/USDT']));
```
### Testnets And Sandbox Environments [#testnets-and-sandbox-environments]
Some exchanges also offer separate APIs for testing purposes that allows developers to trade virtual money for free and test out their ideas. Those APIs are called *"testnets", "sandboxes" or "staging environments"* (with virtual testing assets) as opposed to *"mainnets" and "production environments"* (with real assets). Most often a sandboxed API is a clone of a production API, so, it's literally the same API, except for the URL to the exchange server.
CCXT unifies that aspect and allows the user to switch to the exchange's sandbox (if supported by the underlying exchange).
To switch to the sandbox one has to call the `exchange.setSandboxMode (true)` or `exchange.set_sandbox_mode(true)` **immediately after creating the exchange before any other call**!
JavaScript
Python
PHP
Go
C#
Java
```javascript
const exchange = new ccxt.binance (config)
exchange.setSandboxMode (true) // enable sandbox mode
```
```python
exchange = ccxt.binance(config)
exchange.set_sandbox_mode(True) # enable sandbox mode
```
```php
$exchange = new \ccxt\binance($config);
$exchange->set_sandbox_mode(true); // enable sandbox mode
```
```go
exchange := ccxt.NewBinance(config)
exchange.SetSandboxMode(true) // enable sandbox mode
```
```csharp
var exchange = new Binance(config);
exchange.setSandboxMode(true); // enable sandbox mode
```
```java
Exchange exchange = Exchange.dynamicallyCreateInstance("binance", config);
exchange.setSandboxMode(true); // enable sandbox mode
```
* The `exchange.setSandboxMode (true) / exchange.set_sandbox_mode (True)` has to be your first call immediately after creating the exchange (before any other calls)
* To obtain the [API keys](#authentication) to the sandbox the user has to register with the sandbox website of the exchange in question and create a sandbox keypair
* **Sandbox keys are not interchangeable with production keys!**
## Exchange Structure [#exchange-structure]
Every exchange has a set of properties and methods, most of which you can override by passing an associative array of params to an exchange constructor. You can also make a subclass and override everything.
**A note on PHP arrays:** PHP has a single array type, so an empty container is both an empty dictionary and an empty list at once — the distinction is undecidable there. CCXT's base helpers therefore treat an empty PHP array as a valid dictionary (`is_dictionary(array()) === true`, and `safe_dict` will return an empty array rather than the default), while in every other supported language empty dictionaries and empty lists are distinct types and an empty list is not a dictionary. Code that must distinguish an empty dict from an empty list should not rely on the container alone in PHP, see [https://github.com/ccxt/ccxt/pull/29704](https://github.com/ccxt/ccxt/pull/29704) for details.
Here's an overview of generic exchange properties with values added for example:
```javascript
{
'id': 'exchange' // lowercase string exchange id
'name': 'Exchange' // human-readable string
'countries': [ 'US', 'CN', 'EU' ], // array of ISO country codes
'urls': {
'api': 'https://api.example.com/data', // string or dictionary of base API URLs
'www': 'https://www.example.com' // string website URL
'doc': 'https://docs.example.com/api', // string URL or array of URLs
},
'version': 'v1', // string ending with digits
'api': { ... }, // dictionary of api endpoints
'has': { // exchange capabilities
'CORS': false,
'cancelOrder': true,
'createDepositAddress': false,
'createOrder': true,
'fetchBalance': true,
'fetchCanceledOrders': false,
'fetchClosedOrder': false,
'fetchClosedOrders': false,
'fetchCurrencies': false,
'fetchDepositAddress': false,
'fetchMarkets': true,
'fetchMyTrades': false,
'fetchOHLCV': false,
'fetchOpenOrder': false,
'fetchOpenOrders': false,
'fetchOrder': false,
'fetchOrderBook': true,
'fetchOrders': false,
'fetchStatus': 'emulated',
'fetchTicker': true,
'fetchTickers': false,
'fetchBidsAsks': false,
'fetchTrades': true,
'withdraw': false,
},
'timeframes': { // empty if the exchange.has['fetchOHLCV'] !== true
'1m': '1minute',
'1h': '1hour',
'1d': '1day',
'1M': '1month',
'1y': '1year',
},
'timeout': 10000, // number in milliseconds
'rateLimit': 2000, // number in milliseconds
'userAgent': 'ccxt/1.1.1 ...' // string, HTTP User-Agent header
'verbose': false, // boolean, output error details
'markets': { ... } // dictionary of markets/pairs by symbol
'symbols': [ ... ] // sorted list of string symbols (traded pairs)
'currencies': { ... } // dictionary of currencies by currency code
'markets_by_id': { ... }, // dictionary of array of dictionaries (markets) by id
'currencies_by_id': { ... }, // dictionary of dictionaries (markets) by id
'apiKey': '92560ffae9b8a0421...', // string public apiKey (ASCII, hex, Base64, ...)
'secret': '9aHjPmW+EtRRKN/Oi...' // string private secret key
'password': '6kszf4aci8r', // string password
'uid': '123456', // string user id
'options': { ... }, // exchange-specific options
// ... other properties here ...
}
```
### Exchange Properties [#exchange-properties]
Below is a detailed description of each of the base exchange properties:
* `id`: Each exchange has a default id. The id is not used for anything, it's a string literal for user-land exchange instance identification purposes. You can have multiple links to the same exchange and differentiate them by ids. Default ids are all lowercase and correspond to exchange names.
* `name`: This is a string literal containing the human-readable exchange name.
* `countries`: An array of string literals of 2-symbol ISO country codes, where the exchange is operating from.
* `urls['api']`: The single string literal base URL for API calls or an associative array of separate URLs for private and public APIs.
* `urls['www']`: The main HTTP website URL.
* `urls['doc']`: A single string URL link to original documentation for exchange API on their website or an array of links to docs.
* `version`: A string literal containing version identifier for current exchange API. The ccxt library will append this version string to the API Base URL upon each request. You don't have to modify it, unless you are implementing a new exchange API. The version identifier is a usually a numeric string starting with a letter 'v' in some cases, like v1.1. Do not override it unless you are implementing your own new crypto exchange class.
* `api`: An associative array containing a definition of all API endpoints exposed by a crypto exchange. The API definition is used by ccxt to automatically construct callable instance methods for each available endpoint.
* `has`: This is an associative array of exchange capabilities (e.g `fetchTickers`, `fetchOHLCV` or `CORS`).
* `timeframes`: An associative array of timeframes, supported by the fetchOHLCV method of the exchange. This is only populated when `has['fetchOHLCV']` property is true.
* `timeout`: A timeout in milliseconds for a request-response roundtrip (default timeout is 10000 ms = 10 seconds). If the response is not received in that time, the library will throw an `RequestTimeout` exception. You can leave the default timeout value or set it to a reasonable value. Hanging forever with no timeout is not your option, for sure. You don't have to override this option in general case.
* `rateLimit`: The rate limit in milliseconds. This value represents the number of milliseconds to wait between consecutive requests to stay within the exchange's rate limits. For example, if `rateLimit` is 1000, it means 1 request per second is allowed. The built-in rate-limiter is enabled by default and can be turned off by setting the `enableRateLimit` property to false.
* `enableRateLimit`: A boolean (true/false) value that enables the built-in rate limiter and throttles consecutive requests. This setting is `true` (enabled) by default. **The user is required to implement own [rate limiting](#rate-limit) or leave the built-in rate limiter enabled to avoid being banned from the exchange**.
* `userAgent`: An object to set HTTP User-Agent header to. The ccxt library will set its User-Agent by default. Some exchanges may not like it. If you are having difficulties getting a reply from an exchange and want to turn User-Agent off or use the default one, set this value to false, undefined, or an empty string. The value of `userAgent` may be overrided by HTTP `headers` property below.
* `headers`: An associative array of HTTP headers and their values. Default value is empty `{}`. All headers will be prepended to all requests. If the `User-Agent` header is set within `headers`, it will override whatever value is set in the `userAgent` property above.
* `verbose`: A boolean flag indicating whether to log HTTP requests to stdout (verbose flag is false by default). Python people have an alternative way of DEBUG logging with a standard pythonic logger, which is enabled by adding these two lines to the beginning of their code:
```python
import logging
logging.basicConfig(level=logging.DEBUG)
```
* `returnResponseHeaders`: If set to `true`, the HTTP response headers from the exchange will be included in the `responseHeaders` property inside the `info` field of the returned result for REST API calls. This can be useful for accessing metadata such as rate limit information or exchange-specific headers. By default, this is `false` and headers are not included in the response. Note: it's only supported when response is an object and not a list or string
* `markets`: An associative array of markets indexed by common trading pairs or symbols. Markets should be loaded prior to accessing this property. Markets are unavailable until you call the `loadMarkets() / load_markets()` method on exchange instance.
* `symbols`: A non-associative array (a list) of symbols available with an exchange, sorted in alphabetical order. These are the keys of the `markets` property. Symbols are loaded and reloaded from markets. This property is a convenient shorthand for all market keys.
* `currencies`: An associative array (a dict) of currencies by codes (usually 3 or 4 letters) available with an exchange. Currencies are loaded and reloaded from markets.
* `markets_by_id`: An associative array of arrays of markets indexed by exchange-specific ids. Typically a length one array unless there are multiple markets with the same marketId. Markets should be loaded prior to accessing this property.
* `apiKey`: This is your public API key string literal. Most exchanges require [API keys setup](#api-keys-setup).
* `secret`: Your private secret API key string literal. Most exchanges require this as well together with the apiKey.
* `password`: A string literal with your password/phrase. Some exchanges require this parameter for trading, but most of them don't.
* `uid`: A unique id of your account. This can be a string literal or a number. Some exchanges also require this for trading, but most of them don't.
* `requiredCredentials`: A unified associative dictionary that shows which of the above API credentials are required for sending private API calls to the underlying exchange (an exchange may require a specific set of keys).
* `options`: An exchange-specific associative dictionary containing special keys and options that are accepted by the underlying exchange and supported in CCXT.
* `precisionMode`: The exchange decimal precision counting mode, read more about [Precision And Limits](#precision-and-limits)
* For proxies - `proxyUrl`, `httpUrl`, `httpsUrl`, `socksProxy`, `wsProxy`, `wssProxy`, `wsSocksProxy` : An url of specific proxy. See the [Proxy](#proxy) section for more details.
See this section on [Overriding exchange properties](#overriding-exchange-properties-upon-instantiation).
#### Exchange Metadata [#exchange-metadata]
* `has`: An assoc-array containing flags for exchange capabilities, including the following:
```javascript
'has': {
'CORS': false, // has Cross-Origin Resource Sharing enabled (works from browser) or not
// unified methods availability flags (can be true, false, or 'emulated'):
'cancelOrder': true,
'createDepositAddress': false,
'createOrder': true,
'fetchBalance': true,
'fetchCanceledOrders': false,
'fetchClosedOrder': false,
'fetchClosedOrders': false,
'fetchCurrencies': false,
'fetchDepositAddress': false,
'fetchMarkets': true,
'fetchMyTrades': false,
'fetchOHLCV': false,
'fetchOpenOrder': false,
'fetchOpenOrders': false,
'fetchOrder': false,
'fetchOrderBook': true,
'fetchOrders': false,
'fetchStatus': 'emulated',
'fetchTicker': true,
'fetchTickers': false,
'fetchBidsAsks': false,
'fetchTrades': true,
'withdraw': false,
...
}
```
The meaning of each flag showing availability of this or that method is:
* a value of `undefined` / `None` / `null` means the method is not currently implemented in ccxt (either ccxt has not unified it yet or the method isn't natively available from the exchange API)
* boolean `false` specifically means that the endpoint isn't natively available from the exchange API
* boolean `true` means the endpoint is natively available from the exchange API and unified in the ccxt library
* `'emulated'` string means the endpoint isn't natively available from the exchange API but reconstructed (as much as possible) by the ccxt library from other available true-methods
For a complete list of all exchanges and their supported methods, please, refer to this example: [https://github.com/ccxt/ccxt/blob/master/examples/js/exchange-capabilities.js](https://github.com/ccxt/ccxt/blob/master/examples/js/exchange-capabilities.js)
## Rate Limit [#rate-limit]
Exchanges usually impose what is called a *rate limit*. Exchanges will remember and track your user credentials and your IP address and will not allow you to query the API too frequently. They balance their load and control traffic congestion to protect API servers from (D)DoS and misuse.
**WARNING: Stay under the rate limit to avoid ban!**
Most exchanges allow **up to 1 or 2 requests per second**. Exchanges may temporarily restrict your access to their API or ban you for some period of time if you are too aggressive with your requests.
**The `exchange.rateLimit` property is set to a safe default which is sub-optimal. Some exchanges may have varying rate limits for different endpoints. It is up to the user to tweak `rateLimit` according to application-specific purposes.**
### What the rateLimit number means [#what-the-ratelimit-number-means]
`exchange.rateLimit` is **a number of milliseconds**. It is the pause the built-in throttler keeps between requests.
Requests are not all equal — each endpoint has a *cost* (also called *weight*). A cheap endpoint has a cost of 1, a heavy one might cost 20. The rule is simple:
```
pause before a request = rateLimit × cost of that request
```
So with `rateLimit = 50`, a cost-1 request waits 50 ms, and a cost-20 request waits 1000 ms.
To pick the right value, start from the exchange's published limit. Say an exchange allows 12000 units of weight per minute — that is one unit every `60000 / 12000 = 5` ms, so `rateLimit = 5`. Going the other way, your effective request rate is `1000 / (rateLimit × cost)` requests per second.
Keep in mind this number only controls the pacing on your side. Exchanges also apply their own per-endpoint, per-account and burst rules that one number cannot express — that is why the shipped default is conservative and why tuning `rateLimit` for your workload is up to you.
The CCXT library has built-in experimental rate-limiter algorithms that will do the necessary throttling in background transparently to the user. **WARNING: users are responsible for at least some type of rate-limiting: either by implementing a custom algorithm or by doing it with the built-in rate-limiter.**
CCXT has the following built-in rate-limiting algorithms:
* **Leaky Bucket (default)**: Works by queueing requests and releasing them at a steady, fixed rate. Bursts of requests are smoothed out over time rather than executed immediately, which helps prevent hitting exchange rate limits while still allowing short spikes in activity to be handled gracefully.
* **Window-Based (optional)**: If the user provides the `{ 'rateLimiterAlgorithm': 'rollingWindow' }` option, ccxt switches from the leaky bucket model to a window-based rate limiter (the size of the window can be customized by providing `rollingWindowSize: X0000`, CCXT uses 60s as the default windowSize). A window-based limiter enforces a maximum number of requests within a fixed time window (for example, N requests per X milliseconds). Once the limit is reached, further requests are delayed until the current window expires.
You can turn on/off the built-in rate-limiter with `.enableRateLimit` property, like so:
JavaScript
Python
PHP
Go
C#
Java
```javascript
// enable built-in rate limiting upon instantiation of the exchange
const exchange = new ccxt.bitfinex ({
// 'enableRateLimit': true, // enabled by default
})
// or switch the built-in rate-limiter on or off later after instantiation
exchange.enableRateLimit = true // enable
exchange.enableRateLimit = false // disable
```
```python
# enable built-in rate limiting upon instantiation of the exchange
exchange = ccxt.bitfinex({
# 'enableRateLimit': True, # enabled by default
})
# or switch the built-in rate-limiter on or off later after instantiation
exchange.enableRateLimit = True # enable
exchange.enableRateLimit = False # disable
```
```php
// enable built-in rate limiting upon instantiation of the exchange
$exchange = new \ccxt\bitfinex (array (
// 'enableRateLimit' => true, // enabled by default
));
// or switch the built-in rate-limiter on or off later after instantiation
$exchange->enableRateLimit = true; // enable
$exchange->enableRateLimit = false; // disable
```
```go
// enable built-in rate limiting upon instantiation of the exchange
exchange := ccxt.NewBitfinex(nil) // enabled by default
// or switch the built-in rate-limiter on or off later after instantiation
exchange.EnableRateLimit = true // enable
exchange.EnableRateLimit = false // disable
```
```csharp
// enable built-in rate limiting upon instantiation of the exchange
var exchange = new Bitfinex(); // enabled by default
// or switch the built-in rate-limiter on or off later after instantiation
exchange.enableRateLimit = true; // enable
exchange.enableRateLimit = false; // disable
```
```java
// enabled by default
Exchange exchange = Exchange.dynamicallyCreateInstance("bitfinex", null);
exchange.enableRateLimit = true; // enable
exchange.enableRateLimit = false; // disable
```
In case your calls hit a rate limit or get nonce errors, the ccxt library will throw an `InvalidNonce` exception, or, in some cases, one of the following types:
* `DDoSProtection`
* `ExchangeNotAvailable`
* `ExchangeError`
* `InvalidNonce`
A later retry is usually enough to handle that.
### Notes On Rate Limiter [#notes-on-rate-limiter]
#### One Rate Limiter Per Each Exchange Instance [#one-rate-limiter-per-each-exchange-instance]
The rate limiter is a property of the exchange instance, in other words, each exchange instance has its own rate limiter that is not aware of the other instances. In many cases the user should reuse the same exchange instance throughout the program. Do not use multiple instances of the same exchange with the same API keypair from the same IP address.
```javascript
// DO NOT DO THIS!
const binance1 = new ccxt.binance ()
const binance2 = new ccxt.binance ()
const binance3 = new ccxt.binance ()
while (true) {
const result = await Promise.all ([
binance1.fetchOrderBook ('BTC/USDT'),
binance2.fetchOrderBook ('ETH/USDT'),
binance3.fetchOrderBook ('ETH/BTC'),
])
console.log (result)
}
```
Reuse the exchange instance as much as possible as shown below:
```javascript
// DO THIS INSTEAD:
const binance = new ccxt.binance ()
while (true) {
const result = await Promise.all ([
binance.fetchOrderBook ('BTC/USDT'),
binance.fetchOrderBook ('ETH/USDT'),
binance.fetchOrderBook ('ETH/BTC'),
])
console.log (result)
}
```
Since the rate limiter belongs to the exchange instance, destroying the exchange instance will destroy the rate limiter as well. Among the most common pitfalls with the rate limiting is creating and dropping the exchange instance over and over again. If in your program you are creating and destroying the exchange instance (say, inside a function that is called multiple times), then you are effectively resetting the rate limiter over and over and that will eventually break the rate limits. If you are recreating the exchange instance every time instead of reusing it, CCXT will try to load the markets every time. Therefore, you will force-load the markets over and over as explained in the [Loading Markets](#loading-markets) section. Abusing the markets endpoint will eventually break the rate limiter as well.
```javascript
// DO NOT DO THIS!
async function tick () {
const exchange = new ccxt.binance ()
const response = await exchange.fetchOrderBook ('BTC/USDT')
// ... some processing here ...
return response
}
while (true) {
const result = await tick ()
console.log (result)
}
```
Do not break this rule unless you really understand the inner workings of the rate-limiter and you are 100% sure you know what you're doing. In order to stay safe always reuse the exchange instance throughout your functions and methods callchain like shown below:
```javascript
// DO THIS INSTEAD:
async function tick (exchange) {
const response = await exchange.fetchOrderBook ('BTC/USDT')
// ... some processing here ...
return response
}
const exchange = new ccxt.binance ()
while (true) {
const result = await tick (exchange)
console.log (result)
}
```
### DDoS Protection By Cloudflare / Incapsula [#ddos-protection-by-cloudflare--incapsula]
Some exchanges are [DDoS](https://en.wikipedia.org/wiki/Denial-of-service_attack)-protected by [Cloudflare](https://www.cloudflare.com) or [Incapsula](https://www.incapsula.com). Your IP can get temporarily blocked during periods of high load. Sometimes they even restrict whole countries and regions. In that case their servers usually return a page that states a HTTP 40x error or runs an AJAX test of your browser / captcha test and delays the reload of the page for several seconds. Then your browser/fingerprint is granted access temporarily and gets added to a whitelist or receives a HTTP cookie for further use.
The most common symptoms for a DDoS protection problem, rate-limiting problem or for a location-based filtering issue:
* Getting `RequestTimeout` exceptions with all types of exchange methods
* Catching `ExchangeError` or `ExchangeNotAvailable` with HTTP error codes 400, 403, 404, 429, 500, 501, 503, etc..
* Having DNS resolving issues, SSL certificate issues and low-level connectivity issues
* Getting a template HTML page instead of JSON from the exchange
If you encounter DDoS protection errors and cannot reach a particular exchange then:
* use a [proxy](#proxy) (this is less responsive, though)
* ask the exchange support to add you to a whitelist
* try an alternative IP within a different geographic region
* run your software in a distributed network of servers
* run your software in close proximity to the exchange (same country, same city, same datacenter, same server rack, same server)
* ...
## Maximum Requests capacity [#maximum-requests-capacity]
In asynchronous programming, CCXT allows you to schedule an unlimited number of requests. However, there's a limit on the queue length which is by default set to 1000 concurrent requests max. If you attempt to enqueue more than that, you will encounter the error: "throttle queue is over maxCapacity".
In most cases, having so many pending tasks indicates suboptimal design, as new requests will be delayed until the existing tasks complete.
That said, users who wish to bypass this restriction can increase the default maxCapacity during instantiation as shown below:
```
ex = ccxt.binance({'options': {'maxRequestsQueue': 9999}})
```
# Markets [#markets]
* [Currency Structure](#currency-structure)
* [Market Structure](#market-structure)
* [Precision And Limits](#precision-and-limits)
* [Loading Markets](#loading-markets)
* [Symbols And Market Ids](#symbols-and-market-ids)
* [Market Cache Force Reload](#market-cache-force-reload)
Each exchange is a place for trading some kinds of valuables. The exchanges may use differing terms to call them: *"a currency"*, *"an asset"*, *"a coin"*, *"a token"*, *"stock"*, *"commodity"*, *"crypto"*, "fiat", etc. A place for trading one asset for another is usually called *"a market"*, *"a symbol"*, *"a trading pair"*, *"a contract"*, etc.
In terms of the ccxt library, every exchange offers multiple **markets** within itself. Each market is defined by two or more **currencies**. The set of markets differs from exchange to exchange opening possibilities for cross-exchange and cross-market arbitrage.
## Currency Structure [#currency-structure]
```javascript
{
'id': 'btc', // string literal for referencing within an exchange
'code': 'BTC', // uppercase unified string literal code of the currency
'name': 'Bitcoin', // string, human-readable name, if specified
'active': true, // boolean, currency status (tradeable and withdrawable)
'fee': 0.123, // withdrawal fee, flat
'precision': 8, // number of decimal digits "after the dot" (depends on exchange.precisionMode)
'deposit': true // boolean, deposits are available
'withdraw': true // boolean, withdraws are available
'limits': { // value limits when placing orders on this market
'amount': {
'min': 0.01, // order amount should be > min
'max': 1000, // order amount should be < max
},
'withdraw': { ... }, // withdrawal limits
'deposit': {...},
},
'networks': {...} // network structures indexed by unified network identifiers (ERC20, TRC20, BSC, etc)
'info': { ... }, // the original unparsed currency info from the exchange
}
```
Each currency is an associative array (aka dictionary) with the following keys:
* `id`. The string or numeric ID of the currency within the exchange. Currency ids are used inside exchanges internally to identify coins during the request/response process.
* `code`. An uppercase string code representation of a particular currency. Currency codes are used to reference currencies within the ccxt library (explained below).
* `name`. A human-readable name of the currency (can be a mix of uppercase & lowercase characters).
* `fee`. The withdrawal fee value as specified by the exchange. In most cases it means a flat fixed amount paid in the same currency. If the exchange does not specify it via public endpoints, the `fee` can be `undefined/None/null` or missing.
* `active`. A boolean indicating whether trading or funding (depositing or withdrawing) for this currency is currently possible, more about it here: [`active` status](#active-status).
* `info`. An associative array of non-common market properties, including fees, rates, limits and other general market information. The internal info array is different for each particular market, its contents depend on the exchange.
* `precision`. Precision accepted in values by exchanges upon referencing this currency. The value of this property depends on [`exchange.precisionMode`](#precision-mode).
* `limits`. The minimums and maximums for amounts (volumes), withdrawals and deposits.
## Network Structure [#network-structure]
```javascript
{
'id': 'tron', // string literal for referencing within an exchange
'network': 'TRC20' // unified network
'name': 'Tron Network', // string, human-readable name, if specified
'active': true, // boolean, currency status (tradeable and withdrawable)
'fee': 0.123, // withdrawal fee, flat
'precision': 8, // number of decimal digits "after the dot" (depends on exchange.precisionMode)
'deposit': true // boolean, deposits are available
'withdraw': true // boolean, withdraws are available
'limits': { // value limits when placing orders on this market
'amount': {
'min': 0.01, // order amount should be > min
'max': 1000, // order amount should be < max
},
'withdraw': { ... }, // withdrawal limits
'deposit': {...}, // deposit limits
},
'info': { ... }, // the original unparsed currency info from the exchange
}
```
Each network is an associative array (aka dictionary) with the following keys:
* `id`. The string or numeric ID of the network within the exchange. Network ids are used inside exchanges internally to identify networks during the request/response process.
* `network`. An uppercase string representation of a particular network. Networks are used to reference networks within the ccxt library.
* `name`. A human-readable name of the network (can be a mix of uppercase & lowercase characters).
* `fee`. The withdrawal fee value as specified by the exchange. In most cases it means a flat fixed amount paid in the same currency. If the exchange does not specify it via public endpoints, the `fee` can be `undefined/None/null` or missing.
* `active`. A boolean indicating whether trading or funding (depositing or withdrawing) for this currency is currently possible, more about it here: [`active` status](#active-status).
* `info`. An associative array of non-common market properties, including fees, rates, limits and other general market information. The internal info array is different for each particular market, its contents depend on the exchange.
* `precision`. Precision accepted in values by exchanges upon referencing this currency. The value of this property depends on [`exchange.precisionMode`](#precision-mode).
* `limits`. The minimums and maximums for amounts (volumes), withdrawals and deposits.
## Market Structure [#market-structure]
```javascript
{
'id': 'btcusd', // string literal for referencing within an exchange
'symbol': 'BTC/USD', // uppercase string literal of a pair of currencies
'base': 'BTC', // uppercase string, unified base currency code, 3 or more letters
'quote': 'USD', // uppercase string, unified quote currency code, 3 or more letters
'baseId': 'btc', // any string, exchange-specific base currency id
'quoteId': 'usd', // any string, exchange-specific quote currency id
'active': true, // boolean, market status
'type': 'spot', // spot for spot, future for expiry futures, swap for perpetual swaps, 'option' for options
'spot': true, // whether the market is a spot market
'margin': true, // whether the market is a margin market
'future': false, // whether the market is a expiring future
'swap': false, // whether the market is a perpetual swap
'option': false, // whether the market is an option contract
'stock': false, // whether the market is for a stock
'contract': false, // whether the market is a future, a perpetual swap, or an option
'settle': 'USDT', // the unified currency code that the contract will settle in, only set if `contract` is true
'settleId': 'usdt', // the currencyId of that the contract will settle in, only set if `contract` is true
'contractSize': 1, // the size of one contract, only used if `contract` is true
'linear': true, // the contract is a linear contract (settled in quote currency)
'inverse': false, // the contract is an inverse contract (settled in base currency)
'expiry': 1641370465121, // the unix expiry timestamp in milliseconds, undefined for everything except market['type'] `future`
'expiryDatetime': '2022-03-26T00:00:00.000Z', // The datetime contract will in iso8601 format
'strike': 4000, // price at which a put or call option can be exercised
'optionType': 'call', // call or put string, call option represents an option with the right to buy and put an option with the right to sell
// note, 'taker' and 'maker' compose extended data for markets, however it might be better to use `fetchTradingFees` for more accuracy
'taker': 0.002, // taker fee rate, 0.002 = 0.2%
'maker': 0.0016, // maker fee rate, 0.0016 = 0.16%
'percentage': true, // whether the taker and maker fee rate is a multiplier or a fixed flat amount
'tierBased': false, // whether the fee depends on your trading tier (your trading volume)
'feeSide': 'get', // string literal can be 'get', 'give', 'base', 'quote', 'other'
'precision': { // number of decimal digits "after the dot"
'price': 8, // integer or float for TICK_SIZE roundingMode, might be missing if not supplied by the exchange
'amount': 8, // integer, might be missing if not supplied by the exchange
'cost': 8, // integer, very few exchanges actually have it
},
'limits': { // value limits when placing orders on this market
'amount': {
'min': 0.01, // order amount should be > min
'max': 1000, // order amount should be < max
},
'price': { ... }, // same min/max limits for the price of the order
'cost': { ... }, // same limits for order cost = price * amount
'leverage': { ... }, // same min/max limits for the leverage of the order
},
'marginModes': {
'cross': false, // whether pair supports cross-margin trading
'isolated': false, // whether pair supports isolated-margin trading
},
'info': { ... }, // the original unparsed market info from the exchange
}
```
Each market is an associative array (aka dictionary) with the following keys:
* `id`. The string or numeric ID of the market or trade instrument within the exchange. Market ids are used inside exchanges internally to identify trading pairs during the request/response process.
* `symbol`. An uppercase string code representation of a particular trading pair or instrument. This is usually written as `BaseCurrency/QuoteCurrency` with a slash as in `BTC/USD`, `LTC/CNY` or `ETH/EUR`, etc. Symbols are used to reference markets within the ccxt library (explained below).
* `base`. A unified uppercase string code of base fiat or crypto currency. This is the standardized currency code that is used to refer to that currency or token throughout CCXT and throughout the Unified CCXT API, it's the language that CCXT understands.
* `quote`. A unified uppercase string code of quoted fiat or crypto currency.
* `baseId`. An exchange-specific id of the base currency for this market, not unified. Can be any string, literally. This is communicated to the exchange using the language the exchange understands.
* `quoteId`. An exchange-specific id of the quote currency, not unified.
* `active`. A boolean indicating whether or not trading this market is currently possible, more about it here: [`active` status](#active-status).
* `maker`. Float, 0.0015 = 0.15%. Maker fees are paid when you provide liquidity to the exchange i.e. you *market-make* an order and someone else fills it. Maker fees are usually lower than taker fees. Fees can be negative, this is very common amongst derivative exchanges. A negative fee means the exchange will pay a rebate (reward) to the user for trading this market (note, 'taker' and 'maker' publicly available fees, not taking into consideration your vip-level/volume/etc. Use [`fetchTradingFees`](#fee-schedule) to get the fees specific to your account).
* `taker`. Float, 0.002 = 0.2%. Taker fees are paid when you *take* liquidity from the exchange and fill someone else's order.
* `percentage`. A boolean true/false value indicating whether `taker` and `maker` are multipliers or fixed flat amounts.
* `tierBased`. A boolean true/false value indicating whether the fee depends on your trading tier (usually, your traded volume over a period of time).
* `info`. An associative array of non-common market properties, including fees, rates, limits and other general market information. The internal info array is different for each particular market, its contents depend on the exchange.
* `precision`. Precision accepted in order values by exchanges upon order placement for price, amount and cost. (The value inside this property depend on the [`exchange.precisionMode`](#precision-mode)).
* `limits`. The minimums and maximums for prices, amounts (volumes) and costs (where cost = price \* amount).
* `optionType`. The type of the option, `call` option represents an option with the right to buy and `put` an option with the right to sell.
* `strike`. Price at which an option can be bought or sold when it is exercised.
* `stock`. A boolean indicating whether the market represents a stock instrument.
## Active Status [#active-status]
The `active` flag is typically used in [`currencies`](#currency-structure) and [`markets`](#market-structure). The exchanges might put a slightly different meaning into it. If a currency is inactive, most of the time all corresponding tickers, orderbooks and other related endpoints return empty responses, all zeroes, no data or outdated information. The user should check if the currency is `active` and [reload markets periodically](#market-cache-force-reload).
Note: the `false` value for the `active` property doesn't always guarantee that all of the possible features like trading, withdrawing or depositing are disabled on the exchange. Likewise, neither the `true` value guarantees that all those features are enabled on the exchange. Check the underlying exchanges' documentation and the code in CCXT for the exact meaning of the `active` flag for this or that exchange. This flag is not yet supported or implemented by all markets and may be missing.
**WARNING! The information about the fee is experimental, unstable and may be partial or not available at all.**
## Precision And Limits [#precision-and-limits]
**Do not confuse `limits` with `precision`!** Precision has nothing to do with min limits. A precision of `0.01` does not necessarily mean that a minimum limit for market is `0.01`. The opposite is also true: a min limit of `0.01` does not necessarily mean a precision is `0.01`.
Examples:
1.
```
market['limits']['amount']['min'] == 0.05 &&
market['precision']['amount'] == 0.0001 &&
market['precision']['price'] == 0.01
```
* The *amount value* should be >= 0.05:
```diff
+ good: 0.05, 0.051, 0.0501, 0.0502, ..., 0.0599, 0.06, 0.0601, ...
- bad: 0.04, 0.049, 0.0499
```
* *Precision of the amount* should be up to 4 digits after dot (0.0001):
```diff
+ good: 0.05, 0.0501, ..., 0.06, ..., 0.0719, ...
- bad: 0.05001, 0.05000, 0.06001
```
* *Precision of the price* should be up to 2 digits after dot (0.01):
```diff
+ good: 1.6, 1.61, 123.01, ..., 1234.56, ...
- bad: 1.601, ..., 123.012, ..., 1234.567
```
*
2. `(market['precision']['amount'] == -1)`
A negative *precision* might only theoretically happen if exchange's `precisionMode` is `SIGNIFICANT_DIGIT` or `DECIMAL_PRECISION`. It means that the amount should be an integer multiple of 10 (to the absolute power specified):
```diff
+ good: 10, 50, ..., 110, ... 1230, ..., 1000000, ..., 1234560, ...
- bad: 9.5, ... 10.1, ..., 11, ... 200.71, ...
```
In case of `-2` the acceptable values would be multiple of `100` (e.g. 100, 200, ... ), and so on.
#### Precision Mode [#precision-mode]
Supported precision modes in `exchange['precisionMode']` are:
* `TICK_SIZE` – almost all exchanges use this precision mode. In this mode, the numbers in `market_or_currency['precision']` designate the minimal precision fractions (floats) for rounding or truncating.
* `SIGNIFICANT_DIGITS` – counts non-zero digits only, some exchanges (`bitfinex` and maybe a few other) implement this mode of counting decimals. With this mode of precision, the numbers in `market_or_currency['precision']` designate the Nth place of the last significant (non-zero) decimal digit after the dot.
* `DECIMAL_PLACES` (**DEPRECATED, CCXT no longer uses this mode anywhere**) – counts all digits. With this mode of precision, the numbers in `market_or_currency['precision']` designate the number of decimal digits after the dot for further rounding or truncation.
### Notes On Precision And Limits [#notes-on-precision-and-limits]
The user is required to stay within all limits and precision! The values of the order should satisfy the following conditions:
* Order `amount` >= `limits['amount']['min']`
* Order `amount` \<= `limits['amount']['max']`
* Order `price` >= `limits['price']['min']`
* Order `price` \<= `limits['price']['max']`
* Order `cost` (`amount * price`) >= `limits['cost']['min']`
* Order `cost` (`amount * price`) \<= `limits['cost']['max']`
* Precision of `amount` must be \<= `precision['amount']`
* Precision of `price` must be \<= `precision['price']`
The above values can be missing with some exchanges that don't provide info on limits from their API or don't have it implemented yet.
### Methods For Formatting Decimals [#methods-for-formatting-decimals]
Each exchange has its own rounding, counting and padding modes.
Supported rounding modes are:
* `ROUND` – will round the last decimal digits to precision
* `TRUNCATE`– will cut off the digits after certain precision
The decimal precision counting mode is available in the `exchange.precisionMode` property.
#### Padding Mode [#padding-mode]
Supported padding modes are:
* `NO_PADDING` – default for most cases
* `PAD_WITH_ZERO` – appends zero characters up to precision
#### Formatting To Precision [#formatting-to-precision]
Most of the time the user does not have to take care of precision formatting, since CCXT will handle that for the user when the user places orders or sends withdrawal requests, if the user follows the rules as described on [Precision And Limits](#precision-and-limits). However, in some cases precision-formatting details may be important, so the following methods may be useful in the userland.
The exchange base class contains the `decimalToPrecision` method to help format values to the required decimal precision with support for different rounding, counting and padding modes.
JavaScript
Python
PHP
Go
C#
Java
```javascript
function decimalToPrecision (x, roundingMode, numPrecisionDigits, countingMode = DECIMAL_PLACES, paddingMode = NO_PADDING)
```
```python
# WARNING! The `decimal_to_precision` method is susceptible to getcontext().prec!
def decimal_to_precision(n, rounding_mode=ROUND, precision=None, counting_mode=DECIMAL_PLACES, padding_mode=NO_PADDING):
```
```php
function decimalToPrecision ($x, $roundingMode = ROUND, $numPrecisionDigits = null, $countingMode = DECIMAL_PLACES, $paddingMode = NO_PADDING)
```
```go
func (this *Exchange) DecimalToPrecision(value any, roundingMode any, numPrecisionDigits any, args ...any) any
```
```csharp
public static string DecimalToPrecision(object x, object roundingMode, object numPrecisionDigits, object countingMode = null, object paddingMode = null)
```
```java
String formattedAmount = exchange.getExchange().amountToPrecision(symbol, amount);
String formattedPrice = exchange.getExchange().priceToPrecision(symbol, price);
```
For examples of how to use the `decimalToPrecision` to format strings and floats, please, see the following files:
* Typescript: [https://github.com/ccxt/ccxt/blob/master/ts/src/test/base/functions/test.number.ts](https://github.com/ccxt/ccxt/blob/master/ts/src/test/base/functions/test.number.ts)
* JavaScript: [https://github.com/ccxt/ccxt/blob/master/js/src/test/base/functions/test.number.js](https://github.com/ccxt/ccxt/blob/master/js/src/test/base/functions/test.number.js)
* Python: [https://github.com/ccxt/ccxt/blob/master/python/ccxt/test/base/test\_number.py](https://github.com/ccxt/ccxt/blob/master/python/ccxt/test/base/test_number.py)
* PHP: [https://github.com/ccxt/ccxt/blob/master/php/test/base/test\_number.php](https://github.com/ccxt/ccxt/blob/master/php/test/base/test_number.php)
**Python WARNING! The `decimal_to_precision` method is susceptible to `getcontext().prec!`**
For users' convenience CCXT base exchange class also implements the following methods:
JavaScript
Python
PHP
Go
C#
Java
```javascript
function amountToPrecision (symbol, amount)
function priceToPrecision (symbol, price)
function costToPrecision (symbol, cost)
function currencyToPrecision (code, amount)
```
```python
def amount_to_precision (symbol, amount):
def price_to_precision (symbol, price):
def cost_to_precision (symbol, cost):
def currency_to_precision (code, amount):
```
```php
function amount_to_precision($symbol, $amount)
function price_to_precision($symbol, $price)
function cost_to_precision($symbol, $cost)
function currency_to_precision($code, $amount)
```
```go
func (this *Exchange) AmountToPrecision(symbol any, amount any) any
func (this *Exchange) PriceToPrecision(symbol any, price any) any
func (this *Exchange) CostToPrecision(symbol any, cost any) any
func (this *Exchange) CurrencyToPrecision(code any, fee any, optionalArgs ...any) any
```
```csharp
public virtual object amountToPrecision(object symbol, object amount)
public virtual object priceToPrecision(object symbol, object price)
public virtual object costToPrecision(object symbol, object cost)
public virtual object currencyToPrecision(object code, object fee, object networkCode = null)
```
```java
String formattedAmount = exchange.getExchange().amountToPrecision(symbol, amount);
String formattedPrice = exchange.getExchange().priceToPrecision(symbol, price);
```
Every exchange has its own precision settings, the above methods will help format those values according to exchange-specific precision rules, in a way that is portable and agnostic of the underlying exchange. In order to make that possible, markets and currencies have to be loaded prior to formatting any values.
**Make sure to [load the markets with `exchange.loadMarkets()`](#loading-markets) before calling these methods!**
For example:
JavaScript
Python
PHP
Go
C#
Java
```javascript
await exchange.loadMarkets ()
const symbol = 'BTC/USDT'
const amount = 1.2345678 // amount in base currency BTC
const price = 87654.321 // price in quote currency USDT
const formattedAmount = exchange.amountToPrecision (symbol, amount)
const formattedPrice = exchange.priceToPrecision (symbol, price)
console.log (formattedAmount, formattedPrice)
```
```python
exchange.load_markets()
symbol = 'BTC/USDT'
amount = 1.2345678 # amount in base currency BTC
price = 87654.321 # price in quote currency USDT
formatted_amount = exchange.amount_to_precision(symbol, amount)
formatted_price = exchange.price_to_precision(symbol, price)
print(formatted_amount, formatted_price)
```
```php
$exchange->load_markets();
$symbol = 'BTC/USDT';
$amount = 1.2345678; // amount in base currency BTC
$price = 87654.321; // price in quote currency USDT
$formatted_amount = $exchange->amount_to_precision($symbol, $amount);
$formatted_price = $exchange->price_to_precision($symbol, $price);
echo $formatted_amount, " ", $formatted_price, "\n";
```
```go
exchange.LoadMarkets()
symbol := "BTC/USDT"
amount := 1.2345678 // amount in base currency BTC
price := 87654.321 // price in quote currency USDT
formattedAmount := exchange.AmountToPrecision(symbol, amount)
formattedPrice := exchange.PriceToPrecision(symbol, price)
fmt.Println(formattedAmount, formattedPrice)
```
```csharp
await exchange.LoadMarkets();
var symbol = "BTC/USDT";
var amount = 1.2345678; // amount in base currency BTC
var price = 87654.321; // price in quote currency USDT
var formattedAmount = exchange.amountToPrecision(symbol, amount);
var formattedPrice = exchange.priceToPrecision(symbol, price);
Console.WriteLine(formattedAmount + " " + formattedPrice);
```
```java
exchange.loadMarkets();
String symbol = "BTC/USDT";
double amount = 1.2345678;
double price = 87654.321;
String formattedAmount = exchange.getExchange().amountToPrecision(symbol, amount);
String formattedPrice = exchange.getExchange().priceToPrecision(symbol, price);
System.out.println(formattedAmount + " " + formattedPrice);
```
More practical examples that describe the behavior of `exchange.precisionMode`:
```javascript
// case A
exchange.precisionMode = ccxt.DECIMAL_PLACES
market = exchange.market (symbol)
market['precision']['amount'] === 8 // up to 8 decimals after the dot
exchange.amountToPrecision (symbol, 0.123456789) === 0.12345678
exchange.amountToPrecision (symbol, 0.0000000000123456789) === 0.0000000 === 0.0
```
```javascript
// case B
exchange.precisionMode = ccxt.TICK_SIZE
market = exchange.market (symbol)
market['precision']['amount'] === 0.00000001 // up to 0.00000001 precision
exchange.amountToPrecision (symbol, 0.123456789) === 0.12345678
exchange.amountToPrecision (symbol, 0.0000000000123456789) === 0.00000000 === 0.0
```
```javascript
// case C
exchange.precisionMode = ccxt.SIGNIFICANT_DIGITS
market = exchange.market (symbol)
market['precision']['amount'] === 8 // up to 8 significant non-zero digits
exchange.amountToPrecision (symbol, 0.0000000000123456789) === 0.000000000012345678
exchange.amountToPrecision (symbol, 123.4567890123456789) === 123.45678
```
## Loading Markets [#loading-markets]
In most cases you are required to load the list of markets and trading symbols for a particular exchange prior to accessing other API methods. If you forget to load markets the ccxt library will do that automatically upon your first call to the unified API. It will send two HTTP requests, first for markets and then the second one for other data, sequentially. For that reason, your first call to a unified CCXT API method like fetchTicker, fetchBalance, etc will take more time, than the consequent calls, since it has to do more work loading the market information from the exchange API. See [Notes On Rate Limiter](#notes-on-rate-limiter) for more details.
In order to load markets manually beforehand call the `loadMarkets ()` / `load_markets ()` method on an exchange instance. It returns an associative array of markets indexed by trading symbol. If you want more control over the execution of your logic, preloading markets by hand is recommended.
JavaScript
Python
PHP
Go
C#
Java
```javascript
(async () => {
let kraken = new ccxt.kraken ()
let markets = await kraken.loadMarkets ()
console.log (kraken.id, markets)
}) ()
```
```python
okcoin = ccxt.okcoin()
markets = okcoin.load_markets()
print(okcoin.id, markets)
```
```php
$id = 'htx';
$exchange = '\\ccxt\\' . $id;
$htx = new $exchange();
$markets = $htx->load_markets();
var_dump($htx->id, $markets);
```
```go
kraken := ccxt.NewKraken(nil)
markets, err := kraken.LoadMarkets()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(kraken.GetId(), len(markets))
```
```csharp
var kraken = new Kraken();
var markets = await kraken.LoadMarkets();
Console.WriteLine(kraken.id + " " + markets.Count + " markets");
```
```java
Kraken kraken = new Kraken();
Map markets = kraken.loadMarkets(false);
System.out.println(kraken.id + " " + markets.size() + " markets");
```
Apart from the market info, the `loadMarkets()` call will also load the currencies from the exchange and will cache the info in the `.markets` and the `.currencies` properties respectively.
The user can also bypass the cache and call unified methods for fetching that information from the exchange endpoints directly, `fetchMarkets()` and `fetchCurrencies()`, though using these methods is not recommended for end-users. The recommended way to preload markets is by calling the `loadMarkets()` unified method. However, new exchange integrations are required to implement these methods if the underlying exchange has the corresponding API endpoints.
### Sharing Markets Between Exchange Instances [#sharing-markets-between-exchange-instances]
To optimize memory usage and reduce redundant API calls, you can share market data between multiple instances of the same exchange. This is especially useful when creating multiple exchange instances or when you want to reuse market data that has already been loaded.
JavaScript
Python
PHP
Go
C#
Java
```javascript
(async () => {
// Create first exchange instance and load markets
let exchange1 = new ccxt.binance()
await exchange1.loadMarkets()
// Create second exchange instance
let exchange2 = new ccxt.binance()
// Share markets from first instance to second using the setMarketsFromExchange method
exchange2.setMarketsFromExchange(exchange1)
// Now exchange2 can use the shared markets without loading them
console.log(exchange2.symbols) // Available immediately
// When calling loadMarkets on exchange2, it will use cached markets
await exchange2.loadMarkets() // No API call, uses shared markets
})()
```
```python
# Create first exchange instance and load markets
exchange1 = ccxt.binance()
exchange1.load_markets()
# Create second exchange instance
exchange2 = ccxt.binance()
# Share markets from first instance to second using the setMarketsFromExchange method
exchange2.set_markets_from_exchange(exchange1)
# Now exchange2 can use the shared markets without loading them
print(exchange2.symbols) # Available immediately
# When calling load_markets on exchange2, it will use cached markets
exchange2.load_markets() # No API call, uses shared markets
```
```php
// Create first exchange instance and load markets
$exchange1 = new \ccxt\binance();
$exchange1->load_markets();
// Create second exchange instance
$exchange2 = new \ccxt\binance();
// Share markets from first instance to second using the setMarketsFromExchange method
$exchange2->set_markets_from_exchange($exchange1);
// Now exchange2 can use the shared markets without loading them
var_dump($exchange2->symbols); // Available immediately
// When calling load_markets on exchange2, it will use cached markets
$exchange2->load_markets(); // No API call, uses shared markets
```
```go
// Create first exchange instance and load markets
binance1 := ccxt.NewBinance(nil)
markets, err := binance1.LoadMarkets()
if err != nil {
// Handle error
}
// Create second exchange instance
binance2 := ccxt.NewBinance(nil)
// Share markets from first instance to second using the SetMarketsFromExchange method
binance2.SetMarketsFromExchange(binance1)
// Now binance2 can use the shared markets without loading them
fmt.Printf("Symbols loaded: %d\n", len(binance2.GetSymbols()))
```
```csharp
// Create first exchange instance and load markets
var binance1 = new Binance();
await binance1.LoadMarkets();
// Create second exchange instance
var binance2 = new Binance();
// Share markets from first instance to second using the setMarketsFromExchange method
binance2.setMarketsFromExchange(binance1);
// Now binance2 can use the shared markets without loading them
Console.WriteLine($"Symbols loaded: {binance2.symbols?.Count ?? 0}");
```
```java
Exchange exchange1 = Exchange.dynamicallyCreateInstance("binance", null);
exchange1.loadMarkets().join();
Exchange exchange2 = Exchange.dynamicallyCreateInstance("binance", null);
// share markets from exchange1 to exchange2
exchange2.setMarketsFromExchange(exchange1);
```
**Benefits of Market Sharing:**
* **Memory Efficiency**: Multiple exchange instances share the same market objects in memory
* **Performance**: Eliminates redundant API calls for market data
* **Resource Conservation**: Reduces network requests and API rate limit usage
* **Persistence**: Market data remains available even if individual exchange instances are destroyed
**Alternative Simple Assignment:**
If you prefer direct property assignment, you can also share markets by directly assigning the `markets` property:
```javascript
// Simple direct assignment (ensure both exchanges are of same type)
exchange2.markets = exchange1.markets;
exchange2.symbols = exchange1.symbols; // Also copy symbols for full functionality
```
However, using the `setMarketsFromExchange()` method is recommended as it:
* Validates that both exchanges are of the same type
* Ensures all related market data is properly copied
* Provides better error handling
**Important Notes:**
* Only share markets between instances of the same exchange type
* Market sharing is most effective when both instances use the same API credentials and configuration
* The shared market objects will persist in memory as long as at least one reference exists
* Both the `setMarketsFromExchange()` method and direct assignment create shared references, not copies
## Symbols And Market Ids [#symbols-and-market-ids]
A currency code is a code of three to five letters, like `BTC`, `ETH`, `USD`, `GBP`, `CNY`, `JPY`, `DOGE`, `RUB`, `ZEC`, `XRP`, `XMR`, etc. Some exchanges have exotic currencies with longer codes.
A symbol is usually an uppercase string literal name of a pair of traded currencies with a slash in between. The first currency before the slash is usually called *base currency*, and the one after the slash is called *quote currency*. Examples of a symbol are: `BTC/USD`, `DOGE/LTC`, `ETH/EUR`, `DASH/XRP`, `BTC/CNY`, `ZEC/XMR`, `ETH/JPY`.
Market ids are used during the REST request-response process to reference trading pairs within exchanges. The set of market ids is unique per exchange and cannot be used across exchanges. For example, the BTC/USD pair/market may have different ids on various popular exchanges, like `btcusd`, `BTCUSD`, `XBTUSD`, `btc/usd`, `42` (numeric id), `BTC/USD`, `Btc/Usd`, `tBTCUSD`, `XXBTZUSD`. You don't need to remember or use market ids, they are there for internal HTTP request-response purposes inside exchange implementations.
The ccxt library abstracts uncommon market ids to symbols, standardized to a common format. Symbols aren't the same as market ids. Every market is referenced by a corresponding symbol. Symbols are common across exchanges which makes them suitable for arbitrage and many other things.
Sometimes the user might notice a symbol like `'XBTM18'` or `'.XRPUSDM20180101'` or some other *"exotic/rare symbols"*. The symbol is **not required** to have a slash or to be a pair of currencies. The string in the symbol really depends on the type of the market (whether it is a spot market or a futures market, a darkpool market or an expired market, etc). Attempting to parse the symbol string is highly discouraged, one should not rely on the symbol format, it is recommended to use market properties instead.
Market structures are indexed by symbols and ids. The base exchange class also has builtin methods for accessing markets by symbols. Most API methods require a symbol to be passed in their first argument. You are often required to specify a symbol when querying current prices, making orders, etc.
Most of the time users will be working with market symbols. You will get a standard userland exception if you access non-existent keys in these dicts.
### Methods For Markets And Currencies [#methods-for-markets-and-currencies]
JavaScript
Python
PHP
Go
C#
Java
```javascript
(async () => {
console.log (await exchange.loadMarkets ())
let btcusd1 = exchange.markets['BTC/USD'] // get market structure by symbol
let btcusd2 = exchange.market ('BTC/USD') // same result in a slightly different way
let btcusdId = exchange.marketId ('BTC/USD') // get market id by symbol
let symbols = exchange.symbols // get an array of symbols
let symbols2 = Object.keys (exchange.markets) // same as previous line
console.log (exchange.id, symbols) // print all symbols
let currencies = exchange.currencies // a dictionary of currencies
let bitfinex = new ccxt.bitfinex ()
await bitfinex.loadMarkets ()
bitfinex.markets['BTC/USD'] // symbol → market (get market by symbol)
bitfinex.markets_by_id['XRPBTC'][0] // id → market (get market by id)
bitfinex.markets['BTC/USD']['id'] // symbol → id (get id by symbol)
bitfinex.markets_by_id['XRPBTC'][0]['symbol'] // id → symbol (get symbol by id)
}) ()
```
```python
print(exchange.load_markets())
etheur1 = exchange.markets['ETH/EUR'] # get market structure by symbol
etheur2 = exchange.market('ETH/EUR') # same result in a slightly different way
etheurId = exchange.market_id('ETH/EUR') # get market id by symbol
symbols = exchange.symbols # get a list of symbols
symbols2 = list(exchange.markets.keys()) # same as previous line
print(exchange.id, symbols) # print all symbols
currencies = exchange.currencies # a dictionary of currencies
kraken = ccxt.kraken()
kraken.load_markets()
kraken.markets['BTC/USD'] # symbol → market (get market by symbol)
kraken.markets_by_id['XXRPZUSD'][0] # id → market (get market by id)
kraken.markets['BTC/USD']['id'] # symbol → id (get id by symbol)
kraken.markets_by_id['XXRPZUSD'][0]['symbol'] # id → symbol (get symbol by id)
```
```php
$var_dump($exchange->load_markets());
$dashcny1 = $exchange->markets['DASH/CNY']; // get market structure by symbol
$dashcny2 = $exchange->market('DASH/CNY'); // same result in a slightly different way
$dashcnyId = $exchange->market_id('DASH/CNY'); // get market id by symbol
$symbols = $exchange->symbols; // get an array of symbols
$symbols2 = array_keys($exchange->markets); // same as previous line
var_dump($exchange->id, $symbols); // print all symbols
$currencies = $exchange->currencies; // an associative array of currencies
$okcoin = '\\ccxt\\okcoin';
$okcoin = new $okcoin();
$okcoin->load_markets();
$okcoin->markets['BTC/USD']; // symbol → market (get market by symbol)
$okcoin->markets_by_id['btc_usd'][0]; // id → market (get market by id)
$okcoin->markets['BTC/USD']['id']; // symbol → id (get id by symbol)
$okcoin->markets_by_id['btc_usd'][0]['symbol']; // id → symbol (get symbol by id)
```
```go
exchange := ccxt.NewKraken(nil)
exchange.LoadMarkets()
btcUsd := exchange.Market("BTC/USD") // get market structure by symbol
marketId := exchange.MarketId("BTC/USD") // get market id by symbol
symbols := exchange.GetSymbols() // get a list of symbols
fmt.Println(exchange.GetId(), symbols) // print all symbols
fmt.Println(btcUsd, marketId)
```
```csharp
var exchange = new Kraken();
await exchange.LoadMarkets();
var btcUsd = exchange.market("BTC/USD"); // symbol → market (get market by symbol)
var marketId = exchange.marketId("BTC/USD"); // symbol → id (get market id by symbol)
var symbols = exchange.symbols; // get a list of symbols
Console.WriteLine(exchange.id + " " + string.Join(", ", symbols)); // print all symbols
```
```java
Kraken exchange = new Kraken();
Map markets = exchange.loadMarkets(false);
MarketInterface btcUsd = markets.get("BTC/USD"); // symbol → market
String marketId = btcUsd.id; // symbol → id
```
### Naming Consistency [#naming-consistency]
There is a bit of term ambiguity across various exchanges that may cause confusion among newcoming traders. Some exchanges call markets as *pairs*, whereas other exchanges call symbols as *products*. In terms of the ccxt library, each exchange contains one or more trading markets. Each market has an id and a symbol. Most symbols are pairs of base currency and quote currency.
` → Markets → Symbols → Currencies`
Historically various symbolic names have been used to designate same trading pairs. Some cryptocurrencies (like Dash) even changed their names more than once during their ongoing lifetime. For consistency across exchanges the ccxt library will perform the following known substitutions for symbols and currencies:
* `XBT → BTC`: `XBT` is newer but `BTC` is more common among exchanges and sounds more like bitcoin ([read more](https://www.google.ru/search?q=xbt+vs+btc)).
* `BCC → BCH`: The Bitcoin Cash fork is often called with two different symbolic names: `BCC` and `BCH`. The name `BCC` is ambiguous for Bitcoin Cash, it is confused with BitConnect. The ccxt library will convert `BCC` to `BCH` where it is appropriate (some exchanges and aggregators confuse them).
* `DRK → DASH`: `DASH` was Darkcoin then became Dash ([read more](https://minergate.com/blog/dashcoin-and-dash/)).
* `BCHABC → BCH`: On November 15 2018 Bitcoin Cash forked the second time, so, now there is `BCH` (for BCH ABC) and `BSV` (for BCH SV).
* `BCHSV → BSV`: This is a common substitution mapping for the Bitcoin Cash SV fork (some exchanges call it `BSV`, others call it `BCHSV`, we use the former).
* `DSH → DASH`: Try not to confuse symbols and currencies. The `DSH` (Dashcoin) is not the same as `DASH` (Dash). Some exchanges have `DASH` labelled inconsistently as `DSH`, the ccxt library does a correction for that as well (`DSH → DASH`), but only on certain exchanges that have these two currencies confused, whereas most exchanges have them both correct. Just remember that `DASH/BTC` is not the same as `DSH/BTC`.
* `XRB` → `NANO`: `NANO` is the newer code for RaiBlocks, thus, CCXT unified API will replace the older `XRB` with `NANO` where needed. [https://hackernoon.com/nano-rebrand-announcement-9101528a7b76](https://hackernoon.com/nano-rebrand-announcement-9101528a7b76)
* `USD` → `USDT`: Some exchanges, like Bitfinex, HitBTC and a few other name the currency as `USD` in their listings, but those markets are actually trading `USDT`. The confusion can come from a 3-letter limitation on symbol names or may be due to other reasons. In cases where the traded currency is actually `USDT` and is not `USD` – the CCXT library will perform `USD` → `USDT` conversion. Note, however, that some exchanges have both `USD` and `USDT` symbols, for example, Kraken has a `USDT/USD` trading pair.
#### Notes On Naming Consistency [#notes-on-naming-consistency]
Each exchange has an associative array of substitutions for cryptocurrency symbolic codes in the `exchange.commonCurrencies` property, like:
```
'commonCurrencies' : {
'XBT': 'BTC',
'OPTIMISM': 'OP',
// ... etc
}
```
where key represents actual name how exchange engine refers to that coin, and the value represents what you want to refer to it with through ccxt.
Sometimes the user may notice exotic symbol names with mixed-case words and spaces in the code. The logic behind having these names is explained by the rules for resolving conflicts in naming and currency-coding when one or more currencies have the same symbolic code with different exchanges:
* First, we gather all info available from the exchanges themselves about the currency codes in question. They usually have a description of their coin listings somewhere in their API or their docs, knowledgebases or elsewhere on their websites.
* When we identify each particular cryptocurrency standing behind the currency code, we look them up on [CoinMarketCap](https://coinmarketcap.com).
* The currency that has the greatest market capitalization of all wins the currency code and keeps it. For example, HOT often stand for either `Holo` or `Hydro Protocol`. In this case `Holo` retains the code `HOT`, and `Hydro Protocol` will have its name as its code, literally, `Hydro Protocol`. So, there may be trading pairs with symbols like `HOT/USD` (for `Holo`) and `Hydro Protocol/USD` – those are two different markets.
* If market cap of a particular coin is unknown or is not enough to determine the winner, we also take trading volumes and other factors into consideration.
* When the winner is determined all other competing currencies get their code names properly remapped and substituted within conflicting exchanges via `.commonCurrencies`. **Note, it should be defined before '.loadMarkets()' happens!**
* Unfortunately this is a work in progress, because new currencies get listed daily and new exchanges are added from time to time, so, in general this is a never-ending process of self-correction in a quickly changing environment, practically, in *"live mode"*. We are thankful for all reported conflicts and mismatches you may find.
#### Questions On Naming Consistency [#questions-on-naming-consistency]
*Is it possible for symbols to change?*
In short, yes, sometimes, but rarely. Symbolic mappings can be changed if that is absolutely required and cannot be avoided. However, all previous symbolic changes were related to resolving conflicts or forks. So far, there was no precedent of a market cap of one coin overtaking another coin with the same symbolic code in CCXT.
*Can we rely on always listing the same crypto with the same symbol?*
More or less ) First, this library is a work in progress, and it is trying to adapt to the everchanging reality, so there may be conflicts that we will fix by changing some mappings in the future. Ultimately, the license says "no warranties, use at your own risk". However, we don't change symbolic mappings randomly all over the place, because we understand the consequences and we'd want to rely on the library as well and we don't like to break the backward-compatibility at all.
If it so happens that a symbol of a major token is forked or has to be changed, then the control is still in the users' hands. The `exchange.commonCurrencies` property can be [overrided upon initialization or later](#overriding-exchange-properties-upon-instantiation), just like any other exchange property. If a significant token is involved, we usually post instructions on how to retain the old behavior by adding a couple of lines to the constructor params.
#### Consistency Of Base And Quote Currencies [#consistency-of-base-and-quote-currencies]
It depends on which exchange you are using, but some of them have a reversed (inconsistent) pairing of `base` and `quote`. They actually have base and quote misplaced (switched/reversed sides). In that case you'll see a difference of parsed `base` and `quote` currency values with the unparsed `info` in the market substructure.
For those exchanges the ccxt will do a correction, switching and normalizing sides of base and quote currencies when parsing exchange replies. This logic is financially and terminologically correct. If you want less confusion, remember the following rule: **base is always before the slash, quote is always after the slash in any symbol and with any market**.
```text
base currency ↓
BTC / USDT
ETH / BTC
DASH / ETH
↑ quote currency
```
#### Contract Naming Conventions [#contract-naming-conventions]
We currently load spot markets with the unified `BASE/QUOTE` symbol schema into the `.markets` mapping, indexed by symbol. This would cause a naming conflict for futures and other derivatives that have the same symbol as their spot market counterparts. To accomodate both types of markets in the `.markets` we require the symbols between 'future' and 'spot' markets to be distinct, as well as the symbols between 'linear' and 'inverse' contracts to be distinct.
**Please, check this announcement: [Unified contract naming conventions](https://github.com/ccxt/ccxt/issues/10931)**
CCXT supports the following types of derivative contracts:
* `future` – for expiring futures contracts that have a delivery/settlement date [](https://en.wikipedia.org/wiki/Futures_contract)
* `swap` – for perpetual swap futures that don't have a delivery date [](https://en.wikipedia.org/wiki/Perpetual_futures)
* `option` – for option contracts ([https://en.wikipedia.org/wiki/Option\_contract](https://en.wikipedia.org/wiki/Option_contract))
##### Future [#future]
A future market symbol consists of the underlying currency, the quoting currency, the settlement currency and an arbitrary identifier. Most often the identifier is the settlement date of the future contract in `YYMMDD` format:
```javascript
//
// base asset or currency
// ↓
// ↓ quote asset or currency
// ↓ ↓
// ↓ ↓ settlement asset or currency
// ↓ ↓ ↓
// ↓ ↓ ↓ identifier (settlement date)
// ↓ ↓ ↓ ↓
// ↓ ↓ ↓ ↓
'BTC/USDT:BTC-211225' // BTC/USDT futures contract settled in BTC (inverse) on 2021-12-25
'BTC/USDT:USDT-211225' // BTC/USDT futures contract settled in USDT (linear, vanilla) on 2021-12-25
'ETH/USDT:ETH-210625' // ETH/USDT futures contract settled in ETH (inverse) on 2021-06-25
'ETH/USDT:USDT-210625' // ETH/USDT futures contract settled in USDT (linear, vanilla) on 2021-06-25
```
##### Perpetual Swap (Perpetual Future) [#perpetual-swap-perpetual-future]
```javascript
// base asset or currency
// ↓
// ↓ quote asset or currency
// ↓ ↓
// ↓ ↓ settlement asset or currency
// ↓ ↓ ↓
// ↓ ↓ ↓
'BTC/USDT:BTC' // BTC/USDT inverse perpetual swap contract funded in BTC
'BTC/USDT:USDT' // BTC/USDT linear perpetual swap contract funded in USDT
'ETH/USDT:ETH' // ETH/USDT inverse perpetual swap contract funded in ETH
'ETH/USDT:USDT' // ETH/USDT linear perpetual swap contract funded in USDT
```
##### Option [#option]
```javascript
//
// base asset or currency
// ↓
// ↓ quote asset or currency
// ↓ ↓
// ↓ ↓ settlement asset or currency
// ↓ ↓ ↓
// ↓ ↓ ↓ identifier (settlement date)
// ↓ ↓ ↓ ↓
// ↓ ↓ ↓ ↓ strike price
// ↓ ↓ ↓ ↓ ↓
// ↓ ↓ ↓ ↓ ↓ type, put (P) or call (C)
// ↓ ↓ ↓ ↓ ↓ ↓
'BTC/USDT:BTC-211225-60000-P' // BTC/USDT put option contract strike price 60000 USDT settled in BTC (inverse) on 2021-12-25
'ETH/USDT:USDT-211225-40000-C' // BTC/USDT call option contract strike price 40000 USDT settled in USDT (linear, vanilla) on 2021-12-25
'ETH/USDT:ETH-210625-5000-P' // ETH/USDT put option contract strike price 5000 USDT settled in ETH (inverse) on 2021-06-25
'ETH/USDT:USDT-210625-5000-C' // ETH/USDT call option contract strike price 5000 USDT settled in USDT (linear, vanilla) on 2021-06-25
```
### Unified Networks [#unified-networks]
| Network | CCXT Code |
| ------------------------- | --------------------------------------- |
| Bitcoin | BTC |
| Ethereum | ETH (For Ethereum) / ERC20 (For Tokens) |
| Ripple | XRP |
| Litecoin | LTC |
| Dogecoin | DOGE |
| Stellar | XLM |
| Tron | TRX (For TRX) / TRC20 (For Tokens) |
| Ethereum Classic | ETC |
| Zcash | ZEC |
| BSC (Binance Smart Chain) | BEP20 |
| Monero | XMR |
| Cardano | ADA |
| Tezos | XTZ |
| Cosmos | ATOM |
| Solana | SOL |
| BNB Beacon Chain | BEP2 |
| Polkadot | DOT |
| Algorand | ALGO |
| Avalanche | AVAX |
| Chainlink | LINK |
| Bitcoin Cash | BCH |
| Filecoin | FIL |
| Kusama | KSM |
| Elrond | EGLD |
| THORChain | RUNE |
| Internet Computer | ICP |
| Near Protocol | NEAR |
| Celo | CELO |
| Hedera Hashgraph | HBAR |
| IOTA | MIOTA |
| Klaytn | KLAY |
| VeChain | VET |
| Theta Network | THETA |
| Stacks | STX |
| Bitcoin Lightning Network | LIGHTNING |
| Optimism | OPTIMISM |
| Arbitrum | ARBITRUM |
| zkSync | zkSync |
| Polygon | MATIC |
| Fantom | FTM |
## Market Cache Force Reload [#market-cache-force-reload]
The `loadMarkets () / load_markets ()` is also a dirty method with a side effect of saving the array of markets on the exchange instance. You only need to call it once per exchange. All subsequent calls to the same method will return the locally saved (cached) array of markets.
When exchange markets are loaded, you can then access market information any time via the `markets` property. This property contains an associative array of markets indexed by symbol. If you need to force reload the list of markets after you have them loaded already, pass the reload = true flag to the same method again.
JavaScript
Python
PHP
Go
C#
Java
```javascript
(async () => {
let kraken = new ccxt.kraken ({ verbose: true }) // log HTTP requests
await kraken.loadMarkets () // request markets
console.log (kraken.id, kraken.markets) // output a full list of all loaded markets
console.log (Object.keys (kraken.markets)) // output a short list of market symbols
console.log (kraken.markets['BTC/USD']) // output single market details
await kraken.loadMarkets () // return a locally cached version, no reload
let reloadedMarkets = await kraken.loadMarkets (true) // force HTTP reload = true
console.log (reloadedMarkets['ETH/BTC'])
}) ()
```
```python
poloniex = ccxt.poloniex({'verbose': True}) # log HTTP requests
poloniex.load_markets() # request markets
print(poloniex.id, poloniex.markets) # output a full list of all loaded markets
print(list(poloniex.markets.keys())) # output a short list of market symbols
print(poloniex.markets['BTC/ETH']) # output single market details
poloniex.load_markets() # return a locally cached version, no reload
reloadedMarkets = poloniex.load_markets(True) # force HTTP reload = True
print(reloadedMarkets['ETH/ZEC'])
```
```php
$bitfinex = new \ccxt\bitfinex(array('verbose' => true)); // log HTTP requests
$bitfinex.load_markets(); // request markets
var_dump($bitfinex->id, $bitfinex->markets); // output a full list of all loaded markets
var_dump(array_keys ($bitfinex->markets)); // output a short list of market symbols
var_dump($bitfinex->markets['XRP/USD']); // output single market details
$bitfinex->load_markets(); // return a locally cached version, no reload
$reloadedMarkets = $bitfinex->load_markets(true); // force HTTP reload = true
var_dump($bitfinex->markets['XRP/BTC']);
```
```go
kraken := ccxt.NewKraken(map[string]interface{}{"verbose": true}) // log HTTP requests
kraken.LoadMarkets() // request markets
kraken.LoadMarkets() // return a locally cached version, no reload
kraken.LoadMarkets(true) // force HTTP reload = true
```
```csharp
var kraken = new Kraken(new Dictionary() { { "verbose", true } }); // log HTTP requests
await kraken.LoadMarkets(); // request markets
await kraken.LoadMarkets(); // return a locally cached version, no reload
await kraken.loadMarkets(true); // force HTTP reload = true
```
```java
Kraken kraken = new Kraken();
kraken.loadMarkets(false); // loads from exchange
kraken.loadMarkets(false); // returns cached version
kraken.loadMarkets(true); // force reload
```
# Implicit API [#implicit-api]
* [API Methods / Endpoints](#api-methods--endpoints)
* [Implicit API Methods](#implicit-api-methods)
* [Public/Private API](#publicprivate-api)
* [Synchronous vs Asynchronous Calls](#synchronous-vs-asynchronous-calls)
* [Passing Parameters To API Methods](#passing-parameters-to-api-methods)
## API Methods / Endpoints [#api-methods--endpoints]
Each exchange offers a set of API methods. Each method of the API is called an *endpoint*. Endpoints are HTTP URLs for querying various types of information. All endpoints return JSON in response to client requests.
Usually, there is an endpoint for getting a list of markets from an exchange, an endpoint for retrieving an order book for a particular market, an endpoint for retrieving trade history, endpoints for placing and canceling orders, for money deposit and withdrawal, etc... Basically every kind of action you could perform within a particular exchange has a separate endpoint URL offered by the API.
Because the set of methods differs from exchange to exchange, the ccxt library implements the following:
* a public and private API for all possible URLs and methods
* a unified API supporting a subset of common methods
The endpoint URLs are predefined in the `api` property for each exchange. You don't have to override it, unless you are implementing a new exchange API (at least you should know what you're doing).
Most of exchange-specific API methods are implicit, meaning that they aren't defined explicitly anywhere in code. The library implements a declarative approach for defining implicit (non-unified) exchanges' API methods.
## Implicit API Methods [#implicit-api-methods]
Each method of the API usually has its own endpoint. The library defines all endpoints for each particular exchange in the `.api` property. Upon exchange construction an implicit *magic* method (aka *partial function* or *closure*) will be created inside `defineRestApi()/define_rest_api()` on the exchange instance for each endpoint from the list of `.api` endpoints. This is performed for all exchanges universally. Each generated method will be accessible in both `camelCase` and `under_score` notations.
The endpoints definition is a **full list of ALL API URLs** exposed by an exchange. This list gets converted to callable methods upon exchange instantiation. Each URL in the API endpoint list gets a corresponding callable method. This is done automatically for all exchanges, therefore the ccxt library supports **all possible URLs** offered by crypto exchanges.
Each implicit method gets a unique name which is constructed from the `.api` definition. For example, a private HTTPS PUT `https://api.exchange.com/order/{id}/cancel` endpoint will have a corresponding exchange method named `.privatePutOrderIdCancel()`/`.private_put_order_id_cancel()`. A public HTTPS GET `https://api.exchange.com/market/ticker/{pair}` endpoint would result in the corresponding method named `.publicGetTickerPair()`/`.public_get_ticker_pair()`, and so on.
An implicit method takes a dictionary of parameters, sends the request to the exchange and returns an exchange-specific JSON result from the API **as is, unparsed**. To pass a parameter, add it to the dictionary explicitly under a key equal to the parameter's name. For the examples above, this would look like `.privatePutOrderIdCancel ({ id: '41987a2b-...' })` and `.publicGetTickerPair ({ pair: 'BTC/USD' })`.
The recommended way of working with exchanges is not using exchange-specific implicit methods but using the unified ccxt methods instead. The exchange-specific methods should be used as a fallback in cases when a corresponding unified method isn't available (yet).
To get a list of all available methods with an exchange instance, including implicit methods and unified methods you can simply do the following:
```text
console.log (new ccxt.kraken ()) // JavaScript
print(dir(ccxt.kraken())) # Python
var_dump (new \ccxt\kraken ()); // PHP
```
## Public/Private API [#publicprivate-api]
API URLs are often grouped into two sets of methods called a *public API* for market data and a *private API* for trading and account access. These groups of API methods are usually prefixed with a word 'public' or 'private'.
A public API is used to access market data and does not require any authentication whatsoever. Most exchanges provide market data openly to all (under their rate limit). With the ccxt library anyone can access market data out of the box without having to register with the exchanges and without setting up account keys and passwords.
Public APIs include the following:
* instruments/trading pairs
* price feeds (exchange rates)
* order books (L1, L2, L3...)
* trade history (closed orders, transactions, executions)
* tickers (spot / 24h price)
* OHLCV series for charting
* other public endpoints
The private API is mostly used for trading and for accessing account-specific private data, therefore it requires authentication. You have to get the private API keys from the exchanges. It often means registering with an exchange website and creating the API keys for your account. Most exchanges require personal information or identification. Some exchanges will only allow trading after completing the KYC verification.
Private APIs allow the following:
* manage personal account info
* query account balances
* trade by making market and limit orders
* create deposit addresses and fund accounts
* request withdrawal of fiat and crypto funds
* query personal open / closed orders
* query positions in margin/leverage trading
* get ledger history
* transfer funds between accounts
* use merchant services
Some exchanges offer the same logic under different names. For example, a public API is also often called *market data*, *basic*, *market*, *mapi*, *api*, *price*, etc... All of them mean a set of methods for accessing data available to public. A private API is also often called *trading*, *trade*, *tapi*, *exchange*, *account*, etc...
A few exchanges also expose a merchant API which allows you to create invoices and accept crypto and fiat payments from your clients. This kind of API is often called *merchant*, *wallet*, *payment*, *ecapi* (for e-commerce).
To get a list of all available methods with an exchange instance, you can simply do the following:
```text
console.log (new ccxt.kraken ()) // JavaScript
print(dir(ccxt.kraken())) # Python
var_dump (new \ccxt\kraken ()); // PHP
```
**contract only and margin only**
* methods in this documentation that are documented as **contract only** or **margin only** are only intended to be used for contract trading and margin trading respectively. They may work when trading in other types of markets but will most likely return irrelevant information.
## Synchronous vs Asynchronous Calls [#synchronous-vs-asynchronous-calls]
#### **Javascript** [#javascript]
In the JavaScript version of CCXT all methods are asynchronous and return [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) that resolve with a decoded JSON object. In CCXT we use the modern *async/await* syntax to work with Promises. If you're not familiar with that syntax, you can read more about it [here](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function).
```javascript
// JavaScript
(async () => {
let pairs = await kraken.publicGetSymbolsDetails ()
let marketIds = Object.keys (pairs['result'])
let marketId = marketIds[0]
let ticker = await kraken.publicGetTicker ({ pair: marketId })
console.log (kraken.id, marketId, ticker)
}) ()
```
#### **Python** [#python]
The ccxt library supports asynchronous concurrency mode in Python 3.5+ with async/await syntax. The asynchronous Python version uses pure [asyncio](https://docs.python.org/3/library/asyncio.html) with [aiohttp](http://aiohttp.readthedocs.io). In async mode you have all the same properties and methods, but most methods are decorated with an async keyword. If you want to use async mode, you should link against the `ccxt.async_support` subpackage, like in the following example:
```python
# Python
import asyncio
import ccxt.async_support as ccxt
async def print_poloniex_ethbtc_ticker():
poloniex = ccxt.poloniex()
print(await poloniex.fetch_ticker('ETH/BTC'))
await poloniex.close(True) # close the instance connection when you don't need it anymore, and an extra "True" argument also cleans-up the cached instance data
asyncio.run(print_poloniex_ethbtc_ticker())
```
#### **PHP** [#php-1]
CCXT support PHP 8+ versions. The library has both synchronous and asynchronous versions. To use synchronous version, use `\ccxt` namespace (i.e. `new ccxt\binance()`) and to use asynchronous version, use `\ccxt\async` namespace (i.e. `new ccxt\async\binance()`). Asynchronous version uses [ReactPHP](https://reactphp.org/) library in the background. In async mode you have all the same properties and methods, but any networking API method should be decorated with the `\React\Async\await` keyword and your script should be in a ReactPHP wrapper:
```php
// PHP
fetch_ticker('ETH/BTC'));
var_dump($result);
}
```
See further examples in the `examples/php` directory; look for filenames that include the `async` word. When installing through Composer, all required dependencies, including the ReactPHP components used by the async classes, are installed automatically with `composer require ccxt/ccxt`. When installing manually, the ReactPHP components are only needed if you use the async classes, the synchronous version works without them, so install them by hand only in that case. While syntactically the change is simple (i.e., just using `await` around relevant methods), concurrency has significant implications for the overall design of your code.
#### **Go** [#go]
In Go every networking method is synchronous and returns a `(value, error)` pair — there is no async variant. Always check the returned `error` before using the value:
```go
// Go
exchange := ccxt.NewKraken(nil)
ticker, err := exchange.FetchTicker("ETH/BTC")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(exchange.GetId(), ticker.Last)
```
#### **C#** [#c]
In C# every networking method is asynchronous and returns a `Task` that you `await`. The unified methods use native `async`/`await`:
```csharp
// C#
var exchange = new Kraken();
var ticker = await exchange.FetchTicker("ETH/BTC");
Console.WriteLine(exchange.id + " " + ticker.last);
```
#### **Java** [#java]
In Java, each exchange has its own typed subclass. Every typed method ships
**both** a blocking sync overload and a non-blocking `CompletableFuture`-returning
async overload — symmetric for REST `fetch*` / `fetch*Async` and WS `watch*` /
`watch*Async`:
```java
// Java
import io.github.ccxt.exchanges.Kraken;
import io.github.ccxt.types.Ticker;
import java.util.concurrent.CompletableFuture;
Kraken kraken = new Kraken();
kraken.loadMarkets(false);
// REST — synchronous
Ticker ticker = kraken.fetchTicker("BTC/USDT");
System.out.println(ticker.last);
// REST — asynchronous
CompletableFuture future = kraken.fetchTickerAsync("BTC/USDT", null);
future.thenAccept(t -> System.out.println(t.last));
```
The same sync/async pair applies to the pro (WebSocket) classes — `watchTicker`
blocks for one update; `watchTickerAsync` returns a `CompletableFuture`
that completes on the next update:
```java
import io.github.ccxt.exchanges.pro.Binance;
var ws = new Binance();
ws.loadMarkets(false);
// WS — synchronous (blocks for one update)
Ticker tick = ws.watchTicker("BTC/USDT");
// WS — asynchronous (composable with allOf, anyOf, thenApply, ...)
CompletableFuture stream = ws.watchTickerAsync("BTC/USDT", null);
```
### Returned JSON Objects [#returned-json-objects]
All public and private API methods return raw decoded JSON objects in response from the exchanges, as is, untouched. The unified API returns JSON-decoded objects in a common format and structured uniformly across all exchanges.
## Passing Parameters To API Methods [#passing-parameters-to-api-methods]
The set of all possible API endpoints differs from exchange to exchange. Most of methods accept a single associative array (or a Python dict) of key-value parameters. The params are passed as follows:
```text
bitso.publicGetTicker ({ book: 'eth_mxn' }) // JavaScript
ccxt.zaif().public_get_ticker_pair ({ 'pair': 'btc_jpy' }) # Python
$luno->public_get_ticker (array ('pair' => 'XBTIDR')); // PHP
```
The unified methods of exchanges might expect and will accept various `params` which affect their functionality, like:
```python
params = {'type':'margin', 'isIsolated': 'TRUE'} # --------------┑
# params will go as the last argument to the unified method |
# v
binance.create_order('BTC/USDT', 'limit', 'buy', amount, price, params)
```
An exchange will not accept the params from a different exchange, they're not interchangeable. The list of accepted parameters is defined by each specific exchange.
To find which parameters can be passed to a unified method:
* either open the [exchange-specific implementation](https://github.com/ccxt/ccxt/tree/master/js) file and search for the desired function (i.e. `createOrder`) to inspect and find out the details of `params` usage
* or go to the exchange's API docs and read the list of parameters for your specific function or endpoint (i.e. `order`)
For a full list of accepted method parameters for each exchange, please consult [API docs](#exchanges).
### API Method Naming Conventions [#api-method-naming-conventions]
An exchange method name is a concatenated string consisting of type (public or private), HTTP method (GET, POST, PUT, DELETE) and endpoint URL path like in the following examples:
| Method Name | Base API URL | Endpoint URL |
| ------------------------- | -------------------------------------------------------------- | --------------------- |
| publicGetIdOrderbook | [https://bitbay.net/API/Public](https://bitbay.net/API/Public) | \{id}/orderbook |
| publicGetPairs | [https://bitlish.com/api](https://bitlish.com/api) | pairs |
| publicGetJsonMarketTicker | [https://www.bitmarket.net](https://www.bitmarket.net) | json/\{market}/ticker |
| privateGetUserMargin | [https://bitmex.com](https://bitmex.com) | user/margin |
| privatePostTrade | [https://btc-x.is/api](https://btc-x.is/api) | trade |
| tapiCancelOrder | [https://yobit.net](https://yobit.net) | tapi/CancelOrder |
| ... | ... | ... |
The ccxt library supports both camelcase notation (preferred in JavaScript) and underscore notation (preferred in Python and PHP), therefore all methods can be called in either notation or coding style in any language. Both of these notations work in JavaScript, Python and PHP:
```text
exchange.methodName () // camelcase pseudocode
exchange.method_name() // underscore pseudocode
```
To get a list of all available methods with an exchange instance, you can simply do the following:
```text
console.log (new ccxt.kraken ()) // JavaScript
print(dir(ccxt.hitbtc())) # Python
var_dump (new \ccxt\okcoin ()); // PHP
```
# Unified API [#unified-api]
* [Overriding Unified API Params](#overriding-unified-api-params)
* [Pagination](#pagination)
* [Automatic Pagination](#automatic-pagination)
The unified ccxt API is a subset of methods common among the exchanges. It currently contains the following methods:
* `fetchMarkets ()`: Fetches a list of all available markets from an exchange and returns an array of Market objects as defined by the [Market structure](#market-structure) (with properties such as `symbol`, `base`, `quote` etc.). Some exchanges do not have means for obtaining a list of markets via their online API. For those, the list of markets is hardcoded.
* `fetchCurrencies ()`: Fetches all available currencies from an exchange and returns an associative dictionary of currencies (objects with properties such as `code`, `name`, etc.). Some exchanges do not have means for obtaining currencies via their online API. For those, the currencies will be extracted from market pairs or hardcoded.
* `loadMarkets ([reload])`: Returns the list of markets as an object indexed by symbol and caches it with the exchange instance. Returns cached markets if loaded already, unless the `reload = true` flag is forced.
* `fetchOrderBook (symbol, limit = undefined, params = {})`: Fetch L2/L3 order book for a particular market trading symbol.
* `fetchStatus (params = {})`: Returns information regarding the exchange status from either the info hardcoded in the exchange instance or the API, if available.
* `fetchL2OrderBook (symbol, limit = undefined, params)`: Level 2 (price-aggregated) order book for a particular symbol.
* `fetchTrades (symbol, since, limit, params)`: Fetch recent trades for a particular trading symbol.
* `fetchTicker (symbol)`: Fetch latest ticker data by trading symbol.
* `fetchBalance ()`: Fetch Balance.
* `createOrder (symbol, type, side, amount, price, params)`
* `createOrders(orders, params)`
* `createLimitBuyOrder (symbol, amount, price, param)`
* `createLimitSellOrder (symbol, amount, price, param)`
* `createMarketBuyOrder (symbol, amount, param)`
* `createMarketSellOrder (symbol, amount, param)`
* `cancelOrder (id, symbol, params)`
* `fetchOrder (id, symbol, params)`
* `fetchOrders (symbol, since, limit, params)`
* `fetchOpenOrders (symbol, since, limit, params)`
* `fetchCanceledOrders (symbol, since, limit, params)`
* `fetchClosedOrders (symbol, since, limit, params)`
* `fetchMyTrades (symbol, since, limit, params)`
* `fetchOpenInterest (symbol, params)`
* `fetchVolatilityHistory (code, params)`
* `fetchUnderlyingAssets ()`
* `fetchSettlementHistory (symbol, since, limit, params)`
* `fetchLiquidations (symbol, since, limit, params)`
* `fetchMyLiquidations (symbol, since, limit, params)`
* `fetchGreeks (symbol, params)`
* `fetchAllGreeks (symbols, params)`
* `fetchCrossBorrowRate (code, params)`
* `fetchCrossBorrowRates (params)`
* `fetchIsolatedBorrowRate (symbol, params)`
* `fetchIsolatedBorrowRates (params)`
* `fetchOption (symbol, params)`
* `fetchOptionChain (code, params)`
* `fetchConvertQuote (fromCode, toCode, amount, params)`
* `createConvertTrade (id, fromCode, toCode, amount, params)`
* `fetchFundingRate (symbol, params)`
* `fetchFundingRates (symbols, params)`
* `fetchFundingRateHistory (symbol, since, limit, params)`
* `fetchFundingRateInterval (symbol, params)`
* `fetchFundingRateIntervals (symbols, params)`
* `fetchLongShortRatio (symbol, params)`
* `fetchAutoDeLeverageRank (symbol, params)`
* `fetchPositionAutoDeLeverageRank (symbol, params)`
* `fetchPositionsAutoDeLeverageRank (symbols, params)`
* ...
```text
TODO: better formatting
```
## Overriding Unified API Params [#overriding-unified-api-params]
Note, that most of methods of the unified API accept an optional `params` argument. It is an associative array (a dictionary, empty by default) containing the params you want to override. The contents of `params` are exchange-specific, consult the exchanges' API documentation for supported fields and values. Use the `params` dictionary if you need to pass a custom setting or an optional parameter to your unified query.
JavaScript
Python
PHP
Go
C#
Java
```javascript
(async () => {
const params = {
'foo': 'bar', // exchange-specific overrides in unified queries
'Hello': 'World!', // see their docs for more details on parameter names
}
// the overrides go into the last argument to the unified call ↓ HERE
const result = await exchange.fetchOrderBook (symbol, length, params)
}) ()
```
```python
params = {
'foo': 'bar', # exchange-specific overrides in unified queries
'Hello': 'World!', # see their docs for more details on parameter names
}
# overrides go in the last argument to the unified call ↓ HERE
result = exchange.fetch_order_book(symbol, length, params)
```
```php
$params = array (
'foo' => 'bar', // exchange-specific overrides in unified queries
'Hello' => 'World!', // see their docs for more details on parameter names
}
// overrides go into the last argument to the unified call ↓ HERE
$result = $exchange->fetch_order_book ($symbol, $length, $params);
```
```go
params := map[string]interface{}{
"foo": "bar", // exchange-specific overrides in unified queries
"Hello": "World!", // see their docs for more details on parameter names
}
// overrides go into the options of the unified call ↓ HERE
result, err := exchange.FetchOrderBook(symbol, ccxt.WithFetchOrderBookParams(params))
```
```csharp
var parameters = new Dictionary() {
{ "foo", "bar" }, // exchange-specific overrides in unified queries
{ "Hello", "World!" }, // see their docs for more details on parameter names
};
// overrides go into the last argument to the unified call ↓ HERE
var result = await exchange.FetchOrderBook(symbol, length, parameters);
```
```java
Map params = Map.of("foo", "bar");
OrderBook ob = exchange.fetchOrderBook(symbol, limit, params);
```
## Pagination [#pagination]
Most of unified methods will return either a single object or a plain array (a list) of objects (trades, orders, transactions and so on). However, very few exchanges (if any at all) will return all orders, all trades, all ohlcv candles or all transactions at once. Most often their APIs `limit` output to a certain number of most recent objects. **YOU CANNOT GET ALL OBJECTS SINCE THE BEGINNING OF TIME TO THE PRESENT MOMENT IN JUST ONE CALL**. Practically, very few exchanges will tolerate or allow that.
To fetch historical orders or trades, the user will need to traverse the data in portions or "pages" of objects. Pagination often implies *"fetching portions of data one by one"* in a loop.
In most cases users are **required to use at least some type of pagination** in order to get the expected results consistently. If the user does not apply any pagination, most methods will return the exchanges' default, which may start from the beginning of history or may be a subset of most recent objects. The default behaviour (without pagination) is exchange-specific! The means of pagination are often used with the following methods in particular:
* `fetchTrades()`
* `fetchOHLCV()`
* `fetchOrders()`
* `fetchCanceledOrders()`
* `fetchClosedOrder()`
* `fetchClosedOrders()`
* `fetchOpenOrder()`
* `fetchOpenOrders()`
* `fetchMyTrades()`
* `fetchTransactions()`
* `fetchDeposit()`
* `fetchDeposits()`
* `fetchWithdrawals()`
With methods returning lists of objects, exchanges may offer one or more types of pagination. CCXT unifies **date-based pagination** by default, with timestamps **in milliseconds** throughout the entire library.
### Automatic Pagination [#automatic-pagination]
*Warning: this is an experimental feature and might produce unexpected/incorrect results in some instances.*
Recently, CCXT introduced a way to paginate through several results automatically by just providing the `paginate` flag inside `params,` lifting this work from the userland. Most leading exchanges support it, and more will be added in the future, but the easiest way to check it is to look in the method's documentation and search for the *pagination* parameter. As always there are exceptions, and some endpoints might not provide a way to paginate either through a timestamp or a cursor, and in those cases, there's nothing CCXT can do about it.
Right now, we have three different ways of paginating:
* **dynamic/time-based**: uses the `until` and `since` parameters to paginate through dynamic results like (trades, orders, transactions, etc). Since we don't know a priori how many entries are available to be fetched, it will perform one request at a time until we reach the end of the data or the maximum amount of pagination calls (configurable through an option)
* **deterministic**: when we can pre-compute the boundaries of each page, it will perform the requests concurrently for maximum performance. This applies to OHLCV, Funding Rates, and Open Interest and also respects the `paginationCalls` option.
* **cursor-based**: when the exchange provides a cursor inside the response, we extract the cursor and perform the subsequent request until the end of the data or reach the maximum number of pagination calls.
The user cannot select the pagination method used, it will depend from implementation to implementation, considering the exchange API's features.
#### Pagination params [#pagination-params]
We can't perform an infinite amount of requests, and some of them might throw an error for different reasons, thus, we have some options that allow the user to control these variables and other pagination specificities.
*All the options below, should be provided inside `params`, you can check the examples below*
* **paginate**: (**boolean**) indicates that the user wants to paginate through different pages to get more data. Default is *false*.
* **paginationCalls**: (**integer**) allows the user to control the maximum amount of requests to paginate the data. Due to the rate limits, this value should not be too high. Default is 10.
* **maxRetries**: (**integer**) how many times should the pagination mechanism retry upon getting an error. Default is 3
* **paginationDirection**: (**string**) Only applies to the dynamic pagination and it can be either *forward* (start the pagination from some time in the past and paginate forward) or *backward* (start from the most recent time and paginate backward). If *forward* is selected then a *since* parameter must also be provided. Default is *backward*.
* **maxEntriesPerRequest**: (**integer**): The max amount of entries per request so that we can maximize the data retrieved per call. It varies from endpoint to endpoint and CCXT will populate this value for you, but you can override it if needed.
#### Examples [#examples]
```python
trades = await binance.fetch_trades("BTC/USDT", params = {"paginate": True}) # dynamic/time-based
ohlcv = await binance.fetch_ohlcv("BTC/USDT", params = {"paginate": True, "paginationCalls": 5}) # deterministic-pagination will perform 5 requests
trades = await binance.fetch_trades("BTC/USDT", since = 1664812416000, params = {"paginate": True, "paginationDirection": "forward"}) # dynamic/time-based pagination starting from 1664812416000
ledger = await bybit.fetch_ledger(params = {"paginate": True}) # bybit returns a cursor so the pagination will be cursor-based
funding_rates = await binance.fetch_funding_rate_history("BTC/USDT:USDT", params = {"paginate": True, "maxEntriesPerRequest": 50}) # customizes the number of entries per request
```
### Working With Datetimes And Timestamps [#working-with-datetimes-and-timestamps]
All unified timestamps throughout the CCXT library are integers **in milliseconds** unless explicitly stated otherwise.
Below is the set of methods for working with UTC dates and timestamps and for converting between them:
```javascript
exchange.parse8601 ('2018-01-01T00:00:00Z') == 1514764800000 // integer in milliseconds, Z = UTC
exchange.iso8601 (1514764800000) == '2018-01-01T00:00:00Z' // from milliseconds to iso8601 string
exchange.seconds () // integer UTC timestamp in seconds
exchange.milliseconds () // integer UTC timestamp in milliseconds
```
### Date-based Pagination [#date-based-pagination]
This is the type of pagination currently used throughout the CCXT Unified API. The user supplies a `since` timestamp **in milliseconds** (!) and a number to `limit` results. To traverse the objects of interest page by page, the user runs the following (below is pseudocode, it may require overriding some exchange-specific params, depending on the exchange in question):
JavaScript
Python
PHP
Go
C#
Java
```javascript
if (exchange.has['fetchTrades']) {
let since = exchange.milliseconds () - 86400000 // -1 day from now
// alternatively, fetch from a certain starting datetime
// let since = exchange.parse8601 ('2018-01-01T00:00:00Z')
let allTrades = []
while (since < exchange.milliseconds ()) {
const symbol = undefined // change for your symbol
const limit = 20 // change for your limit
const trades = await exchange.fetchTrades (symbol, since, limit)
if (trades.length) {
since = trades[trades.length - 1]['timestamp'] + 1
allTrades = allTrades.concat (trades)
} else {
break
}
}
}
```
```python
if exchange.has['fetchOrders']:
since = exchange.milliseconds () - 86400000 # -1 day from now
# alternatively, fetch from a certain starting datetime
# since = exchange.parse8601('2018-01-01T00:00:00Z')
all_orders = []
while since < exchange.milliseconds ():
symbol = None # change for your symbol
limit = 20 # change for your limit
orders = await exchange.fetch_orders(symbol, since, limit)
if len(orders):
since = orders[len(orders) - 1]['timestamp'] + 1
all_orders += orders
else:
break
```
```php
if ($exchange->has['fetchMyTrades']) {
$since = exchange->milliseconds () - 86400000; // -1 day from now
// alternatively, fetch from a certain starting datetime
// $since = $exchange->parse8601 ('2018-01-01T00:00:00Z');
$all_trades = array ();
while (since < exchange->milliseconds ()) {
$symbol = null; // change for your symbol
$limit = 20; // change for your limit
$trades = $exchange->fetchMyTrades ($symbol, $since, $limit);
if (count($trades)) {
$since = $trades[count($trades) - 1]['timestamp'] + 1;
$all_trades = array_merge ($all_trades, $trades);
} else {
break;
}
}
}
```
```go
since := exchange.Milliseconds() - 86400000 // -1 day from now
allTrades := []ccxt.Trade{}
for since < exchange.Milliseconds() {
symbol := "BTC/USDT" // change for your symbol
trades, err := exchange.FetchTrades(symbol, ccxt.WithFetchTradesSince(since), ccxt.WithFetchTradesLimit(20))
if err != nil {
fmt.Println(err)
break
}
if len(trades) > 0 {
since = *trades[len(trades)-1].Timestamp + 1
allTrades = append(allTrades, trades...)
} else {
break
}
}
```
```csharp
var since = exchange.milliseconds() - 86400000; // -1 day from now
var allTrades = new List();
while (since < exchange.milliseconds())
{
var symbol = "BTC/USDT"; // change for your symbol
var trades = await exchange.FetchTrades(symbol, since, 20);
if (trades.Count > 0)
{
since = (Int64)trades[trades.Count - 1].Timestamp + 1;
allTrades.AddRange(trades);
}
else
{
break;
}
}
```
```java
long since = System.currentTimeMillis() - 86400000; // -1 day
List allTrades = new ArrayList<>();
while (since < System.currentTimeMillis()) {
List trades = exchange.fetchTrades("BTC/USDT", since, 20L, null);
if (!trades.isEmpty()) {
since = trades.get(trades.size() - 1).timestamp + 1;
allTrades.addAll(trades);
} else {
break;
}
}
```
### id-based Pagination [#id-based-pagination]
The user supplies a `from_id` of the object, from where the query should continue returning results, and a number to `limit` results. This is the default with some exchanges, however, this type is not unified (yet). To paginate objects based on their ids, the user would run the following:
JavaScript
Python
PHP
Go
C#
Java
```javascript
if (exchange.has['fetchTrades']) {
let from_id = 'abc123' // all ids are strings
let allTrades = []
while (true) {
const symbol = undefined // change for your symbol
const since = undefined
const limit = 20 // change for your limit
const params = {
'from_id': from_id, // exchange-specific non-unified parameter name
}
const trades = await exchange.fetchTrades (symbol, since, limit, params)
if (trades.length) {
from_id = trades[trades.length - 1]['id']
allTrades.push (trades)
} else {
break
}
}
}
```
```python
if exchange.has['fetchOrders']:
from_id = 'abc123' # all ids are strings
all_orders = []
while True:
symbol = None # change for your symbol
since = None
limit = 20 # change for your limit
params = {
'from_id': from_id, # exchange-specific non-unified parameter name
}
orders = await exchange.fetch_orders(symbol, since, limit, params)
if len(orders):
from_id = orders[len(orders) - 1]['id']
all_orders += orders
else:
break
```
```php
if ($exchange->has['fetchMyTrades']) {
$from_id = 'abc123' // all ids are strings
$all_trades = array ();
while (true) {
$symbol = null; // change for your symbol
$since = null;
$limit = 20; // change for your limit
$params = array (
'from_id' => $from_id, // exchange-specific non-unified parameter name
);
$trades = $exchange->fetchMyTrades ($symbol, $since, $limit, $params);
if (count($trades)) {
$from_id = $trades[count($trades) - 1]['id'];
$all_trades = array_merge ($all_trades, $trades);
} else {
break;
}
}
}
```
```go
fromId := "abc123" // all ids are strings
allTrades := []ccxt.Trade{}
for {
symbol := "BTC/USDT" // change for your symbol
params := map[string]interface{}{
"from_id": fromId, // exchange-specific non-unified parameter name
}
trades, err := exchange.FetchTrades(symbol, ccxt.WithFetchTradesLimit(20), ccxt.WithFetchTradesParams(params))
if err != nil {
fmt.Println(err)
break
}
if len(trades) > 0 {
fromId = *trades[len(trades)-1].Id
allTrades = append(allTrades, trades...)
} else {
break
}
}
```
```csharp
var fromId = "abc123"; // all ids are strings
var allTrades = new List();
while (true)
{
var symbol = "BTC/USDT"; // change for your symbol
var parameters = new Dictionary() {
{ "from_id", fromId }, // exchange-specific non-unified parameter name
};
var trades = await exchange.FetchTrades(symbol, null, 20, parameters);
if (trades.Count > 0)
{
fromId = trades[trades.Count - 1].Id;
allTrades.AddRange(trades);
}
else
{
break;
}
}
```
```java
String fromId = "abc123";
List allTrades = new ArrayList<>();
while (true) {
Map params = Map.of("from_id", fromId);
List trades = exchange.fetchTrades("BTC/USDT", null, 20L, params);
if (!trades.isEmpty()) {
fromId = trades.get(trades.size() - 1).id;
allTrades.addAll(trades);
} else {
break;
}
}
```
### Pagenumber-based (Cursor) Pagination [#pagenumber-based-cursor-pagination]
The user supplies a page number or an *initial "cursor"* value. The exchange returns a page of results and the *next "cursor"* value, to proceed from. Most of exchanges that implement this type of pagination will either return the next cursor within the response itself or will return the next cursor values within HTTP response headers.
See an example implementation here: [https://github.com/ccxt/ccxt/blob/master/examples/py/coinbaseexchange-fetch-my-trades-pagination.py](https://github.com/ccxt/ccxt/blob/master/examples/py/coinbaseexchange-fetch-my-trades-pagination.py)
Upon each iteration of the loop the user has to take the next cursor and put it into the overrided params for the next query (on the following iteration):
JavaScript
Python
PHP
Go
C#
Java
```javascript
if (exchange.has['fetchTrades']) {
let page = 0 // exchange-specific type and value
let allTrades = []
while (true) {
const symbol = undefined // change for your symbol
const since = undefined
const limit = 20 // change for your limit
const params = {
'page': page, // exchange-specific non-unified parameter name
}
const trades = await exchange.fetchTrades (symbol, since, limit, params)
if (trades.length) {
// not thread-safe and exchange-specific!
last_json_response = exchange.parseJson (exchange.last_http_response)
page = last_json_response['cursor']
allTrades.push (trades)
} else {
break
}
}
}
```
```python
if exchange.has['fetchOrders']:
cursor = 0 # exchange-specific type and value
all_orders = []
while True:
symbol = None # change for your symbol
since = None
limit = 20 # change for your limit
params = {
'cursor': cursor, # exchange-specific non-unified parameter name
}
orders = await exchange.fetch_orders(symbol, since, limit, params)
if len(orders):
# not thread-safe and exchange-specific!
cursor = exchange.last_response_headers['CB-AFTER']
all_orders += orders
else:
break
```
```php
if ($exchange->has['fetchMyTrades']) {
$start = '0' // exchange-specific type and value
$all_trades = array ();
while (true) {
$symbol = null; // change for your symbol
$since = null;
$limit = 20; // change for your limit
$params = array (
'start' => $start, // exchange-specific non-unified parameter name
);
$trades = $exchange->fetchMyTrades ($symbol, $since, $limit, $params);
if (count($trades)) {
// not thread-safe and exchange-specific!
$last_json_response = $exchange->parse_json ($exchange->last_http_response);
$start = $last_json_response['next'];
$all_trades = array_merge ($all_trades, $trades);
} else {
break;
}
}
}
```
```go
page := 0 // exchange-specific type and value
allTrades := []ccxt.Trade{}
for {
symbol := "BTC/USDT" // change for your symbol
params := map[string]interface{}{
"page": page, // exchange-specific non-unified parameter name
}
trades, err := exchange.FetchTrades(symbol, ccxt.WithFetchTradesLimit(20), ccxt.WithFetchTradesParams(params))
if err != nil {
fmt.Println(err)
break
}
if len(trades) > 0 {
page++ // or extract cursor from response
allTrades = append(allTrades, trades...)
} else {
break
}
}
```
```csharp
var page = 0; // exchange-specific type and value
var allTrades = new List();
while (true)
{
var symbol = "BTC/USDT"; // change for your symbol
var parameters = new Dictionary() {
{ "page", page }, // exchange-specific non-unified parameter name
};
var trades = await exchange.FetchTrades(symbol, null, 20, parameters);
if (trades.Count > 0)
{
page++; // or extract cursor from response
allTrades.AddRange(trades);
}
else
{
break;
}
}
```
```java
int page = 0;
List allTrades = new ArrayList<>();
while (true) {
Map params = Map.of("page", page);
List trades = exchange.fetchTrades("BTC/USDT", null, 20L, params);
if (!trades.isEmpty()) {
page++; // or extract cursor from response
allTrades.addAll(trades);
} else {
break;
}
}
```
# Public API [#public-api]
* [Order Book](#order-book)
* [Price Tickers](#price-tickers)
* [OHLCV Candlestick Charts](#ohlcv-candlestick-charts)
* [Public Trades](#public-trades)
* [Exchange Time](#exchange-time)
* [Exchange Status](#exchange-status)
* [Borrow Rates](#borrow-rates)
* [Borrow Rate History](#borrow-rate-history)
* [Leverage Tiers](#leverage-tiers)
* [Funding Rate](#funding-rate)
* [Funding Rate History](#funding-rate-history)
* [Open Interest History](#open-interest-history)
* [Volatility History](#volatility-history)
* [Underlying Assets](#underlying-assets)
* [Liquidations](#liquidations)
* [Greeks](#greeks)
* [OptionChain](#option-chain)
* [Auto De Leverage](#auto-de-leverage)
## Order Book [#order-book]
Exchanges expose information on open orders with bid (buy) and ask (sell) prices, volumes and other data. Usually there is a separate endpoint for querying current state (stack frame) of the *order book* for a particular market. An order book is also often called *market depth*. The order book information is used in the trading decision making process.
To get data on order books, you can use
* `fetchOrderBook ()` // for a single markets order books
* `fetchOrderBooks ( symbols )` // for multiple markets order books
* `fetchOrderBooks ()` // for the order books of all markets
```javascript
async fetchOrderBook (symbol, limit = undefined, params = {})
```
Parameters
* **symbol** (String) *required* Unified CCXT symbol (e.g. `"BTC/USDT"`)
* **limit** (Integer) The number of orders to return in the order book (e.g. `10`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An [order book structure](#order-book-structure)
```javascript
async fetchOrderBooks (symbols = undefined, limit = undefined, params = {})
```
Parameters
* **symbols** (\[String]) Unified CCXT symbols (e.g. `["BTC/USDT", "ETH/USDT"]`)
* **limit** (Integer) The number of orders to return in the order book (e.g. `10`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* A dictionary of [order book structures](#order-book-structure) indexed by market symbols
### fetchOrderBook Examples [#fetchorderbook-examples]
JavaScript
Python
PHP
Go
C#
Java
```javascript
delay = 2000 // milliseconds = seconds * 1000
(async () => {
for (symbol in exchange.markets) {
console.log (await exchange.fetchOrderBook (symbol))
await new Promise (resolve => setTimeout (resolve, delay)) // rate limit
}
}) ()
```
```python
import time
delay = 2 # seconds
for symbol in exchange.markets:
print (exchange.fetch_order_book (symbol))
time.sleep (delay) # rate limit
```
```php
$delay = 2000000; // microseconds = seconds * 1000000
foreach ($exchange->markets as $symbol => $market) {
var_dump ($exchange->fetch_order_book ($symbol));
usleep ($delay); // rate limit
}
```
```go
exchange := ccxt.NewBinance(nil)
exchange.LoadMarkets()
for _, symbol := range exchange.GetSymbols() {
ob, err := exchange.FetchOrderBook(symbol)
if err != nil {
fmt.Println(err)
continue
}
fmt.Println(symbol, "bids:", len(ob.Bids), "asks:", len(ob.Asks))
}
```
```csharp
var exchange = new Binance();
await exchange.LoadMarkets();
foreach (string symbol in exchange.symbols)
{
var ob = await exchange.FetchOrderBook(symbol);
Console.WriteLine(symbol + " bids: " + ob.bids.Count + " asks: " + ob.asks.Count);
}
```
```java
Binance exchange = new Binance();
exchange.loadMarkets(false);
OrderBook ob = exchange.fetchOrderBook("BTC/USDT", 10L, null);
System.out.println("bids: " + ob.bids.size() + " asks: " + ob.asks.size());
```
### Order Book Structure [#order-book-structure]
```javascript
{
'bids': [
[ price, amount ], // [ float, float ]
[ price, amount ],
...
],
'asks': [
[ price, amount ],
[ price, amount ],
...
],
'symbol': 'ETH/BTC', // a unified market symbol
'timestamp': 1499280391811, // Unix Timestamp in milliseconds (seconds * 1000)
'datetime': '2017-07-05T18:47:14.692Z', // ISO8601 datetime string with milliseconds
'nonce': 1499280391811, // an increasing unique identifier of the orderbook snapshot
}
```
**The timestamp and datetime may be missing (`undefined/None/null`) if the exchange in question does not provide a corresponding value in the API response.**
Prices and amounts are floats. The bids array is sorted by price in descending order. The best (highest) bid price is the first element and the worst (lowest) bid price is the last element. The asks array is sorted by price in ascending order. The best (lowest) ask price is the first element and the worst (highest) ask price is the last element. Bid/ask arrays can be empty if there are no corresponding orders in the order book of an exchange.
Exchanges may return the stack of orders in various levels of details for analysis. It is either in full detail containing each and every order, or it is aggregated having slightly less detail where orders are grouped and merged by price and volume. Having greater detail requires more traffic and bandwidth and is slower in general but gives a benefit of higher precision. Having less detail is usually faster, but may not be enough in some very specific cases.
### Notes On Order Book Structure [#notes-on-order-book-structure]
* The `orderbook['timestamp']` is the time when the exchange generated this orderbook response (before replying it back to you). This may be missing (`undefined/None/null`), as documented in the Manual, not all exchanges provide a timestamp there. If it is defined, then it is the UTC timestamp **in milliseconds** since 1 Jan 1970 00:00:00.
* Some exchanges may index orders in the orderbook by order ids, in that case the order id may be returned as the third element of bids and asks: `[ price, amount, id ]`. This is often the case with L3 orderbooks without aggregation. The order `id`, if shown in the orderbook, refers to the orderbook and does not necessarily correspond to the actual order id from the exchanges' database as seen by the owner or by the others. The order id is an `id` of the row inside the orderbook, but not necessarily the true-`id` of the order (though, they may be equal as well, depending on the exchange in question).
* In some cases the exchanges may supply L2 aggregated orderbooks with order counts for each aggregated level, in that case the order count may be returned as the third element of bids and asks: `[ price, amount, count ]`. The `count` tells how many orders are aggregated on each price level in bids and asks.
* Also, some exchanges may return the order timestamp as the third element of bids and asks: `[ price, amount, timestamp ]`. The `timestamp` tells when the order was placed on the orderbook.
### Market Depth [#market-depth]
Some exchanges accept a dictionary of extra parameters to the `fetchOrderBook () / fetch_order_book ()` function. **All extra `params` are exchange-specific (non-unified)**. You will need to consult exchanges docs if you want to override a particular param, like the depth of the order book. You can get a limited count of returned orders or a desired level of aggregation (aka *market depth*) by specifying an limit argument and exchange-specific extra `params` like so:
JavaScript
Python
PHP
Go
C#
Java
```javascript
(async function test () {
const ccxt = require ('ccxt')
const exchange = new ccxt.bitfinex ()
const limit = 5
const orders = await exchange.fetchOrderBook ('BTC/USD', limit, {
// this parameter is exchange-specific, all extra params have unique names per exchange
'group': 1, // 1 = orders are grouped by price, 0 = orders are separate
})
}) ()
```
```python
import ccxt
# return up to ten bidasks on each side of the order book stack
limit = 10
ccxt.cex().fetch_order_book('BTC/USD', limit)
```
```php
// instantiate the exchange by id
$exchange = '\\ccxt\\kraken';
$exchange = new $exchange ();
// up to ten orders on each side, for example
$limit = 20;
var_dump ($exchange->fetch_order_book ('BTC/USD', $limit));
```
```go
exchange := ccxt.NewBitfinex(nil)
limit := 5
orders, err := exchange.FetchOrderBook("BTC/USD", ccxt.WithFetchOrderBookLimit(int64(limit)), ccxt.WithFetchOrderBookParams(map[string]interface{}{
// this parameter is exchange-specific, all extra params have unique names per exchange
"group": 1, // 1 = orders are grouped by price, 0 = orders are separate
}))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(orders.Bids, orders.Asks)
```
```csharp
var exchange = new Bitfinex();
var limit = 5;
var orders = await exchange.FetchOrderBook("BTC/USD", limit, new Dictionary() {
// this parameter is exchange-specific, all extra params have unique names per exchange
{ "group", 1 }, // 1 = orders are grouped by price, 0 = orders are separate
});
Console.WriteLine("bids: " + orders.bids.Count + " asks: " + orders.asks.Count);
```
```java
OrderBook ob = exchange.fetchOrderBook("BTC/USDT", 5L, null);
System.out.println("bids: " + ob.bids.size() + " asks: " + ob.asks.size());
```
The levels of detail or levels of order book aggregation are often number-labelled like L1, L2, L3...
* **L1**: less detail for quickly obtaining very basic info, namely, the market price only. It appears to look like just one order in the order book.
* **L2**: most common level of aggregation where order volumes are grouped by price. If two orders have the same price, they appear as one single order for a volume equal to their total sum. This is most likely the level of aggregation you need for the majority of purposes.
* **L3**: most detailed level with no aggregation where each order is separate from other orders. This LOD naturally contains duplicates in the output. So, if two orders have equal prices they are **not** merged together and it's up to the exchange's matching engine to decide on their priority in the stack. You don't really need L3 detail for successful trading. In fact, you most probably don't need it at all. Therefore some exchanges don't support it and always return aggregated order books.
If you want to get an L2 order book, whatever the exchange returns, use the `fetchL2OrderBook(symbol, limit, params)` or `fetch_l2_order_book(symbol, limit, params)` unified method for that.
The `limit` argument does not guarantee that the number of bids or asks will always be equal to `limit`. It designates the upper boundary or the maximum, so at some moment in time there may be less than `limit` bids or asks. This is the case when the exchange does not have enough orders on the orderbook. However, if the underlying exchange API does not support a `limit` parameter for the orderbook endpoint at all, then the `limit` argument will be ignored. CCXT does not trim `bids` and `asks` if the exchange returns more than you request.
### Market Price [#market-price]
In order to get current best price (query market price) and calculate bidask spread take first elements from bid and ask, like so:
JavaScript
Python
PHP
Go
C#
Java
```javascript
let orderbook = await exchange.fetchOrderBook (exchange.symbols[0])
let bid = orderbook.bids.length ? orderbook.bids[0][0] : undefined
let ask = orderbook.asks.length ? orderbook.asks[0][0] : undefined
let spread = (bid && ask) ? ask - bid : undefined
console.log (exchange.id, 'market price', { bid, ask, spread })
```
```python
orderbook = exchange.fetch_order_book (exchange.symbols[0])
bid = orderbook['bids'][0][0] if len (orderbook['bids']) > 0 else None
ask = orderbook['asks'][0][0] if len (orderbook['asks']) > 0 else None
spread = (ask - bid) if (bid and ask) else None
print (exchange.id, 'market price', { 'bid': bid, 'ask': ask, 'spread': spread })
```
```php
$orderbook = $exchange->fetch_order_book ($exchange->symbols[0]);
$bid = count ($orderbook['bids']) ? $orderbook['bids'][0][0] : null;
$ask = count ($orderbook['asks']) ? $orderbook['asks'][0][0] : null;
$spread = ($bid && $ask) ? $ask - $bid : null;
$result = array ('bid' => $bid, 'ask' => $ask, 'spread' => $spread);
var_dump ($exchange->id, 'market price', $result);
```
```go
orderbook, err := exchange.FetchOrderBook(exchange.GetSymbols()[0])
if err != nil {
fmt.Println(err)
return
}
var bid, ask, spread float64
if len(orderbook.Bids) > 0 {
bid = orderbook.Bids[0][0]
}
if len(orderbook.Asks) > 0 {
ask = orderbook.Asks[0][0]
}
if bid > 0 && ask > 0 {
spread = ask - bid
}
fmt.Println(exchange.GetId(), "market price", "bid:", bid, "ask:", ask, "spread:", spread)
```
```csharp
var orderbook = await exchange.FetchOrderBook(exchange.symbols[0].ToString());
double? bid = orderbook.bids.Count > 0 ? orderbook.bids[0][0] : null;
double? ask = orderbook.asks.Count > 0 ? orderbook.asks[0][0] : null;
double? spread = (bid != null && ask != null) ? ask - bid : null;
Console.WriteLine(exchange.id + " market price bid=" + bid + " ask=" + ask + " spread=" + spread);
```
```java
OrderBook ob = exchange.fetchOrderBook("BTC/USDT");
Double bid = !ob.bids.isEmpty() ? ob.bids.get(0).get(0) : null;
Double ask = !ob.asks.isEmpty() ? ob.asks.get(0).get(0) : null;
Double spread = (bid != null && ask != null) ? ask - bid : null;
System.out.println("bid=" + bid + " ask=" + ask + " spread=" + spread);
```
## Price Tickers [#price-tickers]
A price ticker contains statistics for a particular market/symbol for some period of time in recent past, usually last 24 hours. The methods for fetching tickers are described below.
### A Single Ticker For One Symbol [#a-single-ticker-for-one-symbol]
```javascript
// one ticker
fetchTicker (symbol, params = {})
// example
fetchTicker ('ETH/BTC')
fetchTicker ('BTC/USDT')
```
### Multiple Tickers For All Or Many Symbols [#multiple-tickers-for-all-or-many-symbols]
```javascript
// multiple tickers
fetchTickers (symbols = undefined, params = {}) // for all tickers at once
// for example
fetchTickers () // all symbols
fetchTickers ([ 'ETH/BTC', 'BTC/USDT' ]) // an array of specific symbols
```
Check the `exchange.has['fetchTicker']` and `exchange.has['fetchTickers']` properties of the exchange instance to determine if the exchange in question does support these methods.
**Please, note, that calling `fetchTickers ()` without a symbol is usually strictly rate-limited, an exchange may ban you if you poll that endpoint too frequently.**
### Ticker Structure [#ticker-structure]
A ticker is a statistical calculation with the information calculated over the past 24 hours for a specific market.
The structure of a ticker is as follows:
```javascript
{
'symbol': string symbol of the market ('BTC/USD', 'ETH/BTC', ...)
'info': { the original non-modified unparsed reply from exchange API },
'timestamp': int (64-bit Unix Timestamp in milliseconds since Epoch 1 Jan 1970)
'datetime': ISO8601 datetime string with milliseconds
'high': float, // highest price
'low': float, // lowest price
'bid': float, // current best bid (buy) price
'bidVolume': float, // current best bid (buy) amount (may be missing or undefined)
'ask': float, // current best ask (sell) price
'askVolume': float, // current best ask (sell) amount (may be missing or undefined)
'vwap': float, // volume weighed average price
'open': float, // opening price
'close': float, // price of last trade (closing price for current period)
'last': float, // same as `close`, duplicated for convenience
'previousClose': float, // closing price for the previous period
'change': float, // absolute change, `last - open`
'percentage': float, // relative change, `(change/open) * 100`
'average': float, // average price, `(last + open) / 2`
'baseVolume': float, // volume of base currency traded for last 24 hours
'quoteVolume': float, // volume of quote currency traded for last 24 hours
}
```
#### Notes On Ticker Structure [#notes-on-ticker-structure]
* All fields in the ticker represent the past 24 hours prior to `timestamp`.
* The `bidVolume` is the volume (amount) of current best bid in the orderbook.
* The `askVolume` is the volume (amount) of current best ask in the orderbook.
* The `baseVolume` is the amount of base currency traded (bought or sold) in last 24 hours.
* The `quoteVolume` is the amount of quote currency traded (bought or sold) in last 24 hours.
**All prices in ticker structure are in quote currency. Some fields in a returned ticker structure may be undefined/None/null.**
```text
base currency ↓
BTC / USDT
ETH / BTC
DASH / ETH
↑ quote currency
```
Timestamp and datetime are both Universal Time Coordinated (UTC) in milliseconds.
* `ticker['timestamp']` is the time when the exchange generated this response (before replying it back to you). It may be missing (`undefined/None/null`), as documented in the Manual, not all exchanges provide a timestamp there. If it is defined, then it is a UTC timestamp **in milliseconds** since 1 Jan 1970 00:00:00.
* `exchange.last_response_headers['Date']` is the date-time string of the last HTTP response received (from HTTP headers). The 'Date' parser should respect the timezone designated there. The precision of the date-time is 1 second, 1000 milliseconds. This date should be set by the exchange server when the message originated according to the following standards:
* [https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18)
* [https://tools.ietf.org/html/rfc1123#section-5.2.14](https://tools.ietf.org/html/rfc1123#section-5.2.14)
* [https://tools.ietf.org/html/rfc822#section-5](https://tools.ietf.org/html/rfc822#section-5)
Although some exchanges do mix-in orderbook's top bid/ask prices into their tickers (and some exchanges even serve top bid/ask volumes) you should not treat a ticker as a `fetchOrderBook` replacement. The main purpose of a ticker is to serve statistical data, as such, treat it as "live 24h OHLCV". It is known that exchanges discourage frequent `fetchTicker` requests by imposing stricter rate limits on these queries. If you need a unified way to access bids and asks you should use `fetchL[123]OrderBook` family instead.
To get historical prices and volumes use the unified [`fetchOHLCV`](#ohlcv-candlestick-charts) method where available. To get historical mark, index, and premium index prices, add one of `'price': 'mark'`, `'price': 'index'`, `'price': 'premiumIndex'` respectively to the [params-overrides](#overriding-unified-api-params) of `fetchOHLCV`. There are also convenience methods `fetchMarkPriceOHLCV`, `fetchIndexPriceOHLCV`, and `fetchPremiumIndexOHLCV` that obtain the mark, index and premiumIndex historical prices and volumes.
Methods for fetching tickers:
* `fetchTicker (symbol[, params = {}])`, symbol is required, params are optional
* `fetchTickers ([symbols = undefined[, params = {}]])`, both arguments optional
### Individually By Symbol [#individually-by-symbol]
To get the individual ticker data from an exchange for a particular trading pair or a specific symbol – call the `fetchTicker (symbol)`:
JavaScript
Python
PHP
Go
C#
Java
```javascript
if (exchange.has['fetchTicker']) {
console.log (await (exchange.fetchTicker ('BTC/USD'))) // ticker for BTC/USD
let symbols = Object.keys (exchange.markets)
let random = Math.floor (Math.random () * (symbols.length - 1))
console.log (exchange.fetchTicker (symbols[random])) // ticker for a random symbol
}
```
```python
import random
if (exchange.has['fetchTicker']):
print(exchange.fetch_ticker('LTC/ZEC')) # ticker for LTC/ZEC
symbols = list(exchange.markets.keys())
print(exchange.fetch_ticker(random.choice(symbols))) # ticker for a random symbol
```
```php
//(don't forget to set your timezone properly!)
if ($exchange->has['fetchTicker']) {
var_dump ($exchange->fetch_ticker ('ETH/CNY')); // ticker for ETH/CNY
$symbols = array_keys ($exchange->markets);
$random = rand () % count ($symbols);
var_dump ($exchange->fetch_ticker ($symbols[$random])); // ticker for a random symbol
}
```
```go
ticker, err := exchange.FetchTicker("BTC/USDT")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(ticker.Symbol, "last=", ticker.Last, "bid=", ticker.Bid, "ask=", ticker.Ask)
```
```csharp
var ticker = await exchange.FetchTicker("BTC/USDT");
Console.WriteLine(ticker.symbol + " last=" + ticker.last + " bid=" + ticker.bid + " ask=" + ticker.ask);
```
```java
Ticker ticker = exchange.fetchTicker("BTC/USDT");
System.out.println(ticker.symbol + " last=" + ticker.last + " bid=" + ticker.bid + " ask=" + ticker.ask);
```
### All At Once [#all-at-once]
Some exchanges (not all of them) also support fetching all tickers at once. See [their docs](#exchanges) for details. You can fetch all tickers with a single call like so:
JavaScript
Python
PHP
Go
C#
Java
```javascript
if (exchange.has['fetchTickers']) {
console.log (await (exchange.fetchTickers ())) // all tickers indexed by their symbols
}
```
```python
if (exchange.has['fetchTickers']):
print(exchange.fetch_tickers()) # all tickers indexed by their symbols
```
```php
if ($exchange->has['fetchTickers']) {
var_dump ($exchange->fetch_tickers ()); // all tickers indexed by their symbols
}
```
```go
tickers, err := exchange.FetchTickers()
if err != nil {
fmt.Println(err)
return
}
for symbol, ticker := range tickers.Tickers {
fmt.Println(symbol, "last=", ticker.Last)
}
```
```csharp
var tickers = await exchange.FetchTickers();
foreach (var entry in tickers.tickers)
{
Console.WriteLine(entry.Key + " last=" + entry.Value.last);
}
```
```java
Tickers tickers = exchange.fetchTickers();
for (var entry : tickers.tickers.entrySet()) {
System.out.println(entry.getKey() + " last=" + entry.getValue().last);
}
```
Fetching all tickers requires more traffic than fetching a single ticker. Also, note that some exchanges impose higher rate-limits on subsequent fetches of all tickers (see their docs on corresponding endpoints for details). **The cost of the `fetchTickers()` call in terms of rate limit is often higher than average**. If you only need one ticker, fetching by a particular symbol is faster as well. You probably want to fetch all tickers only if you really need all of them and, most likely, you don't want to fetchTickers more frequently than once in a minute or so.
Also, some exchanges may impose additional requirements on the `fetchTickers()` call, sometimes you can't fetch the tickers for all symbols because of the API limitations of the exchange in question. Some exchanges accept a list of symbols in HTTP URL query params, however, because URL length is limited, and in extreme cases exchanges can have thousands of markets – a list of all their symbols simply would not fit in the URL, so it has to be a limited subset of their symbols. Sometimes, there are other reasons for requiring a list of symbols, and there may be a limit on the number of symbols you can fetch at once, but whatever the limitation, please, blame the exchange. To pass the symbols of interest to the exchange, you can supply a list of strings as the first argument to fetchTickers:
JavaScript
Python
PHP
Go
C#
Java
```javascript
//JavaScript
if (exchange.has['fetchTickers']) {
console.log (await (exchange.fetchTickers ([ 'ETH/BTC', 'LTC/BTC' ]))) // listed tickers indexed by their symbols
}
```
```python
if (exchange.has['fetchTickers']):
print(exchange.fetch_tickers(['ETH/BTC', 'LTC/BTC'])) # listed tickers indexed by their symbols
```
```php
if ($exchange->has['fetchTickers']) {
var_dump ($exchange->fetch_tickers (array ('ETH/BTC', 'LTC/BTC'))); // listed tickers indexed by their symbols
}
```
```go
tickers, err := exchange.FetchTickers(ccxt.WithFetchTickersSymbols([]string{"ETH/BTC", "LTC/BTC"}))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(len(tickers.Tickers)) // listed tickers indexed by their symbols
```
```csharp
var tickers = await exchange.FetchTickers(new List() { "ETH/BTC", "LTC/BTC" }); // listed tickers indexed by their symbols
Console.WriteLine(tickers.tickers.Count);
```
```java
Tickers tickers = exchange.fetchTickers(List.of("ETH/BTC", "LTC/BTC"), null);
```
Note that the list of symbols is not required in most cases, but you must add additional logic if you want to handle all possible limitations that might be imposed on the exchanges' side.
Like most methods of the Unified CCXT API, the last argument to fetchTickers is the `params` argument for overriding request parameters that are sent towards the exchange.
The structure of the returned value is as follows:
```javascript
{
'info': { ... }, // the original JSON response from the exchange as is
'BTC/USD': { ... }, // a single ticker for BTC/USD
'ETH/BTC': { ... }, // a ticker for ETH/BTC
...
}
```
A general solution for fetching all tickers from all exchanges (even the ones that don't have a corresponding API endpoint) is on the way, this section will be updated soon.
```text
UNDER CONSTRUCTION
```
## OHLCV Candlestick Charts [#ohlcv-candlestick-charts]
Most exchanges have endpoints for fetching OHLCV data, but some of them don't. The exchange boolean (true/false) property named `has['fetchOHLCV']` indicates whether the exchange supports candlestick data series or not.
To fetch OHLCV candles/bars from an exchange, ccxt has the `fetchOHLCV` method, which is declared in the following way:
```javascript
fetchOHLCV (symbol, timeframe = '1m', since = undefined, limit = undefined, params = {})
```
You can call the unified `fetchOHLCV` / `fetch_ohlcv` method to get the list of OHLCV candles for a particular symbol like so:
JavaScript
Python
PHP
Go
C#
Java
```javascript
let sleep = (ms) => new Promise (resolve => setTimeout (resolve, ms));
if (exchange.has.fetchOHLCV) {
for (symbol in exchange.markets) {
await sleep (exchange.rateLimit) // milliseconds
console.log (await exchange.fetchOHLCV (symbol, '1m')) // one minute
}
}
```
```python
import time
if exchange.has['fetchOHLCV']:
for symbol in exchange.markets:
time.sleep (exchange.rateLimit / 1000) # time.sleep wants seconds
print (symbol, exchange.fetch_ohlcv (symbol, '1d')) # one day
```
```php
if ($exchange->has['fetchOHLCV']) {
foreach ($exchange->markets as $symbol => $market) {
usleep ($exchange->rateLimit * 1000); // usleep wants microseconds
var_dump ($exchange->fetch_ohlcv ($symbol, '1M')); // one month
}
}
```
```go
candles, err := exchange.FetchOHLCV("BTC/USDT", ccxt.WithFetchOHLCVTimeframe("1h"), ccxt.WithFetchOHLCVLimit(10))
if err != nil {
fmt.Println(err)
return
}
for _, c := range candles {
fmt.Println(c.Timestamp, "O=", c.Open, "H=", c.High, "L=", c.Low, "C=", c.Close)
}
```
```csharp
var candles = await exchange.FetchOHLCV("BTC/USDT", "1h", null, 10);
foreach (var c in candles)
{
Console.WriteLine(c.timestamp + " O=" + c.open + " H=" + c.high + " L=" + c.low + " C=" + c.close);
}
```
```java
List candles = exchange.fetchOHLCV("BTC/USDT", "1h", null, 10L, null);
for (OHLCV c : candles) {
System.out.println(c.timestamp + " O=" + c.open + " H=" + c.high + " L=" + c.low + " C=" + c.close);
}
```
To get the list of available timeframes for your exchange see the `timeframes` property. Note that it is only populated when `has['fetchOHLCV']` is true as well.
The returned list of candles may have one or more missing periods, if the exchange did not have any trades for the specified timerange and symbol. To a user that would appear as gaps in a continuous list of candles. That is considered normal. If the exchange did not have any candles at that time, the CCXT library will show the results as returned from the exchange itself.
**There's a limit on how far back in time your requests can go.** Most of exchanges will not allow to query detailed candlestick history (like those for 1-minute and 5-minute timeframes) too far in the past. They usually keep a reasonable amount of most recent candles, like 1000 last candles for any timeframe is more than enough for most of needs. You can work around that limitation by continuously fetching (aka *REST polling*) latest OHLCVs and storing them in a CSV file or in a database.
**Note that the info from the last (current) candle may be incomplete until the candle is closed (until the next candle starts).**
Like with most other unified and implicit methods, the `fetchOHLCV` method accepts as its last argument an associative array (a dictionary) of extra `params`, which is used to [override default values](#overriding-unified-api-params) that are sent in requests to the exchanges. The contents of `params` are exchange-specific, consult the exchanges' API documentation for supported fields and values.
The `since` argument is an integer UTC timestamp **in milliseconds** (everywhere throughout the library with all unified methods).
If `since` is not specified the `fetchOHLCV` method will return the time range as is the default from the exchange itself. This is not a bug. Some exchanges will return candles from the beginning of time, others will return most recent candles only, the exchanges' default behaviour is expected. Thus, without specifying `since` the range of returned candles will be exchange-specific. One should pass the `since` argument to ensure getting precisely the history range needed.
### Get raw OHLCV response [#get-raw-ohlcv-response]
Currently, the structure CCXT uses does not include the raw response from the exchange. However, users might be able to override the return value by doing:
JavaScript
Python
```javascript
const ex = new ccxt.coinbase();
const originalParser = ex.parseOHLCV.bind(ex);
ex.parseOHLCV = ((ohlcv, market = undefined) => {
return {
'result': originalParser(ohlcv, market),
'raw': ohlcv,
};
});
const result = await ex.fetchOHLCV('BTC/USDT', '1m');
console.log (result[0]);
```
```python
# add raw member at last position in list
async def test():
ex = ccxt.async_support.coinbase()
prase_ohlcv_original = ex.parse_ohlcv
def prase_ohlcv_custom(ohlcv, market):
res = prase_ohlcv_original(ohlcv, market)
res.append(ohlcv)
return res
ex.parse_ohlcv = prase_ohlcv_custom
result = await ex.fetch_ohlcv('BTC/USDT', '1m')
print (result[0])
asyncio.run(test())
```
### Notes On Latency [#notes-on-latency]
Trading strategies require fresh up-to-date information for technical analysis, indicators and signals. Building a speculative trading strategy based on the OHLCV candles received from the exchange may have critical drawbacks. Developers should account for the details explained in this section to build successful bots.
First and foremost, when using CCXT you're talking to the exchanges directly. CCXT is not a server, nor a service, it's a software library. All data that you are getting with CCXT is received directly from the exchanges first-hand.
The exchanges usually provide two categories of public market data:
1. Fast primary first-order data that includes real time orderbooks and trades or fills
2. Slow second-order data that includes secondary tickers and kline OHLCV candles, that are calculated from the first-order data
The primary first-order data is updated by the exchanges APIs in pseudo real time, or as close to real time as possible, as fast as possible. The second-order data requires time for the exchange to calculate it. For example, a ticker is nothing more than a rolling 24-hour statistical cut of orderbooks and trades. OHLCV candles and volumes are also calculated from first-order trades and represent fixed statistical cuts of specific periods. The volume traded within an hour is just a sum of traded volumes of the corresponding trades that happened within that hour.
Obviously, it takes some time for the exchange to collect the first-order data and calculate the secondary statistical data from it. That literally means that **tickers and OHLCVs are always slower than orderbooks and trades**. In other words, there is always some latency in the exchange API between the moment when a trade happens and the moment when a corresponding OHLCV candle is updated or published by the exchange API.
The latency (or how much time is needed by the exchange API for calculating the secondary data) depends on how fast the exchange engine is, so it is exchange-specific. Top exchange engines will usually return and update fresh last-minute OHLCV candles and tickers at a very fast rate. Some exchanges might do it in regular intervals like once a second or once in a few seconds. Slow exchange engines might take minutes to update the secondary statistical information, their APIs might return the current most recent OHLCV candle a few minutes late.
If your strategy depends on the fresh last-minute most recent data you don't want to build it based on tickers or OHLCVs received from the exchange. Tickers and exchanges' OHLCVs are only suitable for display purposes, or for simple trading strategies for hour-timeframes or day-timeframes that are less susceptible to latency.
Thankfully, the developers of time-critical trading strategies don't have to rely on secondary data from the exchanges and can calculate the OHLCVs and tickers in the userland. That may be faster and more efficient than waiting for the exchanges to update the info on their end. One can aggregate the public trade history by polling it frequently and calculate candles by walking over the list of trades - please take a look into "build-ohlcv-bars" file inside [examples folder](https://github.com/ccxt/ccxt/tree/master/examples)
Due to the differences in their internal implementations the exchanges may be faster to update their primary and secondary market data over WebSockets. The latency remains exchange-specific, cause the exchange engine still needs time to calculate the secondary data, regardless of whether you're polling it over the RESTful API with CCXT or getting updates via WebSockets with CCXT Pro. WebSockets can improve the networking latency, so a fast exchange will work even better, but adding the support for WS subscriptions will not make a slow exchange engine work much faster.
If you want to stay on top of the second-order data latency, then you will have to calculate it on your side and beat the exchange engine in speed of doing so. Depending on the needs of your application, it may be tricky, since you will need to handle redundancy, "data holes" in the history, exchange downtimes, and other aspects of data aggregation which is a whole universe in itself that is impossible to fully cover in this Manual.
### Build OHLCV bars from trades [#build-ohlcv-bars-from-trades]
As noted in above paragraph, users can build candles manually using `buildOHLCV / build_ohlcv` method. You can see an example file named "build-ohlcv-bars" inside [examples folder](https://github.com/ccxt/ccxt/tree/master/examples).
Notes:
* This method expects the provided trades to be chronologically sorted (newest trade to be the last in array)
* Due to some possible mistakes inside trade entries (coming from `watch_ohlcv` or other sources) inside `build_ohlcv` method we skip trades that have `0` price, to avoid distorted values for a candle. However, if you don't want to skip such trade items, set an option:
```
exchange.options['buildOHLCV'] = {
'skipZeroPrices': false
};
```
### OHLCV Structure [#ohlcv-structure]
The fetchOHLCV method shown above returns a list (a flat array) of OHLCV candles represented by the following structure:
```javascript
[
[
1504541580000, // UTC timestamp in milliseconds, integer
4235.4, // (O)pen price, float
4240.6, // (H)ighest price, float
4230.0, // (L)owest price, float
4230.7, // (C)losing price, float
37.72941911 // (V)olume float (usually in terms of the base currency, the exchanges docstring may list whether quote or base units are used)
],
...
]
```
The list of candles is returned sorted in ascending (historical/chronological) order, oldest candle first, most recent candle last.
### Mark, Index and PremiumIndex Candlestick Charts [#mark-index-and-premiumindex-candlestick-charts]
To obtain historical Mark, Index Price and Premium Index candlesticks pass the `'price'` [params-override](#overriding-unified-api-params) to `fetchOHLCV`. The `'price'` parameter accepts one of the following values:
* `'mark'`
* `'index'`
* `'premiumIndex'`
```javascript
// JavaScript
async function main () {
const exchange = new ccxt.binanceusdm ()
const markKlines = await exchange.fetchOHLCV ('ADA/USDT', '1h', undefined, undefined, { 'price': 'mark' })
console.log (markKlines)
const indexKlines = await exchange.fetchOHLCV ('ADA/USDT', '1h', undefined, undefined, { 'price': 'index' })
console.log (indexKlines)
}
main ()
```
There are also convenience methods `fetchMarkOHLCV`, `fetchIndexOHLCV` and `fetchPremiumIndexOHLCV`
JavaScript
Python
PHP
Go
C#
Java
```javascript
async function main () {
const exchange = new ccxt.binanceusdm ()
const markKlines = await exchange.fetchMarkOHLCV ('ADA/USDT', '1h')
console.log (markKlines)
const indexKlines = await exchange.fetchIndexOHLCV ('ADA/USDT', '1h')
console.log (indexKlines)
}
main ()
```
```python
exchange = ccxt.binance()
response = exchange.fetch_ohlcv('ADA/USDT', '1h', params={'price':'index'})
pprint(response)
# Convenience methods
mark_klines = exchange.fetch_mark_ohlcv('ADA/USDT', '1h')
index_klines = exchange.fetch_index_ohlcv('ADA/USDT', '1h')
pprint(mark_klines)
pprint(index_klines)
```
```php
$exchange = new \ccxt\binanceusdm();
// Convenience methods
$mark_klines = $exchange->fetch_mark_ohlcv('ADA/USDT', '1h');
$index_klines = $exchange->fetch_index_ohlcv('ADA/USDT', '1h');
var_dump($mark_klines);
var_dump($index_klines);
```
```go
exchange := ccxt.NewBinanceusdm(nil)
// Convenience methods
markKlines, err := exchange.FetchMarkOHLCV("ADA/USDT", ccxt.WithFetchMarkOHLCVTimeframe("1h"))
if err != nil {
fmt.Println(err)
return
}
indexKlines, _ := exchange.FetchIndexOHLCV("ADA/USDT", ccxt.WithFetchIndexOHLCVTimeframe("1h"))
fmt.Println(markKlines, indexKlines)
```
```csharp
var exchange = new Binanceusdm();
// Convenience methods
var markKlines = await exchange.FetchMarkOHLCV("ADA/USDT", "1h");
var indexKlines = await exchange.FetchIndexOHLCV("ADA/USDT", "1h");
Console.WriteLine(markKlines.Count + " " + indexKlines.Count);
```
```java
List markKlines = exchange.fetchOHLCV("ADA/USDT", "1h", null, null, Map.of("price", "mark"));
```
## Public Trades [#public-trades]
```diff
- this is under heavy development right now, contributions appreciated
```
You can call the unified `fetchTrades` / `fetch_trades` method to get the list of most recent trades for a particular symbol. The `fetchTrades` method is declared in the following way:
```javascript
async fetchTrades (symbol, since = undefined, limit = undefined, params = {})
```
For example, if you want to print recent trades for all symbols one by one sequentially (mind the rateLimit!) you would do it like so:
TypeScript
Python
PHP
Go
C#
Java
```javascript
if (exchange.has['fetchTrades']) {
let sleep = (ms) => new Promise (resolve => setTimeout (resolve, ms));
for (symbol in exchange.markets) {
console.log (await exchange.fetchTrades (symbol))
}
}
```
```python
import time
if exchange.has['fetchTrades']:
for symbol in exchange.markets: # ensure you have called loadMarkets() or load_markets() method.
print (symbol, exchange.fetch_trades (symbol))
```
```php
if ($exchange->has['fetchTrades']) {
foreach ($exchange->markets as $symbol => $market) {
var_dump ($exchange->fetch_trades ($symbol));
}
}
```
```go
trades, err := exchange.FetchTrades("BTC/USDT", ccxt.WithFetchTradesLimit(20))
if err != nil {
fmt.Println(err)
return
}
for _, t := range trades {
fmt.Println(t.Datetime, t.Side, t.Amount, "@", t.Price)
}
```
```csharp
var trades = await exchange.FetchTrades("BTC/USDT", null, 20);
foreach (var t in trades)
{
Console.WriteLine(t.datetime + " " + t.side + " " + t.amount + " @ " + t.price);
}
```
```java
List trades = exchange.fetchTrades("BTC/USDT", null, 20L, null);
for (Trade t : trades) {
System.out.println(t.datetime + " " + t.side + " " + t.amount + " @ " + t.price);
}
```
The fetchTrades method shown above returns an ordered list of trades (a flat array, sorted by timestamp in ascending order, oldest trade first, most recent trade last). A list of trades is represented by the [trade structure](#trade-structure).
```javascript
[
{
'info': { ... }, // the original decoded JSON as is
'id': '12345-67890:09876/54321', // string trade id
'timestamp': 1502962946216, // Unix timestamp in milliseconds
'datetime': '2017-08-17 12:42:48.000', // ISO8601 datetime with milliseconds
'symbol': 'ETH/BTC', // symbol
'order': '12345-67890:09876/54321', // string order id or undefined/None/null
'type': 'limit', // order type, 'market', 'limit' or undefined/None/null
'side': 'buy', // direction of the trade, 'buy' or 'sell'
'takerOrMaker': 'taker', // string, 'taker' or 'maker'
'price': 0.06917684, // float price in quote currency
'amount': 1.5, // amount of base currency
'cost': 0.10376526, // total cost, `price * amount`,
'fee': { // if provided by exchange or calculated by ccxt
'cost': 0.0015, // float
'currency': 'ETH', // usually base currency for buys, quote currency for sells
'rate': 0.002, // the fee rate (if available)
},
'fees': [ // an array of fees if paid in multiple currencies
{ // if provided by exchange or calculated by ccxt
'cost': 0.0015, // float
'currency': 'ETH', // usually base currency for buys, quote currency for sells
'rate': 0.002, // the fee rate (if available)
},
]
},
...
]
```
Most exchanges return most of the above fields for each trade, though there are exchanges that don't return the type, the side, the trade id or the order id of the trade. Most of the time you are guaranteed to have the timestamp, the datetime, the symbol, the price and the amount of each trade.
The second optional argument `since` reduces the array by timestamp, the third `limit` argument reduces by number (count) of returned items.
If the user does not specify `since`, the `fetchTrades` method will return the default range of public trades from the exchange. The default set is exchange-specific, some exchanges will return trades starting from the date of listing a pair on the exchange, other exchanges will return a reduced set of trades (like, last 24 hours, last 100 trades, etc). If the user wants precise control over the timeframe, the user is responsible for specifying the `since` argument.
Most of unified methods will return either a single object or a plain array (a list) of objects (trades). However, very few exchanges (if any at all) will return all trades at once. Most often their APIs `limit` output to a certain number of most recent objects. **YOU CANNOT GET ALL OBJECTS SINCE THE BEGINNING OF TIME TO THE PRESENT MOMENT IN JUST ONE CALL**. Practically, very few exchanges will tolerate or allow that.
To fetch historical trades, the user will need to traverse the data in portions or "pages" of objects. Pagination often implies *"fetching portions of data one by one"* in a loop.
In most cases users are **required to use at least some type of pagination** in order to get the expected results consistently.
On the other hand, **some exchanges don't support pagination for public trades at all**. In general the exchanges will provide just the most recent trades.
The `fetchTrades ()` / `fetch_trades()` method also accepts an optional `params` (assoc-key array/dict, empty by default) as its fourth argument. You can use it to pass extra params to method calls or to override a particular default value (where supported by the exchange). See the API docs for your exchange for more details.
## Exchange Time [#exchange-time]
The `fetchTime()` method (if available) returns the current integer timestamp in milliseconds from the exchange server.
```javascript
fetchTime(params = {})
```
## Exchange Status [#exchange-status]
The exchange status describes the latest known information on the availability of the exchange API. This information is either hardcoded into the exchange class or fetched live directly from the exchange API. The `fetchStatus(params = {})` method can be used to get this information. The status returned by `fetchStatus` is one of:
* Hardcoded into the exchange class, e.g. if the API has been broken or shutdown.
* Updated using the exchange ping or `fetchTime` endpoint to see if its alive
* Updated using the dedicated exchange API status endpoint.
```javascript
fetchStatus(params = {})
```
### Exchange Status Structure [#exchange-status-structure]
The `fetchStatus()` method will return a status structure like shown below:
```javascript
{
'status': 'ok', // 'ok', 'shutdown', 'error', 'maintenance'
'updated': undefined, // integer, last updated timestamp in milliseconds if updated via the API
'eta': undefined, // when the maintenance or outage is expected to end
'url': undefined, // a link to a GitHub issue or to an exchange post on the subject
}
```
The possible values in the `status` field are:
* `'ok'` means the exchange API is fully operational
* `'shutdown`' means the exchange was closed, and the `updated` field should contain the datetime of the shutdown
* `'error'` means that either the exchange API is broken, or the implementation of the exchange in CCXT is broken
* `'maintenance'` means regular maintenance, and the `eta` field should contain the datetime when the exchange is expected to be operational again
## Borrow Rates [#borrow-rates]
*margin only*
When short trading or trading with leverage on a spot market, currency must be borrowed. Interest is accrued for the borrowed currency.
Data on the borrow rate for a currency can be retrieved using
* `fetchCrossBorrowRate ()` for a single currencies borrow rate
* `fetchCrossBorrowRates ()` for all currencies borrow rates
* `fetchIsolatedBorrowRate ()` for a trading pairs borrow rate
* `fetchIsolatedBorrowRates ()` for all trading pairs borrow rates
```javascript
fetchCrossBorrowRate (code, params = {})
```
Parameters
* **code** (String) Unified CCXT currency code, required (e.g. `"USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"settle": "USDT"}`)
Returns
* A [borrow rate structure](#borrow-rate-structure)
```javascript
fetchCrossBorrowRates (params = {})
```
Parameters
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"startTime": 1610248118000}`)
Returns
* A dictionary of [borrow rate structures](#borrow-rate-structure) with unified currency codes as keys
```javascript
fetchIsolatedBorrowRate (symbol, params = {})
```
Parameters
* **symbol** (String) Unified CCXT market symbol, required (e.g. `"BTC/USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"settle": "USDT"}`)
Returns
* An [isolated borrow rate structure](#isolated-borrow-rate-structure)
```javascript
fetchIsolatedBorrowRates (params = {})
```
Parameters
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"startTime": 1610248118000}`)
Returns
* A dictionary of [isolated borrow rate structures](#isolated-borrow-rate-structure) with unified market symbols as keys
### Isolated Borrow Rate Structure [#isolated-borrow-rate-structure]
```javascript
{
symbol: 'BTC/USDT', // Unified market symbol
base: 'BTC', // Unified currency code of the base currency
baseRate: 0.00025, // A decimal value rate that interest is accrued at
quote: 'USDT', // Unified currency code of the quote currency
quoteRate: 0.00025, // A decimal value rate that interest is accrued at
period: 86400000, // The amount of time in milliseconds that is required to accrue the interest amount specified by rate
timestamp: 1646956800000, // Timestamp for when the currency had this rate
datetime: '2022-03-11T00:00:00.000Z', // Datetime for when the currency had this rate
info: [ ... ]
}
```
### Borrow Rate Structure [#borrow-rate-structure]
```javascript
{
currency: 'USDT', // Unified currency code
rate: 0.0006, // A ratio of the rate that interest is accrued at
period: 86400000, // The amount of time in milliseconds that is required to accrue the interest amount specified by rate
timestamp: 1646956800000, // Timestamp for when the currency had this rate
datetime: '2022-03-11T00:00:00.000Z', // Datetime for when the currency had this rate
info: [ ... ]
}
```
## Borrow Rate History [#borrow-rate-history]
*margin only*
The `fetchBorrowRateHistory` method retrieves a history of a currencies borrow interest rate at specific time slots
```javascript
fetchBorrowRateHistory (code, since = undefined, limit = undefined, params = {})
```
Parameters
* **code** (String) *required* Unified CCXT currency code (e.g. `"USDT"`)
* **since** (Integer) Timestamp for the earliest borrow rate (e.g. `1645807945000`)
* **limit** (Integer) The maximum number of [borrow rate structures](#borrow-rate-structure) to retrieve (e.g. `10`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [borrow rate structures](#borrow-rate-structure)
## Leverage Tiers [#leverage-tiers]
*contract only*
* Leverage Tier methods are private on **binance**
The `fetchLeverageTiers()` method can be used to obtain the maximum leverage for a market at varying position sizes. It can also be used to obtain the maintenance margin rate, and the max tradeable amount for a market when that information is not available from the market object
While you can obtain the absolute maximum leverage for a market by accessing `market['limits']['leverage']['max']`, for many contract markets, the maximum leverage will depend on the size of your position.
You can access those limits by using
* `fetchMarketLeverageTiers()` (single symbol)
* `fetchLeverageTiers([symbol1, symbol2, ...])` (multiple symbols)
* `fetchLeverageTiers()` (all market symbols)
```javascript
fetchMarketLeverageTiers(symbol, params = {})
```
Parameters
* **symbol** (String) *required* Unified CCXT symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"settle": "usdt"}`)
Returns
* a [leverage-tiers-structure](#leverage-tiers-structure)
```javascript
fetchLeverageTiers(symbols = undefined, params = {})
```
Parameters
* **symbols** (\[String]) Unified CCXT symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"settle": "usdt"}`)
Returns
* an array of [leverage-tiers-structures](#leverage-tiers-structure)
### Leverage Tiers Structure [#leverage-tiers-structure]
```javascript
[
{
"tier": 1, // tier index
"symbol": "BTC/USDT", // the market symbol that the leverage tier applies to
"currency": "USDT", // the currency that minNotional and maxNotional are in
"minNotional": 0, // the lowest amount of this tier // stake = 0.0
"maxNotional": 10000, // the highest amount of this tier // max stake amount at 75x leverage = 133.33333333333334
"maintenanceMarginRate": 0.0065, // maintenance margin rate
"maxLeverage": 75, // max available leverage for this market when the value of the trade is > minNotional and < maxNotional
"info": { ... } // Response from exchange
},
{
"tier": 2,
"symbol": "BTC/USDT",
"currency": "USDT",
"minNotional": 10000, // min stake amount at 50x leverage = 200.0
"maxNotional": 50000, // max stake amount at 50x leverage = 1000.0
"maintenanceMarginRate": 0.01,
"maxLeverage": 50,
"info": { ... },
},
...
{
"tier": 9,
"symbol": "BTC/USDT",
"currency": "USDT",
"minNotional": 20000000,
"maxNotional": 50000000,
"maintenanceMarginRate": 0.5,
"maxLeverage": 1,
"info": { ... },
},
]
```
In the example above:
* stakes below 133.33 = a max leverage of 75
* stakes from 200 + 1000 = a max leverage of 50
* a stake amount of 150 = a max leverage of (10000 / 150) = 66.66
* stakes between 133.33-200 = a max leverage of (10000 / stake) = 50.01 -> 74.99
**Note for htx users:** htx uses both leverage and amount to determine maintenance margin rates: [https://www.htx.com/support/en-us/detail/900000089903](https://www.htx.com/support/en-us/detail/900000089903)
## Funding Rate [#funding-rate]
*contract only*
Data on the current, most recent, and next funding rates can be obtained using the methods
* `fetchFundingRates ()` for all market symbols
* `fetchFundingRates ([ symbol1, symbol2, ... ])` for multiple market symbols
* `fetchFundingRate (symbol)` for a single market symbol
```javascript
fetchFundingRate (symbol, params = {})
```
Parameters
* **symbol** (String) *required* Unified CCXT symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* a [funding rate structure](#funding-rate-structure)
```javascript
fetchFundingRates (symbols = undefined, params = {})
```
Parameters
* **symbols** (\[String]) An optional array/list of unified CCXT symbols (e.g. `["BTC/USDT:USDT", "ETH/USDT:USDT"]`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [funding rate structures](#funding-rate-structure) indexed by market symbols
## Funding Interval [#funding-interval]
*contract only*
Retrieve the current funding interval using the following methods:
* `fetchFundingInterval (symbol)` for a single market symbol
* `fetchFundingIntervals ()` for all market symbols
* `fetchFundingIntervals ([ symbol1, symbol2, ... ])` for multiple market symbols
```javascript
fetchFundingInterval (symbol, params = {})
```
Parameters
* **symbol** (String) *required* Unified CCXT symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* A [funding rate structure](#funding-rate-structure)
```javascript
fetchFundingIntervals (symbols = undefined, params = {})
```
Parameters
* **symbols** (\[String]) An optional array/list of unified CCXT symbols (e.g. `["BTC/USDT:USDT", "ETH/USDT:USDT"]`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [funding rate structures](#funding-rate-structure)
### Funding Rate Structure [#funding-rate-structure]
```javascript
{
info: { ... },
symbol: 'BTC/USDT:USDT',
markPrice: 39294.43,
indexPrice: 39291.78,
interestRate: 0.0003,
estimatedSettlePrice: undefined,
timestamp: undefined,
datetime: undefined,
fundingRate: 0.000072,
fundingTimestamp: 1645833600000,
fundingDatetime: '2022-02-26T00:00:00.000Z',
nextFundingRate: -0.000018, // nextFundingRate is actually two funding rates from now
nextFundingTimestamp: undefined,
nextFundingDatetime: undefined,
previousFundingRate: undefined,
previousFundingTimestamp: undefined,
previousFundingDatetime: undefined,
interval: '8h',
}
```
## Funding Rate History [#funding-rate-history]
*contract only*
```javascript
fetchFundingRateHistory (symbol = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **symbol** (String) Unified CCXT symbol (e.g. `"BTC/USDT:USDT"`)
* **since** (Integer) Timestamp for the earliest funding rate (e.g. `1645807945000`)
* **limit** (Integer) The maximum number of funding rates to retrieve (e.g. `10`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [funding rate history structures](#funding-rate-history-structure)
### Funding Rate History Structure [#funding-rate-history-structure]
```javascript
{
info: { ... },
symbol: "BTC/USDT:USDT",
fundingRate: -0.000068,
timestamp: 1642953600000,
datetime: "2022-01-23T16:00:00.000Z"
}
```
## Open Interest [#open-interest]
*contract only*
Use the `fetchOpenInterest` method to get the current open interest for a symbol from the exchange. Use `fetchOpenInterests` to get the current open interest for multiple symbols
```javascript
fetchOpenInterest (symbol, params = {})
```
Parameters
* **symbol** (String) Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An [open interest structure](#open-interest-structure)
```js
fetchOpenInterests (symbols = undefined, params = {})
```
* **symbols** (\[String]) An optional array/list of unified CCXT symbols (e.g. `["BTC/USDT:USDT", "ETH/USDT:USDT"]`). Leave as `undefined` for all symbols.
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* A dictionary of [open interest structures](#open-interest-structure)
### Open Interest History [#open-interest-history]
*contract only*
Use the `fetchOpenInterestHistory` method to get a history of open interest for a symbol from the exchange.
```javascript
fetchOpenInterestHistory (symbol, timeframe = '5m', since = undefined, limit = undefined, params = {})
```
Parameters
* **symbol** (String) Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`)
* **timeframe** (String) Check exchange.timeframes for available values
* **since** (Integer) Timestamp for the earliest open interest record (e.g. `1645807945000`)
* **limit** (Integer) The maximum number of [open interest structures](#open-interest-structures) to retrieve (e.g. `10`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
**Note for OKX users:** instead of a unified symbol okx.fetchOpenInterestHistory expects a unified currency code in the **symbol** argument (e.g. `'BTC'`).
Returns
* An array of [open interest structures](#open-interest-structure)
### Open Interest Structure [#open-interest-structure]
```javascript
{
symbol: 'BTC/USDT',
baseVolume: 80872.801, // deprecated
quoteVolume: 3508262107.38, // deprecated
openInterestAmount: 80872.801,
openInterestValue: 3508262107.38,
timestamp: 1649379000000,
datetime: '2022-04-08T00:50:00.000Z',
info: {
symbol: 'BTCUSDT',
sumOpenInterest: '80872.80100000',
sumOpenInterestValue: '3508262107.38000000',
timestamp: '1649379000000'
}
}
```
## Historical Volatility [#historical-volatility]
*option only*
Use the `fetchVolatilityHistory` method to get the volatility history for the code of an options underlying asset from the exchange.
```javascript
fetchVolatilityHistory (code, params = {})
```
Parameters
* **code** (String) *required* Unified CCXT currency code (e.g. `"BTC"`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [volatility history structures](#volatility-structure)
### Volatility Structure [#volatility-structure]
```javascript
{
info: {
"period": 7,
"value": "0.23854072",
"time": "1690574400000"
}
timestamp: 1649379000000,
datetime: '2023-07-28T00:50:00.000Z',
volatility: 0.23854072,
}
```
## Underlying Assets [#underlying-assets]
*contract only*
Use the `fetchUnderlyingAssets` method to get the market id's of underlying assets for a contract market type from the exchange.
```javascript
fetchUnderlyingAssets (params = {})
```
Parameters
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"instType": "OPTION"}`)
* **params.type** (String) Unified marketType, the default is 'option' (e.g. `"option"`)
Returns
* An [underlying assets structure](#underlying-assets-structure)
### Underlying Assets Structure [#underlying-assets-structure]
```javascript
[ 'BTC_USDT', 'ETH_USDT', 'DOGE_USDT' ]
```
## Settlement History [#settlement-history]
*contract only*
Use the `fetchSettlementHistory` method to get the public settlement history for a contract market from the exchange. Use `fetchMySettlementHistory` to get only your settlement history
```javascript
fetchMySettlementHistory (symbol = undefined, since = undefined, limit = undefined, params = {})
fetchSettlementHistory (symbol = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **symbol** (String) Unified CCXT symbol (e.g. `"BTC/USDT:USDT-230728-25500-P"`)
* **since** (Integer) Timestamp for the earliest settlement (e.g. `1694073600000`)
* **limit** (Integer) The maximum number of settlements to retrieve (e.g. `10`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [settlement history structures](#settlement-history-structure)
### Settlement History Structure [#settlement-history-structure]
```javascript
{
info: { ... },
symbol: 'BTC/USDT:USDT-230728-25500-P',
price: 25761.35807869,
timestamp: 1694073600000,
datetime: '2023-09-07T08:00:00.000Z',
}
```
## Liquidations [#liquidations]
*margin and contract only*
Use the `fetchLiquidations` method to get the public liquidations of a trading pair from the exchange. Use `fetchMyLiquidations` to get only your liquidation history
```javascript
fetchMyLiquidations (symbol = undefined, since = undefined, limit = undefined, params = {})
fetchLiquidations (symbol, since = undefined, limit = undefined, params = {})
```
Parameters
* **symbol** (String) Unified CCXT symbol (e.g. `"BTC/USDT:USDT-231006-25000-P"`)
* **since** (Integer) Timestamp for the earliest liquidation (e.g. `1694073600000`)
* **limit** (Integer) The maximum number of liquidations to retrieve (e.g. `10`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"until": 1645807945000}`)
Returns
* An array of [liquidation structures](#liquidation-structure)
### Liquidation Structure [#liquidation-structure]
```javascript
[
{
'info': { ... }, // the original decoded JSON as is
'symbol': 'BTC/USDT:USDT-231006-25000-P', // unified CCXT market symbol
'contracts': 2, // the number of derivative contracts
'contractSize': 0.001, // the contract size for the trading pair
'price': 27038.64, // the average liquidation price in the quote currency
'baseValue': 0.002, // value in the base currency (contracts * contractSize)
'quoteValue': 54.07728, // value in the quote currency ((contracts * contractSize) * price)
'timestamp': 1696996782210, // Unix timestamp in milliseconds
'datetime': '2023-10-11 03:59:42.000', // ISO8601 datetime with milliseconds
},
...
]
```
## Greeks [#greeks]
*option only*
Use the `fetchGreeks` method to get the public greeks and implied volatility of an options trading pair from the exchange. Use `fetchAllGreeks` to get the greeks for all symbols or multiple symbols.
The greeks measure how factors like the underlying assets price, time to expiration, volatility, and interest rates, affect the price of an options contract.
```javascript
fetchGreeks (symbol, params = {})
```
Parameters
* **symbol** (String) Unified CCXT symbol (e.g. `"BTC/USD:BTC-240927-40000-C"`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"category": "options"}`)
Returns
* A [greeks structure](#greeks-structure)
```javascript
fetchAllGreeks (symbols = undefined, params = {})
```
Parameters
* **symbols** (String) Unified CCXT symbol (e.g. `"BTC/USD:BTC-240927-40000-C"`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"category": "options"}`)
// for example
fetchAllGreeks () // all symbols
fetchAllGreeks (\[ 'BTC/USD:BTC-240927-40000-C', 'ETH/USD:ETH-240927-4000-C' ]) // an array of specific symbols
Returns
* a dictionary of [greeks structures](#greeks-structure) indexed by unified market symbol
### Greeks Structure [#greeks-structure]
```javascript
{
'symbol': 'BTC/USD:BTC-240927-40000-C', // unified CCXT market symbol
'timestamp': 1699593511632, // unix timestamp in milliseconds
'datetime': '2023-11-10T05:18:31.632Z', // ISO8601 datetime with milliseconds
'delta': 0.59833, // measures the rate of change in the options price per $1 change in the underlying assets price
'gamma': 0.00002, // measures the rate of change in the delta per $1 change in the underlying assets price
'theta': -13.4441, // measures the dollar amount that an options price will decline per day
'vega': 142.30124, // measures the dollar amount that an options price changes with a 1% change in the implied volatility
'rho': 131.82621, // measures the dollar amount that an options price changes with a 1% change in interest rates
'vanna': 0.06671, // measures the amount that an options delta changes with a 1% change in implied volatility
'volga': 925.95015, // measures the amount that an options vega changes with a 1% change in implied volatility
'charm': 0.18433, // measures the amount that an options delta changes each day until expiration
'bidSize': 2.2, // the options bid amount
'askSize': 9, // the options ask amount
'bidImpliedVolatility': 60.06, // the expected percentage price change of the underlying asset, over the remaining life of the option, calculated using the bid price
'askImpliedVolatility': 61.85, // the expected percentage price change of the underlying asset, over the remaining life of the option, calculated using the ask price
'markImpliedVolatility': 60.86, // the expected percentage price change of the underlying asset, over the remaining life of the option, calculated using the mark price
'bidPrice': 0.214, // the bid price of the option
'askPrice': 0.2205, // the ask price of the option
'markPrice': 0.2169, // the mark price of the option
'lastPrice': 0.215, // the last price of the option
'underlyingPrice': 39165.86, // the current market price of the underlying asset
'info': { ... }, // the original decoded JSON as is
}
```
## Option Chain [#option-chain]
*option only*
Use the `fetchOption` method to get the public details of a single option contract from the exchange.
```javascript
fetchOption (symbol, params = {})
```
Parameters
* **symbol** (String) Unified CCXT market symbol (e.g. `"BTC/USD:BTC-240927-40000-C"`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"category": "options"}`)
Returns
* An [option chain structure](#option-chain-structure)
Use the `fetchOptionChain` method to get the public option chain data of an underlying currency from the exchange.
```javascript
fetchOptionChain (code, params = {})
```
Parameters
* **code** (String) Unified CCXT currency code (e.g. `"BTC"`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"category": "options"}`)
Returns
* A list of [option chain structures](#option-chain-structure)
### Option Chain Structure [#option-chain-structure]
```javascript
{
'info': { ... }, // the original decoded JSON as is
'currency': 'BTC', // unified CCXT currency code
'symbol': 'BTC/USD:BTC-240927-40000-C', // unified CCXT market symbol
'timestamp': 1699593511632, // unix timestamp in milliseconds
'datetime': '2023-11-10T05:18:31.632Z', // ISO8601 datetime with milliseconds
'impliedVolatility': 60.06, // the expected percentage price change of the underlying asset, over the remaining life of the option
'openInterest': 10, // the number of open options contracts that have not been settled
'bidPrice': 0.214, // the bid price of the option
'askPrice': 0.2205, // the ask price of the option
'midPrice': 0.2205, // the price in between the bid and the ask
'markPrice': 0.2169, // the mark price of the option
'lastPrice': 0.215, // the last price of the option
'underlyingPrice': 39165.86, // the current market price of the underlying asset
'change': 15.43, // the 24 hour price change in a dollar amount
'percentage': 11.86, // the 24 hour price change as a percentage
'baseVolume': 100.86, // the volume in units of the base currency
'quoteVolume': 23772.86, // the volume in units of the quote currency
}
```
## Long Short Ratio [#long-short-ratio]
*contract only*
Use the `fetchLongShortRatio` method to fetch the current long short ratio of a symbol and use the `fetchLongShortRatioHistory` to fetch the history of long short ratios for a symbol.
* `fetchLongShortRatio (symbol, period)` for the current ratio of a single market symbol
* `fetchLongShortRatioHistory (symbol, period, since, limit)` for the history of ratios of a single market symbol
```javascript
fetchLongShortRatio (symbol, period = undefined, params = {})
```
Parameters
* **symbol** (String) *required* Unified CCXT symbol (e.g. `"BTC/USDT:USDT"`)
* **period** (String) The period to calculate the ratio from (e.g. `"24h"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* a [long short ratio structure](#long-short-ratio-structure)
```javascript
fetchLongShortRatioHistory (symbol = undefined, period = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **symbol** (String) Unified CCXT symbol (e.g. `"BTC/USDT:USDT"`)
* **period** (String) The period to calculate the ratio from (e.g. `"24h"`)
* **since** (Integer) Timestamp for the earliest ratio (e.g. `1645807945000`)
* **limit** (Integer) The maximum number of ratios to retrieve (e.g. `10`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* an array of [long short ratio structures](#long-short-ratio-structure)
### Long Short Ratio Structure [#long-short-ratio-structure]
```javascript
{
info: { ... },
symbol: 'BTC/USDT:USDT',
timestamp: 1645833600000,
datetime: '2022-02-26T00:00:00.000Z',
timeframe: '24h',
longShortRatio: 0.000072,
}
```
## Auto De Leverage [#auto-de-leverage]
*contract only*
Use the `fetchADLRank` method to get the public details of a symbols auto de leverage rank from the exchange.
```javascript
fetchADLRank (symbol, params = {})
```
Parameters
* **symbol** (String) Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"category": "futures"}`)
Returns
* An [auto de leverage structure](#auto-de-leverage)
### Auto De Leverage Stucture [#auto-de-leverage-stucture]
```javascript
{
'info': { ... }, // the original decoded JSON as is
'symbol': 'BTC/USDT:USDT', // unified CCXT market symbol
'rank': 5, // a quantile rank from 1 to 5 with 5 being the highest risk
'rating': 'high', // a string risk rating as either low, medium or high
'percent': 72.86, // the risk percentage with a higher percentage being a higher risk of auto de leverage
'timestamp': 1699593511632, // unix timestamp in milliseconds
'datetime': '2023-11-10T05:18:31.632Z', // ISO8601 datetime with milliseconds
}
```
# Private API [#private-api]
* [Authentication](#authentication)
* [Sign In](#sign-in)
* [API Keys Setup](#api-keys-setup)
* [Accounts](#accounts)
* [Account Balance](#account-balance)
* [Orders](#orders)
* [My Trades](#my-trades)
* [Ledger](#ledger)
* [Deposit](#deposit)
* [Withdrawal](#withdrawal)
* [Deposit Addresses](#deposit-addresses)
* [Transfers](#transfers)
* [Fees](#fees)
* [Borrow Interest](#borrow-interest)
* [Borrow And Repay Margin](#borrow-and-repay-margin)
* [Margin](#margin)
* [Margin Mode](#margin-mode)
* [Leverage](#leverage)
* [Positions](#positions)
* [Funding History](#funding-history)
* [Conversion](#conversion)
* [Auto De Leverage](#auto-de-leverage)
* [Prediction Markets](#prediction-markets)
In order to be able to access your user account, perform algorithmic trading by placing market and limit orders, query balances, deposit and withdraw funds and so on, you need to obtain your API keys for authentication from each exchange you want to trade with. They usually have it available on a separate tab or page within your user account settings. API keys are exchange-specific and cannnot be interchanged under any circumstances.
The exchanges' private APIs will usually allow the following types of interaction:
* the current state of the user's account balance can be obtained with the `fetchBalance()` method as described in the [Account Balance](#account-balance) section
* the user can place and cancel orders with `createOrder()`, `cancelOrder()`, as well as fetch current open orders and the past order history with methods like `fetchOrder`, `fetchOrders()`, `fetchOpenOrder()`, `fetchOpenOrders()`, `fetchCanceledOrders`, `fetchClosedOrder`, `fetchClosedOrders`, as described in the section on [Orders](#orders)
* the user can query the history of past trades executed with their account using `fetchMyTrades`, as described in the [My Trades](#my-trades) section, also see [How Orders Are Related To Trades](#how-orders-are-related-to-trades)
* the user can query their positions with `fetchPositions()` and `fetchPosition()` as described in the [Positions](#positions) section
* the user can fetch the history of their transactions (on-chain *transactions* which are either *deposits* to the exchange account or *withdrawals* from the exchange account) with `fetchTransactions()`, or with `fetchDeposit()`, `fetchDeposits()` `fetchWithdrawal()`, and `fetchWithdrawals()` separately, depending on what is available from the exchange API
* if the exchange API provides a ledger endpoint, the user can fetch a history of all money movements that somehow affected the balance, with `fetchLedger` that will return all accounting ledger entries such as trades, deposits, withdrawals, internal transfers between accounts, rebates, bonuses, fees, staking profits and so on, as described in the [Ledger](#ledger) section.
## Prediction Markets [#prediction-markets]
CCXT also supports prediction-market exchanges (Polymarket, Kalshi, Limitless, Myriad, and Hyperliquid prediction markets) through a dedicated `prediction` namespace. They implement the same unified API as regular crypto exchanges, with prices quoted between 0 and 1 USDC per outcome share, and trade **outcomes** (a market's YES/NO tokens) instead of regular symbols.
See the dedicated **[Prediction Markets guide](/docs/prediction)** for the namespace, the events → markets → outcomes data model, and `fetchEvents` / `fetchEvent` usage.
## Authentication [#authentication]
Authentication with all exchanges is handled automatically if provided with proper API keys. The process of authentication usually goes through the following pattern:
1. Generate new nonce. A nonce is an integer, often a Unix Timestamp in seconds or milliseconds (since epoch January 1, 1970). The nonce should be unique to a particular request and constantly increasing, so that no two requests share the same nonce. Each next request should have greater nonce than the previous request. **The default nonce is a 32-bit Unix Timestamp in seconds.**
2. Append public apiKey and nonce to other endpoint params, if any, then serialize the whole thing for signing.
3. Sign the serialized params using HMAC-SHA256/384/512 or MD5 with your secret key.
4. Append the signature in Hex or Base64 and nonce to HTTP headers or body.
This process may differ from exchange to exchange. Some exchanges may want the signature in a different encoding, some of them vary in header and body param names and formats, but the general pattern is the same for all of them.
**You should not share the same API keypair across multiple instances of an exchange running simultaneously, in separate scripts or in multiple threads. Using the same keypair from different instances simultaneously may cause all sorts of unexpected behaviour.**
**DO NOT REUSE API KEYS WITH DIFFERENT SOFTWARE! The other software will screw your nonce too high. If you get [InvalidNonce](#invalid-nonce) errors – make sure to generate a fresh new keypair first and foremost.**
The authentication is already handled for you, so you don't need to perform any of those steps manually unless you are implementing a new exchange class. The only thing you need for trading is the actual API key pair.
### API Keys Setup [#api-keys-setup]
#### Required Credentials [#required-credentials]
The API credentials usually include the following:
* `apiKey`. This is your public API Key and/or Token. This part is *non-secret*, it is included in your request header or body and sent over HTTPS in open text to identify your request. It is often a string in Hex or Base64 encoding or an UUID identifier.
* `secret`. This is your private key. Keep it secret, don't tell it to anybody. It is used to sign your requests locally before sending them to exchanges. The secret key does not get sent over the internet in the request-response process and should not be published or emailed. It is used together with the nonce to generate a cryptographically strong signature. That signature is sent with your public key to authenticate your identity. Each request has a unique nonce and therefore a unique cryptographic signature.
* `uid`. Some exchanges (not all of them) also generate a user id or *uid* for short. It can be a string or numeric literal. You should set it, if that is explicitly required by your exchange. See [their docs](#exchanges) for details.
* `password`. Some exchanges (not all of them) also require your password/phrase for trading. You should set this string, if that is explicitly required by your exchange. See [their docs](#exchanges) for details.
In order to create API keys find the API tab or button in your user settings on the exchange website. Then create your keys and copy-paste them to your config file. Your config file permissions should be set appropriately, unreadable to anyone except the owner.
**Remember to keep your apiKey and secret key safe from unauthorized use, do not send or tell it to anybody. A leak of the secret key or a breach in security can cost you a fund loss.**
#### Credential Validation [#credential-validation]
For checking if the user has supplied all the required credentials the `Exchange` base class has a method called `exchange.checkRequiredCredentials()` or `exchange.check_required_credentials()`. Calling that method will throw an `AuthenticationError`, if some of the credentials are missing or empty. The `Exchange` base class also has property `exchange.requiredCredentials` that allows a user to see which credentials are required for this or that exchange, as shown below:
JavaScript
Python
PHP
Go
C#
Java
```javascript
const ccxt = require ('ccxt')
const exchange = new ccxt.binance()
console.log (exchange.requiredCredentials) // prints required credentials
exchange.checkRequiredCredentials() // throw AuthenticationError
```
```python
import ccxt
exchange = ccxt.coinbaseexchange()
print(exchange.requiredCredentials) # prints required credentials
exchange.check_required_credentials() # raises AuthenticationError
```
```php
include 'ccxt.php';
$exchange = new \ccxt\coinbase ();
var_dump($exchange->requiredCredentials); // prints required credentials
$exchange->check_required_credentials(); // throws AuthenticationError
```
```go
exchange := ccxt.NewBinance(nil)
fmt.Println(exchange.RequiredCredentials) // prints required credentials
exchange.CheckRequiredCredentials() // throws AuthenticationError
```
```csharp
var exchange = new Binance();
Console.WriteLine(exchange.requiredCredentials); // prints required credentials
exchange.checkRequiredCredentials(); // throws AuthenticationError
```
```java
Exchange exchange = Exchange.dynamicallyCreateInstance("binance", null);
exchange.checkRequiredCredentials(); // throws AuthenticationError
```
#### Configuring API Keys [#configuring-api-keys]
To set up an exchange for trading just assign the API credentials to an existing exchange instance or pass them to exchange constructor upon instantiation, like so:
JavaScript
Python
PHP
Go
C#
Java
```javascript
const ccxt = require ('ccxt')
// any time
let kraken = new ccxt.kraken ()
kraken.apiKey = 'YOUR_KRAKEN_API_KEY'
kraken.secret = 'YOUR_KRAKEN_SECRET_KEY'
// upon instantiation
let okcoin = new ccxt.okcoin ({
apiKey: 'YOUR_OKCOIN_API_KEY',
secret: 'YOUR_OKCOIN_SECRET_KEY',
})
// from variable id
const exchangeId = 'binance'
, exchangeClass = ccxt[exchangeId]
, exchange = new exchangeClass ({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
})
```
```python
import ccxt
# any time
bitfinex = ccxt.bitfinex ()
bitfinex.apiKey = 'YOUR_BFX_API_KEY'
bitfinex.secret = 'YOUR_BFX_SECRET'
# upon instantiation
hitbtc = ccxt.hitbtc ({
'apiKey': 'YOUR_HITBTC_API_KEY',
'secret': 'YOUR_HITBTC_SECRET_KEY',
})
# from variable id
exchange_id = 'binance'
exchange_class = getattr(ccxt, exchange_id)
exchange = exchange_class({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
})
```
```php
include 'ccxt.php'
// any time
$hitbtc = new \ccxt\hitbtc ();
$hitbtc->apiKey = 'YOUR_HITBTC_API_KEY';
$hitbtc->secret = 'YOUR_HITBTC_SECRET_KEY';
// upon instantiation
$zaif = new \ccxt\zaif (array (
'apiKey' => 'YOUR_ZAIF_API_KEY',
'secret' => 'YOUR_ZAIF_SECRET_KEY'
));
// from variable id
$exchange_id = 'binance';
$exchange_class = "\\ccxt\\$exchange_id";
$exchange = new $exchange_class (array (
'apiKey' => 'YOUR_API_KEY',
'secret' => 'YOUR_SECRET',
));
```
```go
// upon instantiation
exchange := ccxt.NewBinance(map[string]interface{}{
"apiKey": "YOUR_API_KEY",
"secret": "YOUR_SECRET",
})
// or set later
exchange.ApiKey = "YOUR_API_KEY"
exchange.Secret = "YOUR_SECRET"
```
```csharp
// upon instantiation
var exchange = new Binance(new Dictionary() {
{ "apiKey", "YOUR_API_KEY" },
{ "secret", "YOUR_SECRET" },
});
// or set later
exchange.apiKey = "YOUR_API_KEY";
exchange.secret = "YOUR_SECRET";
```
```java
// upon instantiation
Map config = new HashMap<>();
config.put("apiKey", "YOUR_API_KEY");
config.put("secret", "YOUR_SECRET");
Exchange exchange = Exchange.dynamicallyCreateInstance("binance", config);
// or set later
exchange.apiKey = "YOUR_API_KEY";
exchange.secret = "YOUR_SECRET";
```
Note that your private requests will fail with an exception or error if you don't set up your API credentials before you start trading. To avoid character escaping **always write your credentials in single quotes**, not double quotes (`'VERY_GOOD'`, `"VERY_BAD"`).
#### API Key Permissions [#api-key-permissions]
When you get errors like `"Invalid API-key, IP, or permissions for action."` or `"API-key format invalid"`, then, most likely, the problem is not within ccxt, please avoid opening a new issue unless you ensure that:
1. You don't have typos, empty spaces, or quotes in your keys
2. Your current IP address (check [IPv4](https://api.ipify.org/) or [IPv6](https://api64.ipify.org/)) is added into API-KEY's whitelist (if you use proxy, consider that too)
3. You have selected the correct options in permissions list for that api-key
4. You are not accidentally mixing "testnet" api-keys or "testnet" mode in your script
5. You have checked already [reported issues](https://github.com/ccxt/ccxt/issues?q=is%3Aissue+%22Invalid+Api-Key+ID%22) about this error
#### Sign In [#sign-in]
Some exchanges required you to sign in prior to calling private methods, which can be done using the `signIn` method
JavaScript
```javascript
signIn (params = {})
```
Parameters
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"2fa": "329293"}`)
Returns
* response from the exchange
## Overriding The Nonce [#overriding-the-nonce]
**The default nonce is defined by the underlying exchange. You can override it with a milliseconds-nonce if you want to make private requests more frequently than once per second! Most exchanges will throttle your requests if you hit their rate limits, read [API docs for your exchange](/docs/exchange-markets) carefully!**
In case you need to reset the nonce it is much easier to create another pair of keys for using with private APIs. Creating new keys and setting up a fresh unused keypair in your config is usually enough for that.
In some cases you are unable to create new keys due to lack of permissions or whatever. If that happens you can still override the nonce. Base market class has the following methods for convenience:
* `seconds ()`: returns a Unix Timestamp in seconds.
* `milliseconds ()`: same in milliseconds (ms = 1000 \* s, thousandths of a second).
* `microseconds ()`: same in microseconds (μs = 1000 \* ms, millionths of a second).
There are exchanges that confuse milliseconds with microseconds in their API docs, let's all forgive them for that, folks. You can use methods listed above to override the nonce value. If you need to use the same keypair from multiple instances simultaneously use closures or a common function to avoid nonce conflicts. In Javascript you can override the nonce by providing a `nonce` parameter to the exchange constructor or by setting it explicitly on exchange object:
```javascript
// JavaScript
// 1: custom nonce redefined in constructor parameters
let nonce = 1
let kraken1 = new ccxt.kraken ({ nonce: () => nonce++ })
// 2: nonce redefined explicitly
let kraken2 = new ccxt.kraken ()
kraken2.nonce = function () { return nonce++ } // uses same nonce as kraken1
// 3: milliseconds nonce
let kraken3 = new ccxt.kraken ({
nonce: function () { return this.milliseconds () },
})
// 4: newer ES syntax
let kraken4 = new ccxt.kraken ({
nonce () { return this.milliseconds () },
})
```
In Python and PHP you can do the same by subclassing and overriding nonce function of a particular exchange class:
```python
# Python
# 1: the shortest
coinbaseexchange = ccxt.coinbaseexchange({'nonce': ccxt.Exchange.milliseconds})
# 2: custom nonce
class MyKraken(ccxt.kraken):
n = 1
def nonce(self):
return self.n += 1
# 3: milliseconds nonce
class MyBitfinex(ccxt.bitfinex):
def nonce(self):
return self.milliseconds()
# 4: milliseconds nonce inline
hitbtc = ccxt.hitbtc({
'nonce': lambda: int(time.time() * 1000)
})
# 5: milliseconds nonce
acx = ccxt.acx({'nonce': lambda: ccxt.Exchange.milliseconds()})
```
```php
// PHP
// 1: custom nonce value
class Myokcoin extends \ccxt\okcoin {
public function __construct ($options = array ()) {
parent::__construct (array_merge (array ('i' => 1), $options));
}
public function nonce () {
return $this->i++;
}
}
// 2: milliseconds nonce
class MyZaif extends \ccxt\zaif {
public function __construct ($options = array ()) {
parent::__construct (array_merge (array ('i' => 1), $options));
}
public function nonce () {
return $this->milliseconds ();
}
}
```
## Accounts [#accounts]
You can get all the accounts associated with a profile by using the `fetchAccounts()` method
```javascript
fetchAccounts (params = {})
```
### Accounts Structure [#accounts-structure]
The `fetchAccounts()` method will return a structure like shown below:
```javascript
[
{
id: "s32kj302lasli3930",
type: "main",
name: "main",
code: "USDT",
info: { ... }
},
{
id: "20f0sdlri34lf90",
name: "customAccount",
type: "margin",
code: "USDT",
info: { ... }
},
{
id: "4oidfk40dadeg4328",
type: "spot",
name: "spotAccount32",
code: "BTC",
info: { ... }
},
...
]
```
Types of account is one of the [unified account types](####account-balance) or `subaccount`
## Account Balance [#account-balance]
To query for balance and get the amount of funds available for trading or funds locked in orders, use the `fetchBalance` method:
```javascript
fetchBalance (params = {})
```
Parameters
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"currency": "usdt"}`)
Returns
* A [balance structure](#balance-structure)
### Balance Structure [#balance-structure]
```javascript
{
'info': { ... }, // the original untouched non-parsed reply with details
'timestamp': 1499280391811, // Unix Timestamp in milliseconds (seconds * 1000)
'datetime': '2017-07-05T18:47:14.692Z', // ISO8601 datetime string with milliseconds
//-------------------------------------------------------------------------
// indexed by availability of funds first, then by currency
'free': { // money, available for trading, by currency
'BTC': 321.00, // floats...
'USD': 123.00,
...
},
'used': { ... }, // money on hold, locked, frozen, or pending, by currency
'total': { ... }, // total (free + used), by currency
'debt': { ... }, // debt, by currency
//-------------------------------------------------------------------------
// indexed by currency first, then by availability of funds
'BTC': { // string, three-letter currency code, uppercase
'free': 321.00 // float, money available for trading
'used': 234.00, // float, money on hold, locked, frozen or pending
'total': 555.00, // float, total balance (free + used)
},
'USD': { // ...
'free': 123.00 // ...
'used': 456.00,
'total': 579.00,
},
...
}
```
The `timestamp` and `datetime` values may be undefined or missing if the underlying exchange does not provide them.
Some exchanges may not return full balance info. Many exchanges do not return balances for your empty or unused accounts. In that case some currencies may be missing in returned balance structure. Top-level keys can be absent or `undefined` as well when the exchange does not provide them: `timestamp` and `datetime` are frequently `undefined` (many balance endpoints are not timestamped), and `debt` only appears on margin-capable exchanges that report outstanding loans. Always guard access to these fields.
JavaScript
Python
PHP
Go
C#
Java
```javascript
(async () => {
console.log (await exchange.fetchBalance ())
}) ()
```
```python
print (exchange.fetch_balance ())
```
```php
var_dump ($exchange->fetch_balance ());
```
```go
balance, err := exchange.FetchBalance()
if err != nil {
fmt.Println(err)
return
}
fmt.Println("BTC free:", balance.Free["BTC"])
fmt.Println("USDT total:", balance.Total["USDT"])
```
```csharp
var balance = await exchange.FetchBalance();
Console.WriteLine("BTC free: " + balance.free["BTC"]);
Console.WriteLine("USDT total: " + balance.total["USDT"]);
```
```java
Balances balance = exchange.fetchBalance();
System.out.println("BTC free: " + balance.free.get("BTC"));
System.out.println("USDT total: " + balance.total.get("USDT"));
```
## Orders [#orders]
```diff
- this part of the unified API is currenty a work in progress
- there may be some issues and missing implementations here and there
- contributions, pull requests and feedback appreciated
```
### Querying Orders [#querying-orders]
Most of the time you can query orders by an id or by a symbol, though not all exchanges offer a full and flexible set of endpoints for querying orders. Some exchanges might not have a method for fetching recently closed orders, the other can lack a method for getting an order by id, etc. The ccxt library will target those cases by making workarounds where possible.
The list of methods for querying orders consists of the following:
* `fetchCanceledOrders (symbol = undefined, since = undefined, limit = undefined, params = {})`
* `fetchClosedOrder (id, symbol = undefined, params = {})`
* `fetchClosedOrders (symbol = undefined, since = undefined, limit = undefined, params = {})`
* `fetchOpenOrder (id, symbol = undefined, params = {})`
* `fetchOpenOrders (symbol = undefined, since = undefined, limit = undefined, params = {})`
* `fetchOrder (id, symbol = undefined, params = {})`
* `fetchOrders (symbol = undefined, since = undefined, limit = undefined, params = {})`
Note that the naming of those methods indicates if the method returns a single order or multiple orders (an array/list of orders). The `fetchOrder()` method requires a mandatory order id argument (a string). Some exchanges also require a symbol to fetch an order by id, where order ids can intersect with various trading pairs. Also, note that all other methods above return an array (a list) of orders. Most of them will require a symbol argument as well, however, some exchanges allow querying with a symbol unspecified (meaning *all symbols*).
The library will throw a NotSupported exception if a user calls a method that is not available from the exchange or is not implemented in ccxt.
To check if any of the above methods are available, look into the `.has` property of the exchange:
JavaScript
Python
PHP
Go
C#
Java
```javascript
'use strict';
const ccxt = require ('ccxt')
const id = 'poloniex'
exchange = new ccxt[id] ()
console.log (exchange.has)
```
```python
import ccxt
id = 'binance'
exchange = getattr(ccxt, id)()
print(exchange.has)
```
```php
$exchange = new \ccxt\bitfinex();
print_r ($exchange->has); // or var_dump
```
```go
exchange := ccxt.NewBitfinex(nil)
fmt.Println(exchange.Has)
```
```csharp
var exchange = new Bitfinex();
Console.WriteLine(exchange.has);
```
```java
Map has = (Map) exchange.getExchange().has;
System.out.println(has);
```
A typical structure of the `.has` property usually contains the following flags corresponding to order API methods for querying orders:
```javascript
exchange.has = {
// ... other flags ...
'fetchOrder': true, // available from the exchange directly and implemented in ccxt
'fetchOrders': false, // not available from the exchange or not implemented in ccxt
'fetchOpenOrders': true,
'fetchClosedOrders': 'emulated', // not available from the exchange, but emulated in ccxt
// ... other flags ...
}
```
The meanings of boolean `true` and `false` are obvious. A string value of `emulated` means that particular method is missing in the exchange API and ccxt will workaround that where possible on the client-side.
#### Understanding The Orders API Design [#understanding-the-orders-api-design]
The exchanges' order management APIs differ by design. The user has to understand the purpose of each specific method and how they're combined together into a complete order API:
* `fetchCanceledOrders()`- fetches a list of canceled orders
* `fetchClosedOrder()`- fetches a single closed order by order id
* `fetchClosedOrders()` – fetches a list of closed (or canceled) orders.
* `fetchMyTrades()` – though not a part of the orders' API, it is closely related, since it provides the history of settled trades.
* `fetchOpenOrder()`- fetches a single open order by order id
* `fetchOpenOrders()` – fetches a list of open orders.
* `fetchOrder()` – fetches a single order (open or closed) by order `id`.
* `fetchOrders()` – fetches a list of all orders (either open or closed/canceled).
* `createOrder()` – used for placing orders
* `createOrders()` – used for placing multiple orders within the same request
* `cancelOrder()` – used for canceling a single order
* `cancelOrders()` - used for canceling multiple orders
* `cancelAllOrders()` - used for canceling all orders
* `cancelAllOrdersAfter()` - used for canceling all orders after the given timeout
The majority of the exchanges will have a way of fetching currently-open orders. Thus, the `exchange.has['fetchOpenOrders']`. If that method is not available, then most likely the `exchange.has['fetchOrders']` that will provide a list of all orders. The exchange will return a list of open orders either from `fetchOpenOrders()` or from `fetchOrders()`. One of the two methods is usually available from any exchange.
Some exchanges will provide the order history, other exchanges will not. If the underlying exchange provides the order history, then the `exchange.has['fetchClosedOrders']` or the `exchange.has['fetchOrders']`. If the underlying exchange does not provide the order history, then `fetchClosedOrders()` and `fetchOrders()` are not available. In the latter case, the user is required to build a local cache of orders and track the open orders using `fetchOpenOrders()` and `fetchOrder()` for order statuses and for marking them as closed locally in the userland (when they're not open anymore).
If the underlying exchange does not have methods for order history (`fetchClosedOrders()` and `fetchOrders()`), then it will provide `fetchOpenOrders` + the trade history with `fetchMyTrades` (see [How Orders Are Related To Trades](#how-orders-are-related-to-trades)). That set of information is in many cases enough for tracking in a live-trading robot. If there's no order history – you have to track your live orders and restore historical info from open orders and historical trades.
In general, the underlying exchanges will usually provide one or more of the following types of historical data:
* `fetchClosedOrders()`
* `fetchOrders()`
* `fetchMyTrades()`
Any of the above three methods may be missing, but the exchanges APIs will usually provide at least one of the three methods.
If the underlying exchange does not provide historical orders, the CCXT library will not emulate the missing functionality – it has to be added on the user side where necessary.
**Please, note, that a certain method may be missing either because the exchange does not have a corresponding API endpoint, or because CCXT has not implemented it yet (the library is also a work in progress). In the latter case, the missing method will be added as soon as possible.**
#### Querying Multiple Orders And Trades [#querying-multiple-orders-and-trades]
All methods returning lists of trades and lists of orders, accept the second `since` argument and the third `limit` argument:
* `fetchTrades()` (public)
* `fetchMyTrades()` (private)
* `fetchOrders()`
* `fetchOpenOrders()`
* `fetchClosedOrders()`
* `fetchCanceledOrders()`
The second argument `since` reduces the array by timestamp, the third `limit` argument reduces by number (count) of returned items.
If the user does not specify `since`, the `fetchTrades()/fetchOrders()` methods will return the default set of results from the exchange. The default set is exchange-specific, some exchanges will return trades or recent orders starting from the date of listing a pair on the exchange, other exchanges will return a reduced set of trades or orders (like, last 24 hours, last 100 trades, first 100 orders, etc). If the user wants precise control over the timeframe, the user is responsible for specifying the `since` argument.
**NOTE: not all exchanges provide means for filtering the lists of trades and orders by starting time, so, the support for `since ` and `limit` is exchange-specific. However, most exchanges do provide at least some alternative for "pagination" and "scrolling" which can be overrided with extra `params` argument.**
Some exchanges do not have a method for fetching closed orders or all orders. They will offer just the `fetchOpenOrders()` endpoint, and sometimes also a `fetchOrder` endpoint as well. Those exchanges don't have any methods for fetching the order history. To maintain the order history for those exchanges the user has to store a dictionary or a database of orders in the userland and update the orders in the database after calling methods like `createOrder()`, `fetchOpenOrders()`, `cancelOrder()`, `cancelAllOrders()`.
#### By Order Id [#by-order-id]
To get the details of a particular order by its id, use the `fetchOrder()` / `fetch_order()` method. Some exchanges also require a symbol even when fetching a particular order by id.
The signature of the fetchOrder/fetch\_order method is as follows:
```javascript
if (exchange.has['fetchOrder']) {
// you can use the params argument for custom overrides
let order = await exchange.fetchOrder (id, symbol = undefined, params = {})
}
```
**Some exchanges don't have an endpoint for fetching an order by id, ccxt will emulate it where possible.** For now it may still be missing here and there, as this is a work in progress.
You can pass custom overrided key-values in the additional params argument to supply a specific order type, or some other setting if needed.
Below are examples of using the fetchOrder method to get order info from an authenticated exchange instance:
JavaScript
Python
PHP
Go
C#
Java
```javascript
(async function () {
const order = await exchange.fetchOrder (id)
console.log (order)
}) ()
```
```python 3 (synchronous)
if exchange.has['fetchOrder']:
order = exchange.fetch_order(id)
print(order)
# Python 3.7+ asyncio (asynchronous)
import asyncio
import ccxt.async_support as ccxt
if exchange.has['fetchOrder']:
order = asyncio.run(exchange.fetch_order(id))
print(order)
```
```php
if ($exchange->has['fetchOrder']) {
$order = $exchange->fetch_order($id);
var_dump($order);
}
```
```go
if exchange.Has["fetchOrder"] == true {
order, err := exchange.FetchOrder(id)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Order", order.Id, "status=", order.Status, "filled=", order.Filled)
}
```
```csharp
if ((bool)exchange.has["fetchOrder"])
{
var order = await exchange.FetchOrder(id);
Console.WriteLine("Order " + order.id + " status=" + order.status + " filled=" + order.filled);
}
```
```java
Order order = exchange.fetchOrder(orderId, "BTC/USDT", null);
System.out.println("Order " + order.id + " status=" + order.status + " filled=" + order.filled);
```
#### All Orders [#all-orders]
```javascript
if (exchange.has['fetchOrders'])
exchange.fetchOrders (symbol = undefined, since = undefined, limit = undefined, params = {})
```
**Some exchanges don't have an endpoint for fetching all orders, ccxt will emulate it where possible.** For now it may still be missing here and there, as this is a work in progress.
#### Open Orders [#open-orders]
```javascript
if (exchange.has['fetchOpenOrders'])
exchange.fetchOpenOrders (symbol = undefined, since = undefined, limit = undefined, params = {})
```
#### Closed Orders [#closed-orders]
Do not confuse *closed orders* with *trades* aka *fills* ! An order can be closed (filled) with multiple opposing trades! So, a *closed order* is not the same as a *trade*. In general, the order does not have a `fee` at all, but each particular user trade does have `fee`, `cost` and other properties. However, many exchanges propagate those properties to the orders as well.
**Some exchanges don't have an endpoint for fetching closed orders, ccxt will emulate it where possible.** For now it may still be missing here and there, as this is a work in progress.
```javascript
if (exchange.has['fetchClosedOrders'])
exchange.fetchClosedOrders (symbol = undefined, since = undefined, limit = undefined, params = {})
```
### Order Structure [#order-structure]
Most of methods returning orders within ccxt unified API will yield an order structure as described below:
```javascript
{
'id': '12345-67890:09876/54321', // string
'clientOrderId': 'abcdef-ghijklmnop-qrstuvwxyz', // a user-defined clientOrderId, if any
'datetime': '2017-08-17 12:42:48.000', // ISO8601 datetime of 'timestamp' with milliseconds
'timestamp': 1502962946216, // order placing/opening Unix timestamp in milliseconds
'lastTradeTimestamp': 1502962956216, // Unix timestamp of the most recent trade on this order
'status': 'open', // 'open', 'closed', 'canceled', 'expired', 'rejected'
'symbol': 'ETH/BTC', // symbol
'type': 'limit', // 'market', 'limit'
'timeInForce': 'GTC', // 'GTC', 'IOC', 'FOK', 'PO'
'side': 'buy', // 'buy', 'sell'
'price': 0.06917684, // float price in quote currency (may be empty for market orders)
'average': 0.06917684, // float average filling price
'amount': 1.5, // ordered amount of base currency
'filled': 1.1, // filled amount of base currency
'remaining': 0.4, // remaining amount to fill
'cost': 0.076094524, // 'filled' * 'price' (filling price used where available)
'trades': [ ... ], // a list of order trades/executions
'fee': { // fee info, if available
'currency': 'BTC', // which currency the fee is (usually quote)
'cost': 0.0009, // the fee amount in that currency
'rate': 0.002, // the fee rate (if available)
},
'triggerPrice': 10000, // price that will be the order trigger
'stopLossPrice': 50000,
'takeProfitPrice': 150000,
'reduceOnly': false,
'postOnly': false,
'info': { ... }, // the original unparsed order structure as is
}
```
* The `status` of an order is usually either `'open'` (not filled or partially filled), `'closed'` (fully filled), or `'canceled'` (unfilled and canceled, or partially filled then canceled).
* Some exchanges allow the user to specify an expiration timestamp upon placing a new order. If the order is not filled by that time, its `status` becomes `'expired'`.
* Use the `filled` value to determine if the order is filled, partially filled or fully filled, and by how much.
* The work on `'fee'` info is still in progress, fee info may be missing partially or entirely, depending on the exchange capabilities.
* The `fee` currency may be different from both traded currencies (for example, an ETH/BTC order with fees in USD).
* The `lastTradeTimestamp` timestamp may have no value and may be `undefined/None/null` where not supported by the exchange or in case of an open order (an order that has not been filled nor partially filled yet).
* The `lastTradeTimestamp`, if any, designates the timestamp of the last trade, in case the order is filled fully or partially, otherwise `lastTradeTimestamp` is `undefined/None/null`.
* Order `status` prevails or has precedence over the `lastTradeTimestamp`.
* The `cost` of an order is: `{ filled * price }`
* The `cost` of an order means the total *quote* volume of the order (whereas the `amount` is the *base* volume). The value of `cost` should be as close to the actual most recent known order cost as possible. The `cost` field itself is there mostly for convenience and can be deduced from other fields.
* The `clientOrderId` field can be set upon placing orders by the user with [custom order params](#custom-order-params). Using the `clientOrderId` the user can later distinguish between own orders. This is only available for the exchanges that do support `clientOrderId` at this time.
#### timeInForce [#timeinforce]
The `timeInForce` field may be `undefined/None/null` if not specified by the exchange. The unification of `timeInForce` is a work in progress.
Possible values for the`timeInForce` field:
* `'GTC'` = *Good Till Cancel(ed)*, the order stays on the orderbook until it is matched or canceled.
* `'IOC'` = *Immediate Or Cancel*, the order has to be matched immediately and filled either partially or completely, the unfilled remainder is canceled (or the entire order is canceled).
* `'FOK'` = *Fill Or Kill*, the order has to get fully filled and closed immediately, otherwise the entire order is canceled.
* `'PO'` = *Post Only*, the order is either placed as a maker order, or it is canceled. This means the order must be placed on orderbook for at at least time in an unfilled state. The unification of `PO` as a `timeInForce` option is a work in progress with unified exchanges having `exchange.has['createPostOnlyOrder'] == True`.
### Placing Orders [#placing-orders]
There are different types of orders that a user can send to the exchange, regular orders eventually land in the orderbook of a corresponding symbol, others orders may be more advanced. Here is a list outlining various types of orders:
* [Limit Orders](#limit-orders) – regular orders having an `amount` in base currency (how much you want to buy or sell) and a `price` in quote currency (for which price you want to buy or sell).
* [Market Orders](#market-orders) – regular orders having an `amount` in base currency (how much you want to buy or sell)
* [Market Buys](#market-buys) – some exchanges require market buy orders with an `amount` in quote currency (how much you want to spend for buying)
* [Trigger Orders](#conditional-orders) aka *conditional orders* – an advanced type of order used to wait for a certain condition on a market and then react automatically: when a `triggerPrice` is reached, the trigger order gets triggered and then a regular limit `price` or market price order is placed, that eventually results in entering a position or exiting a position
* [Stop Loss Orders](#stop-loss-orders) – almost the same as trigger orders, but used to close a position to stop further losses on that position: when the price reaches `triggerPrice` then the stop loss order is triggered that results in placing another regular limit or market order to close a position at a specific limit `price` or at market price (a position with a stop loss order attached to it).
* [Take Profit Orders](#take-profit-orders) – a counterpart to stop loss orders, this type of order is used to close a position to take existing profits on that position: when the price reaches `triggerPrice` then the take profit order is triggered that results in placing another regular limit or market order to close a position at a specific limit `price` or at market price (a position with a take profit order attached to it).
* [StopLoss And TakeProfit Orders Attached To A Position](#stoploss-and-takeprofit-orders-attached-to-a-position) – advanced orders, consisting of three orders of types listed above: a regular limit or market order placed to enter a position with stop loss and/or take profit orders that will be placed upon opening that position and will be used to close that position later (when a stop loss is reached, it will close the position and will cancel its take profit counterpart, and vice versa, when a take profit is reached, it will close the position and will cancel its stop loss counterpart, these two counterparts are also known as "OCO orders – one cancels the other), apart from the `amount` (and `price` for the limit order) to open a position it will also require a `triggerPrice` for a stop loss order (with a limit `price` if it's a stop loss limit order) and/or a `triggerPrice` for a take profit order (with a limit `price` if it's a take profit limit order).
* [Trailing Orders](#trailing-orders) – an order that is automatically adjusted relative to an open position, `trailingAmount` can be set to trail a specified quote amount behind the open position or `trailingPercent` can be set to trail a specified percent behind the open position, when the market price of the position is equal to the trailing order this results in entering a new position or exiting a position depending on if the trailing order has the `reduceOnly` parameter set to true or not.
Placing an order always requires a `symbol` that the user has to specify (which market you want to trade).
To place an order use the `createOrder` method. You can use the `id` from the returned unified [order structure](#order-structure) to query the status and the state of the order later. If you need to place multiple orders simultaneously, you can check the availability of the `createOrders` method.
```javascript
createOrder (symbol, type, side, amount, price = undefined, params = {})
```
```javascript
createOrders (orders, params = {}) // orders is a list in which each element contains a symbol, type, side, amount, price and params
```
Parameters
* **symbol** (String) *required* Unified CCXT market symbol
* Make sure the symbol in question exists with the target exchange and is available for trading.
* **side** *required* a string literal for the direction of your order.
**Unified sides:**
* `buy` give quote currency and receive base currency; for example, buying `BTC/USD` means that you will receive bitcoins for your dollars.
* `sell` give base currency and receive quote currency; for example, buying `BTC/USD` means that you will receive dollars for your bitcoins.
* **type** a string literal type of order
**Unified types:**
* [market](#market-orders) not allowed by some exchanges, see [their docs](#exchanges) for details
* [limit](#limit-orders)
* see #custom-order-params and #other-order-types for non-unified types
* **amount**, how much of currency you want to trade usually, but not always, in units of the base currency of the trading pair symbol (the units for some exchanges are dependent on the side of the order: see their API docs for details.)
* **price** the price at which the order is to be fullfilled at in units of the quote currency (ignored in market orders)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"settle": "usdt"}`)
Returns
* A successful order call returns a [order structure](#order-structure)
**Notes on createOrder**
* Some exchanges will allow to trade with limit orders only.
Some fields from the returned order structure may be `undefined / None / null` if that information is not returned from the exchange API's response. The user is guaranteed that the `createOrder` method will return a unified [order structure](#order-structure) that will contain at least the order `id` and the `info` (a raw response from the exchange "as is"):
```javascript
{
'id': 'string', // order id
'info': { ... }, // decoded original JSON response from the exchange as is
}
```
##### Common pitfalls [#common-pitfalls]
* There is a common error that happens when creating orders for contract markets:
```
"must be greater than minimum amount precision of 1"
```
This error happens when the exchange is expecting a natural number of contracts (1,2,3, etc) in the `amount` argument of `createOrder`. The [market structure](#market-structure) has a key called `contractSize`. Each contract is worth a certain amount of the base asset that is determined by the `contractSize`. The number of contracts multiplied by the `contractSize` is equal to the base amount. `Base amount = (contracts * contractSize)` so to derive the number of contracts you should enter in the `amount` argument you can solve for contracts: `contracts = (Base amount / contractSize)`.
Here is an example of finding the `contractSize`:
```python
await exchange.loadMarkets()
symbol = 'BTC/USDT:USDT'
market = exchange.market(symbol)
print(market['contractSize'])
# Let's say you want to convert 0.5 BTC to the number of contracts:
number_contracts = round((0.5 * 1) / market['contractSize'])
```
#### Limit Orders [#limit-orders]
Limit orders placed on the order book of the exchange for a price specified by the trader. They are fullfilled(closed) when there are no orders in the same market at a better price, and another trader creates a [market order](#market-orders) or an opposite order for a price that matches or exceeds the price of the limit order.
Limit orders may not be fully filled. This happens when the filling order is for a smaller amount than the amount specified by the limit order.
```javascript
// camelCaseNotation
exchange.createLimitSellOrder (symbol, amount, price, params)
exchange.createLimitBuyOrder (symbol, amount, price, params)
// underscore_notation
exchange.create_limit_sell_order (symbol, amount, price, params)
exchange.create_limit_buy_order (symbol, amount, price, params)
// using general createLimitOrder and side = 'buy' or 'sell'
exchange.createLimitOrder (symbol, side, amount, price, params)
exchange.create_limit_order (symbol, side, amount, price, params)
// using general createOrder, type = 'limit' and side = 'buy' or 'sell'
exchange.createOrder (symbol, 'limit', side, amount, price, params)
exchange.create_order (symbol, 'limit', side, amount, price, params)
```
#### Market Orders [#market-orders]
*also known as*
* market price orders
* spot price orders
* instant orders
Market orders are executed immediately by fulfilling one of more already existing orders from the ask side of the exchanges order book. The orders that your market order fulfills are chosen from th top of the order book stack, meaning your market order is fulfilled at the best price available. When placing a market order you don't need to specify the price of the order, and if the price is specified, it will be ignored.
You are not guaranteed that the order will be executed for the price you observe prior to placing your order. There are multiple reasons for this, including:
* **price slippage** a slight change of the price for the traded market while your order is being executed. Reasons for price slippage include, but are not limited to
* networking roundtrip latency
* high loads on the exchange
* price volatility
* **unequivocal order sizes** if a market order is for an amount that is larger than the size of the top order on the order book, then after the top order is filled, the market order will proceed to fill the next order in the order book, which means the market order is filled at multiple prices
```javascript
// camelCaseNotation
exchange.createMarketSellOrder (symbol, amount, params)
exchange.createMarketBuyOrder (symbol, amount, params)
// underscore_notation
exchange.create_market_sell_order (symbol, amount, params)
exchange.create_market_buy_order (symbol, amount, params)
// using general createMarketOrder and side = 'buy' or 'sell'
exchange.createMarketOrder (symbol, side, amount, params)
exchange.create_market_order (symbol, side, amount, params)
// using general createOrder, type = 'market' and side = 'buy' or 'sell'
exchange.createOrder (symbol, 'market', side, amount, ...)
exchange.create_order (symbol, 'market', side, amount, ...)
```
**Note, that some exchanges will not accept market orders (they allow limit orders only).** In order to detect programmatically if the exchange in question does support market orders or not, you can use the `.has['createMarketOrder']` exchange property:
JavaScript
Python
PHP
Go
C#
Java
```javascript
if (exchange.has['createMarketOrder']) {
...
}
```
```python
if exchange.has['createMarketOrder']:
...
```
```php
if ($exchange->has['createMarketOrder']) {
...
}
```
```go
if exchange.Has["createMarketOrder"] == true {
// All order types are supported through CreateOrder
order, err := exchange.CreateMarketBuyOrder("BTC/USDT", 0.001)
if err != nil {
fmt.Println(err)
}
fmt.Println(order)
}
```
```csharp
if ((bool)exchange.has["createMarketOrder"])
{
// All order types are supported through CreateOrder
var order = await exchange.CreateMarketBuyOrder("BTC/USDT", 0.001);
}
```
```java
// All order types are supported through createOrder
Order order = exchange.createMarketBuyOrder("BTC/USDT", 0.001);
```
#### Market Buys [#market-buys]
In general, when placing a `market buy` or `market sell` order the user has to specify just the amount of the base currency to buy or sell. However, with some exchanges market buy orders implement a different approach to calculating the value of the order.
Suppose you're trading BTC/USD and the current market price for BTC is over 9000 USD. For a market buy or market sell you could specify an `amount` of 2 BTC and that would result in *plus or minus* 18000 USD (more or less ;)) on your account, depending on the side of the order.
**With market buys some exchanges require the total cost of the order in the quote currency!** The logic behind it is simple, instead of taking the amount of base currency to buy or sell some exchanges operate with *"how much quote currency you want to spend on buying in total"*.
To place a market buy order with those exchanges you would not specify an amount of 2 BTC, instead you should somehow specify the total cost of the order, that is, 18000 USD in this example. The exchanges that treat `market buy` orders in this way have an exchange-specific option `createMarketBuyOrderRequiresPrice` that allows specifying the total cost of a `market buy` order in two ways.
The first is the default and if you specify the `price` along with the `amount` the total cost of the order would be calculated inside the lib from those two values with a simple multiplication (`cost = amount * price`). The resulting `cost` would be the amount in USD quote currency that will be spent on this particular market buy order.
```javascript
// this example is oversimplified and doesn't show all the code that is
// required to handle the errors and exchange metadata properly
// it shows just the concept of placing a market buy order
const exchange = new ccxt.cex ({
'apiKey': YOUR_API_KEY,
'secret': 'YOUR_SECRET',
// 'options': {
// 'createMarketBuyOrderRequiresPrice': true, // default
// },
})
;(async () => {
// when `createMarketBuyOrderRequiresPrice` is true, we can pass the price
// so that the total cost of the order would be calculated inside the library
// by multiplying the amount over price (amount * price)
const symbol = 'BTC/USD'
const amount = 2 // BTC
const price = 9000 // USD
// cost = amount * price = 2 * 9000 = 18000 (USD)
// note that we don't use createMarketBuyOrder here, instead we use createOrder
// createMarketBuyOrder will omit the price and will not work when
// exchange.options['createMarketBuyOrderRequiresPrice'] = true
const order = await exchange.createOrder (symbol, 'market', 'buy', amount, price)
console.log (order)
}) ()
```
The second alternative is useful in cases when the user wants to calculate and specify the resulting total cost of the order himself. That can be done by setting the `createMarketBuyOrderRequiresPrice` option to `false` to switch it off:
```javascript
const exchange = new ccxt.cex ({
'apiKey': YOUR_API_KEY,
'secret': 'YOUR_SECRET',
'options': {
'createMarketBuyOrderRequiresPrice': false, // switch off
},
})
// or, to switch it off later, after the exchange instantiation, you can do
exchange.options['createMarketBuyOrderRequiresPrice'] = false
;(async () => {
// when `createMarketBuyOrderRequiresPrice` is true, we can pass the price
// so that the total cost of the order would be calculated inside the library
// by multiplying the amount over price (amount * price)
const symbol = 'BTC/USD'
const amount = 2 // BTC
const price = 9000 // USD
cost = amount * price // ← instead of the amount cost goes ↓ here
const order = await exchange.createMarketBuyOrder (symbol, cost)
console.log (order)
}) ()
```
More about it:
* [https://github.com/ccxt/ccxt/issues/564#issuecomment-347458566](https://github.com/ccxt/ccxt/issues/564#issuecomment-347458566)
* [https://github.com/ccxt/ccxt/issues/4914#issuecomment-478199357](https://github.com/ccxt/ccxt/issues/4914#issuecomment-478199357)
* [https://github.com/ccxt/ccxt/issues/4799#issuecomment-470966769](https://github.com/ccxt/ccxt/issues/4799#issuecomment-470966769)
* [https://github.com/ccxt/ccxt/issues/5197#issuecomment-496270785](https://github.com/ccxt/ccxt/issues/5197#issuecomment-496270785)
#### Emulating Market Orders With Limit Orders [#emulating-market-orders-with-limit-orders]
It is also possible to emulate a `market` order with a `limit` order.
**WARNING this method can be risky due to high volatility, use it at your own risk and only use it when you know really well what you're doing!**
Most of the time a `market sell` can be emulated with a `limit sell` at a very low price – the exchange will automatically make it a taker order for market price (the price that is currently in your best interest from the ones that are available in the order book). When the exchange detects that you're selling for a very low price it will automatically offer you the best buyer price available from the order book. That is effectively the same as placing a market sell order. Thus market orders can be emulated with limit orders (where missing).
The opposite is also true – a `market buy` can be emulated with a `limit buy` for a very high price. Most exchanges will again close your order for best available price, that is, the market price.
However, you should never rely on that entirely, **ALWAYS test it with a small amount first!** You can try that in their web interface first to verify the logic. You can sell the minimal amount at a specified limit price (an affordable amount to lose, just in case) and then check the actual filling price in trade history.
#### Limit Orders [#limit-orders-1]
Limit price orders are also known as *limit orders*. Some exchanges accept limit orders only. Limit orders require a price (rate per unit) to be submitted with the order. The exchange will close limit orders if and only if market price reaches the desired level.
```javascript
// camelCaseStyle
exchange.createLimitBuyOrder (symbol, amount, price[, params])
exchange.createLimitSellOrder (symbol, amount, price[, params])
// underscore_style
exchange.create_limit_buy_order (symbol, amount, price[, params])
exchange.create_limit_sell_order (symbol, amount, price[, params])
```
#### Conditional Orders [#conditional-orders]
Coming from traditional trading, the term "Stop order" has been a bit ambigious, so instead of it, in CCXT we use term "Trigger" order. When symbol's price reaches your "trigger"("stop") price, the order is activated as `market` or `limit` order, depending which one you had chosen.
We have different classification of trigger orders:
1. standalone [Trigger order](#trigger-order) to buy/sell coin (open/close position)
2. standalone [Stop Loss](#stop-loss-orders) or [Take Profit](#take-profit-orders) designed to close open positions.
3. a Stop Loss or Take Profit order attached to a primary order ([Conditional Trigger Order](#stoploss-and-takeprofit-orders-attached-to-a-position)).
##### Trigger order [#trigger-order]
Traditional "stop" order (which you might see across exchanges' websites) is now called "trigger" order across CCXT library. Implemented by adding a `triggerPrice` parameter. They are independent basic trigger orders that can open or close a position.
* To ensure exchange supports this functionality, check `exchange.features` or use helper method `exchange.featureValue('BTC/USDT', 'createOrder', 'triggerPrice')`.
* Typically, it is activated when price of the underlying asset/contract crosses the `triggerPrice` from **any direction**. However, some exchanges' API require to set `triggerDirection` too, which triggers order depending whether price is above or below `triggerPrice`. For example, if you want to trigger limit order (buy 0.1 `ETH` at limit price `1500`) once pair price crosses `1700`:
JavaScript
Python
PHP
Go
C#
Java
```javascript
const params = {
'triggerPrice': 1700,
}
const order = await exchange.createOrder ('ETH/USDT', 'market', 'buy', 0.1, 1500, params)
```
```python
params = {
'triggerPrice': 1700,
}
order = exchange.create_order('ETH/USDT', 'market', 'buy', 0.1, 1500, params)
```
```php
$params = {
'triggerPrice': 1700,
}
$order = $exchange->create_order ('ETH/USDT', 'market', 'buy', 0.1, 1500, $params)
```
```go
params := map[string]interface{}{
"triggerPrice": 1700,
}
order, err := exchange.CreateOrder("ETH/USDT", "market", "buy", 0.1, ccxt.WithCreateOrderPrice(1500), ccxt.WithCreateOrderParams(params))
```
```csharp
var parameters = new Dictionary() {
{ "triggerPrice", 1700 },
};
var order = await exchange.CreateOrder("ETH/USDT", "market", "buy", 0.1, 1500, parameters);
```
```java
Map params = Map.of("triggerPrice", 1700);
Order order = exchange.createOrder("ETH/USDT", "market", "buy", 0.1, null, params);
```
Typically, exchange automatically determines `triggerPrice`'s direction (whether it is "above" or "below" current price), however, some exchanges require that you provide `triggerDirection` with either `ascending` or `descending` values:
```
params = {
'triggerPrice': 1700,
'triggerDirection': 'ascending', // order will be triggered when price goes upward and touches 1700
}
```
Note, you can also add `reduceOnly: true` param to the trigger order (with a possible `triggerDirection: 'ascending/descending'` param), so it would act as "stop-loss" or "take-profit" order. However, for some exchanges we support "stop-loss" and "take-profit" trigger order types, which automatically involve `reduceOnly` and `triggerDirection` handling (see them below).
##### Stop Loss Orders [#stop-loss-orders]
The same as Trigger Orders, but the direction matters. Implemented by specifying a `stopLossPrice` parameter (for the stop loss triggerPrice), and also automatically implemented `triggerDirection` on behalf of user, so instead of regular Trigger Order, you can use this as an alternative.
* To ensure exchange supports this functionality, check `exchange.features` or use helper method `exchange.featureValue('BTC/USDT', 'createOrder', 'stopLossPrice')`.
Suppose you entered a long position (you bought) at 1000 and want to protect yourself from losses from a possible price drop below 700. You would place a stop loss order with triggerPrice at 700. For that stop loss order either you would specify a limit price or it will be executed at market price.
```
| price | amount
----|----------------
| 1500 | 200
| 1400 | 300
a | 1300 | 100
s | 1200 | 200
k | 1100 | 300
| 1000 | 100 <--- you bought to enter a long position here at 1000
| 900 | 100
----|---------------- last price is 900
| 800 | 100
| 700 | 200 <------- you place a stop loss order here at 700 <----------------------+
b | 600 | 100 when your stopLossPrice is reached from above |
i | 500 | 300 it will close your position at market price below 700 ----------------+
d | 400 | 200 <- or it will be executed at your limit price lower that stopLossPrice -+
| 300 | 100
| 200 | 100
```
Suppose you entered a short position (you sold) at 700 and want to protect yourself from losses from a possible price pump above 1300. You would place a stop loss order with triggerPrice at 1300. For that stop loss order either you would specify a limit price or it will be executed at market price.
```
| price | amount
----|----------------
| 1500 | 200
| 1400 | 300 <------------------------------------------------------------------------+
a | 1300 | 100 <------ you place a stop loss order here at 1300 <---------------------+ |
s | 1200 | 200 when your stopLossPrice is reached from below | |
k | 1100 | 300 it will close your position at market price above 1300 --------------+ |
| 1000 | 100 or it will be executed at your limit price higher than stopLossPrice -+
| 900 | 100
----|---------------- last price is 900 (you sold at 700)
| 800 | 100
| 700 | 200 <--- you sold to enter a short position here at 700
b | 600 | 100
i | 500 | 300
d | 400 | 200
| 300 | 100
| 200 | 100
```
Stop Loss orders are activated when the price of the underlying asset/contract:
* drops below the `stopLossPrice` from above, for sell orders. (eg: to close a long position, and avoid further losses)
* rises above the `stopLossPrice` from below, for buy orders (eg: to close a short position, and avoid further losses)
JavaScript
Python
PHP
Go
C#
Java
```javascript
// for a stop loss order
const params = {
'stopLossPrice': 55.45, // your stop loss price
}
const order = await exchange.createOrder (symbol, type, side, amount, price, params)
```
```python
# for a stop loss order
params = {
'stopLossPrice': 55.45, # your stop loss price
}
order = exchange.create_order (symbol, type, side, amount, price, params)
```
```php
// for a stop loss order
$params = {
'stopLossPrice': 55.45, // your stop loss price
}
$order = $exchange->create_order ($symbol, $type, $side, $amount, $price, $params);
```
```go
// for a stop loss order
params := map[string]interface{}{
"stopLossPrice": 55.45, // your stop loss price
}
order, err := exchange.CreateOrder(symbol, typeVar, side, amount, ccxt.WithCreateOrderPrice(price), ccxt.WithCreateOrderParams(params))
```
```csharp
// for a stop loss order
var parameters = new Dictionary() {
{ "stopLossPrice", 55.45 }, // your stop loss price
};
var order = await exchange.CreateOrder(symbol, type, side, amount, price, parameters);
```
```java
Map params = Map.of("stopLossPrice", 55.45);
Order order = exchange.createOrder(symbol, type, side, amount, price, params);
```
##### Take Profit Orders [#take-profit-orders]
The same as Stop Loss Orders, but the direction matters. Implemented by specifying a `takeProfitPrice` parameter (for the take profit triggerPrice).
Suppose you entered a long position (you bought) at 1000 and want to get your profits from a possible price pump above 1300. You would place a take profit order with triggerPrice at 1300. For that take profit order either you would specify a limit price or it will be executed at market price.
```
| price | amount
----|----------------
| 1500 | 200
| 1400 | 300 <------------------------------------------------------------------------------+
a | 1300 | 100 <--- it will close your position at market price above 1300 |
s | 1200 | 200 when your takeProfitPrice is reached from below |
k | 1100 | 300 or it will be executed at your limit price higher than your takeProfitPrice -+
| 1000 | 100 <- you bought to enter a long position here at 1000
| 900 | 100
----|---------------- last price is 900
| 800 | 100
| 700 | 200
b | 600 | 100
i | 500 | 300
d | 400 | 200
| 300 | 100
| 200 | 100
```
Suppose you entered a short position (you sold) at 700 and want to get your profits from a possible price drop below 600. You would place a take profit order with triggerPrice at 600. For that take profit order either you would specify a limit price or it will be executed at market price.
```
| price | amount
----|----------------
| 1500 | 200
| 1400 | 300
a | 1300 | 100
s | 1200 | 200
k | 1100 | 300
| 1000 | 100
| 900 | 100
----|---------------- last price is 900 (you sold at 700)
| 800 | 100
| 700 | 200 <--- you sold to enter a short position here at 700
b | 600 | 100 <------ you place a take profit order here at 600
i | 500 | 300 when your takeProfitPrice is reached from above
d | 400 | 200 it will be close your position at market price below 600
| 300 | 100 <- or it will be executed at your limit price lower than your takeProfitPrice
| 200 | 100
```
Take Profit orders are activated when the price of the underlying:
* rises above the `takeProfitPrice` from below, for sell orders (eg: to close a long position, at a profit)
* drops below the `takeProfitPrice` from above, for buy orders (eg: to close a short position, at a profit)
JavaScript
Python
PHP
Go
C#
Java
```javascript
// for a take profit order
const params = {
'takeProfitPrice': 120.45, // your take profit price
}
const order = await exchange.createOrder (symbol, type, side, amount, price, params)
```
```python
# for a take profit order
params = {
'takeProfitPrice': 120.45, # your take profit price
}
order = exchange.create_order (symbol, type, side, amount, price, params)
```
```php
// for a take profit order
$params = {
'takeProfitPrice': 120.45, // your take profit price
}
$order = $exchange->create_order ($symbol, $type, $side, $amount, $price, $params);
```
```go
// for a take profit order
params := map[string]interface{}{
"takeProfitPrice": 120.45, // your take profit price
}
order, err := exchange.CreateOrder(symbol, typeVar, side, amount, ccxt.WithCreateOrderPrice(price), ccxt.WithCreateOrderParams(params))
```
```csharp
// for a take profit order
var parameters = new Dictionary() {
{ "takeProfitPrice", 120.45 }, // your take profit price
};
var order = await exchange.CreateOrder(symbol, type, side, amount, price, parameters);
```
```java
Map params = Map.of("takeProfitPrice", 120.45);
Order order = exchange.createOrder(symbol, type, side, amount, price, params);
```
#### StopLoss And TakeProfit Orders Attached To A Position [#stoploss-and-takeprofit-orders-attached-to-a-position]
**Take Profit** / **Stop Loss** Orders which are tied to a position-opening primary order. Implemented by supplying a dictionary parameters for `stopLoss` and `takeProfit` describing each respectively.
* By default stopLoss and takeProfit order amounts will be the same as primary order but in the opposite direction.
* Attached trigger orders are conditional on the primary order being executed.
* Not supported by all exchanges. To check whether stop-loss is supported, use such approach:
```
exchange.featureValue('BTC/USDT', 'createOrder', 'stopLoss') // if stopLoss supported
exchange.featureValue('BTC/USDT', 'createOrder', 'stopLoss.price') // if limit price is supported for stoploss
```
JavaScript
Python
PHP
Go
C#
Java
```javascript
const params = {
'stopLoss': {
'triggerPrice': 12.34, // at what price it will trigger
'price': 12.00, // if exchange supports, 'price' param would be limit price (for market orders, don't include this param)
},
'takeProfit': {
// similar params here
}
}
const order = await exchange.createOrder ('SOL/USDT', 'limit', 'buy', 0.5, 13, params)
```
```python
params = {
'stopLoss': {
'triggerPrice': 12.34, # at what price it will trigger
'price': 12.00, # if exchange supports, 'price' param would be limit price (for market orders, don't include this param)
},
'takeProfit': {
# similar params here
}
}
order = exchange.create_order ('SOL/USDT', 'limit', 'buy', 0.5, 13, params)
```
```php
$params = [
'stopLoss': [
'triggerPrice'=> 12.34, // at what price it will trigger
'price'=> 12.00, // if exchange supports, 'price' param would be limit price (for market orders, don't include this param)
],
'takeProfit'=> [
// similar params here
]
]
$order = $exchange->create_order ('SOL/USDT', 'limit', 'buy', 0.5, 13, $params);
```
```go
params := map[string]interface{}{
"stopLoss": map[string]interface{}{
"triggerPrice": 12.34, // at what price it will trigger
"price": 12.00, // if exchange supports, 'price' param would be limit price (for market orders, don't include this param)
},
"takeProfit": map[string]interface{}{
// similar params here
},
}
order, err := exchange.CreateOrder("SOL/USDT", "limit", "buy", 0.5, ccxt.WithCreateOrderPrice(13), ccxt.WithCreateOrderParams(params))
```
```csharp
var parameters = new Dictionary() {
{ "stopLoss", new Dictionary() {
{ "triggerPrice", 12.34 }, // at what price it will trigger
{ "price", 12.00 }, // if exchange supports, 'price' param would be limit price (for market orders, don't include this param)
} },
{ "takeProfit", new Dictionary() {
// similar params here
} },
};
var order = await exchange.CreateOrder("SOL/USDT", "limit", "buy", 0.5, 13, parameters);
```
```java
Map params = Map.of(
"stopLoss", Map.of("triggerPrice", 12.34, "price", 12.00),
"takeProfit", Map.of("triggerPrice", 15.00, "price", 15.50)
);
Order order = exchange.createOrder("SOL/USDT", "limit", "buy", 0.5, 13.0, params);
```
For exchanges, where it is not possible to use attached SL \&TP, after submitting an entry order, you can immediatelly submit another order (even though position might not be open yet) with `stopLossPrice/takeProfitPrice` in `parmas`, (or `triggerPrice` and `reduceOnly: true`), so it can still act as a stoploss order for your upcoming position (note, this approach might not work for some exchanges).
Example:
```
symbol = 'ADA/USDT:USDT'
main_order = await binance.create_order(symbol, 'market', 'buy', 50) # open position
tp_order = await binance.create_order(symbol, 'limit', 'sell', 50, 1.5, {"takeProfitPrice": 1.6}) # take profit order
sl_order = await binance.create_order(symbol, 'limit', 'sell', 50, 0.24, {"stopLossPrice": 0.25}) # stop loss order
```
#### Trailing Orders [#trailing-orders]
**Trailing** Orders trail behind an open position. Implemented by supplying float parameters for `trailingPercent` or `trailingAmount`.
* A trailing order continually adjusts the order price at a fixed percent or fixed quote amount away from the current market price.
* A trailing order trails behind a position as it moves in one direction, but not in the opposite direction.
* If the position value rises, the trailing order changes, but if the position value drops the trailing order stays the same until the order is executed.
* A trailing order can be placed independently after opening a position.
* Implemented by filling in either the `trailingPercent` or `trailingAmount` parameter depending on the exchange.
* The price argument can be used as the `trailingTriggerPrice`, and the type argument can be used to differentiate between limit and market trailing orders if needed.
*Not supported by all exchanges.*
*Note: This is still under unification and is a work in progress*
JavaScript
Python
PHP
Go
C#
Java
```javascript
symbol = 'BTC/USDT:USDT';
type = 'market';
side = 'sell';
amount = 1.0;
price = undefined;
const params = {
'trailingPercent': 1.0, // percentage away from the current market price 1.0 is equal to 1%
// 'trailingAmount': 100.0, // quote amount away from the current market price
// 'trailingTriggerPrice': 44500.0, // the price to trigger activating a trailing stop order
// 'reduceOnly': true, // set to true if you want to close a position, set to false if you want to open a new position
}
const order = await exchange.createOrder (symbol, type, side, amount, price, params)
```
```python
symbol = 'BTC/USDT:USDT'
type = 'market'
side = 'sell'
amount = 1.0
price = None
params = {
'trailingPercent': 1.0, # percentage away from the current market price 1.0 is equal to 1%
# 'trailingAmount': 100.0, # quote amount away from the current market price
# 'trailingTriggerPrice': 44500.0, # the price to trigger activating a trailing stop order
# 'reduceOnly': True, # set to True if you want to close a position, set to False if you want to open a new position
}
order = exchange.create_order (symbol, type, side, amount, price, params)
```
```php
$symbol = 'BTC/USDT:USDT';
$type = 'market';
$side = 'sell';
$amount = 1.0;
$price = null;
$params = {
'trailingPercent': 1.0, // percentage away from the current market price 1.0 is equal to 1%
// 'trailingAmount': 100.0, // quote amount away from the current market price
// 'trailingTriggerPrice': 44500.0, // the price to trigger activating a trailing stop order
// 'reduceOnly': true, // set to true if you want to close a position, set to false if you want to open a new position
}
$order = $exchange->create_order ($symbol, $type, $side, $amount, $price, $params);
```
```go
symbol := "BTC/USDT:USDT"
typeVar := "market"
side := "sell"
amount := 1.0
params := map[string]interface{}{
"trailingPercent": 1.0, // percentage away from the current market price 1.0 is equal to 1%
// "trailingAmount": 100.0, // quote amount away from the current market price
// "trailingTriggerPrice": 44500.0, // the price to trigger activating a trailing stop order
// "reduceOnly": true, // set to true if you want to close a position, set to false if you want to open a new position
}
order, err := exchange.CreateOrder(symbol, typeVar, side, amount, ccxt.WithCreateOrderParams(params))
```
```csharp
var symbol = "BTC/USDT:USDT";
var type = "market";
var side = "sell";
var amount = 1.0;
var parameters = new Dictionary() {
{ "trailingPercent", 1.0 }, // percentage away from the current market price 1.0 is equal to 1%
// { "trailingAmount", 100.0 }, // quote amount away from the current market price
// { "trailingTriggerPrice", 44500.0 }, // the price to trigger activating a trailing stop order
// { "reduceOnly", true }, // set to true if you want to close a position, set to false if you want to open a new position
};
var order = await exchange.CreateOrder(symbol, type, side, amount, null, parameters);
```
```java
Map params = Map.of("trailingPercent", 1.0);
Order order = exchange.createOrder("BTC/USDT:USDT", "market", "sell", 1.0, null, params);
```
#### Custom Order Params [#custom-order-params]
Some exchanges allow you to specify optional parameters for your order. You can pass your optional parameters and override your query with an associative array using the `params` argument to your unified API call. All custom params are exchange-specific, of course, and aren't interchangeable, do not expect those custom params for one exchange to work with another exchange.
JavaScript
Python
PHP
Go
C#
Java
```javascript
// use a custom order type
bitfinex.createLimitSellOrder ('BTC/USD', 1, 10, { 'type': 'trailing-stop' })
```
```python
# add a custom order flag
kraken.create_market_buy_order('BTC/USD', 1, {'trading_agreement': 'agree'})
```
```php
// add custom user id to your order
$hitbtc->create_order ('BTC/USD', 'limit', 'buy', 1, 3000, array ('clientOrderId' => '123'));
```
```go
// use a custom order type
order, err := bitfinex.CreateLimitSellOrder("BTC/USD", 1, 10, ccxt.WithCreateLimitSellOrderParams(map[string]interface{}{
"type": "trailing-stop",
}))
```
```csharp
// use a custom order type
var order = await bitfinex.CreateLimitSellOrder("BTC/USD", 1, 10, new Dictionary() {
{ "type", "trailing-stop" },
});
```
```java
Order order = exchange.createOrder("BTC/USDT", "limit", "sell", 1.0, 10.0, Map.of("type", "trailing-stop"));
```
##### User-defined `clientOrderId` [#user-defined-clientorderid]
```text
- this part of the unified API is currenty a work in progress
- there may be some issues and missing implementations here and there
- contributions, pull requests and feedback appreciated
```
The user can specify a custom `clientOrderId` field can be set upon placing orders with the `params`. Using the `clientOrderId` one can later distinguish between own orders. This is only available for the exchanges that do support `clientOrderId` at this time. For the exchanges that don't support it will either throw an error upon supplying the `clientOrderId` or will ignore it setting the `clientOrderId` to `undefined/None/null`.
JavaScript
Python
PHP
Go
C#
Java
```javascript
exchange.createOrder (symbol, type, side, amount, price, {
'clientOrderId': 'Hello',
})
```
```python
exchange.create_order(symbol, type, side, amount, price, {
'clientOrderId': 'World',
})
```
```php
$exchange->create_order($symbol, $type, $side, $amount, $price, array(
'clientOrderId' => 'Foobar',
))
```
```go
exchange.CreateOrder(symbol, typeVar, side, amount, ccxt.WithCreateOrderPrice(price), ccxt.WithCreateOrderParams(map[string]interface{}{
"clientOrderId": "Hello",
}))
```
```csharp
await exchange.CreateOrder(symbol, type, side, amount, price, new Dictionary() {
{ "clientOrderId", "Foobar" },
});
```
```java
Order order = exchange.createOrder("BTC/USDT", "limit", "buy", 0.001, 50000.0,
Map.of("clientOrderId", "Hello"));
```
##### Hedge mode for order [#hedge-mode-for-order]
If exchange supports [feature](#features) for `hedged` orders, user can pass `params['hedged'] = true` in `createOrder` to open a `hedged` position instead of default `one-way` mode order. However, if exchange supports `.has['setPositionMode']` then those exchanges might not support `hedged` param directly through `createOrder`, instead on such exchange you need to change the account-mode at first using [setPositionMode()](#set-position-mode) and then run `createOrder` (without `hedged` param) and it will place hedged order by default.
### Editing Orders [#editing-orders]
To edit an order, you can use the `editOrder` method
```javascript
editOrder (id, symbol, type, side, amount, price = undefined, params = {})
```
Parameters
* **id** (String) *required* Order id (e.g. `1645807945000`)
* **symbol** (String) *required* Unified CCXT market symbol
* **side** (String) *required* the direction of your order.
**Unified sides:**
* `buy` give quote currency and receive base currency; for example, buying `BTC/USD` means that you will receive bitcoins for your dollars.
* `sell` give base currency and receive quote currency; for example, buying `BTC/USD` means that you will receive dollars for your bitcoins.
* **type** (String) *required* type of order
**Unified types:**
* [`market`](#market-orders) not allowed by some exchanges, see [their docs](#exchanges) for details
* [`limit`](#limit-orders)
* see #custom-order-params and #other-order-types for non-unified types
* **amount** (Number) *required* how much of currency you want to trade usually, but not always, in units of the base currency of the trading pair symbol (the units for some exchanges are dependent on the side of the order: see their API docs for details.)
* **price** (Float) the price at which the order is to be fullfilled at in units of the quote currency (ignored in market orders)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"settle": "usdt"}`)
Returns
* An [order structure](#order-structure)
### Canceling Orders [#canceling-orders]
To cancel an existing order use
* `cancelOrder ()` for a single order
* `cancelOrders ()` for multiple orders
* `cancelAllOrders ()` for all open orders
* `cancelAllOrdersAfter ()` for all open orders after the given timeout
```javascript
cancelOrder (id, symbol = undefined, params = {})
```
Parameters
* **id** (String) *required* Order id (e.g. `1645807945000`)
* **symbol** (String) Unified CCXT market symbol **required** on some exchanges (e.g. `"BTC/USDT"`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"settle": "usdt"}`)
Returns
* An [order structure](#order-structure)
```javascript
cancelOrders (ids, symbol = undefined, params = {})
```
Parameters
* **ids** (\[String]) *required* Order ids (e.g. `1645807945000`)
* **symbol** (String) Unified CCXT market symbol **required** on some exchanges (e.g. `"BTC/USDT"`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"settle": "usdt"}`)
Returns
* An array of [order structures](#order-structure)
```javascript
async cancelAllOrders (symbol = undefined, params = {})
```
Parameters
* **symbol** (String) Unified CCXT market symbol **required** on some exchanges (e.g. `"BTC/USDT"`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"settle": "usdt"}`)
Returns
* An array of [order structures](#order-structure)
```javascript
async cancelAllOrdersAfter (timeout, params = {})
```
Parameters
* **timeout** (number) countdown time in milliseconds **required** on some exchanges, 0 represents cancel the timer (e.g. `10`\ )
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"type": "spot"}`\ )
Returns
* An object
#### Exceptions Upon Canceling Orders [#exceptions-upon-canceling-orders]
The `cancelOrder()` is usually used on open orders only. However, it may happen that your order gets executed (filled and closed)
before your cancel-request comes in, so a cancel-request might hit an already-closed order.
A cancel-request might also throw a `OperationFailed` indicating that the order might or might not have been canceled successfully and whether you need to retry or not. Consecutive calls to `cancelOrder()` may hit an already canceled order as well.
As such, `cancelOrder()` can throw an `OrderNotFound` exception in these cases:
* canceling an already-closed order
* canceling an already-canceled order
## My Trades [#my-trades]
```text
- this part of the unified API is currenty a work in progress
- there may be some issues and missing implementations here and there
- contributions, pull requests and feedback appreciated
```
### How Orders Are Related To Trades [#how-orders-are-related-to-trades]
A trade is also often called `a fill`. Each trade is a result of order execution. Note, that orders and trades have a one-to-many relationship: an execution of one order may result in several trades. However, when one order matches another opposing order, the pair of two matching orders yields one trade. Thus, when an order matches multiple opposing orders, this yields multiple trades, one trade per each pair of matched orders.
To put it shortly, an order can contain *one or more* trades. Or, in other words, an order can be *filled* with one or more trades.
For example, an orderbook can have the following orders (whatever trading symbol or pair it is):
```text
| price | amount
----|----------------
a | 1.200 | 200
s | 1.100 | 300
k | 0.900 | 100
----|----------------
b | 0.800 | 100
i | 0.700 | 200
d | 0.500 | 100
```
All specific numbers above aren't real, this is just to illustrate the way orders and trades are related in general.
A seller decides to place a sell limit order on the ask side for a price of 0.700 and an amount of 150.
```text
| price | amount
----|---------------- ↓
a | 1.200 | 200 ↓
s | 1.100 | 300 ↓
k | 0.900 | 100 ↓
----|---------------- ↓
b | 0.800 | 100 ↓ sell 150 for 0.700
i | 0.700 | 200 --------------------
d | 0.500 | 100
```
As the price and amount of the incoming sell (ask) order cover more than one bid order (orders `b` and `i`), the following sequence of events usually happens within an exchange engine very quickly, but not immediately:
1. Order `b` is matched against the incoming sell because their prices intersect. Their volumes *"mutually annihilate"* each other, so, the bidder gets 100 for a price of 0.800. The seller (asker) will have their sell order partially filled by bid volume 100 for a price of 0.800. Note that for the filled part of the order the seller gets a better price than he asked for initially. He asked for 0.7 at least but got 0.8 instead which is even better for the seller. Most conventional exchanges fill orders for the best price available.
2. A trade is generated for the order `b` against the incoming sell order. That trade *"fills"* the entire order `b` and most of the sell order. One trade is generated per each pair of matched orders, whether the amount was filled completely or partially. In this example the seller amount (100) fills order `b` completely (closes the order `b`) and also fills the selling order partially (leaves it open in the orderbook).
3. Order `b` now has a status of `closed` and a filled volume of 100. It contains one trade against the selling order. The selling order has an `open` status and a filled volume of 100. It contains one trade against order `b`. Thus each order has just one fill-trade so far.
4. The incoming sell order has a filled amount of 100 and has yet to fill the remaining amount of 50 from its initial amount of 150 in total.
The intermediate state of the orderbook is now (order `b` is `closed` and is not in the orderbook anymore):
```text
| price | amount
----|---------------- ↓
a | 1.200 | 200 ↓
s | 1.100 | 300 ↓
k | 0.900 | 100 ↓
----|---------------- ↓ sell remaining 50 for 0.700
i | 0.700 | 200 -----------------------------
d | 0.500 | 100
```
5. Order `i` is matched against the remaining part of incoming sell, because their prices intersect. The amount of buying order `i` which is 200 completely annihilates the remaining sell amount of 50. The order `i` is filled partially by 50, but the rest of its volume, namely the remaining amount of 150 will stay in the orderbook. The selling order, however, is fulfilled completely by this second match.
6. A trade is generated for the order `i` against the incoming sell order. That trade partially fills order `i`. And completes the filling of the sell order. Again, this is just one trade for a pair of matched orders.
7. Order `i` now has a status of `open`, a filled amount of 50, and a remaining amount of 150. It contains one filling trade against the selling order. The selling order has a `closed` status now and it has completely filled its total initial amount of 150. However, it contains two trades, the first against order `b` and the second against order `i`. Thus each order can have one or more filling trades, depending on how their volumes were matched by the exchange engine.
After the above sequence takes place, the updated orderbook will look like this.
```text
| price | amount
----|----------------
a | 1.200 | 200
s | 1.100 | 300
k | 0.900 | 100
----|----------------
i | 0.700 | 150
d | 0.500 | 100
```
Notice that the order `b` has disappeared, the selling order also isn't there. All closed and fully-filled orders disappear from the orderbook. The order `i` which was filled partially and still has a remaining volume and an `open` status, is still there.
### Personal Trades [#personal-trades]
Most of unified methods will return either a single object or a plain array (a list) of objects (trades). However, very few exchanges (if any at all) will return all trades at once. Most often their APIs `limit` output to a certain number of most recent objects. **YOU CANNOT GET ALL OBJECTS SINCE THE BEGINNING OF TIME TO THE PRESENT MOMENT IN JUST ONE CALL**. Practically, very few exchanges will tolerate or allow that.
As with all other unified methods for fetching historical data, the `fetchMyTrades` method accepts a `since` argument for [date-based pagination](#date-based-pagination). Just like with all other unified methods throughout the CCXT library, the `since` argument for `fetchMyTrades` must be an **integer timestamp in milliseconds**.
To fetch historical trades, the user will need to traverse the data in portions or "pages" of objects. Pagination often implies *"fetching portions of data one by one"* in a loop.
In many cases a `symbol` argument is required by the exchanges' APIs, therefore you have to loop over all symbols to get all your trades. If the `symbol` is missing and the exchange requires it then CCXT will throw an `ArgumentsRequired` exception to signal the requirement to the user. And then the `symbol` has to be specified. One of the approaches is to filter the relevant symbols from the list of all symbols by looking at non-zero balances as well as transactions (withdrawals and deposits). Also, the exchanges will have a limit on how far back in time you can go.
In most cases users are **required to use at least some type of [pagination](#pagination)** in order to get the expected results consistently.
JavaScript
Python
PHP
Go
C#
Java
```javascript
// fetchMyTrades (symbol = undefined, since = undefined, limit = undefined, params = {})
if (exchange.has['fetchMyTrades']) {
const trades = await exchange.fetchMyTrades (symbol, since, limit, params)
}
```
```python
# fetch_my_trades(symbol=None, since=None, limit=None, params={})
if exchange.has['fetchMyTrades']:
exchange.fetch_my_trades(symbol=None, since=None, limit=None, params={})
```
```php
// fetch_my_trades($symbol = null, $since = null, $limit = null, $params = array())
if ($exchange->has['fetchMyTrades']) {
$trades = $exchange->fetch_my_trades($symbol, $since, $limit, $params);
}
```
```go
if exchange.Has["fetchMyTrades"] == true {
trades, err := exchange.FetchMyTrades(ccxt.WithFetchMyTradesSymbol("BTC/USDT"), ccxt.WithFetchMyTradesLimit(20))
if err != nil {
fmt.Println(err)
return
}
for _, t := range trades {
fmt.Println(t.Datetime, t.Side, t.Amount, "@", t.Price)
}
}
```
```csharp
var myTrades = await exchange.FetchMyTrades("BTC/USDT", null, 20);
foreach (var t in myTrades)
{
Console.WriteLine(t.datetime + " " + t.side + " " + t.amount + " @ " + t.price);
}
```
```java
List myTrades = exchange.fetchMyTrades("BTC/USDT", null, 20L, null);
for (Trade t : myTrades) {
System.out.println(t.datetime + " " + t.side + " " + t.amount + " @ " + t.price);
}
```
Returns ordered array `[]` of trades (most recent trade last).
#### Trade Structure [#trade-structure]
Trades denote the exchange of one currency for another, unlike [transactions](#transaction-structure), which denote a transfer of a given coin.
```javascript
{
'info': { ... }, // the original decoded JSON as is
'id': '12345-67890:09876/54321', // string trade id
'timestamp': 1502962946216, // Unix timestamp in milliseconds
'datetime': '2017-08-17 12:42:48.000', // ISO8601 datetime with milliseconds
'symbol': 'ETH/BTC', // symbol
'order': '12345-67890:09876/54321', // string order id or undefined/None/null
'type': 'limit', // order type, 'market', 'limit' or undefined/None/null
'side': 'buy', // direction of the trade, 'buy' or 'sell'
'takerOrMaker': 'taker', // string, 'taker' or 'maker'
'price': 0.06917684, // float price in quote currency
'amount': 1.5, // amount of base currency
'cost': 0.10376526, // total cost, `price * amount`,
'fee': { // provided by exchange or calculated by ccxt
'cost': 0.0015, // float
'currency': 'ETH', // usually base currency for buys, quote currency for sells
'rate': 0.002, // the fee rate (if available)
},
'fees': [ // an array of fees if paid in multiple currencies
{ // if provided by exchange or calculated by ccxt
'cost': 0.0015, // float
'currency': 'ETH', // usually base currency for buys, quote currency for sells
'rate': 0.002, // the fee rate (if available)
},
],
}
```
* The work on `'fee'` and `'fees'` info is still in progress, fee info may be missing partially or entirely, depending on the exchange capabilities.
* The `fee` currency may be different from both traded currencies (for example, an ETH/BTC order with fees in USD).
* The `cost` of the trade means `amount * price`. It is the total *quote* volume of the trade (whereas `amount` is the *base* volume). The cost field itself is there mostly for convenience and can be deduced from other fields.
* The `cost` of the trade is a *"gross"* value. That is the value pre-fee, and the fee has to be applied afterwards.
### Trades By Order Id [#trades-by-order-id]
JavaScript
Python
PHP
Go
C#
Java
```javascript
// fetchOrderTrades (id, symbol = undefined, since = undefined, limit = undefined, params = {})
if (exchange.has['fetchOrderTrades']) {
const trades = await exchange.fetchOrderTrades (orderId, symbol, since, limit, params)
}
```
```python
# fetch_order_trades(id, symbol=None, since=None, limit=None, params={})
if exchange.has['fetchOrderTrades']:
exchange.fetch_order_trades(order_id, symbol=None, since=None, limit=None, params={})
```
```php
// fetch_order_trades ($id, $symbol = null, $since = null, $limit = null, $params = array())
if ($exchange->has['fetchOrderTrades']) {
$trades = $exchange->fetch_order_trades($order_id, $symbol, $since, $limit, $params);
}
```
```go
if exchange.Has["fetchOrderTrades"] == true {
trades, err := exchange.FetchOrderTrades(orderId, ccxt.WithFetchOrderTradesSymbol(symbol))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(trades)
}
```
```csharp
if ((bool)exchange.has["fetchOrderTrades"])
{
var trades = await exchange.FetchOrderTrades(orderId, symbol);
Console.WriteLine(trades.Count);
}
```
```java
Object trades = exchange.fetchOrderTrades(orderId, symbol).join();
```
## Ledger [#ledger]
The ledger is simply the history of changes, actions done by the user or operations that altered the user's balance in any way, that is, the history of movements of all funds from/to all accounts of the user which includes
* deposits and withdrawals (funding)
* amounts incoming and outcoming in result of a trade or an order
* trading fees
* transfers between accounts
* rebates, cashbacks and other types of events that are subject to accounting.
Data on ledger entries can be retrieved using
* `fetchLedgerEntry ()` for a ledger entry
* `fetchLedger ( code )` for multiple ledger entries of the same currency
* `fetchLedger ()` for all ledger entries
```javascript
fetchLedgerEntry (id, code = undefined, params = {})
```
Parameters
* **id** (String) *required* Ledger entry id
* **code** (String) Unified CCXT currency code, required (e.g. `"USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"type": "deposit"}`)
Returns
* A [ledger entry structure](#ledger-entry-structure)
```javascript
async fetchLedger (code = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **code** (String) Unified CCXT currency code; *required* if fetching all ledger entries for all assets at once is not supported (e.g. `"USDT"`)
* **since** (Integer) Timestamp (ms) of the earliest time to retrieve withdrawals for (e.g. `1646940314000`)
* **limit** (Integer) The number of [ledger entry structures](#ledger-entry-structure) to retrieve (e.g. `5`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [ledger entry structures](#ledger-entry-structure)
### Ledger Entry Structure [#ledger-entry-structure]
```javascript
{
'id': 'hqfl-f125f9l2c9', // string id of the ledger entry, e.g. an order id
'direction': 'out', // or 'in'
'account': '06d4ab58-dfcd-468a', // string id of the account if any
'referenceId': 'bf7a-d4441fb3fd31', // string id of the trade, transaction, etc...
'referenceAccount': '3146-4286-bb71', // string id of the opposite account (if any)
'type': 'trade', // string, reference type, see below
'currency': 'BTC', // string, unified currency code, 'ETH', 'USDT'...
'amount': 123.45, // absolute number, float (does not include the fee)
'timestamp': 1544582941735, // milliseconds since epoch time in UTC
'datetime': "2018-12-12T02:49:01.735Z", // string of timestamp, ISO8601
'before': 0, // amount of currency on balance before
'after': 0, // amount of currency on balance after
'status': 'ok', // 'ok, 'pending', 'canceled'
'fee': { // object or undefined
'cost': 54.321, // absolute number on top of the amount
'currency': 'ETH', // string, unified currency code, 'ETH', 'USDT'...
},
'info': { ... }, // raw ledger entry as is from the exchange
}
```
#### Notes On Ledger Entry Structure [#notes-on-ledger-entry-structure]
The type of the ledger entry is the type of the operation associated with it. If the amount comes due to a sell order, then it is associated with a corresponding trade type ledger entry, and the referenceId will contain associated trade id (if the exchange in question provides it). If the amount comes out due to a withdrawal, then is associated with a corresponding transaction.
* `trade`
* `transaction`
* `fee`
* `rebate`
* `cashback`
* `referral`
* `transfer`
* `airdrop`
* `whatever`
* ...
The `referenceId` field holds the id of the corresponding event that was registered by adding a new item to the ledger.
The `status` field is there to support for exchanges that include pending and canceled changes in the ledger. The ledger naturally represents the actual changes that have taken place, therefore the status is `'ok'` in most cases.
The ledger entry type can be associated with a regular trade or a funding transaction (deposit or withdrawal) or an internal `transfer` between two accounts of the same user. If the ledger entry is associated with an internal transfer, the `account` field will contain the id of the account that is being altered with the ledger entry in question. The `referenceAccount` field will contain the id of the opposite account the funds are transferred to/from, depending on the `direction` (`'in'` or `'out'`).
## Deposit [#deposit]
In order to deposit cryptocurrency funds to an exchange you must get an address from the exchange for the currency you want to deposit using `fetchDepositAddress`. You can then call the `withdraw` method with the specified currency and address.
To deposit fiat currency on an exchange you can use the `deposit` method with data retrieved from the `fetchDepositMethodId` method.
*this deposit feature is currently supported on coinbase only, feel free to report any issues you find*
* `deposit ()`
```javascript
deposit (id, code = undefined, params = {})
```
Parameters
* **id** (String) *required* Deposit id
* **code** (String) Fiat currency code, required (e.g. `"USD"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"account": "fiat"}`)
Returns
* A [transaction structure](#transaction-structure)
* `fetchDepositMethodId ()`
```javascript
fetchDepositMethodId (id, params = {})
```
Parameters
* **id** (String) *required* Deposit id
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"account": "fiat"}`)
Returns
* A [deposit id structure](#deposit-id-structure)
* `fetchDepositMethodIds ()`
```javascript
fetchDepositMethodIds (params = {})
```
Parameters
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"account": "fiat"}`)
Returns
* An array of [deposit id structures](#deposit-id-structure)
### Deposit Id Structure [#deposit-id-structure]
The deposit id structure returned from `fetchDepositMethodId`, `fetchDepositMethodIds` look like this:
```javascript
{
'info': {}, // raw unparsed data as returned from the exchange
'id': '75ab52ff-f25t', // the deposit id
'currency': 'USD', // fiat currency
'verified': true, // whether funding through this id is verified or not
'tag': 'from credit card', // tag / memo / name of funding source
}
```
Data on deposits made to an account can be retrieved using
* `fetchDeposit ()` for a single deposit
* `fetchDeposits ( code )` for multiple deposits of the same currency
* `fetchDeposits ()` for all deposits to an account
```javascript
fetchDeposit (id, code = undefined, params = {})
```
Parameters
* **id** (String) *required* Deposit id
* **code** (String) Unified CCXT currency code, required (e.g. `"USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"network": "TRX"}`)
Returns
* A [transaction structure](#transaction-structure)
```javascript
fetchDeposits (code = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **code** (String) Unified CCXT currency code (e.g. `"USDT"`)
* **since** (Integer) Timestamp (ms) of the earliest time to retrieve deposits for (e.g. `1646940314000`)
* **limit** (Integer) The number of [transaction structures](#transaction-structure) to retrieve (e.g. `5`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [transaction structures](#transaction-structure)
## Withdrawal [#withdrawal]
The `withdraw` method can be used to withdraw funds from an account
Some exchanges require a manual approval of each withdrawal by means of 2FA (2-factor authentication). In order to approve your withdrawal you usually have to either click their secret link in your email inbox or enter a Google Authenticator code or an Authy code on their website to verify that withdrawal transaction was requested intentionally.
In some cases you can also use the withdrawal id to check withdrawal status later (whether it succeeded or not) and to submit 2FA confirmation codes, where this is supported by the exchange. See [their docs](#exchanges) for details.
JavaScript
Python
PHP
Go
C#
Java
```javascript
withdraw (code, amount, address, tag = undefined, params = {})
```
```python
withdraw(code, amount, address, tag=None, params={})
```
```php
withdraw ($code, $amount, $address, $tag = null, $params = array ())
```
```go
func (this *Binance) Withdraw(code string, amount float64, address string, options ...ccxt.WithdrawOptions) (ccxt.Transaction, error)
```
```csharp
public async Task Withdraw(string code, double amount, string address, string tag = null, Dictionary parameters = null)
```
```java
Transaction tx = exchange.withdraw("BTC", 0.5, "1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2", null, null);
```
Parameters
* **code** (String) *required* Unified CCXT currency code (e.g. `"USDT"`)
* **amount** (Float) *required* The amount of currency to withdraw (e.g. `20`)
* **address** (String) *required* The recipient address of the withdrawal (e.g. `"TEY6qjnKDyyq5jDc3DJizWLCdUySrpQ4yp"`)
* **tag** (String) Required for some networks (e.g. `"52055"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"network": "TRX"}`)
Returns
* A [transaction structure](#transaction-structure)
***
Data on withdrawals made to an account can be retrieved using
* `fetchWithdrawal ()` for a single withdrawal
* `fetchWithdrawals ( code )` for multiple withdrawals of the same currency
* `fetchWithdrawals ()` for all withdrawals from an account
```javascript
fetchWithdrawal (id, code = undefined, params = {})
```
Parameters
* **id** (String) *required* Withdrawal id
* **code** (String) Unified CCXT currency code (e.g. `"USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"network": "TRX"}`)
```javascript
fetchWithdrawals (code = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **code** (String) Unified CCXT currency code (e.g. `"USDT"`)
* **since** (Integer) Timestamp (ms) of the earliest time to retrieve withdrawals for (e.g. `1646940314000`)
* **limit** (Integer) The number of [transaction structures](#transaction-structure) to retrieve (e.g. `5`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [transaction structures](#transaction-structure)
### Deposit And Withdrawal Networks [#deposit-and-withdrawal-networks]
It is also possible to pass the parameters as the fourth argument with or without a specified tag
JavaScript
Python
PHP
Go
C#
Java
```javascript
withdraw (code, amount, address, { tag, network: 'ETH' })
```
```python
withdraw(code, amount, address, { 'tag': tag, 'network': 'ETH' })
```
```php
withdraw ($code, $amount, $address, array( 'tag' => tag, 'network' -> 'ETH' ));
```
```go
exchange.Withdraw(code, amount, address, ccxt.WithWithdrawTag(tag), ccxt.WithWithdrawParams(map[string]interface{}{"network": "ETH"}))
```
```csharp
await exchange.Withdraw(code, amount, address, tag, new Dictionary() { { "network", "ETH" } });
```
```java
Transaction tx = exchange.withdraw("USDT", 100.0, "0x1234...", null, Map.of("network", "ETH"));
```
The following aliases of `network` allow for withdrawing crypto on multiple chains
| Currency | Network |
| :------: | :-----: |
| ETH | ERC20 |
| TRX | TRC20 |
| BSC | BEP20 |
| BNB | BEP2 |
| HT | HECO |
| OMNI | OMNI |
You may set the value of `exchange.withdraw ('USDT', 100, 'TVJ1fwyJ1a8JbtUxZ8Km95sDFN9jhLxJ2D', { 'network': 'TRX' })` in order to withdraw USDT on the TRON chain, or 'BSC' to withdraw USDT on Binance Smart Chain. In the table above BSC and BEP20 are equivalent aliases, so it doesn't matter which one you use as they both will achieve the same effect.
### Transaction Structure [#transaction-structure]
Transactions denote a transfer of a given coin, unlike [trades](#trade-structure), which denote the exchange of one currency for another.
* *deposit structure*
* *withdrawal structure*
```javascript
{
'info': { ... }, // the JSON response from the exchange as is
'id': '123456', // exchange-specific transaction id, string
'txid': '0x68bfb29821c50ca35ef3762f887fd3211e4405aba1a94e448a4f218b850358f0',
'timestamp': 1534081184515, // timestamp in milliseconds
'datetime': '2018-08-12T13:39:44.515Z', // ISO8601 string of the timestamp
'addressFrom': '0x38b1F8644ED1Dbd5DcAedb3610301Bf5fa640D6f', // sender
'address': '0x02b0a9b7b4cDe774af0f8e47cb4f1c2ccdEa0806', // "from" or "to"
'addressTo': '0x304C68D441EF7EB0E2c056E836E8293BD28F8129', // receiver
'tagFrom', '0xabcdef', // "tag" or "memo" or "payment_id" associated with the sender
'tag': '0xabcdef' // "tag" or "memo" or "payment_id" associated with the address
'tagTo': '0xhijgklmn', // "tag" or "memo" or "payment_id" associated with the receiver
'type': 'deposit', // 'withdrawal' or 'transfer', string
'amount': 1.2345, // float (does not include the fee)
'currency': 'ETH', // a common unified currency code, string
'status': 'pending', // 'ok', 'failed', 'canceled', string
'updated': undefined, // UTC timestamp of most recent status change in ms
'comment': 'a comment or message defined by the user if any',
'fee': { // the entire fee structure may be undefined
'currency': 'ETH', // a unified fee currency code
'cost': 0.1234, // float
'rate': undefined, // approximately, fee['cost'] / amount, float
},
}
```
#### Notes On Transaction Structure [#notes-on-transaction-structure]
* `addressFrom` or `addressTo` may be `undefined/None/null`, if the exchange in question does not specify all sides of the transaction
* The semantics of the `address` field is exchange-specific. In some cases it can contain the address of the sender, in other cases it may contain the address of the receiver. The actual value depends on the exchange.
* The `updated` field is the UTC timestamp in milliseconds of the most recent change of status of that funding operation, be it `withdrawal` or `deposit`. It is necessary if you want to track your changes in time, beyond a static snapshot. For example, if the exchange in question reports `created_at` and `confirmed_at` for a transaction, then the `updated` field will take the value of `Math.max (created_at, confirmed_at)`, that is, the timestamp of the most recent change of the status.
* The `updated` field may be `undefined/None/null` in certain exchange-specific cases.
* The `fee` substructure may be missing, if not supplied within the reply coming from the exchange.
* The `comment` field may be `undefined/None/null`, otherwise it will contain a message or note defined by the user upon creating the transaction.
* Be careful when handling the `tag` and the `address`. The `tag` is **NOT an arbitrary user-defined string** of your choice! You cannot send user messages and comments in the `tag`. The purpose of the `tag` field is to address your wallet properly, so it must be correct. You should only use the `tag` received from the exchange you're working with, otherwise your transaction might never arrive to its destination.
* The `type` field may be `deposit/withdrawal` or, in some cases (when the exchange's endpoint returns both internal transfers and blockchain transactions, e.g. `ccxt.coinlist`), could be `transfer`.
### fetchDeposits Examples [#fetchdeposits-examples]
JavaScript
Python
PHP
Go
C#
Java
```javascript
// fetchDeposits (code = undefined, since = undefined, limit = undefined, params = {})
if (exchange.has['fetchDeposits']) {
const deposits = await exchange.fetchDeposits (code, since, limit, params)
} else {
throw new Error (exchange.id + ' does not have the fetchDeposits method')
}
```
```python
# fetch_deposits(code = None, since = None, limit = None, params = {})
if exchange.has['fetchDeposits']:
deposits = exchange.fetch_deposits(code, since, limit, params)
else:
raise Exception (exchange.id + ' does not have the fetch_deposits method')
```
```php
// fetch_deposits ($code = null, $since = null, $limit = null, $params = {})
if ($exchange->has['fetchDeposits']) {
$deposits = $exchange->fetch_deposits ($code, $since, $limit, $params);
} else {
throw new Exception ($exchange->id . ' does not have the fetch_deposits method');
}
```
```go
if exchange.Has["fetchDeposits"] == true {
deposits, err := exchange.FetchDeposits(ccxt.WithFetchDepositsCode(code))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(deposits)
}
```
```csharp
if ((bool)exchange.has["fetchDeposits"])
{
var deposits = await exchange.FetchDeposits(code);
Console.WriteLine(deposits.Count);
}
```
```java
List deposits = exchange.fetchDeposits("BTC", null, null, null);
```
### fetchWithdrawals Examples [#fetchwithdrawals-examples]
JavaScript
Python
PHP
Go
C#
Java
```javascript
// fetchWithdrawals (code = undefined, since = undefined, limit = undefined, params = {})
if (exchange.has['fetchWithdrawals']) {
const withdrawals = await exchange.fetchWithdrawals (code, since, limit, params)
} else {
throw new Error (exchange.id + ' does not have the fetchWithdrawals method')
}
```
```python
# fetch_withdrawals(code = None, since = None, limit = None, params = {})
if exchange.has['fetchWithdrawals']:
withdrawals = exchange.fetch_withdrawals(code, since, limit, params)
else:
raise Exception (exchange.id + ' does not have the fetch_withdrawals method')
```
```php
// fetch_withdrawals ($code = null, $since = null, $limit = null, $params = {})
if ($exchange->has['fetchWithdrawals']) {
$withdrawals = $exchange->fetch_withdrawals ($code, $since, $limit, $params);
} else {
throw new Exception ($exchange->id . ' does not have the fetch_withdrawals method');
}
```
```go
if exchange.Has["fetchWithdrawals"] == true {
withdrawals, err := exchange.FetchWithdrawals(ccxt.WithFetchWithdrawalsCode(code))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(withdrawals)
}
```
```csharp
if ((bool)exchange.has["fetchWithdrawals"])
{
var withdrawals = await exchange.FetchWithdrawals(code);
Console.WriteLine(withdrawals.Count);
}
```
```java
List withdrawals = exchange.fetchWithdrawals("BTC", null, null, null);
```
### fetchTransactions Examples [#fetchtransactions-examples]
JavaScript
Python
PHP
Go
C#
Java
```javascript
// fetchTransactions (code = undefined, since = undefined, limit = undefined, params = {})
if (exchange.has['fetchTransactions']) {
const transactions = await exchange.fetchTransactions (code, since, limit, params)
} else {
throw new Error (exchange.id + ' does not have the fetchTransactions method')
}
```
```python
# fetch_transactions(code = None, since = None, limit = None, params = {})
if exchange.has['fetchTransactions']:
transactions = exchange.fetch_transactions(code, since, limit, params)
else:
raise Exception (exchange.id + ' does not have the fetch_transactions method')
```
```php
// fetch_transactions ($code = null, $since = null, $limit = null, $params = {})
if ($exchange->has['fetchTransactions']) {
$transactions = $exchange->fetch_transactions ($code, $since, $limit, $params);
} else {
throw new Exception ($exchange->id . ' does not have the fetch_transactions method');
}
```
```go
if exchange.Has["fetchTransactions"] == true {
transactions, err := exchange.FetchTransactions(ccxt.WithFetchTransactionsCode(code))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(transactions)
}
```
```csharp
if ((bool)exchange.has["fetchTransactions"])
{
var transactions = await exchange.FetchTransactions(code);
Console.WriteLine(transactions.Count);
}
```
```java
List transactions = exchange.fetchTransactions("BTC", null, null, null);
```
## Deposit Addresses [#deposit-addresses]
The address for depositing can be either an already existing address that was created previously with the exchange or it can be created upon request. In order to see which of the two methods are supported, check the `exchange.has['fetchDepositAddress']` and `exchange.has['createDepositAddress']` properties.
```javascript
fetchDepositAddress (code, params = {})
createDepositAddress (code, params = {})
```
Parameters
* **code** (String) *required* Unified CCXT currency code (e.g. `"USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* an [address structure](#address-structure)
***
Some exchanges may also have a method for fetching multiple deposit addresses at once or all of them at once.
```javascript
fetchDepositAddresses (codes = undefined, params = {})
```
Parameters
* **code** (\[String]) Array of unified CCXT currency codes. May or may not be required depending on the exchange (e.g. `["USDT", "BTC"]`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* an array of [address structures](#address-structure)
```javascript
fetchDepositAddressesByNetwork (code, params = {})
```
Parameters
* **code** (String) *required* Unified CCXT currency code (e.g. `"USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* a dictionary of [address structures](#address-structure) indexed by unified network code (e.g. `{ 'ERC20': {...}, 'TRC20': {...} }`)
### Address Structure [#address-structure]
The address structures returned from `fetchDepositAddress`, `fetchDepositAddresses`, `fetchDepositAddressesByNetwork` and `createDepositAddress` look like this:
```javascript
{
'info': response, // raw unparsed data as returned from the exchange
'currency': 'USDC', // currency code
'network': 'ERC20', // a deposit/withdraw networks, ERC20, TRC20, BSC20 (see below)
'address': '0x', // blockchain address in terms of the requested currency and network
'tag': undefined, // tag / memo / paymentId for particular currencies (XRP, XMR, ...)
}
```
With certain currencies, like AEON, BTS, GXS, NXT, SBD, STEEM, STR, XEM, XLM, XMR, XRP, an additional argument `tag` is usually required by exchanges. Other currencies will have the `tag` set to `undefined / None / null`. The tag is a memo or a message or a payment id that is attached to a withdrawal transaction. The tag is mandatory for those currencies and it identifies the recipient user account.
Be careful when specifying the `tag` and the `address`. The `tag` is **NOT an arbitrary user-defined string** of your choice! You cannot send user messages and comments in the `tag`. The purpose of the `tag` field is to address your wallet properly, so it must be correct. You should only use the `tag` received from the exchange you're working with, otherwise your transaction might never arrive to its destination.
**The `network` field is relatively new, it may be `undefined / None / null` or missing entirely in certain cases (with some exchanges), but will be added everywhere eventually. It is still in the process of unification.**
## Transfers [#transfers]
The `transfer` method makes internal transfers of funds between accounts on the same exchange. This can include subaccounts or accounts of different types (`spot`, `margin`, `future`, ...). If an exchange is separated on CCXT into a spot and futures class (e.g. `binanceusdm`, `kucoinfutures`, ...), then the method `transferIn` may be available to transfer funds into the futures account, and the method `transferOut` may be available to transfer funds out of the futures account
```javascript
transfer (code, amount, fromAccount, toAccount, params = {})
```
Parameters
* **code** (String) Unified CCXT currency code (e.g. `"USDT"`)
* **amount** (Float) The amount of currency to transfer (e.g. `10.5`)
* **fromAccount** (String) The account to transfer funds from.
* **toAccount** (String) The account to transfer funds to.
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
* **params.symbol** (String) Market symbol when transfering to or from a margin account (e.g. `'BTC/USDT'`)
### Account Types [#account-types]
`fromAccount` and `toAccount` can accept the exchange account id or one of the following unified values:
* `funding` *for some exchanges `funding` and `spot` are the same account*
* `main` *for some exchanges that allow for subaccounts*
* `spot`
* `margin`
* `future`
* `swap`
* `lending`
You can retrieve all the account types by selecting the keys from \`exchange.options\['accountsByType']
Some exchanges allow transfers to email addresses, phone numbers or to other users by user id.
Returns
* A [transfer structure](#transfer-structure)
```javascript
transferIn (code, amount, params = {})
transferOut (code, amount, params = {})
```
Parameters
* **code** (String) Unified CCXT currency code (e.g. `"USDT"`)
* **amount** (Float) The amount of currency to transfer (e.g. `10.5`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* A [transfer structure](#transfer-structure)
```javascript
fetchTransfers (code = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **code** (String) Unified CCXT currency code (e.g. `"USDT"`)
* **since** (Integer) Timestamp (ms) of the earliest time to retrieve transfers for (e.g. `1646940314000`)
* **limit** (Integer) The number of [transfer structures](#transfer-structure) to retrieve (e.g. `5`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [transfer structures](#transfer-structure)
```javascript
fetchTransfer (id, since = undefined, limit = undefined, params = {})
```
Parameters
* **id** (String) tranfer id (e.g. `"12345"`)
* **since** (Integer) Timestamp (ms) of the earliest time to retrieve transfers for (e.g. `1646940314000`)
* **limit** (Integer) The number of [transfer structures](#transfer-structure) to retrieve (e.g. `5`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* A [transfer structure](#transfer-structure)
### Transfer Structure [#transfer-structure]
```javascript
{
info: { ... },
id: "93920432048",
timestamp: 1646764072000,
datetime: "2022-03-08T18:27:52.000Z",
currency: "USDT",
amount: 11.31,
fromAccount: "spot",
toAccount: "future",
status: "ok"
}
```
## Fees [#fees]
**This section of the Unified CCXT API is under development.**
Fees are often grouped into two categories:
* Trading fees. Trading fee is the amount payable to the exchange, usually a percentage of volume traded (filled).
* Transaction fees. The amount payable to the exchange upon depositing and withdrawing as well as the underlying crypto transaction fees (tx fees).
Because the fee structure can depend on the actual volume of currencies traded by the user, the fees can be account-specific. Methods to work with account-specific fees:
```javascript
fetchTradingFee (symbol, params = {})
fetchTradingFees (params = {})
fetchDepositWithdrawFees (codes = undefined, params = {})
fetchDepositWithdrawFee (code, params = {})
```
The fee methods will return a unified fee structure, which is often present with orders and trades as well. The fee structure is a common format for representing the fee info throughout the library. Fee structures are usually indexed by market or currency.
Because this is still a work in progress, some or all of methods and info described in this section may be missing with this or that exchange.
**DO NOT use the `.fees` property of the exchange instance as most often it contains the predefined/hardcoded info. Actual fees should only be accessed from markets and currencies.**
**NOTE: Previously we used fetchTransactionFee(s) to fetch the transaction fees, which are now DEPRECATED and these functions have been replace by fetchDepositWithdrawFee(s)**
You call `fetchTradingFee` / `fetchTradingFees` to fetch the trading fees, `fetchDepositWithdrawFee` / `fetchDepositWithdrawFees` to fetch the deposit & withdraw fees.
### Fee Structure [#fee-structure]
Orders, private trades, transactions and ledger entries may define the following info in their `fee` field:
```javascript
{
'currency': 'BTC', // the unified fee currency code
'rate': percentage, // the fee rate, 0.05% = 0.0005, 1% = 0.01, ...
'cost': feePaid, // the fee cost (amount * fee rate)
}
```
### Fee Schedule [#fee-schedule]
```javascript
fetchTradingFees (params = {})
```
```javascript
{
'withdraw': {
'BTC': 0.00001,
'ETH': 0.001,
'LTC': 0.0003,
},
'deposit': {
'BTC': 0,
},
'info': { ... },
}
```
```javascript
fetchDepositWithdrawFees (codes, params = {})
```
```javascript
{
'BTC': {
'withdraw': { 'fee': 0.0005, 'percentage': false },
'deposit': { 'fee': undefined, 'percentage': undefined },
'networks': {
'BTC': {
'deposit': { 'fee': undefined, 'percentage': undefined },
'withdraw': { 'fee': 0.0005, 'percentage': false }
}
},
'info': { ... },
},
...
}
```
### Trading Fees [#trading-fees]
Trading fees are properties of markets. Most often trading fees are loaded into the markets by the `fetchMarkets` call. Sometimes, however, the exchanges serve fees from different endpoints.
The `calculateFee` method can be used to precalculate trading fees that will be paid (use `calculateFeeWithRate` if you have a custom trading fee / tier, like VIP-X, instead of the default user fee) . **WARNING! This method is experimental, unstable and may produce incorrect results in certain cases.** You should only use it with caution. Actual fees may be different from the values returned from `calculateFee`, this is just for precalculation. Do not rely on precalculated values, because market conditions change frequently. It is difficult to know in advance whether your order will be a market taker or maker.
```javascript
calculateFee (symbol, type, side, amount, price, takerOrMaker = 'taker', params = {})
calculateFeeWithRate (symbol, type, side, amount, price, takerOrMaker = 'taker', customRate, params = {})
```
The `calculateFee` method will return a unified fee structure with precalculated fees for an order with specified params.
Accessing trading fee rates should be done via [`fetchTradingFees`](#fee-schedule) which is the recommended approach. If that method is not supported by exchange, then via the `.markets` property, like so:
```javascript
exchange.markets['ETH/BTC']['taker'] // taker fee rate for ETH/BTC
exchange.markets['BTC/USD']['maker'] // maker fee rate for BTC/USD
```
The markets stored under the `.markets` property may contain additional fee related information:
```javascript
{
'taker': 0.002, // taker fee rate, 0.002 = 0.2%
'maker': 0.0016, // maker fee rate, 0.0016 = 0.16%
'percentage': true, // whether the taker and maker fee rate is a multiplier or a fixed flat amount
'tierBased': false, // whether the fee depends on your trading tier (your trading volume)
'tiers': {
'taker': [
[0, 0.0026], // tupple (trade volume in USD, taker fee) ordered by increasing volume
[50000, 0.0024],
...
],
'maker': [
[0, 0.0016], // tupple (trade volume in USD, maker fee) ordered by increasing volume
[50000, 0.0014],
...
],
},
}
```
**WARNING! fee related information is experimental, unstable and may only be partial available or not at all.**
Maker fees are paid when you provide liquidity to the exchange i.e. you *market-make* an order and someone else fills it. Maker fees are usually lower than taker fees. Similarly, taker fees are paid when you *take* liquidity from the exchange and fill someone else's order.
Fees can be negative, this is very common amongst derivative exchanges. A negative fee means the exchange will pay a rebate (reward) to the user for the trading.
Also, some exchanges might not specify fees as percentage of volume, check the `percentage` field of the market to be sure.
#### Trading Fee Schedule [#trading-fee-schedule]
Some exchanges have an endpoint for fetching the trading fee schedule, this is mapped to the unified methods `fetchTradingFees`, and `fetchTradingFee`
```javascript
fetchTradingFee (symbol, params = {})
```
Parameters
* **symbol** (String) *required* Unified market symbol (e.g. `"BTC/USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"currency": "quote"}`)
Returns
* A [trading fee structure](#trading-fee-structure)
```javascript
fetchTradingFees (params = {})
```
Parameters
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"currency": "quote"}`)
Returns
* An array of [trading fee structures](#trading-fee-structure)
#### Trading Fee Structure [#trading-fee-structure]
```javascript
{
'ETH/BTC': {
'maker': 0.001,
'taker': 0.002,
'info': { ... },
'symbol': 'ETH/BTC',
},
'LTC/BTC': {
'maker': 0.001,
'taker': 0.002,
'info': { ... },
'symbol': 'LTC/BTC',
},
}
```
### Transaction Fees [#transaction-fees]
Transaction fees are properties of currencies (account balance).
Accessing transaction fee rates should be done via the `.currencies` property. This aspect is not unified yet and is subject to change.
```javascript
exchange.currencies['ETH']['fee'] // tx/withdrawal fee rate for ETH
exchange.currencies['BTC']['fee'] // tx/withdrawal fee rate for BTC
```
#### Transaction Fee Schedule [#transaction-fee-schedule]
Some exchanges have an endpoint for fetching the transaction fee schedule, this is mapped to the unified methods
* `fetchTransactionFee ()` for a single transaction fee schedule
* `fetchTransactionFees ()` for all transaction fee schedules
```javascript
fetchTransactionFee (code, params = {})
```
Parameters
* **code** (String) *required* Unified CCXT currency code, required (e.g. `"USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"type": "deposit"}`)
* **params.network** (String) Specify unified CCXT network (e.g. `{"network": "TRC20"}`)
Returns
* A [transaction fee structure](#transaction-fee-structure)
```javascript
fetchTransactionFees (codes = undefined, params = {})
```
Parameters
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"type": "deposit"}`)
Returns
* An array of [transaction fee structures](#transaction-fee-structure)
#### Transaction Fee Structure [#transaction-fee-structure]
```javascript
{
'withdraw': {
'BTC': 0.00001,
'ETH': 0.001,
'LTC': 0.0003,
},
'deposit': {
'BTC': 0,
},
'info': { ... },
}
```
## Borrow Interest [#borrow-interest]
* margin only
To trade with leverage in spot or margin markets, currency must be borrowed as a loan. This borrowed currency must be payed back with interest. To obtain the amount of interest that has accrued you can use the `fetchBorrowInterest` method
```javascript
fetchBorrowInterest (code = undefined, symbol = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **code** (String) The unified currency code for the currency of the interest (e.g. `"USDT"`)
* **symbol** (String) The market symbol of an isolated margin market, if undefined, the interest for cross margin markets is returned (e.g. `"BTC/USDT:USDT"`)
* **since** (Integer) Timestamp (ms) of the earliest time to receive interest records for (e.g. `1646940314000`)
* **limit** (Integer) The number of [borrow interest structures](#borrow-interest-structure) to retrieve (e.g. `5`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [borrow interest structures](#borrow-interest-structure)
### Borrow Interest Structure [#borrow-interest-structure]
```javascript
{
info: { ... } // Unparsed exchange response
symbol: 'BTC/USDT', // The market that the interest was accrued in
currency: 'USDT', // The currency of the interest
interest: 0.00004842, // The amount of interest that was charged
interestRate: 0.0002, // The borrow interest rate
amountBorrowed: 5.81, // The amount of currency that was borrowed
marginMode: 'cross', // The margin mode of the borrowed amount
timestamp: 1648699200000, // The timestamp that the interest was charged
datetime: '2022-03-31T04:00:00.000Z', // The datetime that the interest was charged
}
```
## Borrow And Repay Margin [#borrow-and-repay-margin]
*margin only*
To borrow and repay currency as a margin loan use `borrowCrossMargin`, `borrowIsolatedMargin`, `repayCrossMargin` and `repayIsolatedMargin`.
```javascript
borrowCrossMargin (code, amount, params = {})
repayCrossMargin (code, amount, params = {})
```
Parameters
* **code** (String) *required* The unified currency code for the currency to be borrowed or repaid (e.g. `"USDT"`)
* **amount** (Float) *required* The amount of margin to borrow or repay (e.g. `20.92`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"rate": 0.002}`)
Returns
* A [margin loan structure](#margin-loan-structure)
```javascript
borrowIsolatedMargin (symbol, code, amount, params = {})
repayIsolatedMargin (symbol, code, amount, params = {})
```
Parameters
* **symbol** (String) *required* The unified CCXT market symbol of an isolated margin market (e.g. `"BTC/USDT"`)
* **code** (String) *required* The unified currency code for the currency to be borrowed or repaid (e.g. `"USDT"`)
* **amount** (Float) *required* The amount of margin to borrow or repay (e.g. `20.92`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"rate": 0.002}`)
Returns
* A [margin loan structure](#margin-loan-structure)
### Margin Loan Structure [#margin-loan-structure]
```javascript
{
id: '1234323', // integer, the transaction id
currency: 'USDT', // string, the currency that is borrowed or repaid
amount: 5.81, // float, the amount of currency that was borrowed or repaid
symbol: 'BTC/USDT:USDT', // string, unified market symbol
timestamp: 1648699200000, // integer, the timestamp of when the transaction was made
datetime: '2022-03-31T04:00:00.000Z', // string, the datetime of when the transaction was made
info: { ... } // Unparsed exchange response
}
```
## Margin [#margin]
*margin and contract only*
Note: through the manual we use term "collateral" which means current margin balance, but do not confuse it with "initial margin" or "maintenance margin":
* `collateral (current margin balance) = initial margin + realized & unrealized profit`.
For example, when you had opened an isolated position with **50$** initial margin and the position has unrealized profit of **-15$**, then your position's **collateral** will be **35$**. However, if we take that Maintenance Margin requirement (to keep the position open) by exchange hints **$25** for that position, then your collateral should not drop below it, otherwise the position will be liquidated.
To increase, reduce or set your margin balance (collateral) in an open leveraged position, use `addMargin`, `reduceMargin` and `setMargin` respectively. This is kind of like adjusting the amount of leverage you're using with a position that's already open.
Some scenarios to use these methods include
* if the trade is going against you, you can add margin to, reducing the risk of liquidation
* if your trade is going well you can reduce your position's margin balance and take profits
```javascript
addMargin (symbol, amount, params = {})
reduceMargin (symbol, amount, params = {})
setMargin (symbol, amount, params = {})
```
Parameters
* **symbol** (String) *required* Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`)
* **amount** (String) *required* Amount of margin to add or reduce (e.g. `20`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"leverage": 5}`)
Returns
* a [margin structure](#margin-structure)
You can fetch the history of margin adjustments made using the methods above or automatically by the exchange using the following method
```javascript
fetchMarginAdjustmentHistory (symbol = undefined, type = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **symbol** (String) Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`)
* **type** (String) "add" or "reduce"
* **since** (Integer) Timestamp (ms) of the earliest time to retrieve margin adjustments for for (e.g. `1646940314000`)
* **limit** (Integer) The number of [margin structures](#margin-structure) to retrieve (e.g. `5`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"auto": true}`)
Returns
* a [margin structure](#margin-structure)
### Margin Structure [#margin-structure]
```javascript
{
info: { ... },
type: 'add', // 'add', 'reduce', 'set'
amount: 1, // amount added, reduced, or set
total: 2, // total margin or undefined if not specified by the exchange
code: 'USDT',
symbol: 'XRP/USDT:USDT',
status: 'ok'
}
```
## Set Margin Mode [#set-margin-mode]
*contract only*
Updates the type of margin used to be either
* `cross` One account is used to share collateral between markets. Margin is taken from total account balance to avoid liquidation when needed.
* `isolated` Each market, keeps collateral in a separate account
```javascript
setMarginMode (marginMode, symbol = undefined, params = {})
```
Parameters
* **marginMode** (String) *required* the type of margin used
**Unified margin types:**
* `"cross"`
* `"isolated"`
* **symbol** (String) Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`) *required* on most exchanges. Is not required when the margin mode is not specific to a market
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"leverage": 5}`)
Returns
* response from the exchange
### Exchanges Without setMarginMode [#exchanges-without-setmarginmode]
Common reasons for why an exchange might have
```javascript
exchange.has['setMarginMode'] == false
```
include
* the exchange does not offer leveraged trading
* the exchange only offers one of `cross` or `isolated` margin modes, but does not offer both
* margin mode must be set using an exchange specific parameter within `params` when using `createOrder`
### Notes On Suppressed Errors For setMarginMode [#notes-on-suppressed-errors-for-setmarginmode]
Some exchange apis return an error response when a request is sent to set the margin mode to the mode that it is already set to (e.g. Sending a request to set the margin mode to `cross` for the market `BTC/USDT:USDT` when the account already has `BTC/USDT:USDT` set to use cross margin). CCXT doesn't see this as an error because the end result is what the user wanted, so the error is suppressed and the error result is returned as an object.
e.g.
```javascript
{ code: -4046, msg: 'No need to change margin type.' }
```
### Notes On The marginMode Parameter [#notes-on-the-marginmode-parameter]
Some methods allow the usage of a `marginMode` parameter that can be set to either `cross` or `isolated`. This can be useful for specifying the `marginMode` directly within the methods params, for use with spot margin or contract markets. To specify a spot margin market, you need to use a unified spot symbol or set the market type to spot, while setting the marginMode parameter to `cross` or `isolated`.
Create a Spot Margin Order:
*Use a unified spot symbol, while setting the marginMode parameter.*
JavaScript
Python
PHP
Go
C#
Java
```javascript
const params = {
'marginMode': 'isolated', // or 'cross'
}
const order = await exchange.createOrder ('ETH/USDT', 'market', 'buy', 0.1, 1500, params)
```
```python
params = {
'marginMode': 'isolated', # or 'cross'
}
order = exchange.create_order ('ETH/USDT', 'market', 'buy', 0.1, 1500, params)
```
```php
$params = {
'marginMode': 'isolated', // or 'cross'
}
$order = $exchange->create_order ('ETH/USDT', 'market', 'buy', 0.1, 1500, $params);
```
```go
params := map[string]interface{}{
"marginMode": "isolated", // or "cross"
}
order, err := exchange.CreateOrder("ETH/USDT", "market", "buy", 0.1, ccxt.WithCreateOrderPrice(1500), ccxt.WithCreateOrderParams(params))
```
```csharp
var parameters = new Dictionary() {
{ "marginMode", "isolated" }, // or "cross"
};
var order = await exchange.CreateOrder("ETH/USDT", "market", "buy", 0.1, 1500, parameters);
```
```java
Map params = Map.of("marginMode", "isolated");
Order order = exchange.createOrder("ETH/USDT", "market", "buy", 0.1, null, params);
```
## Fetch Margin Mode [#fetch-margin-mode]
*margin and contract only*
The `fetchMarginMode()` method can be used to obtain the set margin mode for a market. The `fetchMarginModes()` method can be used to obtain the set margin mode for multiple markets at once.
You can access the set margin mode by using:
* `fetchMarginMode()` (single symbol)
* `fetchMarginModes([symbol1, symbol2, ...])` (multiple symbols)
* `fetchMarginModes()` (all market symbols)
```javascript
fetchMarginMode(symbol, params = {})
```
Parameters
* **symbol** (String) *required* A unified CCXT symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"subType": "linear"}`)
Returns
* a [margin-mode-structure](#margin-mode-structure)
```javascript
fetchMarginModes(symbols = undefined, params = {})
```
Parameters
* **symbols** (\[String]) A list of unified CCXT symbols (e.g. `[ "BTC/USDT:USDT" ]`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"subType": "linear"}`)
Returns
* an array of [margin-mode-structures](#margin-mode-structure)
### Margin Mode Structure [#margin-mode-structure]
```javascript
{
"info": { ... } // response from the exchange
"symbol": "BTC/USDT:USDT", // unified market symbol
"marginMode": "cross", // the margin mode either cross or isolated
}
```
## Set Leverage [#set-leverage]
*margin and contract only*
```javascript
setLeverage (leverage, symbol = undefined, params = {})
```
Parameters
* **leverage** (Integer) *required* The desired leverage
* **symbol** (String) Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`) *required* on most exchanges. Is not required when leverage is not specific to a market (e.g. If leverage is set for the account and not per market)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"marginMode": "cross"}`)
Returns
* response from the exchange
## Leverage [#leverage]
*margin and contract only*
The `fetchLeverage()` method can be used to obtain the set leverage for a market. The `fetchLeverages()` method can be used to obtain the set leverage for multiple markets at once.
You can access the set leverage by using:
* `fetchLeverage()` (single symbol)
* `fetchLeverages([symbol1, symbol2, ...])` (multiple symbols)
* `fetchLeverages()` (all market symbols)
```javascript
fetchLeverage(symbol, params = {})
```
Parameters
* **symbol** (String) *required* A unified CCXT symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"marginMode": "cross"}`)
Returns
* a [leverage-structure](#leverage-structure)
```javascript
fetchLeverages(symbols = undefined, params = {})
```
Parameters
* **symbols** (\[String]) A list of unified CCXT symbols (e.g. `[ "BTC/USDT:USDT" ]`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"marginMode": "cross"}`)
Returns
* an array of [leverage-structures](#leverage-structure)
### Leverage Structure [#leverage-structure]
```javascript
{
"info": { ... } // response from the exchange
"symbol": "BTC/USDT:USDT", // unified market symbol
"marginMode": "cross", // the margin mode either cross or isolated
"longLeverage": 100, // the set leverage for a long position
"shortLeverage": 75, // the set leverage for a short position
}
```
## Contract Trading [#contract-trading]
This can include futures with a set expiry date, perpetual swaps with funding payments, and inverse futures or swaps.
Information about the positions can be served from different endpoints depending on the exchange.
In the case that there are multiple endpoints serving different types of derivatives CCXT will default to just loading the "linear" (as oppose to the "inverse") contracts or the "swap" (as opposed to the "future") contracts.
### Positions [#positions]
*contract only*
To get information about positions currently held in contract markets, use
* fetchPosition () // for a single market
* fetchPositions () // for all positions
* fetchAccountPositions () // TODO
* fetchPositionHistory () // for single historical position
* fetchPositionsHistory () // for historical positions
```javascript
fetchPosition (symbol, params = {}) // for a single market
```
Parameters
* **symbol** (String) *required* Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* A [position structure](#position-structure)
```javascript
fetchPositions (symbols = undefined, params = {})
fetchAccountPositions (symbols = undefined, params = {})
```
Parameters
* **symbols** (\[String]) Unified CCXT market symbols, do not set to retrieve all positions (e.g. `["BTC/USDT:USDT"]`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [position structures](#position-structure)
```javascript
fetchPositionHistory (symbol = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **symbol** (\[String]) Unified CCXT market symbols, do not set to retrieve all positions (e.g. `["BTC/USDT:USDT"]`)
* **since** (Integer) Timestamp (ms) of the earliest time to retrieve positions for (e.g. `1646940314000`)
* **limit** (Integer) The number of [position structures](#position-structure) to retrieve (e.g. `5`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [position structures](#position-structure)
#### Position Structure [#position-structure]
```javascript
{
'info': { ... }, // json response returned from the exchange as is
'id': '1234323', // string, position id to reference the position, similar to an order id
'symbol': 'BTC/USD', // uppercase string literal of a pair of currencies
'timestamp': 1607723554607, // integer unix time since 1st Jan 1970 in milliseconds
'datetime': '2020-12-11T21:52:34.607Z', // ISO8601 representation of the unix time above
'isolated': true, // boolean, whether or not the position is isolated, as opposed to cross where margin is added automatically
'hedged': false, // boolean, whether or not the position is hedged, i.e. if trading in the opposite direction will close this position or make a new one
'side': 'long', // string, long or short
'contracts': 5, // float, number of contracts bought, aka the amount or size of the position
'contractSize': 100, // float, the size of one contract in quote units
'entryPrice': 20000, // float, the average entry price of the position
'markPrice': 20050, // float, a price that is used for funding calculations
'notional': 100000, // float, the value of the position in the settlement currency
'leverage': 100, // float, the leverage of the position, related to how many contracts you can buy with a given amount of collateral
'collateral': 5300, // float, the maximum amount of collateral that can be lost, affected by pnl
'initialMargin': 5000, // float, the amount of collateral that is locked up in this position
'maintenanceMargin': 1000, // float, the mininum amount of collateral needed to avoid being liquidated
'initialMarginPercentage': 0.05, // float, the initialMargin as a percentage of the notional
'maintenanceMarginPercentage': 0.01, // float, the maintenanceMargin as a percentage of the notional
'unrealizedPnl': 300, // float, the difference between the market price and the entry price times the number of contracts, can be negative
'liquidationPrice': 19850, // float, the price at which collateral becomes less than maintenanceMargin
'marginMode': 'cross', // string, can be cross or isolated
'percentage': 3.32, // float, represents unrealizedPnl / initialMargin * 100
}
```
Positions allow you to borrow money from an exchange to go long or short on an market. Some exchanges require you to pay a funding fee to keep the position open.
When you go long on a position you are betting that the price will be higher in the future and that the price will never be less than the `liquidationPrice`.
As the price of the underlying index changes so does the unrealisedPnl and as a consequence the amount of collateral you have left in the position (since you can only close it at market price or worse). At some price you will have zero collateral left, this is called the "bust" or "zero" price. Beyond this point, if the price goes in the opposite direction far enough, the collateral of the position will drop below the `maintenanceMargin`. The maintenanceMargin acts as a safety buffer between your position and negative collateral, a scenario where the exchange incurs losses on your behalf. To protect itself the exchange will swiftly liquidate your position if and when this happens. Even if the price returns back above the liquidationPrice you will not get your money back since the exchange sold all the `contracts` you bought at market. In other words the maintenanceMargin is a hidden fee to borrow money.
It is recommended to use the `maintenanceMargin` and `initialMargin` instead of the `maintenanceMarginPercentage` and `initialMarginPercentage` since these tend to be more accurate. The maintenanceMargin might be calculated from other factors outside of the maintenanceMarginPercentage including the funding rate and taker fees, for example on [kucoin](https://futures.kucoin.com/contract/detail).
An inverse contract will allow you to go long or short on BTC/USD by putting up BTC as collateral. Our API for inverse contracts is the same as for linear contracts. The amounts in an inverse contracts are quoted as if they were traded USD/BTC, however the price is still quoted terms of BTC/USD. The formula for the profit and loss of a inverse contract is `(1/markPrice - 1/price) * contracts`. The profit and loss and collateral will now be quoted in BTC, and the number of contracts are quoted in USD.
#### Closing Positions [#closing-positions]
*contract only*
To quickly close open positions with a market order, use
* closePosition (symbol) // for a single market
* closeAllPositions (symbol) // for all positions
```typescript
closePosition (symbol: string, side: OrderSide = undefined, params = {}): Promise
```
Parameters
* **symbol** (String) *required* Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`)
* **side** *optional* a string literal for the direction of your order. Some exchanges require it.
**Unified sides:**
* `buy` give quote currency and receive base currency; for example, buying `BTC/USD` means that you will receive bitcoins for your dollars.
* `sell` give base currency and receive quote currency; for example, buying `BTC/USD` means that you will receive dollars for your bitcoins.
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An [order structure](#order-structure)
```typescript
closeAllPositions (params = {}): Promise
```
Parameters
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* A list of [order structures](#order-structure)
### Position Mode [#position-mode]
*margin and contract only*
Method used for setting position mode:
```javascript
setPositionMode (hedged, symbol = undefined, params = {})
```
Parameters
* **hedged** (String) *required* hedged-mode value:
* `true` - sets to **hedged** mode
* `false` - sets to **one-way** mode
* **symbol** (String) Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint
Method used for fetching position mode:
```javascript
fetchPositionMode (symbol = undefined, params = {}) {
```
Parameters
* **symbol** (String) Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint
Returns
```javascript
{
'info': { ... },
'hedged': true,
}
```
#### Liquidation Price [#liquidation-price]
It is the price at which the `initialMargin + unrealized = collateral = maintenanceMargin`. The price has gone in the opposite direction of your position to the point where the is only maintenanceMargin collateral left and if it goes any further the position will have negative collateral.
```javascript
// if long
(liquidationPrice - price) * contracts = maintenanceMargin
// if short
(price - liquidationPrice) * contracts = maintenanceMargin
// if inverse long
(1/liquidationPrice - 1/price) * contracts = maintenanceMargin
// if inverse short
(1/price - 1/liquidationPrice) * contracts = maintenanceMargin
```
### Funding History [#funding-history]
*contract only*
Perpetual swap (also known as perpetual future) contracts maintain a market price that mirrors the price of the asset they are based on because funding fees are exchanged between traders who hold positions in perpetual swap markets.
If the contract is being traded at a price that is higher than the price of the asset they represent, then traders in long positions pay a funding fee to traders in short positions at specific times of day, which encourages more traders to enter short positions prior to these times.
If the contract is being traded at a price that is lower than the price of the asset they represent, then traders in short positions pay a funding fee to traders in long positions at specific times of day, which encourages more traders to enter long positions prior to these times.
These fees are usually exchanged between traders with no commission going to the exchange
The `fetchFundingHistory` method can be used to retrieve an accounts history of funding fees paid or received
```javascript
fetchFundingHistory (symbol = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **symbol** (String) Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`)
* **since** (Integer) Timestamp (ms) of the earliest time to retrieve funding history for (e.g. `1646940314000`)
* **limit** (Integer) The number of [funding history structures](#funding-history-structure) to retrieve (e.g. `5`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"endTime": 1645807945000}`)
Returns
* An array of [funding history structures](#funding-history-structure)
#### Funding History Structure [#funding-history-structure]
```javascript
{
info: { ... },
symbol: "XRP/USDT:USDT",
code: "USDT",
timestamp: 1646954920000,
datetime: "2022-03-08T16:00:00.000Z",
id: "1520286109858180",
amount: -0.027722
}
```
### Conversion [#conversion]
The `fetchConvertQuote` method can be used to retrieve a quote that can be used for a conversion trade.
The quote usually needs to be used within a certain timeframe specified by the exchange for the convert trade to execute successfully.
```javascript
fetchConvertQuote (fromCode, toCode, amount = undefined, params = {})
```
Parameters
* **fromCode** (String) *required* The unified currency code for the currency to convert from (e.g. `"USDT"`)
* **toCode** (String) *required* The unified currency code for the currency to be converted into (e.g. `"USDC"`)
* **amount** (Float) Amount to convert in units of the from currency (e.g. `20.0`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"toAmount": 2.9722}`)
Returns
* A [conversion structure](#conversion-structure)
The `createConvertTrade` method can be used to create a conversion trade order using the id retrieved from fetchConvertQuote.
The quote usually needs to be used within a certain timeframe specified by the exchange for the convert trade to execute successfully.
```javascript
createConvertTrade (id, fromCode, toCode, amount = undefined, params = {})
```
Parameters
* **id** (String) *required* Conversion quote id (e.g. `1645807945000`)
* **fromCode** (String) *required* The unified currency code for the currency to convert from (e.g. `"USDT"`)
* **toCode** (String) *required* The unified currency code for the currency to be converted into (e.g. `"USDC"`)
* **amount** (Float) Amount to convert in units of the from currency (e.g. `20.0`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"toAmount": 2.9722}`)
Returns
* A [conversion structure](#conversion-structure)
The `fetchConvertTrade` method can be used to fetch a specific conversion trade using the trades id.
```javascript
fetchConvertTrade (id, code = undefined, params = {})
```
Parameters
* **id** (String) *required* Conversion trade id (e.g. `"80794187SDHJ25"`)
* **code** (String) The unified currency code of the conversion trade (e.g. `"USDT"`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"toAmount": 2.9722}`)
Returns
* A [conversion structure](#conversion-structure)
The `fetchConvertTradeHistory` method can be used to fetch the conversion history for a specified currency code.
```javascript
fetchConvertTradeHistory (code = undefined, since = undefined, limit = undefined, params = {})
```
Parameters
* **code** (String) The unified currency code to fetch conversion trade history for (e.g. `"USDT"`)
* **since** (Integer) Timestamp of the earliest conversion (e.g. `1645807945000`)
* **limit** (Integer) The maximum number of conversion structures to retrieve (e.g. `10`)
* **params** (Dictionary) Parameters specific to the exchange API endpoint (e.g. `{"toAmount": 2.9722}`)
Returns
* An array of [conversion structures](#conversion-structure)
#### Conversion Structure [#conversion-structure]
```javascript
{
info: { ... },
timestamp: 1646954920000,
datetime: "2022-03-08T16:00:00.000Z",
id: "1520286109858180",
fromCurrency: "USDT",
fromAmount: 3.0,
toCurrency: "USDC",
toAmount: 2.9722,
price: 0.97,
fee: 0.0
}
```
## Auto De Leverage [#auto-de-leverage-1]
*contract only*
Use the `fetchPositionADLRank` or `fetchPositionsADLRank` methods to get the private details of a positions auto de leverage rank from the exchange.
```javascript
fetchPositionADLRank (symbol, params = {})
```
Parameters
* **symbol** (String) Unified CCXT market symbol (e.g. `"BTC/USDT:USDT"`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"category": "futures"}`)
Returns
* An [auto de leverage structure](#auto-de-leverage)
```javascript
fetchPositionsADLRank (symbols, params = {})
```
Parameters
* **symbols** (\[String]) A list of unified CCXT symbols (e.g. `[ "BTC/USDT:USDT" ]`)
* **params** (Dictionary) Extra parameters specific to the exchange API endpoint (e.g. `{"category": "futures"}`)
Returns
* A list of [auto de leverage structures](#auto-de-leverage)
### Auto De Leverage Stucture [#auto-de-leverage-stucture-1]
```javascript
{
'info': { ... }, // the original decoded JSON as is
'symbol': 'BTC/USDT:USDT', // unified CCXT market symbol
'rank': 5, // a quantile rank from 1 to 5 with 5 being the highest risk
'rating': 'high', // a string risk rating as either low, medium or high
'percent': 72.86, // the risk percentage with a higher percentage being a higher risk of auto de leverage
'timestamp': 1699593511632, // unix timestamp in milliseconds
'datetime': '2023-11-10T05:18:31.632Z', // ISO8601 datetime with milliseconds
}
```
## Proxy [#proxy]
In some specific cases you may want a proxy, when:
* Exchange is not available in your location
* Your IP is forbidden by exchange
* You experience random restriction by exchange, like [DDoS protection by Cloudflare](#ddos-protection-by-cloudflare-incapsula)
However, beware that each added intermediary might add some latency to requests.
**Note for Go users:** After setting any proxy property, you must call `UpdateProxySettings()` to apply the changes:
```go
exchange := ccxt.NewBinance(nil)
exchange.ProxyUrl = "http://your-proxy-url:8080"
exchange.UpdateProxySettings() // Required in Go to apply proxy settings
```
However be aware that each added intermediary might add some latency to requests.
### Supported proxy types [#supported-proxy-types]
CCXT supports the following proxy types (note, each of them also have [callback support](#using-proxy-callbacks)):
#### proxyUrl [#proxyurl]
This property prepends an url to API requests. It might be useful for simple redirection or [bypassing CORS browser restriction](#cors-access-control-allow-origin).
```
ex = ccxt.binance();
ex.proxyUrl = 'YOUR_PROXY_URL';
```
while 'YOUR\_PROXY\_URL' could be like (use the slash accordingly):
* `https://cors-anywhere.herokuapp.com/`
* `http://127.0.0.1:8080/`
* `http://your-website.com/sample-script.php?url=`
* etc
So requests will be made to i.e. `https://cors-anywhere.herokuapp.com/https://exchange.xyz/api/endpoint`. ( You can also have a small proxy script running on your device/webserver to use it in `.proxyUrl` - "sample-local-proxy-server" in [examples folder](https://github.com/ccxt/ccxt/tree/master/examples)). To customize the target url, you can also override `urlEncoderForProxyUrl` method of instance.
This approach works **only for REST** requests, but not for websocket connections. ((*How to test if your proxy works*))\[#test-if-your-proxy-works]
#### httpProxy and httpsProxy [#httpproxy-and-httpsproxy]
To set a real http(s) proxy for your scripts, you need to have an access to a remote [http or https proxy](https://stackoverflow.com/q/10440690/2377343), so calls will be made directly to the target exchange, tunneled through your proxy server:
```
ex.httpProxy = 'http://1.2.3.4:8080/';
// or
ex.httpsProxy = 'http://1.2.3.4:8080/';
```
This approach only affects **non-websocket** requests of ccxt. To route CCXT's WebSockets connections through proxy, you need to specifically set `wsProxy` (or `wssProxy`) property, in addition to the `httpProxy` (or `httpsProxy`), so your script should be like:
```
ex.httpProxy = 'http://1.2.3.4:8080/';
ex.wsProxy = 'http://1.2.3.4:8080/';
```
So, both connections (HTTP & WS) would go through proxies.
((*How to test if your proxy works*))\[#test-if-your-proxy-works]
#### socksProxy [#socksproxy]
You can also use [socks proxy](https://www.google.com/search?q=what+is+socks+proxy) with the following format:
```
// from protocols: socks, socks5, socks5h
ex.socksProxy = 'socks5://1.2.3.4:8080/';
ex.wsSocksProxy = 'socks://1.2.3.4:8080/';
```
((*How to test if your proxy works*))\[#test-if-your-proxy-works]
#### Test if your proxy works [#test-if-your-proxy-works]
After setting any of the above listed proxy properties in your ccxt snippet, you can test whether it works by pinging some IP echoing websites - check a "proxy-usage" file in [examples](https://github.com/ccxt/ccxt/blob/master/examples/).
#### using proxy callbacks [#using-proxy-callbacks]
\*\*Instead of setting a property, you can also use callbacks `proxyUrlCallback, http(s)ProxyCallback, socksProxyCallback`:
```
myEx.proxyUrlCallback = function (url, method, headers, body) { ... return 'http://1.2.3.4/'; }
```
### extra proxy related details [#extra-proxy-related-details]
#### userAgent [#useragent]
If you need for special cases, you can override `userAgent` property like:
```
exchange.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'
```
#### custom proxy agents [#custom-proxy-agents]
Depending your programming language, you can set custom proxy agents.
* For JS, see [this example](https://github.com/ccxt/ccxt/blob/master/examples/js/custom-proxy-agent-for-js.js)
* For Python, see the following examples: [proxies-for-synchronous-python](https://github.com/ccxt/ccxt/blob/master/examples/py/proxies-for-synchronous-python.py), [proxy-asyncio-aiohttp-python-3](https://github.com/ccxt/ccxt/blob/master/examples/py/proxy-asyncio-aiohttp-python-3.py), [proxy-asyncio-aiohttp-socks](https://github.com/ccxt/ccxt/blob/master/examples/py/proxy-asyncio-aiohttp-socks.py), [proxy-sync-python-requests-2-and-3](https://github.com/ccxt/ccxt/blob/master/examples/py/proxy-sync-python-requests-2-and-3.py)
#### CORS (Access-Control-Allow-Origin) [#cors-access-control-allow-origin]
CORS (known as [Cross-Origin Resource Sharing](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing)) affects mostly browsers and is the cause of the well-know warning `No 'Access-Control-Allow-Origin' header is present on the requested resource`. It happens when a script (running in a browser) makes a request to a 3rd party domain (by default such requests are blocked, unless the target domain explicitly allows it).
So, in such cases you will need to communicate with a "CORS" proxy, which would redirect requests (as opposed to direct browser-side request) to the target exchange. To set a CORS proxy, you can run [sample-local-proxy-server-with-cors](https://github.com/ccxt/ccxt/blob/master/examples/) example file and in ccxt set the [`.proxyUrl`](#proxyurl) property to route requests through cors/proxy server.
## String Math [#string-math]
Some users might want to control how CCXT handles arithmetic operations. Even though it uses numeric types by default, users can switch to fixed-point math using string types. This can be done by:
JavaScript
Python
PHP
C#
Go
```javascript
const ex = new ccxt.coinbase ();
ex.number = String ; // String | Number
```
```python
ex = ccxt.coinbase()
ex.number = str # str | float
```
```php
$ex = new ccxt\\coinbase();
$ex->number = 'strval'; // 'strval' | 'floatval'
```
```csharp
var ex = new ccxt.coinbase();
ex.number = typeof(String); // typeof(String) | typeof(float)
```
```go
ex := ccxt.NewCoinbase(nil)
ex.Number = "String" // "String" | "Number"
```
# Resource clean-up [#resource-clean-up]
When your script finishes its work with any exchange, you are advised to clean-up the resources:
```python
poloniex = ccxtpro.poloniex()
print(await poloniex.fetch_ticker('ETH/USDT'))
# ... your codes
await poloniex.close(True) # close the instance connection when you don't need it anymore, and an extra "True" argument also cleans-up the cached instance data
```
Especially it is needed for all programming languages if you use Websockets.
# Error Handling [#error-handling]
* [Retry Mechanism](#retry-mechanism)
* [Exception Hierarchy](#exception-hierarchy)
* [ExchangeError](#exchangeerror)
* [OperationFailed](#operationfailed)
* [DDoSProtection](#ddosprotection)
* [RateLimitExceeded](#ratelimitexceeded)
* [RequestTimeout](#requesttimeout)
* [RequestTimeout](#requesttimeout)
* [ExchangeNotAvailable](#exchangenotavailable)
* [InvalidNonce](#invalidnonce)
The error handling with CCXT is done with the exception mechanism that is natively available with all languages.
To handle the errors you should add a `try` block around the call to a unified method and catch the exceptions like you would normally do with your language:
JavaScript
Python
PHP
Go
C#
Java
```javascript
// try to call a unified method
try {
const response = await exchange.fetchTicker ('ETH/BTC')
console.log (response)
} catch (e) {
// if the exception is thrown, it is "caught" and can be handled here
// the handling reaction depends on the type of the exception
// and on the purpose or business logic of your application
if (e instanceof ccxt.NetworkError) {
console.log (exchange.id, 'fetchTicker failed due to a network error:', e.message)
// retry or whatever
} else if (e instanceof ccxt.ExchangeError) {
console.log (exchange.id, 'fetchTicker failed due to exchange error:', e.message)
// retry or whatever
} else {
console.log (exchange.id, 'fetchTicker failed with:', e.message)
// retry or whatever
}
}
```
```python
# try to call a unified method
try:
response = await exchange.fetch_order_book('ETH/BTC')
print(response)
except ccxt.NetworkError as e:
print(exchange.id, 'fetch_order_book failed due to a network error:', str(e))
# retry or whatever
except ccxt.ExchangeError as e:
print(exchange.id, 'fetch_order_book failed due to exchange error:', str(e))
# retry or whatever
except Exception as e:
print(exchange.id, 'fetch_order_book failed with:', str(e))
# retry or whatever
```
```php
// try to call a unified method
try {
$response = $exchange->fetch_trades('ETH/BTC');
print_r($response);
} catch (\ccxt\NetworkError $e) {
echo $exchange->id . ' fetch_trades failed due to a network error: ' . $e->getMessage () . "\n";
// retry or whatever
} catch (\ccxt\ExchangeError $e) {
echo $exchange->id . ' fetch_trades failed due to exchange error: ' . $e->getMessage () . "\n";
// retry or whatever
} catch (Exception $e) {
echo $exchange->id . ' fetch_trades failed with: ' . $e->getMessage () . "\n";
// retry or whatever
}
```
```go
// in Go networking methods return a (value, error) pair instead of throwing.
// ccxt errors are *ccxt.Error values whose Type field identifies the category
ticker, err := exchange.FetchTicker("ETH/BTC")
if err != nil {
if ccxtError, ok := err.(*ccxt.Error); ok {
switch ccxtError.Type {
case ccxt.NetworkErrorErrType:
fmt.Println(exchange.GetId(), "fetchTicker failed due to a network error:", ccxtError.Message)
// retry or whatever
case ccxt.ExchangeErrorErrType:
fmt.Println(exchange.GetId(), "fetchTicker failed due to exchange error:", ccxtError.Message)
// retry or whatever
default:
fmt.Println(exchange.GetId(), "fetchTicker failed with:", ccxtError.Message)
// retry or whatever
}
}
} else {
fmt.Println(ticker)
}
```
```csharp
// try to call a unified method
try
{
var response = await exchange.FetchTicker("ETH/BTC");
Console.WriteLine(response);
}
catch (NetworkError e)
{
Console.WriteLine(exchange.id + " fetchTicker failed due to a network error: " + e.Message);
// retry or whatever
}
catch (ExchangeError e)
{
Console.WriteLine(exchange.id + " fetchTicker failed due to exchange error: " + e.Message);
// retry or whatever
}
catch (Exception e)
{
Console.WriteLine(exchange.id + " fetchTicker failed with: " + e.Message);
// retry or whatever
}
```
```java
import io.github.ccxt.errors.*;
import io.github.ccxt.exchanges.Binance;
import io.github.ccxt.types.Ticker;
// CCXT's typed sync wrappers unwrap CompletionException for you, so users
// write idiomatic Java try/catch with multiple typed catch blocks in
// most-specific → least-specific order — same shape as catching
// ArrayIndexOutOfBoundsException, IOException, etc.
Binance exchange = new Binance();
try {
Ticker ticker = exchange.fetchTicker("ETH/BTC");
System.out.println(ticker.last());
} catch (RateLimitExceeded e) { // back off, retry later
System.out.println("Rate limited: " + e.getMessage());
} catch (NetworkError e) { // transient: DDoSProtection, RequestTimeout, ExchangeNotAvailable
System.out.println("Network error: " + e.getMessage());
} catch (AuthenticationError e) { // refresh creds
System.out.println("Auth failed: " + e.getMessage());
} catch (ExchangeError e) { // exchange-side issue (don't retry blindly)
System.out.println("Exchange error: " + e.getMessage());
} catch (BaseError e) { // ccxt catch-all
System.out.println("CCXT error: " + e.getMessage());
}
```
For async pipelines (`fetchTickerAsync`, etc.), `CompletableFuture` wraps
thrown errors in `CompletionException`. Use `Helpers.unwrap()` inside
`.exceptionally(...)` to peel the wrapper and pattern-match the underlying
ccxt error:
```java
import io.github.ccxt.Helpers;
exchange.fetchTickerAsync("ETH/BTC")
.thenAccept(t -> System.out.println(t.last()))
.exceptionally(throwable -> {
Throwable cause = Helpers.unwrap(throwable);
return switch (cause) {
case RateLimitExceeded e -> { System.out.println("rate-limited"); yield null; }
case NetworkError e -> { System.out.println("network"); yield null; }
case AuthenticationError e -> { System.out.println("auth"); yield null; }
case ExchangeError e -> { System.out.println("exchange"); yield null; }
default -> throw new java.util.concurrent.CompletionException(cause);
};
});
```
## Retry Mechanism [#retry-mechanism]
When dealing with HTTP requests, it's important to understand that requests might fail for various reasons. Common causes of these failures include the server being unavailable, network instability, or temporary server issues. To handle such scenarios gracefully, CCXT provide an option to automatically retry failed requests. You can set the value of `maxRetriesOnFailure` and `maxRetriesOnFailureDelay` to configure the number of retries and the delay between retries, example:
```python
exchange.options['maxRetriesOnFailure'] = 3 # if we get an error like the ones mentioned above we will retry up to three times per request
exchange.options['maxRetriesOnFailureDelay'] = 1000 # we will wait 1000ms (1s) between retries
```
It's important to highlight that only server/network-related issues will be part of the retry mechanism; if the user gets an error due to `InsufficientFunds` or `InvalidOrder,` the request will not be repeated.
## Exception Hierarchy [#exception-hierarchy]
All exceptions are derived from the base BaseError exception, which, in its turn, is defined in the ccxt library like so:
JavaScript
Python
PHP
Go
C#
```javascript
class BaseError extends Error {
constructor () {
super ()
// a workaround to make `instanceof BaseError` work in ES5
this.constructor = BaseError
this.__proto__ = BaseError.prototype
}
}
```
```python
class BaseError (Exception):
pass
```
```php
class BaseError extends \Exception {}
```
```go
// in Go all ccxt errors are represented by a single *ccxt.Error value
// whose Type field carries the error category (e.g. "ExchangeError")
type Error struct {
Type ErrorType
Message string
Stack string
}
```
```csharp
public class BaseError : Exception { }
```
The exception inheritance hierarchy lives in this file: [https://github.com/ccxt/ccxt/blob/master/ts/src/base/errorHierarchy.ts](https://github.com/ccxt/ccxt/blob/master/ts/src/base/errorHierarchy.ts) , and visually can be outlined like shown below:
```text
+ BaseError
|
+---+ ExchangeError
| |
| +---+ OperationRejected
| |
| +---+ BadRequest
| | |
| | +---+ BadSymbol
| |
| +---+ AuthenticationError
| | |
| | +---+ PermissionDenied
| | |
| | +---+ AccountSuspended
| |
| +---+ ArgumentsRequired
| |
| +---+ BadResponse
| | |
| | +---+ NullResponse
| |
| +---+ InsufficientFunds
| |
| +---+ InvalidAddress
| | |
| | +---+ AddressPending
| |
| +---+ InvalidOrder
| | |
| | +---+ OrderNotFound
| | |
| | +---+ OrderNotCached
| | |
| | +---+ CancelPending
| | |
| | +---+ OrderImmediatelyFillable
| | |
| | +---+ OrderNotFillable
| | |
| | +---+ DuplicateOrderId
| |
| +---+ NotSupported
|
|
+---+ OperationFailed (recoverable)
|
+---+ NetworkError (recoverable)
|
+---+ InvalidNonce
|
+---+ RequestTimeout
|
+---+ ExchangeNotAvailable
| |
| +---+ OnMaintenance
|
+---+ RateLimitExceeded
|
+---+ DDoSProtection
```
The `BaseError` class is a generic root error class for all sorts of errors, including accessibility and request/response mismatch. If you don't need to catch any specific subclass of exceptions, you can just use `BaseError`, where all exception types are being caught.
From `BaseError` derives two different families of errors: `OperationFailed` and `ExchangeError` (they also have their specific sub-types, as explained below).
### OperationFailed [#operationfailed]
An `OperationFailed` might happen when user sends **correctly constructed & valid request** to exchange, but a non-deterministic problem occurred:
* maintenance ongoing
* internet/network connectivitiy issues
* DDoS protections
* "Server busy, try again"...
Such exceptions are temporary and re-trying the request again might be enough. However, if the error still happens, then it may indicate some persistent problem with the exchange or with your connection.
`OperationFailed` has the following sub-types: `RequestTimeout`,`DDoSProtection` (includes sub-type `RateLimitExceeded`), `ExchangeNotAvailable`, `InvalidNonce`.
#### DDoSProtection [#ddosprotection]
This exception is thrown in cases when cloud/hosting services (Cloudflare, Incapsula or etc..) limits requests from user/region/location or when the exchange API restricts user because of making abnormal requests. This exception also contains specific sub-type exception `RateLimitExceeded`, which directly means that user makes much frequent requests than tolerated by exchange API engine.
#### RequestTimeout [#requesttimeout]
This exception is raised when the connection with the exchange fails or data is not fully received in a specified amount of time. This is controlled by the exchange's `.timeout` property. When a `RequestTimeout` is raised, the user doesn't know the outcome of a request (whether it was accepted by the exchange server or not).
Thus it's advised to handle this type of exception in the following manner:
* for fetching requests it is safe to retry the call
* for a request to `cancelOrder()` a user is required to retry the same call the second time. A subsequent retry to `cancelOrder()` will return one of the following possible results:
* a request is completed successfully, meaning the order has been properly canceled now
* an `OrderNotFound` exception is raised, which means the order was either already canceled on the first attempt or has been executed (filled and closed) in the meantime between the two attempts.
* if a request to `createOrder()` fails with a `RequestTimeout` the user should:
* call `fetchOrders()`, `fetchOpenOrders()`, `fetchClosedOrders()` to check if the request to place the order has succeeded and the order is now open
* if the order is not `'open'` the user should `fetchBalance()` to check if the balance has changed since the order was created on the first run and then was filled and closed by the time of the second check.
#### ExchangeNotAvailable [#exchangenotavailable]
This type of exception is thrown when the underlying exchange is unreachable. The ccxt library also throws this error if it detects any of the following keywords in response:
* `offline`
* `unavailable`
* `busy`
* `retry`
* `wait`
* `maintain`
* `maintenance`
* `maintenancing`
#### InvalidNonce [#invalidnonce]
Raised when your nonce is less than the previous nonce used with your keypair, as described in the [Authentication](#authentication) section. This type of exception is thrown in these cases (in order of precedence for checking):
* You are not rate-limiting your requests or sending too many of them too often.
* Your API keys are not fresh and new (have been used with some different software or script already, just always create a new keypair when you add this or that exchange).
* The same keypair is shared across multiple instances of the exchange class (for example, in a multithreaded environment or in separate processes).
* Your system clock is out of synch. System time should be synched with UTC in a non-DST timezone at a rate of once every ten minutes or even more frequently because of the clock drifting. **Enabling time synch in Windows is usually not enough!** You have to set it up with the OS Registry (Google *"time synch frequency"* for your OS).
### ExchangeError [#exchangeerror]
In contrast to `OperationFailed`, the `ExchangeError` is mostly happening when the request is impossible to succeed (because of factors listed below), so even if you retry the same request hundreds of times, they will still fail, because the request is being made incorrectly.
Possible reasons for this exception:
* endpoint is switched off by the exchange
* symbol not found on the exchange
* required parameter is missing
* the format of parameters is incorrect
* some problem happening on user-side that needs to be fixed
`ExchangeError` has the following sub-type exceptions:
* `NotSupported`: when the endpoint/operation is not offered or supported by the exchange API.
* `BadRequest`: user sends an **incorrectly** constructed request/parameter/action that is invalid/unallowed (i.e.: "invalid number", "forbidden symbol", "size beyond min/max limits", "incorrect precision", etc). Retrying would not help in this case, the request needs to be fixed/adjusted first.
* `OperationRejected` - user sends a **correctly** constructed request (that should be accepted by the exchange in a typical case), but some deterministic factor prevents your request to succeed. For example, your current account status might not allow it (i.e. "please close existing positions before changing the leverage", "too many pending orders", "your account in wrong position/margin mode") or at the give moment symbol is not tradable (i.e. "MarketClosed") or some explained factors, where you need to take a specific action (i.e. change some setting at first, or wait till specific moment). So, once again: [**OperationFailed**](#operationfailed) can be blindly re-tried and should success, while `OperationRejected` is a failure that depends on specific exact factors that need to be considered, before request can be retried.
* `AuthenticationError`: when an exchange requires one of the API credentials that you've missed to specify, or when there's a mistake in the keypair or an outdated nonce. Most of the time you need `apiKey` and `secret`, sometimes you also need `uid` and/or `password` if exchange API requires it.
* `PermissionDenied`: when there's no access for specified action or insufficient permissions on the specified `apiKey`.
* `InsufficientFunds`: when you don't have enough currency on your account balance to place an order.
* `InvalidAddress`: when encountering a bad funding address or a funding address shorter than `.minFundingAddressLength` (10 characters by default) in a call to `fetchDepositAddress`, `createDepositAddress` or `withdraw`.
* `InvalidOrder`: the base class for all exceptions related to the unified order API.
* `OrderNotFound`: when you are trying to fetch or cancel a non-existent order.
### Handling timestamp errors [#handling-timestamp-errors]
Users may occasionally encounter errors such as:
> "Timestamp for this request is outside of the recvWindow."
> "Invalid request, please check your server timestamp or recv\_window param."
> "Timestamp for this request was 1000ms ahead of the server's time."
These issues can arise for several reasons:
#### 1. System Clock Desynchronization [#1-system-clock-desynchronization]
Your device’s system clock may not be properly synchronized with global time standards, leading to timestamp discrepancies.
To resolve this, ensure your system clock is accurate to the millisecond. This should not be a one-time adjustment — configure your operating system to synchronize time periodically (e.g., every hour) to maintain accuracy.
#### 2. Network Latency or Delayed Requests [#2-network-latency-or-delayed-requests]
If your device’s clock is correctly synchronized but network delays cause requests to take longer than the exchange’s accepted window (commonly around `5` seconds, though this varies by exchange), your request may be rejected.
If the issue persists, you can compare your local timestamp with the exchange’s server time to diagnose discrepancies:
```
for i in range(0, 20):
local_time = exchange.milliseconds()
exchange_time = await exchange.fetch_time()
print(exchange_time - local_time)
```
#### Adjusting Exchange Options [#adjusting-exchange-options]
If you continue to experience timestamp errors after verifying synchronization, you can modify certain exchange options to help mitigate the issue.
A) `exchange.options['adjustForTimeDifference'] = True`
or increase window to eg. 10 seconds (only if an exchange supports it, search this keyword in target [exchange file](https://github.com/ccxt/ccxt/tree/master/ts/src)):
B) `exchange.options['recvWindow'] = 10000`
For additional troubleshooting steps, community discussions, and related timestamp/`recvWindow` issues, refer to the following GitHub threads:
* [CCXT Issue #773](https://github.com/ccxt/ccxt/issues/773)
* [CCXT Issue #850](https://github.com/ccxt/ccxt/issues/850)
* [CCXT Issue #936](https://github.com/ccxt/ccxt/issues/936)
# Troubleshooting [#troubleshooting]
In case you experience any difficulty connecting to a particular exchange, do the following in order of precedence:
* Make sure that you have the most recent version of ccxt.
Never trust your package installer (whether it is `npm`, `pip` or `composer`), instead always check your **actual (real) runtime version number** by running this code in your environment:
```javascript
console.log (ccxt.version) // JavaScript
```
```python
print('CCXT version:', ccxt.__version__) # Python
```
```php
echo "CCXT v." . \ccxt\Exchange::VERSION . "\n"; // PHP
```
* Check the [Issues](https://github.com/ccxt/ccxt/issues) or [Announcements](#announcements) for recent updates.
* Make sure you have not turned off [rate-limiter with `enableRateLimit: false`](#rate-limit) (If anyone has custom rate-limit solution built, ensure it does not misbehave).
* If you use ccxt's proxy functionality, ensure it does not misbehave.
* Turn `verbose = true` to get more detail about it!
```
exchange = ccxt.binance()
exchange.load_markets()
exchange.verbose = True # for less noise, you can set that after `load_markets`, but if the error happens during `load_markets` then place this line before it
# ... your codes here ...
```
Your [code to reproduce the issue + verbose output is required](/docs/faq#what-is-required-to-get-help) in order to get help.
* Python people can turn on DEBUG logging level with a standard pythonic logger, by adding these two lines to the beginning of their code:
```python
import logging
logging.basicConfig(level=logging.DEBUG)
```
* Use verbose mode to make sure that the used API credentials correspond to the keys you intend to use. Make sure there's no confusion of keypairs.
* **Try a fresh new keypair if possible.**
* Read the answers to Frequently Asked Questions: /docs/faq
* Check the permissions on the keypair with the exchange website!
* Check your nonce. If you used your API keys with other software, you most likely should [override your nonce function](#overriding-the-nonce) to match your previous nonce value. A nonce usually can be easily reset by generating a new unused keypair. If you are getting nonce errors with an existing key, try with a new API key that hasn't been used yet.
* Check your request rate if you are getting nonce errors. Your private requests should not follow one another quickly. You should not send them one after another in a split second or in short time. The exchange will most likely ban you if you don't make a delay before sending each new request. In other words, you should not hit their rate limit by sending unlimited private requests too frequently. Add a delay to your subsequent requests or enable the built-in rate-limiter, like shown in the long-poller [examples](https://github.com/ccxt/ccxt/tree/master/examples), also [here](#order-book--market-depth).
* Read the [docs for your exchange](/docs/exchange-markets) and compare your verbose output to the docs.
* Check your connectivity with the exchange by accessing it with your browser.
* Check your connection with the exchange through a [proxy](#proxy).
* Try accesing the exchange from a different computer or a remote server, to see if this is a local or global issue with the exchange.
* Check if there were any news from the exchange recently regarding downtime for maintenance. Some exchanges go offline for updates regularly (like once a week).
* Make sure that your system time in sync with the rest of the world's clocks since otherwise you may get invalid nonce errors.
**Further Notes:**
* Use the `verbose = true` option or instantiate your troublesome exchange with `new ccxt.exchange ({ 'verbose': true })` to see the HTTP requests and responses in details. The verbose output will also be of use for us to debug it if you submit an issue on GitHub.
* Use DEBUG logging in Python!
* Some exchanges are not available in certain countries, using a [proxy](#proxy) might be the solution in such cases.
* If you are getting authentication errors or *'invalid keys'* errors, those are most likely due to a nonce issue.
* Some exchanges do not state it clearly if they fail to authenticate your request. In those circumstances they might respond with an exotic error code, like HTTP 502 Bad Gateway Error or something that's even less related to the actual cause of the error.
# MCP Server (/docs/mcp)
# CCXT MCP Server [#ccxt-mcp-server]
CCXT ships an official **MCP (Model Context Protocol) server** so AI agents — Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, and any other MCP host — can access market data, account balances, and (when you explicitly enable it) trading across 100+ cryptocurrency exchanges and prediction markets through the unified CCXT API.
It runs **locally over stdio**: your API keys stay on your machine and are never visible to the AI model, which references accounts by name only. Nothing is hosted, and no keys transit any third‑party service.
* npm package: [`ccxt-mcp`](https://www.npmjs.com/package/ccxt-mcp)
* Source: [github.com/ccxt/ccxt/tree/master/mcp](https://github.com/ccxt/ccxt/tree/master/mcp)
```bash
claude mcp add ccxt -- npx -y ccxt-mcp
```
## Security model (read this first) [#security-model-read-this-first]
Your API keys stay on your machine, and the model never sees them:
* The server runs **locally over stdio**. A local server is the only way to hold user keys without a hosted service becoming a custodian.
* Credentials are **never tool parameters**. No tool schema accepts a key, so neither the model nor a prompt‑injected page can supply, request, or change them. Tools reference accounts by a **name** you choose (e.g. `binance-main`).
* Keys leave the process only inside signed HTTPS requests to the exchange itself — exactly like any trading bot.
* Every tool result, error, and log line passes a **redaction filter** holding your loaded secret values, so a secret can never appear in the conversation.
* **Capability tiers are opt‑in and file‑owned.** Out of the box the server serves public market data only. Configuring an account enables private reads. Trading, withdrawals/transfers, and raw endpoints must each be enabled per account **in the config file** — there is no tool that edits config, so a conversation can never grant itself permissions. The tools are *listed* by default (so the model can discover them and, when one isn't configured, return a clear "add an account" error the assistant relays to you), but **execution is always gated at the account** — calling a write tool without a configured, tier‑enabled account just errors. Set `"settings": { "hideDisabledTools": true }` to hide unconfigured tiers from the tool list entirely (a leaner, deliberately read‑only deployment).
* Order‑placing tools are **previewed and confirmed**, validated against market limits and your notional caps, and journaled to an append‑only audit log.
Recommended exchange‑side backstops (they hold even if your machine is compromised): create API keys with **withdrawal permission disabled** and an **IP allowlist**.
## Install [#install]
Requires Node.js ≥ 18. The server runs with `npx -y ccxt-mcp` — no global install needed. Add it to your MCP host with one of the snippets below.
### Claude Code [#claude-code]
```bash
claude mcp add ccxt -- npx -y ccxt-mcp
```
Or per‑project via a committed `.mcp.json` (safe to commit — it contains no secrets):
```json
{ "mcpServers": { "ccxt": { "command": "npx", "args": ["-y", "ccxt-mcp"] } } }
```
### Claude Desktop [#claude-desktop]
**Easiest — one‑click bundle:** download [`ccxt-mcp.mcpb`](https://github.com/ccxt/ccxt/releases/download/ccxt-mcp-latest/ccxt-mcp.mcpb) and open it (Settings → Extensions → drag it in, or double‑click). The installer shows a form where you can enter up to **three exchanges'** keys (and point at a config file for more); keys are stored in your OS keychain, never seen by the model.
```bash
curl -L -o ccxt-mcp.mcpb https://github.com/ccxt/ccxt/releases/download/ccxt-mcp-latest/ccxt-mcp.mcpb
```
**Or via JSON** — add to `claude_desktop_config.json` (Settings → Developer → Edit Config), then restart:
```json
{ "mcpServers": { "ccxt": { "command": "npx", "args": ["-y", "ccxt-mcp"] } } }
```
### Cursor [#cursor]
`~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (per project):
```json
{ "mcpServers": { "ccxt": { "command": "npx", "args": ["-y", "ccxt-mcp"] } } }
```
### VS Code [#vs-code]
`.vscode/mcp.json` — VS Code's `inputs` mechanism stores values in **encrypted secret storage**, the best option for keys among the JSON‑config hosts:
```json
{
"inputs": [
{ "id": "binance-key", "type": "promptString", "password": true, "description": "Binance API key" },
{ "id": "binance-secret", "type": "promptString", "password": true, "description": "Binance API secret" }
],
"servers": {
"ccxt": {
"command": "npx", "args": ["-y", "ccxt-mcp"],
"env": { "BINANCE_APIKEY": "${input:binance-key}", "BINANCE_SECRET": "${input:binance-secret}" }
}
}
}
```
### Windsurf [#windsurf]
`~/.codeium/windsurf/mcp_config.json` — same `mcpServers` shape as Claude Desktop; `${env:VAR}` interpolation is supported.
## Configuration [#configuration]
With no configuration the server serves **public market data on every exchange** — that alone is a useful install (prices, order books, candles, market search, prediction‑market events).
To add accounts, create the config file (its path is reported by the `get_safety_status` tool):
* macOS: `~/Library/Application Support/ccxt-mcp/config.json`
* Linux: `~/.config/ccxt-mcp/config.json`
* Windows: `%APPDATA%\ccxt-mcp\config.json`
* Or point the `CCXT_MCP_CONFIG` environment variable at any path (a legacy per‑exchange `keys.local.json` shape also loads).
```jsonc
{
"accounts": {
"binance-testnet": {
"exchange": "binance",
"apiKey": "…",
"secret": "…",
"sandbox": true, // testnet — recommended first stop
"trading": true // "true" enables SANDBOX/DEMO trading only
},
"binance-main": {
"exchange": "binance",
"apiKey": "…",
"secret": "…",
"trading": "live", // live trading requires the explicit string "live"…
"maxOrderValue": 250, // …and a per-order USD cap you author (null = opt out)
"maxDailyValue": 1000, // optional rolling-24h cap
"allowedSymbols": ["BTC/USDT", "ETH/*"], // optional strict allowlist
"confirm": "live" // always | live (default) | never
},
"okx-main": {
"exchange": "okx",
"apiKey": "…",
"secret": "…",
"password": "…" // OKX / KuCoin / Bitget also require the API passphrase
},
"polymarket-main": {
"exchange": "polymarket",
"walletAddress": "0x…", // wallet-based venues (DEXes, prediction markets) use a key pair
"privateKey": "0x…"
}
}
}
```
Account fields accept any credential from the exchange's `requiredCredentials` (`apiKey`, `secret`, `password`, `uid`, `walletAddress`, `privateKey`, …), plus `sandbox`/`demo`, `defaultType`, `options` (CCXT constructor options), `prediction: true` (for exchanges that exist in both the crypto and prediction namespaces, e.g. hyperliquid), and the safety switches below. `chmod 600` the file; the server warns otherwise (or refuses with `"settings": { "strictPermissions": true }`).
### Which credentials does each exchange need? [#which-credentials-does-each-exchange-need]
Each account names its own `exchange` and carries **that exchange's** credentials, so a multi‑exchange setup is just several entries side by side — each with the fields that venue requires:
| Exchange | Credential fields to set |
| -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| Most CEXs — Binance, Bybit, Kraken, Gate, MEXC… | `apiKey`, `secret` |
| OKX, KuCoin, Bitget | `apiKey`, `secret`, `password` (the API **passphrase** you chose when creating the key) |
| Wallet‑based — Hyperliquid, Polymarket, Limitless, other DEX / prediction venues | `walletAddress`, `privateKey` |
The config field names are exactly the credential names — set only the fields a venue needs and omit the rest. **Not sure what a given exchange takes?** Ask the agent to run **`describe_exchange`** for it: the `requiredCredentials` field lists precisely which of `apiKey` / `secret` / `password` / `uid` / `walletAddress` / `privateKey` / `token` / `twofa` to provide. (Credentials only ever live in this file — no tool accepts or returns them.)
Environment variables work too: `_` (e.g. `BINANCE_APIKEY`, `OKX_PASSWORD`) fill missing credentials on a configured account, and the `CCXT_MCP_EXCHANGE` / `CCXT_MCP_APIKEY` / `CCXT_MCP_SECRET` / `CCXT_MCP_SANDBOX` / `CCXT_MCP_TRADING` set defines a single account named `default` (add `_2`, `_3` — `CCXT_MCP_EXCHANGE_2` … — for more). The `accounts` map holds as many exchanges as you want.
**Zero‑config env keys (ccxt `--loadKeys` parity).** Set `"settings": { "loadEnvKeys": true }` (or `CCXT_MCP_LOAD_ENV_KEYS=true`) and the server auto‑registers an account for every exchange whose keys are already in the environment as `_APIKEY`/`_SECRET` (or `_WALLETADDRESS`/`_PRIVATEKEY`) — e.g. `BINANCE_APIKEY`+`BINANCE_SECRET` → a `binance` account, no config file needed. These accounts are **read‑only** unless you also set the global `CCXT_MCP_SANDBOX`/`CCXT_MCP_TRADING` toggles (which enable sandbox trading only — live trading is never auto‑armed from ambient env vars). It's **off by default**, so keys sitting in your shell for other tools are never silently activated.
**Claude Desktop (`.mcpb` bundle):** the install form takes **up to three exchanges** inline (each with its key/secret, plus an optional passphrase for OKX/KuCoin/Bitget) and global **Sandbox**, **Demo trading** and "allow orders" toggles. Pick **Sandbox** for testnet keys or **Demo trading** for demo‑portal keys (e.g. Binance `demo.binance.com`) — one or the other, not both. For a fourth exchange, a wallet‑based venue (`walletAddress`/`privateKey`), or live trading/withdrawals, set the **Config file** field to a `config.json` with an `accounts` map (as above), or create it at the default path and leave the form blank — the file merges with the inline exchanges.
### Capability tiers [#capability-tiers]
| Tier | Enables | Switch | Default |
| -------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------ |
| market | tickers, order books, OHLCV, trades, market search, prediction events, read‑only raw GET endpoints | — | **on** |
| read | balances, orders, own trades, positions | an account with credentials exists | on when configured |
| trading | create/edit/cancel orders, leverage, margin, position ops | per‑account `"trading": true` (sandbox/demo) or `"live"` | **off** |
| funds | withdraw, internal transfer, deposit addresses | per‑account `"funds": true` or `"live"` | **off** |
| implicitWrites | raw POST/PUT/DELETE endpoints (anything exchange‑specific, incl. key management) | per‑account `"implicitWrites": true` | **off** |
`"trading": true` deliberately works **only** on sandbox/demo accounts; live trading requires typing `"trading": "live"` *and* deciding a `maxOrderValue` (a number, or explicitly `null` to opt out). The same pattern applies to `funds` with `maxTransferValue`. Activating a tier is your responsibility — the server's job is honest gates, confirmation, and the audit journal (`/ccxt-mcp/journal/`).
## Tools [#tools]
The model discovers these from the server; you don't call them directly.
* **market** — `list_exchanges`, `describe_exchange`, `describe_method` (search method signatures, per‑exchange params and doc links), `search_markets`, `get_tickers`, `get_orderbook`, `get_ohlcv`, `get_trades`, `search_events` (prediction markets), `call_read_method` (any unified `fetch*`/`load*` — structurally read‑only), `call_implicit_get` (raw GET endpoints), `get_safety_status`.
* **live (WebSocket)** — `watch_subscribe` opens a background ccxt.pro stream; `watch_read` returns fresh data. **State** streams are snapshots of "what is X right now" — `watchTicker(s)`, `watchOrderBook(ForSymbols)`, `watchOHLCV`, `watchBalance`, `watchPositions`, `watchBidsAsks`, `watchMarkPrice(s)`: the server merges live updates into the **full current set**, so `watch_read` always returns every subscribed symbol in `latest`, never just the one that last ticked. **Event** streams are logs of discrete events — `watchTrades` and the private `watchOrders`/`watchMyTrades`/`watch(My)Liquidations` (private ones need an account): `watch_read` returns new items oldest‑first in `events` with a cursor. Set `waitForChange: true` on `watch_read` to **block until the next update** (or timeout) instead of polling — the efficient way to wait for a fill or a position change. `watch_unsubscribe` stops it; `watch_list` shows active streams. The long‑lived server holds the socket so the agent always has fresh data; idle streams auto‑stop after 10 minutes.
* **read** — `list_accounts`, `get_balance`, `get_orders`, `get_my_trades`, `get_positions`.
* **trading** — `create_order`, `edit_order`, `cancel_order`, `cancel_all_orders`, `set_leverage`, `set_margin_mode`, `call_write_method`.
* **funds** — `withdraw`, `transfer`, `get_deposit_address`. **implicitWrites** — `call_implicit_write`.
Every list result is capped and paginated to fit host context limits (with in‑band truncation notices), and the raw `info` payload is stripped by default. Symbols are unified CCXT symbols (`BTC/USDT` spot, `BTC/USDT:USDT` swap); resolve them with `search_markets`. Prediction exchanges use the same tools with outcome handles (from `search_events`) in the symbol position, priced 0–1.
## Prediction markets [#prediction-markets]
The prediction‑market exchanges (Polymarket, Kalshi, Limitless, Myriad, and Hyperliquid) are first‑class. Ask the model to find an event with `search_events`, then read or trade its outcomes with the ordinary market and trading tools — the outcome handle goes in the symbol position, and prices are probabilities between 0 and 1.
## Troubleshooting [#troubleshooting]
* **"Trading is not enabled for account …"** — edit the config file (see tiers above). This is not something the conversation can change.
* **AUTH\_FAILED / "Invalid API-key" on a sandbox account** — testnet keys come from the exchange's testnet portal, not your live account (and vice versa). Note **sandbox ≠ demo**: some exchanges (e.g. Binance) run a separate *demo‑trading* environment on a different host — those keys need `"demo": true` (or `CCXT_MCP_DEMO=true`, or the **Demo trading** toggle in the `.mcpb` form), not `sandbox`. Binance's futures testnet is deprecated; use demo trading instead.
* **HTTP 451 / geo‑blocks** — some exchanges block cloud/VPN/US IPs; set a proxy via account `options` if needed.
* **Slow first call on a big exchange** — the initial `loadMarkets()` can take a few seconds; it is cached on disk for 24h afterwards.
* Run `npx @modelcontextprotocol/inspector npx -y ccxt-mcp` to open an interactive tool console.
## See also [#see-also]
* [CLI](/docs/cli) — the command‑line interface, for the same unified API from a terminal or shell script.
* [Manual](/docs/manual) — the full unified API reference.
* [Model Context Protocol](https://modelcontextprotocol.io/) — the open standard this server implements.
# CCXT Pro Manual (/docs/pro-manual)
# Manual [#manual]
CCXT Pro is a free part of CCXT that adds support for WebSocket streaming: [https://github.com/ccxt/ccxt/issues/15171](https://github.com/ccxt/ccxt/issues/15171)
The CCXT Pro stack is built upon [CCXT](https://ccxt.com) and extends the core CCXT classes, using:
* JavaScript prototype-level mixins
* Python multiple inheritance
* PHP Traits
* Java class inheritance (pro exchange classes extend base exchange classes)
The CCXT Pro heavily relies on the transpiler of CCXT for [multilanguage support](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#multilanguage-support).
```
User
+-------------------------------------------------------------+
| CCXT Pro |
+------------------------------+------------------------------+
| Public . Private |
+=============================================================+
│ . |
│ The Unified CCXT Pro API |
| . |
| loadMarkets . watchBalance |
| watchTicker . watchOrders |
| watchTickers . watchMyTrades |
| watchOrderBook . watchPositions |
| watchOHLCV . createOrderWs |
| watchStatus . editOrderWs |
| watchTrades . cancelOrderWs |
│ watchOHLCVForSymbols . cancelOrdersWs |
│ watchTradesForSymbols . cancelAllOrdersWs |
│ watchOrderBookForSymbols . |
│ . |
+=============================================================+
│ unWatch |
│ (to stop **watch** method) |
+=============================================================+
│ . |
| The Underlying Exchange-Specific APIs |
| (Derived Classes And Their Implementations) |
│ . |
+=============================================================+
│ . |
| CCXT Pro Base Exchange Class |
│ . |
+=============================================================+
+-------------------------------------------------------------+
| |
| CCXT |
| |
+=============================================================+
```
## Exchanges [#exchanges]
The CCXT Pro library currently supports the following 73 cryptocurrency exchange markets and WebSocket trading APIs:
| logo | id | name | ver | type | certified | pro |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | ----------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------: | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| [](https://alpaca.markets) | alpaca | [Alpaca](https://alpaca.markets) | [](https://alpaca.markets/docs/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://omni.apex.exchange/trade) | apex | [Apex](https://omni.apex.exchange/trade) | [](https://api-docs.omni.apex.exchange) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.asterdex.com/en/referral/aA1c2B) | aster | [Aster](https://www.asterdex.com/en/referral/aA1c2B) | [](https://github.com/asterdex/api-docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://backpack.exchange/join/ccxt) | backpack | [Backpack](https://backpack.exchange/join/ccxt) | [](https://docs.backpack.exchange/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://bequant.io/referral/dd104e3bee7634ec) | bequant | [Bequant](https://bequant.io/referral/dd104e3bee7634ec) | [](https://api.bequant.io/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://accounts.binance.com/register?ref=CCXTCOM) | binance | [Binance](https://accounts.binance.com/register?ref=CCXTCOM) | [](https://developers.binance.com/en) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://accounts.binance.com/register?ref=CCXTCOM) | binancecoinm | [Binance COIN-M](https://accounts.binance.com/register?ref=CCXTCOM) | [](https://binance-docs.github.io/apidocs/delivery/en/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.binance.us/?ref=35005074) | binanceus | [Binance US](https://www.binance.us/?ref=35005074) | [](https://github.com/binance-us/binance-official-api-docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://accounts.binance.com/register?ref=CCXTCOM) | binanceusdm | [Binance USDⓈ-M](https://accounts.binance.com/register?ref=CCXTCOM) | [](https://binance-docs.github.io/apidocs/futures/en/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://bingx.com/invite/OHETOM) | bingx | [BingX](https://bingx.com/invite/OHETOM) | [](https://bingx-api.github.io/docs/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bitfinex.com) | bitfinex | [Bitfinex](https://www.bitfinex.com) | [](https://docs.bitfinex.com/v2/docs/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bitget.com/expressly?languageType=0\&channelCode=ccxt\&vipCode=tg9j) | bitget | [Bitget](https://www.bitget.com/expressly?languageType=0\&channelCode=ccxt\&vipCode=tg9j) | [](https://www.bitget.com/api-doc/common/intro) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bithumb.com) | bithumb | [Bithumb](https://www.bithumb.com) | [](https://apidocs.bithumb.com) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bitmex.com/app/register/NZTR1q) | bitmex | [BitMEX](https://www.bitmex.com/app/register/NZTR1q) | [](https://www.bitmex.com/app/apiOverview) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bitopro.com) | bitopro | [BitoPro](https://www.bitopro.com) | [](https://github.com/bitoex/bitopro-offical-api-docs/blob/master/v3-1/rest-1/rest.md) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bitrue.com/affiliate/landing?cn=600000\&inviteCode=EZWETQE) | bitrue | [Bitrue](https://www.bitrue.com/affiliate/landing?cn=600000\&inviteCode=EZWETQE) | [](https://github.com/Bitrue-exchange/bitrue-official-api-docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bitstamp.net) | bitstamp | [Bitstamp](https://www.bitstamp.net) | [](https://www.bitstamp.net/api) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bittrade.co.jp/register/?invite_code=znnq3) | bittrade | [BitTrade](https://www.bittrade.co.jp/register/?invite_code=znnq3) | [](https://api-doc.bittrade.co.jp) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://bitvavo.com/?a=24F34952F7) | bitvavo | [Bitvavo](https://bitvavo.com/?a=24F34952F7) | [](https://docs.bitvavo.com/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://blockchain.com) | blockchaincom | [Blockchain.com](https://blockchain.com) | [](https://api.blockchain.com/v3) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://blofin.com/register?referral_code=f79EsS) | blofin | [BloFin](https://blofin.com/register?referral_code=f79EsS) | [](https://blofin.com/docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://bullish.com/) | bullish | [Bullish](https://bullish.com/) | [](https://api.exchange.bullish.com/docs/api/rest/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bybit.com/invite?ref=XDK12WP) | bybit | [Bybit](https://www.bybit.com/invite?ref=XDK12WP) | [](https://bybit-exchange.github.io/docs/inverse/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.bybit.com/invite?ref=XDK12WP) | bybiteu | [Bybit EU](https://www.bybit.com/invite?ref=XDK12WP) | [](https://bybit-exchange.github.io/docs/inverse/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://partner.bydfi.com/j/DilWutCI) | bydfi | [BYDFi](https://partner.bydfi.com/j/DilWutCI) | [](https://developers.bydfi.com/en/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://cex.io/r/0/up105393824/0/) | cex | [CEX.IO](https://cex.io/r/0/up105393824/0/) | [](https://trade.cex.io/docs/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.coinbase.com/join/58cbe25a355148797479dbd2) | coinbase | [Coinbase Advanced](https://www.coinbase.com/join/58cbe25a355148797479dbd2) | [](https://docs.cdp.coinbase.com/coinbase-app/introduction/welcome) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://coinbase.com/) | coinbaseexchange | [Coinbase Exchange](https://coinbase.com/) | [](https://docs.cloud.coinbase.com/exchange/docs/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://international.coinbase.com) | coinbaseinternational | [Coinbase International](https://international.coinbase.com) | [](https://docs.cloud.coinbase.com/intx/docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.coinex.com/register?refer_code=yw5fz) | coinex | [CoinEx](https://www.coinex.com/register?refer_code=yw5fz) | [](https://docs.coinex.com/api/v2) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://crypto.com/exch/kdacthrnxt) | cryptocom | [Crypto.com](https://crypto.com/exch/kdacthrnxt) | [](https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://s.deepcoin.com/UzkyODgy) | deepcoin | [DeepCoin](https://s.deepcoin.com/UzkyODgy) | [](https://www.deepcoin.com/docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.deribit.com/reg-1189.4038) | deribit | [Deribit](https://www.deribit.com/reg-1189.4038) | [](https://docs.deribit.com/v2) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.derive.xyz/invite/3VB0B) | derive | [Derive](https://www.derive.xyz/invite/3VB0B) | [](https://docs.derive.xyz/docs/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://dydx.trade?ref=ccxt) | dydx | [dYdX](https://dydx.trade?ref=ccxt) | [](https://docs.dydx.xyz) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://app.extended.exchange) | extended | [Extended](https://app.extended.exchange) | [](https://api.docs.extended.exchange) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.gate.com/share/CCXTGATE) | gate | [Gate](https://www.gate.com/share/CCXTGATE) | [](https://www.gate.com/docs/developers/apiv4/en) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.gate.com/share/CCXTGATE) | gateeu | [Gate EU](https://www.gate.com/share/CCXTGATE) | [](https://www.gate.com/docs/developers/apiv4/en) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://gemini.com/) | gemini | [Gemini](https://gemini.com/) | [](https://docs.gemini.com/rest-api) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://grvt.io/?ref=WBLS9D1) | grvt | [GRVT](https://grvt.io/?ref=WBLS9D1) | [](https://api-docs.grvt.io/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | hashkey | [HashKey Global](https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN) | [](https://hashkeyglobal-apidoc.readme.io/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://pro.hollaex.com/signup?affiliation_code=QSWA6G) | hollaex | [HollaEx](https://pro.hollaex.com/signup?affiliation_code=QSWA6G) | [](https://apidocs.hollaex.com) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.htx.com/invite/en-us/1h?invite_code=6rmm2223) | htx | [HTX](https://www.htx.com/invite/en-us/1h?invite_code=6rmm2223) | [](https://huobiapi.github.io/docs/spot/v1/en/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://app.hyperliquid.xyz/) | hyperliquid | [Hyperliquid](https://app.hyperliquid.xyz/) | [](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.independentreserve.com) | independentreserve | [Independent Reserve](https://www.independentreserve.com) | [](https://www.independentreserve.com/API) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.kraken.com) | kraken | [Kraken](https://www.kraken.com) | [](https://docs.kraken.com/api-reference/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://futures.kraken.com/) | krakenfutures | [Kraken Futures](https://futures.kraken.com/) | [](https://docs.kraken.com/api/docs/futures-api/trading/market-data/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.kucoin.com/ucenter/signup?rcode=E5wkqe) | kucoin | [KuCoin](https://www.kucoin.com/ucenter/signup?rcode=E5wkqe) | [](https://docs.kucoin.com) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://futures.kucoin.com/?rcode=E5wkqe) | kucoinfutures | [KuCoin Futures](https://futures.kucoin.com/?rcode=E5wkqe) | [](https://docs.kucoin.com) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.lbank.com/login/?icode=7QCY) | lbank | [LBank](https://www.lbank.com/login/?icode=7QCY) | [](https://www.lbank.com/en-US/docs/index.html) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://app.lighter.xyz/?referral=715955W9) | lighter | [Lighter](https://app.lighter.xyz/?referral=715955W9) | [](https://apidocs.lighter.xyz/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.luno.com/invite/44893A) | luno | [Luno](https://www.luno.com/invite/44893A) | [](https://www.luno.com/en/developers/api) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.mexc.com/register?inviteCode=mexc-1FQ1GNu1) | mexc | [MEXC Global](https://www.mexc.com/register?inviteCode=mexc-1FQ1GNu1) | [](https://www.mexc.com/api-docs/spot-v3/introduction) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://trade.mode.network?ref=MODETRADE) | modetrade | [Mode Trade](https://trade.mode.network?ref=MODETRADE) | [](https://orderly.network/docs/build-on-omnichain/building-on-omnichain) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://mudrex.com) | mudrex | [Mudrex](https://mudrex.com) | [](https://docs.trade.mudrex.com/docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.my.okx.com/join/CCXT2023) | myokx | [MyOKX (EEA)](https://www.my.okx.com/join/CCXT2023) | [](https://my.okx.com/docs-v5/en/#overview) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://nado.xyz) | nado | [Nado](https://nado.xyz) | [](https://docs.nado.xyz/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://one.ndax.io/bfQiSL) | ndax | [NDAX](https://one.ndax.io/bfQiSL) | [](https://apidoc.ndax.io/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.okx.com/join/CCXTCOM) | okx | [OKX](https://www.okx.com/join/CCXTCOM) | [](https://www.okx.com/docs-v5/en/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.app.okx.com/join/CCXT2023) | okxus | [OKX (US)](https://www.app.okx.com/join/CCXT2023) | [](https://app.okx.com/docs-v5/en/#overview) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://onetrading.com/) | onetrading | [One Trading](https://onetrading.com/) | [](https://docs.onetrading.com) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://p2pb2b.com?referral=ee784c53) | p2b | [p2b](https://p2pb2b.com?referral=ee784c53) | [](https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://app.pacifica.fi?referral=ccxt) | pacifica | [Pacifica](https://app.pacifica.fi?referral=ccxt) | [](https://docs.pacifica.fi/api-documentation/api/rest-api) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://app.paradex.trade/r/ccxt24) | paradex | [Paradex](https://app.paradex.trade/r/ccxt24) | [](https://docs.api.testnet.paradex.trade/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://phemex.com/register?referralCode=EDNVJ) | phemex | [Phemex](https://phemex.com/register?referralCode=EDNVJ) | [](https://phemex-docs.github.io/#overview) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://poloniex.com/signup?c=UBFZJRPJ) | poloniex | [Poloniex](https://poloniex.com/signup?c=UBFZJRPJ) | [](https://api-docs.poloniex.com/spot/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.toobit.com/en-US/r?i=dvCpJj) | toobit | [Toobit](https://www.toobit.com/en-US/r?i=dvCpJj) | [](https://api-docs.toobit.com/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://upbit.com) | upbit | [Upbit](https://upbit.com) | [](https://docs.upbit.com/kr) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.weex.com/register?vipCode=qfyh) | weex | [Weex](https://www.weex.com/register?vipCode=qfyh) | [](https://www.weex.com/api-doc) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://whitebit.com/referral/d9bdf40e-28f2-4b52-b2f9-cd1415d82963) | whitebit | [WhiteBit](https://whitebit.com/referral/d9bdf40e-28f2-4b52-b2f9-cd1415d82963) | [](https://github.com/whitebit-exchange/api-docs) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://woox.io/register?ref=DIJT0CNL) | woo | [WOO X](https://woox.io/register?ref=DIJT0CNL) | [](https://developer.woox.io/) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://dex.woo.org/en/trade?ref=CCXT) | woofipro | [WOOFI PRO](https://dex.woo.org/en/trade?ref=CCXT) | [](https://orderly.network/docs/build-on-omnichain/building-on-omnichain) |  | [](/docs/certification) | [](https://docs.ccxt.com/docs/pro-manual) |
| [](https://www.xt.com/en/accounts/register?ref=9PTM9VW) | xt | [XT](https://www.xt.com/en/accounts/register?ref=9PTM9VW) | [](https://doc.xt.com/) |  | | [](https://docs.ccxt.com/docs/pro-manual) |
This is the list of exchanges in CCXT Pro with support for WebSockets APIs. This list will be updated with new exchanges on a regular basis.
Full list of exchanges available in CCXT via REST: [Supported Cryptocurrency Exchange Markets](https://github.com/ccxt/ccxt/#supported-cryptocurrency-exchange-markets).
## Usage [#usage]
```diff
- this part of the doc is under heavy development right now
- there may be some typos, mistakes and missing info here and there
- contributions, pull requests and feedback appreciated
```
## Prerequisites [#prerequisites]
The best way to understand CCXT Pro is to make sure you grasp the entire CCXT Manual and practice standard CCXT first. CCXT Pro borrows from CCXT. The two libraries share a lot of commonalities, including:
* the concepts of public API and private authenticated API
* markets, symbols, currency codes and ids
* unified data structures and formats, orderbooks, trades, orders, candles, timeframes, ...
* exceptions and error mappings
* authentication and API keys (for private feeds and calls)
* configuration options
The CCXT Pro audience consists mostly of professional algorithmic traders and developers. In order to work efficiently with this library the user is required to be well-familiar with the concepts of streaming. One has to understand the underlying differences between connection-based streaming APIs ([WebSocket](https://en.wikipedia.org/wiki/WebSocket), CCXT Pro) and request-response based APIs ([REST](https://en.wikipedia.org/wiki/Representational_state_transfer), CCXT).
The general async-style flow for a CCXT application is as follows:
```javascript
// a RESTful orderbook polling request-response loop
while (condition) {
try {
// fetch some of the public data
orderbook = await exchange.fetchOrderBook (symbol, limit)
// do something or react somehow based on that data
// ...
} catch (e) {
// handle errors
}
}
```
In CCXT Pro each public and private unified RESTful method having a `fetch*` prefix also has a corresponding stream-based counterpart method prefixed with `watch*`, as follows:
* Public API
* `fetchStatus` → `watchStatus`
* `fetchOrderBook` → `watchOrderBook`
* `fetchOrderBookForSymbols` → `watchOrderBookForSymbols`
* `fetchTicker` → `watchTicker`
* `fetchTickers` → `watchTickers`
* `fetchOHLCV` → `watchOHLCV`
* `fetchOHLCVForSymbols` → `watchOHLCVForSymbols`
* `fetchTrades` → `watchTrades`
* `fetchTradesForSymbols` → `watchTradesForSymbols`
* `fetchBidsAsks` → `watchBidsAsks`
* `fetchLiquidations` → `watchLiquidations`
* `fetchLiquidationsForSymbols` → `watchLiquidationsForSymbols`
* Private API
* `fetchBalance` → `watchBalance`
* `fetchOrders` → `watchOrders`
* `fetchOrdersForSymbols` → `watchOrdersForSymbols`
* `fetchMyTrades` → `watchMyTrades`
* `fetchPosition` → `watchPosition`
* `fetchPositions` → `watchPositions`
* `fetchLiquidations` → `watchLiquidations`
* `fetchMyLiquidations` → `watchMyLiquidations`
* `fetchMyLiquidationsForSymbols` → `watchMyLiquidationsForSymbols`
* `fetchFundingRates` → `watchFundingRates`
* REST alternatives
* `fetchTrades` → `fetchTradesWs`
* `createOrder` → `createOrderWs`
* `editOrder` → `editOrderWs`
* `cancelOrder` → `cancelOrderWs`
* `cancelOrders` → `cancelOrdersWs`
* `cancelAllOrders` → `cancelAllOrdersWs`
* etc ...
* unWatch (stops background subscription for `watch`-ed methods)
* `unWatchOrderBook`
* `unWatchOrderBooksForSymbols`
* `unWatchTrades`
* `unWatchTradesForSymbols`
* `unWatchOHLCVForSymbols`
* `unWatchOrderBookForSymbols`
* `unWatchPositions`
* `unWatchTickers`
* `unWatchMyTrades`
* `unWatchTicker`
* `unWatchOHLCV`
* `unWatchOrders`
The Unified CCXT Pro Streaming API inherits CCXT usage patterns to make migration easier.
The general async-style flow for a CCXT Pro application (as opposed to a CCXT application above) is shown below:
```javascript
// a stream-based (WebSocket) orderbook feed loop
while (condition) {
try {
// watch some of the public data
orderbook = await exchange.watchOrderBook (symbol, limit)
// do something or react somehow based on that data
// ...
} catch (e) {
// handle errors
}
}
```
That usage pattern is usually wrapped up into a core business-logic method called *"a `tick()` function"*, since it reiterates a reaction to the incoming events (aka *ticks*). From the two examples above it is obvious that the generic usage pattern in CCXT Pro and CCXT is identical.
Many of the CCXT rules and concepts also apply to CCXT Pro:
* CCXT Pro will load markets and will cache markets upon the first call to a unified API method
* CCXT Pro will call CCXT RESTful methods under the hood if necessary
* CCXT Pro will throw standard CCXT exceptions where necessary
* ...
## Streaming Specifics [#streaming-specifics]
Despite of the numerous commonalities, streaming-based APIs have their own specifics, because of their connection-based nature.
Having a connection-based interface implies connection-handling mechanisms. Connections are managed by CCXT Pro transparently to the user. Each exchange instance manages its own set of connections.
Upon your first call to any `watch*()` method the library will establish a connection to a specific stream/resource of the exchange and will maintain it. If the connection already exists – it is reused. The library will handle the subscription request/response messaging sequences as well as the authentication/signing if the requested stream is private.
The library will also watch the status of the uplink and will keep the connection alive. Upon a critical exception, a disconnect or a connection timeout/failure, the next iteration of the tick function will call the `watch` method that will trigger a reconnection. This way the library handles disconnections and reconnections for the user transparently. CCXT Pro applies the necessary rate-limiting and exponential backoff reconnection delays. All of that functionality is enabled by default and can be configured via exchange properties, as usual.
Most of the exchanges only have a single base URL for streaming APIs (usually, WebSocket, starting with `ws://` or `wss://`). Some of them may have more than one URL for each stream, depending on the feed in question.
Exchanges' Streaming APIs can be classified into two different categories:
* *sub* or *subscribe* allows receiving only
* *pub* or *publish* allows sending and receiving
### Sub [#sub]
A *sub* interface usually allows to subscribe to a stream of data and listen for it. Most of exchanges that do support WebSockets will offer a *sub* type of API only. The *sub* type includes streaming public market data. Sometimes exchanges also allow subcribing to private user data. After the user subscribes to a data feed the channel effectively starts working one-way sending updates from the exchange towards the user continuously.
Commonly appearing types of public data streams:
* order book (most common) - updates on added, edited and deleted orders (aka *change deltas*)
* ticker updates upon changing of 24 hour stats
* fills feed (also common) - a live stream of public trades
* ohlcv candlestick feed
* heartbeat
* exchange chat/trollbox
Less common types of private user data streams:
* the stream of private trades of the user
* live order updates
* balance updates
* custom streams
* exchange-specific and other streams
### Pub [#pub]
A *pub* interface usually allows users to send data requests towards the server. This usually includes common user actions, like:
* placing orders
* canceling orders
* placing withdrawal requests
* posting chat/trollbox messages
* etc
**Some exchanges do not offer a *pub* WS API, they will offer *sub* WS API only.** However, there are exchanges that have a complete Streaming API as well. In most cases a user cannot operate effectively having just the Streaming API. Exchanges will stream public market data *sub*, and the REST API is still needed for the *pub* part where missing.
### unWatch [#unwatch]
Each `watchX` method establishes a subscription with a stream and will continuously get updates from the exchange. Even if you stop getting the return value from the `watchX` method, the stream will keep sending that, which is handled and stored in the background. To stop those background subscriptions, you should use `unWatch` method (eg. `watchTrades` -> `unWatchTrades`).
### Incremental Data Structures [#incremental-data-structures]
In many cases due to a unidirectional nature of the underlying data feeds, the application listening on the client-side has to keep a local snapshot of the data in memory and merge the updates received from the exchange server into the local snapshot. The updates coming from the exchange are also often called *deltas*, because in most cases those updates will contain just the changes between two states of the data and will not include the data that has not changed making it necessary to store the locally cached current state S of all relevant data objects.
All of that functionality is handled by CCXT Pro for the user. To work with CCXT Pro, the user does not have to track or manage subscriptions and related data. CCXT Pro will keep a cache of structures in memory to handle the underlying hassle.
Each incoming update says which parts of the data have changed and the receiving side "increments" local state S by merging the update on top of current state S and moves to next local state S'. In terms of CCXT Pro that is called *"incremental state"* and the structures involved in the process of storing and updating the cached state are called *"incremental structures"*. CCXT Pro introduces several new base classes to handle the incremental state where necessary.
The incremental structures returned from the unified methods of CCXT Pro are often one of two types:
1. JSON-decoded object (`object` in JavaScript, `dict` in Python, `array()` in PHP). This type may be returned from public and private methods like `watchOrderBook`, `watchTicker`, `watchBalance`, `watchOrder`, etc.
2. An array/list of objects (usually sorted in chronological order). This type may be returned from methods like `watchOHLCV`, `watchTrades`, `watchMyTrades`, `watchOrders`, etc.
The unified methods returning arrays like `watchOHLCV`, `watchTrades`, `watchMyTrades`, `watchOrders`, are based on the caching layer. The user has to understand the inner workings of the caching layer to work with it efficiently.
The cache is a fixed-size deque aka array/list with two ends. The CCXT Pro library has a reasonable limit on the number of objects stored in memory. By default the caching array structures will store up to 1000 entries of each type (1000 most recent trades, 1000 most recent candles, 1000 most recent orders). The allowed maximum number can be configured by the user upon instantiation or later:
```python
ccxtpro.binance({
'options': {
'tradesLimit': 1000,
'OHLCVLimit': 1000,
'ordersLimit': 1000,
},
})
# or
exchange.options['tradesLimit'] = 1000
exchange.options['OHLCVLimit'] = 1000
exchange.options['ordersLimit'] = 1000
```
The cache limits have to be set prior to calling any watch-methods and cannot change during a program run.
When there is space left in the cache, new elements are simply appended to the end of it. If there's not enough room to fit a new element, the oldest element is deleted from the beginning of the cache to free some space. Thus, for example, the cache grows from 0 to 1000 most recent trades and then stays at 1000 most recent trades max, constantly renewing the stored data with each new update incoming from the exchange. It reminds a sliding frame window or a sliding door, that looks like shown below:
```
past > ------------------ > time > - - - - - - - - > future
sliding frame
of 1000 most
recent trades
+-----------------+
| |
|===========+=====|
+----------------+------| | | - - - - - + - - - - - - - - + - - -
| | | | | | |
0 1000 | 2000 | 3000 4000 ...
| | | | | | |
+----------------+------| | | - - - - - + - - - - - - - - + - - -
|===========+=====|
| |
+---+---------+---+
| |
since ^ ^ limit
date-based pagination arguments
are always applied
within the cached frame
```
The user can configure the cache limits using the `exchange.options` as was shown above. Do not confuse the cache limits with the pagination limit.
**Note, that the `since` and `limit` [date-based pagination](/docs/manual#date-based-pagination) params have a different meaning and are always applied within the cached window!** If the user specifies a `since` argument to the `watchTrades()` call, CCXT Pro will return all cached trades having `timestamp >= since`. If the user does not specify a `since` argument, CCXT pro will return cached trades from the beginning of the sliding window. If the user specifies a `limit` argument, the library will return up to `limit` candles starting from `since` or from the beginning of the cache. For that reason the user cannot paginate beyond the cached frame due to the WebSocket real-time specifics.
```python
exchange.options['tradesLimit'] = 5 # set the size of the cache to 5
# this call will return up to 5 cached trades
await exchange.watchTrades (symbol)
# the following call will return the first 2 of up to 5 cached trades
await exchange.watchTrades (symbol, since=None, limit=2)
# this call will first filter cached trades by trade['timestamp'] >= since
# and will return the first 2 of up to 5 cached trades that pass the filter
since = exchange.iso8601('2020-01-01T00:00:00Z')
limit = 2
await exchange.watchTrades (symbol, since, limit)
```
#### newUpdates mode [#newupdates-mode]
If you want to always get just the most recent trade, **you should instantiate the exchange with the newUpdates flag set to true**.
```python
exchange = ccxtpro.binance({'newUpdates': True})
while True:
trades = await exchange.watchTrades (symbol)
print(trades)
```
The newUpdates mode continues to utilize the sliding cache in the background, but the user will only be given the new updates. This is because some exchanges use incremental structures, so we need to keep a cache of objects as the exchange may only provide partial information such as status updates.
The result from the newUpdates mode will be one or more updates that have occurred since the last time `exchange.watchMethod` resolved. CCXT Pro can return one or more orders that were updated since the previous call. The result of calling `exchange.watchOrders` will look like shown below:
```javascript
[
order, // see /docs/manual#order-structure
order,
order,
...
]
```
*Deprecation Warning*: in the future `newUpdates: true` will be the default mode and you will have to set newUpdates to false to get the sliding cache.
JavaScript
Python
PHP
C#/.NET
Go
Java
```javascript
const ccxtpro = require ('ccxt').pro
console.log ('CCXT version', ccxtpro.version)
console.log ('Supported exchanges:', ccxtpro.exchanges)
```
```python
import ccxt.pro as ccxtpro
print('CCXT version', ccxtpro.__version__)
print('Supported exchanges:', ccxtpro.exchanges)
```
```php
use \ccxt\pro; // optional, since you can use fully qualified names
echo 'CCXT version ', \ccxt\pro\Exchange::VERSION, "\n";
echo 'Supported exchanges: ', json_encode(\ccxt\pro\Exchange::$exchanges), "\n";
```
```c#
using ccxt;
using ccxt.pro;
Console.WriteLine("CCXT version " + ccxt.Exchange.ccxtVersion);
```
```go
import (
"fmt"
ccxtpro "github.com/ccxt/ccxt/go/v4/pro"
)
fmt.Println("CCXT version", ccxtpro.Version)
```
```java
import io.github.ccxt.exchanges.pro.Binance;
// Pro exchange classes are in the io.github.ccxt.exchanges.pro package
```
The imported CCXT Pro module wraps the CCXT inside itself – every exchange instantiated via CCXT Pro has all the CCXT methods as well as the additional functionality.
## Instantiation [#instantiation]
CCXT Pro is designed for async/await style syntax and relies heavily on async primitives such as *promises* and *futures*.
Creating a CCXT Pro exchange instance is pretty much identical to creating a CCXT exchange instance.
JavaScript
```javascript
const ccxt = require ('ccxt').pro
const exchange = new ccxtpro.binance ({ newUpdates: false })
```
#### **Python** [#python]
The Python implementation of CCXT Pro relies on builtin [asyncio](https://docs.python.org/3/library/asyncio.html) and [Event Loop](https://docs.python.org/3/library/asyncio-eventloop.html) in particular. In Python it is possible to supply an asyncio's event loop instance in the constructor arguments as shown below (identical to `ccxt.async support`):
```python
import ccxt.pro as ccxtpro
from asyncio import run
async def main():
exchange = ccxtpro.kraken({'newUpdates': False})
while True:
orderbook = await exchange.watch_order_book('BTC/USD')
print(orderbook['asks'][0], orderbook['bids'][0])
await exchange.close()
run(main())
```
#### **PHP** [#php]
In PHP the async primitives are borrowed from [ReactPHP](https://reactphp.org). The PHP implementation of CCXT Pro relies on [Promise](https://github.com/reactphp/promise) and [EventLoop](https://github.com/reactphp/event-loop) in particular. In PHP the user is required to supply a ReactPHP's event loop instance in the constructor arguments as shown below:
```php
error_reporting(E_ALL);
date_default_timezone_set('UTC');
require_once 'vendor/autoload.php';
$exchange = new \ccxt\pro\kucoin(array( 'newUpdates' => false ));
```
C#/Dotnet
Go
Java
```c#
using ccxt.pro;
public async static Task Watch()
{
var exchange = new binance();
while (true)
{
var trades = await exchange.WatchTrades("BTC/USDT");
Console.WriteLine("Trades: " + JsonConvert.SerializeObject(trades, Formatting.Indented));
}
}
```
```go
import (
"fmt"
ccxtpro "github.com/ccxt/ccxt/go/v4/pro"
)
exchange := ccxtpro.NewBinance(map[string]interface{}{
"newUpdates": false,
})
defer exchange.Close()
for {
orderbook, err := exchange.WatchOrderBook("BTC/USDT")
if err != nil {
fmt.Println(err)
break
}
fmt.Println(orderbook.Asks[0], orderbook.Bids[0])
}
```
```java
import io.github.ccxt.exchanges.pro.Binance;
import io.github.ccxt.types.Ticker;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
Binance exchange = new Binance();
exchange.loadMarkets(false);
// Sync: blocks until next update
while (true) {
Ticker ticker = exchange.watchTicker("BTC/USDT");
System.out.println(ticker.last);
}
// Or async: returns CompletableFuture — composable, supports timeouts
CompletableFuture next = exchange.watchTickerAsync("BTC/USDT", null);
Ticker tick = next.get(30, TimeUnit.SECONDS);
```
## Exchange Properties [#exchange-properties]
Every CCXT Pro instance contains all properties of the underlying CCXT instance. Apart from the standard CCXT properties, the CCXT Pro instance includes the following:
```javascript
{
'has': { // an associative array of extended exchange capabilities
'ws': true, // only available in CCXT Pro
'watchOrderBook': true,
'watchTicker': true,
'watchTickers': true,
'watchTrades': true,
'watchMyTrades': true,
'watchOHLCV': true,
'watchBalance': true,
'watchPositions': true,
'createOrderWs': true,
'editOrderWs': true,
'cancelOrderWs': true,
'cancelOrdersWs': false,
'cancelAllOrdersWs': true,
'fetchOrderWs': true,
'fetchOrdersWs': true,
'fetchBalanceWs': true,
'fetchMyTradesWs': true,
...
},
'urls': {
'api': { // will contain a streaming API base URL, depending on the underlying protocol
'ws': 'wss://ws.exchange.com', // https://en.wikipedia.org/wiki/WebSocket
'signalr': 'https://signalr.exchange.com' // https://en.wikipedia.org/wiki/SignalR
'socketio': 'wss://socket.exchange.io' // https://socket.io
},
},
'version': '1.21',
'streaming': {
'keepAlive': 30000, // integer keep-alive rate in milliseconds
'maxPingPongMisses': 2.0, // how many ping pong misses to drop and reconnect
... // other streaming options
},
// incremental data structures
'orderbooks': {}, // incremental order books indexed by symbol
'ohlcvs': {}, // standard CCXT OHLCVs indexed by symbol by timeframe
'balance': {}, // a standard CCXT balance structure, accounts indexed by currency code
'orders': {}, // standard CCXT order structures indexed by order id
'trades': {}, // arrays of CCXT trades indexed by symbol
'tickers': {}, // standard CCXT tickers indexed by symbol
'transactions': {}, // standard CCXT deposits and withdrawals indexed by id or txid
...
}
```
## Unified API [#unified-api]
The Unified CCXT Pro API encourages direct control flow for better codestyle, more readable and architecturally superior code compared to using EventEmitters and callbacks. The latter is considered an outdated approach nowadays since it requires inversion of control (people aren't used to inverted thinking).
CCXT Pro goes with the modern approach and it is designed for the async syntax. Under the hood, CCXT Pro will still have to use inverted control flow sometimes because of the dependencies and the WebSocket libs that can't do otherwise.
The same is true not only for JS/ES6 but also for Python 3 async code as well. In PHP the async primitives are borrowed from [ReactPHP](https://reactphp.org/).
Modern async syntax allows you to combine and split the execution into parallel pathways and then merge them, group them, prioritize them, and what not. With promises one can easily convert from direct async-style control flow to inverted callback-style control flow, back and forth.
### Real-Time vs Throttling [#real-time-vs-throttling]
CCXT Pro supports two modes of tick function loops – the real-time mode and the throttling mode. Both of them are shown below in pseudocode:
```javascript
// real-time mode
const limit = 5 // optional
while (true) {
try {
const orderbook = await exchange.watchOrderBook (symbol, limit)
// your reaction to the update takes place here
// you arrive here after receiving the update from the exchange in real time
console.log (orderbook) // every update
} catch (e) {
console.log (e)
// throw e // uncomment to stop the loop on exceptions
}
}
```
```javascript
// throttling mode
const limit = 5 // optional
// await is optional, alternatively you can launch it in bg without await
await exchange.watchOrderBook (symbol, limit)
while (true) {
// your reaction takes place here
// you arrive here every 100 ms regardless of whether there was an update or not
// in throttling mode offloading the orderbook with .limit () is required
console.log (exchange.orderbooks[symbol].limit (limit))
await exchange.sleep (100) // every 100 ms
}
```
In **real-time mode** CCXT Pro will return the result as soon as each new delta arrives from the exchange. The general logic of a unified call in a real-time loop is to await for the next delta and immediately return the unified result structure to the user, over and over again. This is useful when reaction time is critical, or has to be as fast as possible.
However, the real-time mode requires programming experience with async flows when it comes to synchronizing multiple parallel tick loops. Apart from that, the exchanges can stream a very large number of updates during periods of high activity or high volatility. Therefore the user developing a real-time algorithm has to make sure that the userland code is capable of consuming data that fast. Working in real-time mode may be more demanding for resources sometimes.
In **throttling mode** CCXT Pro will receive and manage the data in the background. The user is responsible for calling the results from time to time when necessary. The general logic of the throttling loop is to sleep for most of the time and wake up to check the results occasionally. This is usually done at some fixed frequency, or, *"frame rate"*. The code inside a throttling loop is often easier to synchronize across multiple exchanges. The rationing of time spent in a throttled loop also helps reduce resource usage to a minimum. This is handy when your algorithm is heavy and you want to control the execution precisely to avoid running it too often.
The obvious downside of the throttling mode is being less reactive or responsive to updates. When a trading algorithm has to wait some number milliseconds before being executed – an update or two may arrive sooner than that time expires. In throttling mode the user will only check for those updates upon next wakeup (loop iteration), so the reaction lag may vary within some number of milliseconds over time.
## Public Methods [#public-methods]
### watchOrderBook [#watchorderbook]
The `watchOrderBook`'s interface is identical to [fetchOrderBook](/docs/manual#order-book). It accepts three arguments:
* `symbol` – string, a unified CCXT symbol, required
* `limit` – integer, the max number of bids/asks returned, optional
* `params` – assoc dictionary, optional overrides as described in [Overriding Unified API Params](/docs/manual#overriding-unified-api-params)
In general, the exchanges can be divided in two categories:
1. the exchanges that support limited orderbooks (streaming just the top part of the stack of orders)
2. the exchanges that stream full orderbooks only
If the exchange accepts a limiting argument, the `limit` argument is sent towards the exchange upon subscribing to the orderbook stream over a WebSocket connection. The exchange will then send only the specified amount of orders which helps reduce the traffic. Some exchanges may only accept certain values of `limit`, like 10, 25, 50, 100 and so on.
If the underlying exchange does not accept a limiting argument, the limiting is done on the client side.
The `limit` argument does not guarantee that the number of bids or asks will always be equal to `limit`. It designates the upper boundary or the maximum, so at some moment in time there may be less than `limit` bids or asks, but never more than `limit` bids or asks. This is the case when the exchange does not have enough orders on the orderbook, or when one of the top orders in the orderbook gets matched and removed from the orderbook, leaving less than `limit` entries on either bids side or asks side. The free space in the orderbook usually gets quickly filled with new data.
JavaScript
Python
PHP
C#/.NET
Go
Java
```javascript
if (exchange.has['watchOrderBook']) {
while (true) {
try {
const orderbook = await exchange.watchOrderBook (symbol, limit, params)
console.log (new Date (), symbol, orderbook['asks'][0], orderbook['bids'][0])
} catch (e) {
console.log (e)
// stop the loop on exception or leave it commented to retry
// throw e
}
}
}
```
```python
if exchange.has['watchOrderBook']:
while True:
try:
orderbook = await exchange.watch_order_book(symbol, limit, params)
print(exchange.iso8601(exchange.milliseconds()), symbol, orderbook['asks'][0], orderbook['bids'][0])
except Exception as e:
print(e)
# stop the loop on exception or leave it commented to retry
# raise e
```
```php
if ($exchange->has['watchOrderBook']) {
$exchange::execute_and_run(function() use ($exchange, $symbol, $limit, $params) {
while (true) {
try {
$orderbook = yield $exchange->watch_order_book($symbol, $limit, $params);
echo date('c'), ' ', $symbol, ' ', json_encode(array($orderbook['asks'][0], $orderbook['bids'][0])), "\n";
} catch (Exception $e) {
echo get_class($e), ' ', $e->getMessage(), "\n";
}
}
});
}
```
```c#
if ((bool)exchange.has["watchOrderBook"])
{
while (true)
{
try
{
var orderbook = await exchange.WatchOrderBook(symbol);
Console.WriteLine(orderbook["symbol"] + " " + orderbook.asks + " " + orderbook.bids);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
```
```go
for {
orderbook, err := exchange.WatchOrderBook(symbol)
if err != nil {
fmt.Println(err)
break
}
fmt.Println(orderbook.Asks[0], orderbook.Bids[0])
}
```
```java
import io.github.ccxt.types.OrderBook;
Binance exchange = new Binance();
exchange.loadMarkets(false);
while (true) {
try {
OrderBook orderbook = exchange.watchOrderBook(symbol);
System.out.println(orderbook.bids.get(0));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
```
#### watchOrderBookForSymbols [#watchorderbookforsymbols]
Similar to `watchOrderBook` but accepts an array of symbols so you can subscribe to multiple orderbooks in a single message.
JavaScript
Python
```javascript
if (exchange.has['watchOrderBookForSymbols']) {
while (true) {
try {
const orderbook = await exchange.watchOrderBookForSymbols (['BTC/USDT', 'LTC/USDT'], limit, params)
console.log (new Date (), symbol, orderbook['asks'][0], orderbook['bids'][0])
} catch (e) {
console.log (e)
// stop the loop on exception or leave it commented to retry
// throw e
}
}
}
```
```python
if exchange.has['watchOrderBookForSymbols']:
while True:
try:
orderbook = await exchange.watchOrderBookForSymbols(['BTC/USDT', 'LTC/USDT'], limit, params)
print(exchange.iso8601(exchange.milliseconds()), symbol, orderbook['asks'][0], orderbook['bids'][0])
except Exception as e:
print(e)
# stop the loop on exception or leave it commented to retry
# raise e
```
### watchTicker [#watchticker]
Some exchanges allow different topics to listen to tickers (ie: bookTicker). You can set this in `exchange.options['watchTicker']['name']`
```javascript
// JavaScript
if (exchange.has['watchTicker']) {
while (true) {
try {
const ticker = await exchange.watchTicker (symbol, params)
console.log (new Date (), ticker)
} catch (e) {
console.log (e)
// stop the loop on exception or leave it commented to retry
// throw e
}
}
}
```
```python
# Python
if exchange.has['watchTicker']:
while True:
try:
ticker = await exchange.watch_ticker(symbol, params)
print(exchange.iso8601(exchange.milliseconds()), ticker)
except Exception as e:
print(e)
# stop the loop on exception or leave it commented to retry
# raise e
```
PHP
C#/.NET
Go
Java
```php
if ($exchange->has['watchTicker']) {
$exchange::execute_and_run(function() use ($exchange, $symbol, $params) {
while (true) {
try {
$ticker = yield $exchange->watch_ticker($symbol, $params);
echo date('c'), ' ', json_encode($ticker), "\n";
} catch (Exception $e) {
echo get_class($e), ' ', $e->getMessage(), "\n";
}
}
});
}
```
```c#
if ((bool)exchange.has["watchTicker"])
{
while (true)
{
try
{
var ticker = await exchange.WatchTicker(symbol, parameters);
Console.WriteLine(ticker.last);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
```
```go
for {
ticker, err := exchange.WatchTicker(symbol)
if err != nil {
fmt.Println(err)
break
}
fmt.Println(ticker.Last)
}
```
```java
while (true) {
Object ticker = exchange.watchTicker(symbol).get(30, TimeUnit.SECONDS);
System.out.println(ticker);
}
```
### watchTickers [#watchtickers]
JavaScript
Python
PHP
C#/.NET
Go
Java
```javascript
if (exchange.has['watchTickers']) {
while (true) {
try {
const tickers = await exchange.watchTickers (symbols, params)
console.log (new Date (), tickers)
} catch (e) {
console.log (e)
// stop the loop on exception or leave it commented to retry
// throw e
}
}
}
```
```python
if exchange.has['watchTickers']:
while True:
try:
tickers = await exchange.watch_tickers(symbols, params)
print(exchange.iso8601(exchange.milliseconds()), tickers)
except Exception as e:
print(e)
# stop the loop on exception or leave it commented to retry
# raise e
```
```php
if ($exchange->has['watchTickers']) {
$exchange::execute_and_run(function() use ($exchange, $symbols, $params) {
while (true) {
try {
$tickers = yield $exchange->watch_tickers($symbols, $params);
echo date('c'), ' ', json_encode($tickers), "\n";
} catch (Exception $e) {
echo get_class($e), ' ', $e->getMessage(), "\n";
}
}
});
}
```
```c#
if ((bool)exchange.has["watchTickers"])
{
while (true)
{
try
{
var tickers = await exchange.WatchTickers(symbols, parameters);
Console.WriteLine(tickers.tickers.Count + " tickers");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
```
```go
for {
tickers, err := exchange.WatchTickers(ccxt.WithWatchTickersSymbols(symbols))
if err != nil {
fmt.Println(err)
break
}
fmt.Println(len(tickers.Tickers))
}
```
```java
while (true) {
Object tickers = exchange.watchTickers(symbols).get(30, TimeUnit.SECONDS);
System.out.println(tickers);
}
```
### watchOHLCV [#watchohlcv]
A very common misconception about WebSockets is that WS OHLCV streams can somehow speed up a trading strategy.
If the purpose of your app is to implement OHLCV-trading or a speculative algorithmic strategy, **consider the following carefully**.
In general, there's two types of trading data used in the algorithms:
* 1st-order real-time data like orderbooks and trades
* 2nd-order non-real-time data like tickers, ohlcvs, etc
When developers say *"real-time"*, that usually means pseudo real-time, or, put simply, *"as fast and as close to real time as possible"*.
The 2nd-order data is **always** calculated from the 1st-order data. OHLCVs are calculated from aggregated trades. Tickers are calculated from trades and orderbooks.
Some exchanges do the calculation of OHLCVs (2nd order data) for you on the exchange side and send you updates over WS (Binance). Other exchanges don't really think that is necessary, for a reason.
Obviously, it takes time to calculate 2nd-order OHLCV candles from trades. Apart from that sending the calculated candle back to all connected users also takes time. Additional delays can happen during periods of high volatility if an exchange is traded very actively under high load.
There is no strict guarantee on how much time it will take from the exchange to calculate the 2nd order data and stream it to you over WS. The delays and lags on OHLCV candles can vary significantly from exchange to exchange. For example, an exchange can send an OHLCV update \~30 seconds after the actual closing of a corresponding period. Other exchanges may send the current OHLCV updates at a regular intervals (say, once every 100ms), while in reality trades can happen much more frequently.
Most people use WS to avoid any sorts of delays and have real-time data. So, in most cases it is much better to not wait for the exchange. Recalculating the 2nd order data from 1st order data on your own may be much faster and that can lower the unnecessary delays. Therefore it does not make much sense to use WS for watching just the OHLCV candles from the exchange. Developers would rather `watch_trades()` instead and recalculate the OHLCV candles using CCXT's built-in methods like `build_ohlcvc()`.
```python
# Python
exchange = ccxtpro.binance()
if not exchange.has['watchOHLCV']:
while True:
try:
trades = await exchange.watch_trades(symbol)
ohlcvc = exchange.build_ohlcvc(trades, '1m')
print(ohlcvc)
except Exception as e:
print(e)
# stop the loop on exception or leave it commented to retry
# raise e
```
That explains why some exchanges reasonably think that OHLCVs are not necessary in the WS context, cause users can calculate that information in the userland much faster having just a WS stream of realtime 1st-order trades.
If your application is not very time-critical, you can still subscribe to OHLCV streams, for charting purposes. If the underlying `exchange.has['watchOHLCV']`, you can `watchOHLCV()/watch_ohlcv()` as shown below:
JavaScript
Python
PHP
C#/.NET
Go
Java
```javascript
if (exchange.has['watchOHLCV']) {
while (true) {
try {
const candles = await exchange.watchOHLCV (symbol, timeframe, since, limit, params)
console.log (new Date (), candles)
} catch (e) {
console.log (e)
// stop the loop on exception or leave it commented to retry
// throw e
}
}
}
```
```python
if exchange.has['watchOHLCV']:
while True:
try:
candles = await exchange.watch_ohlcv(symbol, timeframe, since, limit, params)
print(exchange.iso8601(exchange.milliseconds()), candles)
except Exception as e:
print(e)
# stop the loop on exception or leave it commented to retry
# raise e
```
```php
if ($exchange->has['watchOHLCV']) {
$exchange::execute_and_run(function() use ($exchange, $symbol, $timeframe, $since, $limit, $params) {
while (true) {
try {
$candles = yield $exchange->watch_ohlcv($symbol, $timeframe, $since, $limit, $params);
echo date('c'), ' ', $symbol, ' ', $timeframe, ' ', json_encode($candles), "\n";
} catch (Exception $e) {
echo get_class($e), ' ', $e->getMessage(), "\n";
}
}
});
}
```
```c#
if ((bool)exchange.has["watchOHLCV"])
{
while (true)
{
try
{
var candles = await exchange.WatchOHLCV(symbol, timeframe);
Console.WriteLine(candles.Count + " candles");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
```
```go
for {
candles, err := exchange.WatchOHLCV(symbol)
if err != nil {
fmt.Println(err)
break
}
fmt.Println(len(candles))
}
```
```java
while (true) {
Object ohlcv = exchange.watchOHLCV(symbol, "1m").get(30, TimeUnit.SECONDS);
System.out.println(ohlcv);
}
```
### watchOHLCVForSymbols [#watchohlcvforsymbols]
Similar to `watchOHLCV` but allows multiple subscriptions of symbols and timeframes
JavaScript
Python
PHP
C#/.NET
Go
Java
```javascript
if (exchange.has['watchOHLCVForSymbols']) {
while (true) {
try {
const subscriptions = [[
['BTC/USDT', '1d'],
['LTC/USDT', '5m'],
['ETH/USDT', '1h']
]]
const candles = await exchange.watchOHLCVForSymbols (subscriptions, since, limit, params)
console.log (new Date (), candles)
} catch (e) {
console.log (e)
// stop the loop on exception or leave it commented to retry
// throw e
}
}
}
```
```python
if exchange.has['watchOHLCVForSymbols']:
while True:
try:
subscriptions = [[
['BTC/USDT', '1d'],
['LTC/USDT', '5m'],
['ETH/USDT', '1h']
]]
candles = await exchange.watch_ohlcv_for_symbols(subscriptions, since, limit, params)
print(exchange.iso8601(exchange.milliseconds()), candles)
except Exception as e:
print(e)
# stop the loop on exception or leave it commented to retry
# raise e
```
```php
if ($exchange->has['watchOHLCVForSymbols']) {
$exchange::execute_and_run(function() use ($exchange, $since, $limit, $params) {
while (true) {
try {
$subscriptions = array(
array('BTC/USDT', '1d'),
array('LTC/USDT', '5m'),
array('ETH/USDT', '1h'),
);
$candles = yield $exchange->watch_ohlcv_for_symbols($subscriptions, $since, $limit, $params);
echo date('c'), ' ', json_encode($candles), "\n";
} catch (Exception $e) {
echo get_class($e), ' ', $e->getMessage(), "\n";
}
}
});
}
```
```c#
if ((bool)exchange.has["watchOHLCVForSymbols"])
{
var subscriptions = new List>() {
new List() { "BTC/USDT", "1d" },
new List() { "LTC/USDT", "5m" },
new List() { "ETH/USDT", "1h" },
};
while (true)
{
try
{
var candles = await exchange.WatchOHLCVForSymbols(subscriptions);
Console.WriteLine(candles.Count + " symbols");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
```
```go
subscriptions := [][]string{
{"BTC/USDT", "1d"},
{"LTC/USDT", "5m"},
{"ETH/USDT", "1h"},
}
for {
candles, err := exchange.WatchOHLCVForSymbols(subscriptions)
if err != nil {
fmt.Println(err)
break
}
fmt.Println(len(candles))
}
```
```java
while (true) {
Object ohlcv = exchange.watchOHLCVForSymbols(symbols, "1m").get(30, TimeUnit.SECONDS);
System.out.println(ohlcv);
}
```
### watchTrades [#watchtrades]
JavaScript
Python
PHP
C#/.NET
Go
Java
```javascript
// JavaScript
if (exchange.has['watchTrades']) {
while (true) {
try {
const trades = await exchange.watchTrades (symbol, since, limit, params)
console.log (new Date (), trades)
} catch (e) {
console.log (e)
// stop the loop on exception or leave it commented to retry
// throw e
}
}
}
```
```python
if exchange.has['watchTrades']:
while True:
try:
trades = await exchange.watch_trades(symbol, since, limit, params)
print(exchange.iso8601(exchange.milliseconds()), trades)
except Exception as e:
print(e)
# stop the loop on exception or leave it commented to retry
# raise e
```
```php
if ($exchange->has['watchTrades']) {
$exchange::execute_and_run(function() use ($exchange, $symbol, $since, $limit, $params) {
while (true) {
try {
$trades = yield $exchange->watch_trades($symbol, $since, $limit, $params);
echo date('c'), ' ', json_encode($trades), "\n";
} catch (Exception $e) {
echo get_class($e), ' ', $e->getMessage(), "\n";
}
}
});
}
```
```c#
if ((bool)exchange.has["watchTrades"])
{
while (true)
{
try
{
var trades = await exchange.WatchTrades(symbol);
Console.WriteLine(trades.Count + " trades");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
```
```go
for {
trades, err := exchange.WatchTrades(symbol)
if err != nil {
fmt.Println(err)
break
}
fmt.Println(len(trades))
}
```
```java
while (true) {
Object trades = exchange.watchTrades(symbol).get(30, TimeUnit.SECONDS);
System.out.println(trades);
}
```
### watchTradesForSymbols [#watchtradesforsymbols]
Similar to `watchTrades` but allows subscribing to multiple symbols in a single call.
JavaScript
Python
PHP
C#/.NET
Go
Java
```javascript
if (exchange.has['watchTradesForSymbols']) {
while (true) {
try {
const trades = await exchange.watchTradesForSymbols (['LTC/USDT', 'BTC/USDT'], since, limit, params)
console.log (new Date (), trades)
} catch (e) {
console.log (e)
// stop the loop on exception or leave it commented to retry
// throw e
}
}
}
```
```python
if exchange.has['watchTradesForSymbols']:
while True:
try:
trades = await exchange.watchTradesForSymbols(['LTC/USDT', 'BTC/USDT'], since, limit, params)
print(exchange.iso8601(exchange.milliseconds()), trades)
except Exception as e:
print(e)
# stop the loop on exception or leave it commented to retry
# raise e
```
```php
if ($exchange->has['watchTradesForSymbols']) {
$exchange::execute_and_run(function() use ($exchange, $since, $limit, $params) {
while (true) {
try {
$trades = yield $exchange->watch_trades_for_symbols(array('LTC/USDT', 'BTC/USDT'), $since, $limit, $params);
echo date('c'), ' ', json_encode($trades), "\n";
} catch (Exception $e) {
echo get_class($e), ' ', $e->getMessage(), "\n";
}
}
});
}
```
```c#
if ((bool)exchange.has["watchTradesForSymbols"])
{
var symbols = new List() { "LTC/USDT", "BTC/USDT" };
while (true)
{
try
{
var trades = await exchange.WatchTradesForSymbols(symbols);
Console.WriteLine(trades.Count + " trades");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
```
```go
symbols := []string{"LTC/USDT", "BTC/USDT"}
for {
trades, err := exchange.WatchTradesForSymbols(symbols)
if err != nil {
fmt.Println(err)
break
}
fmt.Println(len(trades))
}
```
```java
while (true) {
Object trades = exchange.watchTradesForSymbols(symbols).get(30, TimeUnit.SECONDS);
System.out.println(trades);
}
```
## Private Methods [#private-methods]
In most cases the authentication logic is borrowed from CCXT since the exchanges use the same keypairs and signing algorithms for REST APIs and WebSocket APIs. See [API Keys Setup](/docs/manual#api-keys-setup) for more details.
### watchBalance [#watchbalance]
JavaScript
Python
PHP
C#/.NET
Go
Java
```javascript
if (exchange.has['watchBalance']) {
while (true) {
try {
const balance = await exchange.watchBalance (params)
console.log (new Date (), balance)
} catch (e) {
console.log (e)
// stop the loop on exception or leave it commented to retry
// throw e
}
}
}
```
```python
if exchange.has['watchBalance']:
while True:
try:
balance = await exchange.watch_balance(params)
print(exchange.iso8601(exchange.milliseconds()), balance)
except Exception as e:
print(e)
# stop the loop on exception or leave it commented to retry
# raise e
```
```php
if ($exchange->has['watchBalance']) {
$exchange::execute_and_run(function() use ($exchange, $params) {
while (true) {
try {
$balance = yield $exchange->watch_balance($params);
echo date('c'), ' ', json_encode($balance), "\n";
} catch (Exception $e) {
echo get_class($e), ' ', $e->getMessage(), "\n";
}
}
});
}
```
```c#
if ((bool)exchange.has["watchBalance"])
{
while (true)
{
try
{
var balance = await exchange.WatchBalance();
Console.WriteLine(balance);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
```
```go
for {
balance, err := exchange.WatchBalance()
if err != nil {
fmt.Println(err)
break
}
fmt.Println(balance)
}
```
```java
while (true) {
Object balance = exchange.watchBalance().get(30, TimeUnit.SECONDS);
System.out.println(balance);
}
```
### watchOrders [#watchorders]
JavaScript
Python
PHP
C#/.NET
Go
Java
```javascript
watchOrders (symbol = undefined, since = undefined, limit = undefined, params = {})
```
```python
watch_orders(symbol=None, since=None, limit=None, params={})
```
```php
watch_orders($symbol = null, $since = null, $lmit = null, $params = array());
```
```c#
public async Task> WatchOrders(string symbol = null, Int64? since2 = 0, Int64? limit2 = 0, Dictionary parameters = null)
```
```go
func (this *Binance) WatchOrders(options ...ccxt.WatchOrdersOptions) ([]ccxt.Order, error)
```
```java
while (true) {
Object orders = exchange.watchOrders(symbol).get(30, TimeUnit.SECONDS);
System.out.println(orders);
}
```
#### Watching Orders Across Multiple Account Types [#watching-orders-across-multiple-account-types]
Some exchanges route order updates through separate user-data streams per account type. On binance, spot, cross margin, isolated margin and portfolio margin each map to their own listenKey and stream — one `watchOrders` subscription per account type, selected via params, run as concurrent tasks:
* **spot** — the default: `watchOrders ()`
* **cross margin** — `watchOrders (undefined, undefined, undefined, { 'type': 'margin', 'marginMode': 'cross' })`, shares the spot user-data stream
* **isolated margin** — `watchOrders (symbol, undefined, undefined, { 'marginMode': 'isolated' })`, binance issues a **separate listenKey per symbol**, so a symbol is required and N isolated pairs mean N subscriptions — an exchange design constraint, not a ccxt limit
* **portfolio margin** — `watchOrders (undefined, undefined, undefined, { 'portfolioMargin': true })`
Each subscription keeps its own stream and resolves into the shared orders cache. A multi-account setup is a set of concurrent per-account loops, see [https://github.com/ccxt/ccxt/issues/24737](https://github.com/ccxt/ccxt/issues/24737):
```python
import asyncio
import ccxt.pro as ccxtpro
async def account_loop(exchange, symbol, params):
while True:
orders = await exchange.watch_orders(symbol, params=params)
print(params, orders[-1]['id'], orders[-1]['status'])
async def main():
exchange = ccxtpro.binance({'apiKey': '...', 'secret': '...'})
await exchange.load_markets()
subscriptions = [
(None, {}), # spot
(None, {'type': 'margin', 'marginMode': 'cross'}), # cross margin
('BTC/USDT', {'marginMode': 'isolated'}), # one per isolated pair
('ETH/USDT', {'marginMode': 'isolated'}),
]
await asyncio.gather(*(account_loop(exchange, s, p) for s, p in subscriptions))
asyncio.run(main())
```
### watchMyTrades [#watchmytrades]
JavaScript
Python
PHP
C#/.NET
Go
Java
```javascript
watchMyTrades (symbol = undefined, since = undefined, limit = undefined, params = {})
```
```python
watch_my_trades(symbol=None, since=None, limit=None, params={})
```
```php
watch_my_trades($symbol = null, $since = null, $lmit = null, $params = array());
```
```c#
public async Task> WatchMyTrades(string symbol = null, Int64? since2 = 0, Int64? limit2 = 0, Dictionary parameters = null)
```
```go
func (this *Binance) WatchMyTrades(options ...ccxt.WatchMyTradesOptions) ([]ccxt.Trade, error)
```
```java
while (true) {
Object trades = exchange.watchMyTrades(symbol).get(30, TimeUnit.SECONDS);
System.out.println(trades);
}
```
### watchPositions [#watchpositions]
watch all open positions and returns a list of [position structure](/docs/manual#position-structure)
JavaScript
Python
PHP
C#/.NET
Go
Java
```javascript
watchPositions (symbols = undefined, since = undefined, limit = undefined, params = {})
```
```python
watch_positions(symbols=None, since=None, limit=None, params={})
```
```php
watch_positions($symbols = null, $since = null, $lmit = null, $params = array());
```
```c#
public async Task> WatchPositions(List symbols = null, Int64? since2 = 0, Int64? limit2 = 0, Dictionary parameters = null)
```
```go
func (this *Binance) WatchPositions(options ...ccxt.WatchPositionsOptions) ([]ccxt.Position, error)
```
```java
while (true) {
Object positions = exchange.watchPositions(symbols).get(30, TimeUnit.SECONDS);
System.out.println(positions);
}
```
### createOrderWs [#createorderws]
TypeScript
Python
PHP
C#/.NET
Go
Java
```typescript
createOrderWs (symbol: string, type: OrderType, side: OrderSide, amount: number, price: number = undefined, params = {})
```
```python
create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Optional[float] = None, params={})
```
```php
create_order_ws(string $symbol, string $type, string $side, float $amount, ?float $price = null, $params = array ())
```
```c#
public async Task CreateOrderWs(string symbol, string type, string side, float amount, float? price2 = 0, Dictionary parameters = null)
```
```go
func (this *Binance) CreateOrderWs(symbol string, typeVar string, side string, amount float64, options ...ccxt.CreateOrderWsOptions) (ccxt.Order, error)
```
```java
Object order = exchange.createOrderWs("BTC/USDT", "limit", "buy", 0.001, 50000.0).get(30, TimeUnit.SECONDS);
System.out.println(order);
```
### editOrderWs [#editorderws]
TypeScript
Python
PHP
C#/.NET
Go
Java
```typescript
// JavaScript
editOrderWs (id, symbol: string, type: OrderType, side: OrderSide, amount: number, price: number = undefined, params = {})
```
```python
edit_order_ws(self, id, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Optional[float] = None, params={})
```
```php
edit_order_ws(string id, string $symbol, string $type, string $side, float $amount, ?float $price = null, $params = array ())
```
```c#
public async Task EditOrderWs(string id, string symbol, string type, string side, double? amount2 = 0, double? price2 = 0, Dictionary parameters = null)
```
```go
func (this *Binance) EditOrderWs(id string, symbol string, typeVar string, side string, options ...ccxt.EditOrderWsOptions) (ccxt.Order, error)
```
```java
Object order = exchange.editOrderWs(orderId, "BTC/USDT", "limit", "buy", 0.002, 51000.0).get(30, TimeUnit.SECONDS);
System.out.println(order);
```
### cancelOrderWs [#cancelorderws]
TypeScript
Python
PHP
C#/.NET
Go
Java
```typescript
cancelOrderWs(id: string, symbol: string = undefined, params = {})
```
```python
cancel_order_ws(self, id, symbol: str, params={})
```
```php
cancel_order_ws(string $id, string $symbol, $params = array ())
```
```c#
public async Task CancelOrderWs(string id, string symbol = null, Dictionary parameters = null)
```
```go
func (this *Binance) CancelOrderWs(id string, options ...ccxt.CancelOrderWsOptions) (ccxt.Order, error)
```
```java
Object result = exchange.cancelOrderWs(orderId, "BTC/USDT").get(30, TimeUnit.SECONDS);
System.out.println(result);
```
### cancelOrdersWs [#cancelordersws]
TypeScript
Python
PHP
C#/.NET
Go
Java
```typescript
cancelOrdersWs(ids: string[], symbol: string = undefined, params = {})
```
```python
cancel_orders_ws(self, ids, symbol: str, params={})
```
```php
cancel_orders_ws(string[] $ids, string $symbol, $params = array ())
```
```c#
public async Task> CancelOrdersWs(List ids, string symbol = null, Dictionary parameters = null)
```
```go
func (this *Binance) CancelOrdersWs(ids []string, options ...ccxt.CancelOrdersWsOptions) ([]ccxt.Order, error)
```
```java
Object result = exchange.cancelOrdersWs(orderIds, "BTC/USDT").get(30, TimeUnit.SECONDS);
System.out.println(result);
```
### cancelAllOrdersWs [#cancelallordersws]
TypeScript
Python
PHP
C#/.NET
Go
Java
```typescript
cancelAllOrdersWs(symbol: string = undefined, params = {})
```
```python
cancel_all_orders_ws(self, symbol: str, params={})
```
```php
cancel_all_orders_ws(string $symbol, $params = array ())
```
```c#
public async Task> CancelAllOrdersWs(string symbol = null, Dictionary parameters = null)
```
```go
func (this *Binance) CancelAllOrdersWs(options ...ccxt.CancelAllOrdersWsOptions) ([]ccxt.Order, error)
```
```java
Object result = exchange.cancelAllOrdersWs("BTC/USDT").get(30, TimeUnit.SECONDS);
System.out.println(result);
```
### watchTransactions [#watchtransactions]
```diff
- this method is a work in progress now (may be unavailable)
```
### Custom handler [#custom-handler]
If you want to have an access to raw incoming messages and use your custom handlers, you can override exchange's `handleMessage/handle_message` method, like:
A) By inheritance:
JavaScript
Python
PHP
C#/.NET
```javascript
class myExchange extends ccxt.pro.coinbase {
handleMessage (wsClient, data) {
console.log("Raw incoming message:", message) // this is the raw update
super.handleMessage(wsClient, data);
// your extra logic here
}
}
const ex = new myExchange();
ex.watchTicker('BTC/USDT');
```
```python
class my_exchange(ccxt.pro.coinbase):
def handle_message(self, client, message):
print("Raw incoming message:", message) # this is the raw update
super().handle_message(client, message)
# your extra logic here
async def example():
ex = my_exchange()
await ex.watch_ticker('BTC/USDT')
asyncio.run(example())
```
```php
class myBinance extends \ccxt\pro\binance {
public function __construct($options = array()) {
parent::__construct($options);
}
// your custom handler
public function handle_message($ws, $message) {
parent::handle_message($ws, $message); // trigger original `handleMessage`
if ($your_condition) {
// execute your additional code
}
}
}
$ex = new myBinance();
$ex->watch_ticker('BTC/USDT');
```
```c#
using ccxt.pro;
class MyExchange : ccxt.pro.coinbase
{
public override void handleMessage(WebSocketClient client, object message)
{
Console.WriteLine("Raw incoming message: " + message); // this is the raw update
base.handleMessage(client, message);
// your extra logic here
}
}
var ex = new MyExchange();
await ex.WatchTicker("BTC/USDT");
```
B) by overriding the method:
JavaScript
Python
```javascript
function myHandler(ws, data, orignal_handler){
orignal_handler(ws, data); // trigger original `handleMessage`
if (your_condition) {
// execute your additional code
}
}
const ex = new ccxt.pro.binance();
const original_handler = ex.handleMessage.bind(ex);
ex.handleMessage = (ws, data) => myHandler(ws, data, original_handler);
ex.watchTicker('BTC/USDT');
```
```python
def myHandler(instance, ws, data, original_handle_message):
original_handle_message(ws, data) # trigger original `handleMessage`
if your_condition:
# execute your additional code
async def example():
e = ccxt.pro.binance()
original_handle_message = e.handle_message
e.handle_message = lambda ws, data: myHandler(e, ws, data, original_handle_message)
await e.watch_ticker('BTC/USDT')
asyncio.run(example())
```
### Resource clean-up [#resource-clean-up]
When your script finishes its work with any exchange, you are advised to clean-up the resources:
```python
poloniex = ccxtpro.poloniex()
while(condition):
print(await poloniex.watch_ticker('ETH/USDT'))
# ... your codes
await poloniex.close(True) # close the instance connection when you don't need it anymore, and an extra "True" argument also cleans-up the cached instance data
```
### Error Handling [#error-handling]
In case of an error the CCXT Pro will throw a standard CCXT exception, see [Error Handling](/docs/index#error-handling) for more details.
# CCXT Pro (/docs/pro)
# CCXT Pro [#ccxt-pro]
CCXT supports WebSockets (`Pro` part) for many exchanges.
* [User Manual](/docs/pro-manual)
* [Architecture Overview](/docs/pro-manual#overview)
* [Prerequisites](/docs/pro-manual#prerequisites)
* [Streaming Specifics](/docs/pro-manual#streaming-specifics)
* [Linking](/docs/pro-manual#linking)
* [Instantiation](/docs/pro-manual#instantiation)
* [Exchange Properties](/docs/pro-manual#exchange-properties)
* [Unified API](/docs/pro-manual#unified-api)
* [Public Methods](/docs/pro-manual#public-methods)
* [Market Data](/docs/pro-manual#market-data)
* [`watchOrderBook (symbol, limit, params)`](/docs/pro-manual#watchorderbook)
* [`watchOrderBookForSymbols (symbols, limit, params)`](/docs/pro-manual#watchorderbookforsymbols)
* [`watchTicker (symbol, params)`](/docs/pro-manual#watchticker)
* [`watchTickers (symbols, params)`](/docs/pro-manual#watchtickers)
* [`watchOHLCV (symbol, timeframe, since, limit, params)`](/docs/pro-manual#watchohlcv)
* [`watchOHLCVForSymbols (symbolsAndTimeframes, since, limit, params)`](/docs/pro-manual#watchohlcvforsymbols)
* [`watchTrades (symbol, since, limit, params)`](/docs/pro-manual#watchtrades)
* [`watchTradesForSymbols (symbols, since, limit, params)`](/docs/pro-manual#watchtradesforsymbols)
* [`watchBidsAsks (symbols, params)`](/docs/pro-manual#watchbidsasks)
* [`watchLiquidations (symbol, since, limit, params)`](/docs/pro-manual#watchbidsasks)
* [`watchLiquidationsForSymbols (symbols, since, limit, params)`](/docs/pro-manual#watchforsymbols)
* [Private Methods](/docs/pro-manual#private-methods)
* [Authentication](/docs/pro-manual#authentication)
* [Trading](/docs/pro-manual#trading)
* [`watchBalance (params)`](/docs/pro-manual#watchbalance)
* [`watchOrders (symbol, since, limit, params)`](/docs/pro-manual#watchorders)
* [`watchOrdersForSymbols (symbols, since, limit, params)`](/docs/pro-manual#watchordersforsymbols)
* [`watchPosition (symbol, since, limit, params)`](/docs/pro-manual#watchposition)
* [`watchPositions (symbols, since, limit, params)`](/docs/pro-manual#watchpositions)
* [`watchMyTrades (symbol, since, limit, params)`](https://github.com/ccxt-dev/ccxt/wiki/ccxt.pro/Manual#watchMyTrades)
* [`watchDepositsWithdrawals (code, limit, params)`](/docs/manual#watchdepositswithdrawals)
* [`watchMyLiquidations (symbols, since, limit, params)`](/docs/manual#watchmyliquidations)
* [`watchMyLiquidationsForSymbols (symbols, since, limit, params)`](/docs/manual#watchmyliquidationsforsymbols)
* REST alternatives:
In addition to above methods, some major exchanges also support websocket methods for REST methods, like `createOrderWs` (which has same signature as `createOrder`). You can find them in `exchange.has` dictionary.
* [UnWatch](/docs/pro-manual#unwatch) (for stopping **watch** methods).
* [Error Handling](/docs/pro-manual#error-handling)
* [Troubleshooting](/docs/manual#troubleshooting)
* [How To Submit An Issue](https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-submit-an-issue)
* [Usage Examples](https://github.com/ccxt/ccxt/tree/master/examples)
# Requirements (/docs/requirements)
# CCXT Integration Requirements [#ccxt-integration-requirements]
The exchange is required to implement the following list of methods and structures in order to get integrated with CCXT.
## Public API [#public-api]
#### Exchange Information, Fee Schedule and Trading Rules [#exchange-information-fee-schedule-and-trading-rules]
* [`fetchMarkets`](/docs/manual#loading-markets) – a list of trading pairs and their statuses + [market structure](/docs/manual#market-structure)
* [`fetchCurrencies`](/docs/manual#loading-markets) – a list of tokens or assets and their statuses + [currency structure](/docs/manual#currency-structure)
* `fetchTradingLimits` – min/max order volume, price, cost, precision, etc...
* `fetchTradingFees` – trading fees, either public or personal
* `fetchFundingLimits` – a list of withdrawal limits
#### Market Data [#market-data]
* [`fetchTicker`](/docs/manual#price-tickers) – 24h volumes and stats + [ticker structure](/docs/manual#ticker-structure)
* [`fetchOrderBook`](/docs/manual#order-book) – L2/L3 + [orderbook structure](/docs/manual#order-book-structure)
* [`fetchTrades`](/docs/manual#trades-executions-transactions) – a list of recent public trades + [trade structure](/docs/manual#trade-structure)
* [`fetchOHLCV`](/docs/manual#ohlcv-candlestick-charts) – a list of candles or kline data for traded volumes in different timeframes 1m, 15m, 1h, 1d, ... + [OHLCV structure](/docs/manual#ohlcv-structure)
## Private API [#private-api]
#### Trading [#trading]
* [`fetchBalance`](/docs/manual#querying-account-balance) – for all types of accounts + [balance structure](/docs/manual#balance-structure)
* `fetchAccounts` – required if the exchange has multiple accounts or sub-accounts
* [`createOrder`](/docs/manual#placing-orders) – *limit/market* orders + [order structure](/docs/manual#order-structure)
* [`cancelOrder`](/docs/manual#canceling-orders)
* `editOrder` – change the price and/or amount of an open order
#### Trading History [#trading-history]
* [`fetchOrder`](/docs/manual#querying-orders) – one order by order id + [order structure](/docs/manual#order-structure)
* [`fetchOpenOrders`](/docs/manual#querying-orders) – a list of all open orders
* [`fetchOrders`](/docs/manual#querying-orders) – a list of all orders
* [`fetchMyTrades`](/docs/manual#personal-trades) – the personal history of filled trades for the account + [trade structure](/docs/manual#trade-structure)
#### Funding [#funding]
* [`fetchDepositAddress`](/docs/manual#funding-your-account) – deposit address(es) + [address structure](/docs/manual#address-structure)
* [`fetchDeposits`](/docs/manual#transactions)
* [`fetchWithdrawals`](/docs/manual#transactions)
* [`fetchTransactions`](/docs/manual#transactions) + [transaction structure](/docs/manual#transaction-structure)
* [`fetchLedger`](/docs/manual#ledger) – transactions, transfers, referrals, cashbacks + [ledger entry structure](/docs/manual#ledger-entry-structure)
* [`withdraw`](/docs/manual#withdraw)
* `transfer` – required if exchange has multiple accounts or sub-accounts
# Statistics (/docs/stats)
# CCXT Statistics [#ccxt-statistics]
## JavaScript / npm [#javascript--npm]



## Python / PyPI [#python--pypi]



## PHP / Packagist [#php--packagist]



## GitHub [#github]







## Opencollective [#opencollective]





# Awesome CCXT (/docs/examples/awesome)
# Awesome CCXT [#awesome-ccxt]
Suggestions and contributions are always welcome! Make sure to read the [contribution guidelines](#contributing)
* [Awesome CCXT](#awesome-ccxt)
* [Trading bots](#trading-bots)
* [Trading toolkits](#trading-toolkits)
* [Trading terminals](#trading-terminals)
* [Analytics platforms](#analytics-platforms)
* [API](#api)
* [AI](#ai)
* [Utils](#utils)
* [Languages](#languages)
* [Javascript examples](#javascript-examples)
* [Python examples](#python-examples)
* [PHP examples](#php-examples)
* [Articles](#articles)
* [Videos](#videos)
* [Contributing](#contributing)
## Trading bots [#trading-bots]
* [Supertrend crypto bot](https://github.com/hackingthemarkets/supertrend-crypto-bot) - Python, pandas. Has a good video tutorial.
* [CryptoMon Bot](https://github.com/jchristov/cryptomon-bot) - Helps tracking of your cryptocurrency investments and making smart, informed buy/sell decisions.
* [ZenBot](https://github.com/carlos8f/zenbot) - A command-line cryptocurrency trading bot using Node.js and MongoDB.
* [Titan](https://github.com/Denton24646/Titan) - Based on python, flask, postgres.
* [Python-crypto-Bot](https://github.com/Seigneur774/Python-crypto-Bot)
* [Nash](https://github.com/joelsfoster/Nash) - Arbitrage bot on meteorjs
* [cryptodaemon](https://github.com/gmark4212/cryptodaemon) - Bot watches which currencies are now in a significant decline but have the potential for growth.
* [pine-bot-client](https://github.com/kzh-dev/pine-bot-client)
* [cryptobot](https://github.com/Zane-/cryptobot) - lowhighbot, poolbot, releasebot
* [ccxt-trader](https://github.com/Schnides123/ccxt-trader) - cryptocurrency arbitrage calculator on #python
* [KryptoBot](https://github.com/eristoddle/KryptoBot)
* [blockbid-ccxt-tutorials](https://github.com/thomasdavis/blockbid-ccxt-tutorials)
* [trader0](https://github.com/kebnekaise-io/trader0)
* [bakuchi](https://github.com/tsu-nera/bakuchi) - arbitrage bot
* [Superalgos](https://github.com/superalgos/superalgos) - Trading bot platform, node.js, tensorflow
## Signals [#signals]
* [Peregrine](https://github.com/wardbradt/peregrine) - Arbitrage on python.
* [ccxt-arbitrage](https://github.com/ArthurAnanda/ccxt-arbitrage-v1)
* [crypto-arbitrage-framework](https://github.com/hzjken/crypto-arbitrage-framework)
* [Nash](https://github.com/joelsfoster/Nash) - Arbitrage bot on meteorjs
* [ccxt-trade-mgr](https://github.com/notlesh/ccxt-trade-mgr) - take profit vs. stop loss
* [EasyTrage](https://github.com/Vikrammel/EasyTrage) - crypto arbitrage bot in MERN
* [Automatic-Arbitrage-Crypto-exchange](https://github.com/ZgodaRafal/Automatic-Arbitrage-Crypto-exchange)
* [Cryptocurrency-Multi-Exchange-Arbitrage-Strategy](https://github.com/chicago-joe/Cryptocurrency-Multi-Exchange-Arbitrage-Strategy)
## Trading toolkits [#trading-toolkits]
* [The Coinbase Pro trading toolkit (CPTT)](https://github.com/coinbase/coinbase-pro-trading-toolkit) – a trading toolkit developed by the coinbase team that integrates with ccxt, bitfinex, bitmex, coinbaseexchange, gemini, poloniex.
* [bt-ccxt-store](https://github.com/Dave-Vallance/bt-ccxt-store) – Store with backtesting. #python
* [ZTOM](https://github.com/ztomsy/ztom) - #python, #backtesting, #rest, orders manager, loggin, reporting, throttling control.
* [TradingSystemDemo](https://github.com/FWangTrading/TradingSystemDemo) - #Catalyst, #CryptoCompare, #backtesting, #alerts, #trading, #python
* [Visuccxt](https://github.com/wnklb/Visuccxt) - #python
* [DataSynchronizer](https://github.com/stockmlbot/DataSynchronizer)
* [Trading-indicator](https://github.com/thanhnguyennguyen/trading-indicator) - fetch data with ccxt and generate indicators
## Trading terminals [#trading-terminals]
* [Kupi-terminal](https://github.com/kupi-network/kupi-terminal) - Customized, extendable trading platform based on js, vue, react, express (rest api), mongo. Can: plot OHLCV, buy/sell, show balances, history balances, orders, trades, my orders, my trades.
* [ccxt-trading-cp](https://github.com/michnovka/ccxt-trading-cp) - Trading terminal in console: plot OHLCV, find arbitrage signals, buy/sell, show balances.
* [Auto-Trade-Crypto-Bot](https://github.com/dev4Fun/Auto-Trade-Crypto-Bot) - Crypto trading #bot in #python with #telegram.
* [ccxt-exchange-template](https://github.com/AdrenalineAI/ccxt-exchange-template) - python
## Analytics platforms [#analytics-platforms]
* [CoinTop](https://github.com/fatihacet/CoinTop) - portfolio with secure access to keys
* [DACP](https://github.com/Pyeskyhigh/DACP) - portfolio
* [hodlwatch](https://github.com/belaczek/hodlwatch) - portfolio
* [Live-Crypto-Dashboard-and-DB](https://github.com/srozov/Live-Crypto-Dashboard-and-DB) - python, sentiments
## API [#api]
* [sanic-ccxt](https://github.com/zloyuser/sanic-ccxt) - Unified REST API on #python
* [ccxt-rest](https://github.com/franz-see/ccxt-rest) - Unified REST API on #javascript
* [ccxt-microservice](https://github.com/xeno14/ccxt-microservice) - Unified REST API on #python
* [mpakus/ccxt-server](https://github.com/mpakus/ccxt-server) - #javascript
* [imloama/ccxt-server](https://github.com/imloama/ccxt-server) - #typescript
* [ccxt-private-ws](https://github.com/invao/ccxt-private-ws) - private websocket connections with CCXT compatible data layout
## AI [#ai]
* [Taurus](https://github.com/OptimalPandemic/taurus) - A cryptocurrency trading platform using deep reinforcement learning.
## Utils [#utils]
* [bitcoin-chart-cli](https://github.com/madnight/bitcoin-chart-cli) by [madnight](https://github.com/madnight) – a command-line console util that draws Bitcoin, Ether, Litecoin and many altcoin charts right in the terminal!
* [node-red-contrib-ccxt](https://github.com/masalinas/node-red-contrib-ccxt) - Node-red integration.
* [freqcache](https://github.com/creslinux/freqcache) - A environment to control egress and ingress data from ccxt fronted trading bots for security and scalability
* [candlestick-convert](https://github.com/valamidev/candlestick-convert) - \[Object,Object] => \[\[],\[]]
* [crypto-exporter](https://github.com/ix-ai/crypto-exporter) - An exporter capable of connecting to multiple exchanges and getting account balances and exchange rates
* [ccxtreplay](https://github.com/xCuri0/ccxtreplay) - collect data from ccxt exchanges and replay it for backtesting
* [quant-backtest-utils](https://github.com/braddyyguyuing/quant-backtest-utils) - zero-dependency strategy evaluation helpers (Sharpe ratio, max drawdown, win rate) that pair with ccxt OHLCV data. #javascript
## Languages [#languages]
* [CCXT](https://github.com/ccxt/ccxt) - Javascript, python, php, C#.
* [kizzx2/ccxt-rs](https://github.com/kizzx2/ccxt-rs) - Rust.
* [irbis-labs/ccxt-rs](https://github.com/irbis-labs/ccxt-rs) - Rust. Early version. See branch 'preview'.
* [CCXT.NET](https://github.com/lisa3907/ccxt.net) - C#.
* [ccxtex](https://github.com/metachaos-systems/ccxtex) - Elixir/Erlang.
* [ccxt.dart](https://github.com/Sach97/ccxt.dart) - Dart.
* [ccxt-go](https://github.com/prompt-cash/ccxt-go) - Go.
## Javascript examples [#javascript-examples]
* [Examples from ccxt](https://github.com/ccxt/ccxt/tree/master/examples/js)
* [Using ccxt and technicalindicators to calculate MACD for BTC/USDT with Node.js](https://runkit.com/dhilipb/macd-for-btc-usdt) – A runkit sample showing how to fetch data and run statistical calculations.
## Python examples [#python-examples]
* [Examples from ccxt](https://github.com/ccxt/ccxt/tree/master/examples/py)
* [ccxt\_notes](https://github.com/yinruiqing/ccxt_notes) - jupiter notebooks
* [51bitqunt](https://github.com/ramoslin02/51bitqunt) - video playlist
## PHP examples [#php-examples]
* [Examples from ccxt](https://github.com/ccxt/ccxt/tree/master/examples/php)
## Articles [#articles]
* [Enigma Catalyst](https://blog.enigma.co/enigma-announces-catalyst-0-4-our-biggest-release-yet-fa31a5ffa4b1) – The major effort towards decentralized exchanges integrates ccxt!
* [Playing with CCXT in Google Colab](https://medium.com/@ccxt/playing-with-ccxt-in-google-colab-23522ac8a6cb) – An article on how useful Colab can be for quick prototyping and testing your trading ideas with CCXT.
* [CC Power Analytics Part 1: How to get the data of the exchanges](https://www.linkedin.com/pulse/part-1-cc-power-analytics-how-get-data-exchanges-steve-rein/) – The first part of a series of articles on cryptocurrency analytics.
* [Looking for arbitrage opportunies with ccxt](https://steemit.com/steemdev/@codewithcheese/looking-for-arbitrage-opportunies-with-javascript-library-cctx-supporting-70-exchanges) – An article @steemit on getting arbitrage started with ccxt for crypto-arbitrage.
* [A n00bs Guide To Deep Cryptocurrency Trading](https://medium.com/@LeonFedden/deep-cryptocurrency-trading-1e64af6d280a) – An article @ Medium on deep neural trading using ccxt for backend tasks.
* [Let’s write a cryptocurrency bot](https://medium.com/@joeldg/an-advanced-tutorial-a-new-crypto-currency-trading-bot-boilerplate-framework-e777733607ae) – A multi-part advanced tutorial on a new cryptocurrency trading framework also integrating ccxt.
* [Download Cryptocurrency Data with CCXT](https://backtest-rookies.com/2018/03/08/download-cryptocurrency-data-with-ccxt/) – A sample script to download historical data from exchanges with a video overview: [Easy Python script to download crypto currency market data with CCXT package](https://www.youtube.com/watch?v=PTGkJsrF7kQ).
* [Experiments : Creating a Crypto Twitter Bot to Announce Newly Listed CryptoCoins](https://medium.com/@kennychuaio/experiments-creating-a-crypto-twitter-bot-to-announce-newly-listed-cryptocoins-9cd23930f5cb) – An article on how to integrate with CCXT and Twitter to get new currencies from exchanges automatically.
* [How to make your own trading bot](https://codeburst.io/how-to-make-your-own-trading-bot-83b5c6e35036) – A tutorial on algortrading in Python.
* [Writing crypto trading bot in Python with Telegram and ccxt](https://medium.com/@maxAvdyushkin/writing-crypto-trading-bot-in-python-with-telegram-and-ccxt-80632a00c637) – A tutorial on programming a Telegram bot in Python with CCXT
* [Data science is eating the world — Here’s how you can start exploring it](https://medium.com/covee-network/data-science-is-eating-the-world-heres-how-you-can-start-exploring-it-37501414af15) – An article on collecting and analyzing financial big data.
* [Chasing fake volume: a crypto-plague](https://medium.com/@sylvainartplayribes/chasing-fake-volume-a-crypto-plague-ea1a3c1e0b5e) – An article @ Medium on trading volumes analysis.
* [CCXTが便利な理由!CCXTライブラリをインストールしよう](https://ryota-trade.com/?p=476) – An article in Japanese on getting CCXT up and runining.
* [Bitflyerや各取引所の個別APIをCCXTライブラリ経由で直接利用する方法](https://ryota-trade.com/?p=629) – How to use Bitflyer and individual API of each exchange directly via the CCXT library.
* [CCXTライブラリでBitflyerに注文を出す方法をマスターする](https://ryota-trade.com/?p=662) – Master placing orders on Bitflyer with the CCXT library.
* [CCXTでBitflyerに出した注文を管理・キャンセルする方法](https://ryota-trade.com/?p=759) – How to manage and cancel orders placed on Bitflyer with CCXT
* [Bitflyerの未約定の全注文をCCXTで一括でキャンセルする方法](https://ryota-trade.com/?p=833) – How to cancel all uncommitted orders of Bitflyer in bulk with CCXT
* [Python3とCCXTライブラリを用いたBitMEX自動売買bot作成Tips](https://note.mu/akagami/n/n0af0a96c261f) – An article in Japanese on getting started with CCXT and a few bot tips.
* [BitMEX 自動売買BOT開発 (API編) ① 開発環境の構築、APIライブラリの詳細、全APIマップ](https://note.mu/mazmex7/n/n1a3a0293ce82) – An article on developing an automatic BitMEX trading bot.
* [仮想通貨トレード Bot 制作に便利な CCXT ライブラリに関する知見まとめ (Python 随時更新)](http://www.stray-scrapbook.work/entry/2018/04/03/205700) – A summary on Python version of CCXT API in Japanese.
* [Python3とCCXTを使用して仮想通貨の自動売買プログラムを作る](http://www.hacky.xyz/entry/2018/03/18/200822) – Automatic cryptocurrency trading using Python 3 and CCXT
* [ccxtを使って裁定取引botを作ってみたらなぜか虚しくなった件](https://qiita.com/reon777/items/21ed87f19cdd50f08bd9) – An article in Japanese explaining the basics of programming an arbitrage bot with CCXT.
* [Python 3 / BitMEX の BOT を作ろう CCXT + BOT サンプルコード 〈基礎編〉](https://note.mu/mman/n/n5a9083864335) – A sample of basic BitMEX bot with CCXT in Python 3.
* [python異步加協程獲取比特幣市場信息](https://hk.saowen.com/a/18a648f24d6e7f54981e9db4411b56730a35dd2b3b27519083543bcd6198cd27) – An article in Chinese on using CCXT with Python.
* [Лучшая криптотрейдинг библиотека?](http://medium.com/@vladthelittleone/лучшая-криптотрейдинг-библиотека-67e308f96c1f) – An article in Russian on setting up CCXT to connect and trade with crypto exchanges.
## Videos [#videos]
* [The Evolution of CCXT](https://www.youtube.com/watch?v=O5HrvSLeo90) – An awesome Gource visualization video on YouTube! )
* [A Video Crash-Course On Using CCXT](https://www.youtube.com/playlist?list=PLIFBTFgFpoJ-xGRz3v_2nF7f9HKZrfSpj) – A series of awesome video tutorials on getting started with CCXT!
* [Download Cryptocurrency Data with CCXT](https://backtest-rookies.com/2018/03/08/download-cryptocurrency-data-with-ccxt/) – A sample script to download historical data from exchanges with a video overview: [Easy Python script to download crypto currency market data with CCXT package](https://www.youtube.com/watch?v=PTGkJsrF7kQ).
* [Python数字货币量化交易开发入门视频-利用CCXT获取bitmex交易所的行情数据](https://www.bilibili.com/video/av44339579/) – An video in Chinese on how to get started with CCXT in Python and a tutorial on OHLCV + Pandas export to CSV.
* [数字货币量化交易1 【群友 Shadow 自制】ccxt 的python版本安装及使用入门](https://www.bilibili.com/video/av21795165) – Trading Digital Currencies 1: Installing and using the Python version of ccxt (video in Chinese)
* [数字货币量化交易2 【群友 林军 自制】ccxt Unified API命令详解及node版本使用演示](https://www.bilibili.com/video/av21842290) – Trading Digital Currencies 2: Using unified CCXT API (video in Chinese)
* [数字货币量化交易3 ccxt Custom API命令详解及node版本使用演示](https://www.bilibili.com/video/av21842988)
– Trading Digital Currencies 3: Details on using custom exchange-specific [implicit methods](/docs/manual#implicit-api-methods) in ccxt (video in Chinese)
* [Algorithmic Trading - Aula 4](https://www.youtube.com/watch?v=BkKebXrhMGY) – A video introduction to algorithmic trading with CCXT from Curso Algo Trading in Portuguese language.
* [Présentation de projet - Créer un Bot Telegram de A à Z (+CCXT)](https://www.youtube.com/watch?v=yayJKRtg5M4) – La création d'un bot Telegram en Node.js, qui va rechercher des informations sur les différentes marketpalce de crypto-monnaies, et cela via la librairie CCXT.
* [Which Bitcoin crypto currency bot project? Gekko vs ccxt vs Tribeca vs Blackbird](https://www.youtube.com/watch?v=Bn2p-nkbVdE) – A video comparison of opensource cryptocurrency trading platforms.
## Other [#other]
* [Projects based on ccxt](https://github.com/ccxt/ccxt/network/dependents) – A list of hundreds of ccxt-based projects by developers from all over the world!
* [LOC-Extension](https://github.com/walkjivefly/LOC-Extension) – a LibreOffice extension which embeds ccxt to provide cryptocurrency price lookup in your spreadsheets.
* [exchange-connector](https://github.com/donvadicastro/exchange-connector) - Exchange connector over ccxt and kafka
* [ccew](https://github.com/saytoken/ccew) - has the same scheme as ccxt, but provide data by websocket
## Contributing [#contributing]
Please ensure your pull request adheres to the following:
* Search previous suggestions before making a new one to ensure yours is not a duplicate.
* Make an individual pull request for each suggestion.
* Use the following format: [NAME](LINK) - DESCRIPTION.
* Keep descriptions simple.
* New categories, or improvements to the existing ones are welcome.
* End all descriptions with a period.
* Try to ensure your pull requests only have one commit if possible. You can squash your commits into one before submitting.
* Make your pull request titles and descriptions as detailed as possible. Explain why an asset or resources deserves to be added to the list.
* Make sure your additions are in alphabetical order. This includes the headers and items themselves.
* Ensure that assets you submit are of high quality, documented well, and are recently maintained. It also helps if they're popular so I can research them before adding them to the list.
* This is not meant to be used as a list to advertise your own assets. Free or open-source assets should be prioritized over paid assets if they are of similar quality and feature sets.
## Special thanks [#special-thanks]
This was forked from /sindresorhus/awesone. Special thanks to [](https://github.com/sindresorhus/awesome) for starting this list and those that contributed to it [contributors](https://github.com/suenot/awesome-ccxt/graphs/contributors), this wouldn't be possible without you!
# Examples (/docs/examples)
Hundreds of runnable CCXT examples. Pick a language to browse its ready-to-run scripts:
* [JavaScript Examples](/docs/examples/js) — Node.js and the browser
* [Python Examples](/docs/examples/py) — sync and async (asyncio)
* [TypeScript Examples](/docs/examples/ts) — typed, for Node and bundlers
* [PHP Examples](/docs/examples/php) — sync and async (ReactPHP)
* [C# Examples](/docs/examples/cs) — .NET / C#
* [Go Examples](/docs/examples/go) — Go modules
* [Java Examples](/docs/examples/java) — Java (JVM)
* [Rust Examples](/docs/examples/rust) — async Rust (Tokio)
Showcases — see [Awesome CCXT](/docs/examples/awesome), a curated list of projects and integrations built with CCXT.
# binance (/docs/prediction/binance)
## binance [#binance]
**Kind**: global class\
**Extends**: Exchange
* [fetchMarkets](#fetchmarkets)
* [fetchEvents](#fetchevents)
* [fetchEvent](#fetchevent)
* [fetchTicker](#fetchticker)
* [fetchTickers](#fetchtickers)
* [fetchOrderBook](#fetchorderbook)
* [fetchBalance](#fetchbalance)
* [fetchOpenOrders](#fetchopenorders)
* [fetchOrders](#fetchorders)
* [fetchPositions](#fetchpositions)
* [fetchPosition](#fetchposition)
* [fetchMyTrades](#fetchmytrades)
* [fetchWallet](#fetchwallet)
* [fetchQuote](#fetchquote)
* [createOrder](#createorder)
* [createMarketOrderWithCost](#createmarketorderwithcost)
* [cancelOrder](#cancelorder)
* [cancelOrders](#cancelorders)
### binance [#binance-1]
Binance Web3 Wallet prediction trading. Binance aggregates prediction markets from
on-chain vendors (predict.fun on BNB Chain) behind its standard signed SAPI — every endpoint,
including market data, requires apiKey/secret credentials
```javascript
binance.binance ()
```
### fetchMarkets [#fetchmarkets]
fetches binance prediction markets; with a query it resolves the query via the search endpoint and returns the matched topics' markets, otherwise it pages the market listing
**Kind**: instance method of [binance](#binance)\
**Returns**: Array\ - an array of objects representing market data
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data)
| Param | Type | Required | Description |
| ----------------- | --------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.query | string | No | a single search query resolved against the market search endpoint |
| params.queries | Array\ | No | multiple search queries (alternative to query) |
| params.l1Category | string | No | filter the listing by a level-1 category id (see the category/list endpoint) |
| params.l2Category | string | No | filter the listing by a level-2 category id |
| params.limit | int | No | for an unscoped listing (no query), the max number of topics to collect (defaults to options.maxFetchMarketsLimit, 200) |
```javascript
binance.fetchMarkets (params?)
```
### fetchEvents [#fetchevents]
fetches prediction-market events (market topics); the call must be scoped by query/queries/tags, eventId, or an l1Category/l2Category listing filter
**Kind**: instance method of [binance](#binance)\
**Returns**: Array\ - a list of [prediction event structures](/docs/prediction#prediction-event-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data)
| Param | Type | Required | Description | | | | |
| ----------------- | --------------------------- | -------- | ----------------------------------------------------------------------- | --------------------------------------------------- | ---------------------- | --------------- | -------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint | | | | |
| params.query | string | No | a free-text search resolved against the semantic market search endpoint | | | | |
| params.queries | Array\ | No | multiple free-text searches (alternative to query) | | | | |
| params.tags | Array\ | No | treated as additional free-text searches (binance has no tag taxonomy) | | | | |
| params.eventId | string | No | a marketTopicId, fetched directly via the detail endpoint | | | | |
| params.l1Category | string | No | scope the listing server-side by a level-1 category id | | | | |
| params.l2Category | string | No | scope the listing server-side by a level-2 category id | | | | |
| params.limit | int | No | the maximum number of events to return | | | | |
| params.sort | string | No | 'volume' | 'liquidity' | 'newest' (client-side) | | |
| params.status | string | No | 'active' | 'closed' | 'all' (client-side) | | |
| params.sortBy | string | No | sort events by server side ('RECOMMENDED' | 'VOLUME' | 'PARTICIPANTS' | 'CREATED\_TIME' | 'END\_DATE'), works when no queries and eventId provided |
| params.orderBy | string | No | order events by server side ('ASC' | 'DESC'), works when no queries and eveitId provided | | | |
```javascript
binance.fetchEvents (params?)
```
### fetchEvent [#fetchevent]
fetches a single prediction-market event (market topic) by its marketTopicId
**Kind**: instance method of [binance](#binance)\
**Returns**: object - a [prediction event structure](/docs/prediction#prediction-event-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the marketTopicId |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
binance.fetchEvent (id, params?)
```
### fetchTicker [#fetchticker]
fetches the last trade price for a single prediction outcome
**Kind**: instance method of [binance](#binance)\
**Returns**: object - a prediction [ticker structure](/docs/manual#ticker-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data#query-last-trade-price](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data#query-last-trade-price)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------------------------------------ |
| outcome | string | Yes | unified outcome handle like BTC\_PRICE\_1H\_UP\_DOWN\_UP:YES, or an outcome token id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
binance.fetchTicker (outcome, params?)
```
### fetchTickers [#fetchtickers]
fetches last trade prices for multiple outcomes, one request per distinct underlying market
**Kind**: instance method of [binance](#binance)\
**Returns**: object - a dictionary of prediction [ticker structures](/docs/manual#ticker-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data#query-last-trade-price](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data#query-last-trade-price)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ------------------------------------------------------------------ |
| outcomes | Array\ | Yes | unified outcomes — required: the venue has no all-tickers endpoint |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
binance.fetchTickers (outcomes, params?)
```
### fetchOrderBook [#fetchorderbook]
fetches the order book for a single prediction outcome token
**Kind**: instance method of [binance](#binance)\
**Returns**: object - a prediction [order book structure](/docs/manual#order-book-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data#query-order-book](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/market-data#query-order-book)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome handle, or an outcome token id |
| limit | int | No | not used by binance fetchOrderBook |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
binance.fetchOrderBook (outcome, limit?, params?)
```
### fetchBalance [#fetchbalance]
query for balance and get the amount of funds available for trading or funds locked in orders
**Kind**: instance method of [binance](#binance)\
**Returns**: object - a [balance structure](/docs/manual#balance-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/wallet#query-payment-option-balances](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/wallet#query-payment-option-balances)
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.type | string | No | 'CeDefi', 'FUNDING', or 'SPOT' |
```javascript
binance.fetchBalance (params?)
```
### fetchOpenOrders [#fetchopenorders]
fetches currently open orders for the user
**Kind**: instance method of [binance](#binance)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#query-active-orders](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#query-active-orders)
| Param | Type | Required | Description |
| ----------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| outcome | string | No | filter by outcome |
| since | int | No | only return orders updated since this timestamp in ms |
| limit | int | No | max number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.tradeSide | string | No | Filter by trade side. Enum: BUY, SELL |
| params.l1Category | string | No | Filter by level-1 category |
| params.paginate | boolean | No | *spot only* default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](/docs/manual#pagination-params) |
```javascript
binance.fetchOpenOrders (outcome?, since?, limit?, params?)
```
### fetchOrders [#fetchorders]
fetches all historical orders for the user
**Kind**: instance method of [binance](#binance)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#query-order-history](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#query-order-history)
| Param | Type | Required | Description |
| ----------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| outcome | string | No | filter by outcome |
| since | int | No | only return orders updated since this timestamp in ms |
| limit | int | No | max number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.orderType | string | No | Filter by order type. Enum: MARKET, LIMIT |
| params.l1Category | string | No | Filter by level-1 category |
| params.status | string | No | Filter by order status |
| params.until | string | No | end timestamp in ms |
| params.paginate | boolean | No | *spot only* default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](/docs/manual#pagination-params) |
```javascript
binance.fetchOrders (outcome?, since?, limit?, params?)
```
### fetchPositions [#fetchpositions]
fetches the user's outcome positions; outcome positions are spot token balances under the "+" coin form (size and entry notional), the value/entry/mark price/pnl are computed from the current mid prices
**Kind**: instance method of [binance](#binance)\
**Returns**: Array\ - a list of [prediction position structures](/docs/prediction#prediction-position-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/position#query-positions](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/position#query-positions)
| Param | Type | Required | Description |
| ---------- | --------------------------- | -------- | ------------------------------------------------------------------- |
| outcomes | Array\ | No | filter by outcome ids or outcomes |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.tab | string | No | Position status tab. Values from PositionQueryType. Default ONGOING |
```javascript
binance.fetchPositions (outcomes?, params?)
```
### fetchPosition [#fetchposition]
fetch data on an open position
**Kind**: instance method of [binance](#binance)\
**Returns**: Array\ - a list of [prediction position structures](/docs/prediction#prediction-position-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/position#query-positions-by-filter](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/position#query-positions-by-filter)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter by outcome |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
binance.fetchPosition (outcome?, params?)
```
### fetchMyTrades [#fetchmytrades]
fetch all trades made by the user
**Kind**: instance method of [binance](#binance)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#query-order-history](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#query-order-history)
| Param | Type | Required | Description |
| ----------------- | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| outcome | string | No | filter by outcome |
| since | int | No | only return orders updated since this timestamp in ms |
| limit | int | No | max number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.orderType | string | No | Filter by order type. Enum: MARKET, LIMIT |
| params.l1Category | string | No | Filter by level-1 category |
| params.status | string | No | Filter by order status |
| params.until | string | No | end timestamp in ms |
| params.paginate | boolean | No | *spot only* default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](/docs/manual#pagination-params) |
```javascript
binance.fetchMyTrades (outcome?, since?, limit?, params?)
```
### fetchWallet [#fetchwallet]
fetch wallet for user and save the one match the walletAddress user provided
**Kind**: instance method of [binance](#binance)\
**Returns**: object - a wallet
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/wallet#list-prediction-wallets](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/wallet#list-prediction-wallets)
| Param | Type | Required | Description |
| ---------- | ------------------- | -------- | ------------------------------------------------------ |
| methodName | string | No | method name |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
binance.fetchWallet (methodName?, params?)
```
### fetchQuote [#fetchquote]
request for quote from binance server
**Kind**: instance method of [binance](#binance)\
**Returns**: object - a quote
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#get-quote](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#get-quote)
| Param | Type | Required | Description |
| ------------------------- | -------------------- | -------- | ---------------------------------------------------------------- |
| request | object | No | request to the exchange API endpoint |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.chainId | string | No | Chain ID. Default 56 (BSC) |
| params.feeRateBps | integer | No | Fee rate in basis points. Default 200, range 1–10000 |
| params.fundingSource | string | No | Funding source. Enum: MPC, CEX. Default MPC |
| params.fundTransferAmount | string | No | Auto-transfer amount before order (wei). Must be > 0 if provided |
```javascript
binance.fetchQuote (request?, params?)
```
### createOrder [#createorder]
creates a limit or market order for an outcome market
**Kind**: instance method of [binance](#binance)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#place-order](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#place-order)
| Param | Type | Required | Description |
| ------------------------- | ------------------- | -------- | ---------------------------------------------------------------- |
| outcome | string | Yes | unified outcome |
| type | string | Yes | 'limit' or 'market' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | quantity of outcome tokens |
| price | float | No | limit price (0–1 range for prediction markets) |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.timeInForce | string | No | Must match orderType: FOK for MARKET, GTC for LIMIT |
| params.slippage | string | No | slippage for market orders (default 5%) |
| params.fundingSource | string | No | Funding source. Enum: MPC, CEX. Default MPC |
| params.fundTransferAmount | string | No | Auto-transfer amount before order (wei). Must be > 0 if provided |
| params.accountType | string | No | Payment account type. Enum: SPOT, FUNDING |
| params.feeRateBps | string | No | Payment account type. Enum: SPOT, FUNDING |
| params.cost | string | No | Buy prediction market with USDT cost, only for buy side |
```javascript
binance.createOrder (outcome, type, side, amount, price?, params?)
```
### createMarketOrderWithCost [#createmarketorderwithcost]
create a market order by providing the symbol, side and cost
**Kind**: instance method of [binance](#binance)\
**Returns**: object - an [order structure](/docs/manual#order-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#place-order](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#place-order)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | --------------------------------------------------------- |
| symbol | string | Yes | unified symbol of the market to create an order in |
| side | string | Yes | 'buy' or 'sell' |
| cost | float | Yes | how much you want to trade in units of the quote currency |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
binance.createMarketOrderWithCost (symbol, side, cost, params?)
```
### cancelOrder [#cancelorder]
cancels a single open order
**Kind**: instance method of [binance](#binance)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#batch-cancel-orders](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#batch-cancel-orders)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| outcome | string | No | unified outcome |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
binance.cancelOrder (id, outcome?, params?)
```
### cancelOrders [#cancelorders]
cancels multiple open orders
**Kind**: instance method of [binance](#binance)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#batch-cancel-orders](https://developers.binance.com/en/docs/catalog/web3-wallet-prediction-trading/api/rest-api/trade#batch-cancel-orders)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| ids | Array\ | Yes | order ids |
| outcome | string | No | unified outcome (required) |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
binance.cancelOrders (ids, outcome?, params?)
```
# hyperliquid (/docs/prediction/hyperliquid)
## hyperliquid [#hyperliquid]
**Kind**: global class\
**Extends**: Exchange
* [fetchMarkets](#fetchmarkets)
* [fetchTicker](#fetchticker)
* [fetchTickers](#fetchtickers)
* [fetchOrderBook](#fetchorderbook)
* [fetchOHLCV](#fetchohlcv)
* [fetchBalance](#fetchbalance)
* [fetchPositions](#fetchpositions)
* [createOrder](#createorder)
* [cancelOrder](#cancelorder)
* [cancelOrders](#cancelorders)
* [fetchOpenOrders](#fetchopenorders)
* [fetchOrders](#fetchorders)
* [fetchOrder](#fetchorder)
* [fetchTrades](#fetchtrades)
* [fetchMyTrades](#fetchmytrades)
* [fetchEvents](#fetchevents)
### fetchMarkets [#fetchmarkets]
Retrieves all Hyperliquid outcome markets from outcomeMeta.
Each binary outcome becomes one CCXT prediction market with two outcomes: YES and NO.
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: Array\ - array of market structures
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/asset-ids#outcomes](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/asset-ids#outcomes)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ---------------- |
| params | object | No | extra parameters |
```javascript
hyperliquid.fetchMarkets (params?)
```
### fetchTicker [#fetchticker]
fetches a ticker for a single outcome market using the L2 order book snapshot
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: object - a [prediction ticker structure](/docs/prediction#prediction-ticker-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#l2-book-snapshot](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#l2-book-snapshot)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | -------------------------------------------------------- |
| outcome | string | Yes | unified outcome (e.g. 'BTC\_ABOVE\_78213\_20260503:YES') |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
hyperliquid.fetchTicker (outcome, params?)
```
### fetchTickers [#fetchtickers]
fetches all outcome market tickers using allMids then optionally enriches with l2Book
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: object - a dictionary of [prediction ticker structures](/docs/prediction#prediction-ticker-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-all-mids-for-all-actively-traded-coins](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-all-mids-for-all-actively-traded-coins)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ------------------------------------------------------ |
| outcomes | Array\ | No | filter by outcome ids or outcomes |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
hyperliquid.fetchTickers (outcomes?, params?)
```
### fetchOrderBook [#fetchorderbook]
fetches the L2 order book for an outcome market
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: object - a [prediction order book structure](/docs/prediction#prediction-order-book-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#l2-book-snapshot](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#l2-book-snapshot)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------- |
| outcome | string | Yes | unified outcome |
| limit | int | No | max depth levels (not used by hyperliquid but accepted) |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
hyperliquid.fetchOrderBook (outcome, limit?, params?)
```
### fetchOHLCV [#fetchohlcv]
fetches candlestick OHLCV data for an outcome market
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: Array\> - a list of candles ordered as timestamp, open, high, low, close, volume
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#candle-snapshot](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#candle-snapshot)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome |
| timeframe | string | Yes | '1m', '5m', '15m', '1h', '4h', '1d', etc. |
| since | int | No | timestamp in ms of earliest candle |
| limit | int | No | max number of candles |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.until | int | No | end timestamp in ms |
```javascript
hyperliquid.fetchOHLCV (outcome, timeframe, since?, limit?, params?)
```
### fetchBalance [#fetchbalance]
Fetches spot balance (outcomes use spot-like balance).
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: Balances - balance structure
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-a-users-token-balances](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-a-users-token-balances)
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | ----------------------------------------------- |
| params | object | No | extra parameters |
| params.user | string | No | wallet address (defaults to this.walletAddress) |
```javascript
hyperliquid.fetchBalance (params?)
```
### fetchPositions [#fetchpositions]
fetches the user's outcome positions; outcome positions are spot token balances under the "+" coin form (size and entry notional), the value/entry/mark price/pnl are computed from the current mid prices
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: Array\ - a list of [prediction position structures](/docs/prediction#prediction-position-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-a-users-token-balances](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-a-users-token-balances)
| Param | Type | Required | Description |
| ----------- | --------------------------- | -------- | ------------------------------------------------------ |
| outcomes | Array\ | No | filter by outcome ids or outcomes |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.user | string | No | wallet address |
```javascript
hyperliquid.fetchPositions (outcomes?, params?)
```
### createOrder [#createorder]
creates a limit or market order for an outcome market
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order)
| Param | Type | Required | Description | | |
| -------------------- | -------------------- | -------- | ------------------------------------------------------------------------------------------ | ----- | --------------------- |
| outcome | string | Yes | unified outcome | | |
| type | string | Yes | 'limit' or 'market' | | |
| side | string | Yes | 'buy' or 'sell' | | |
| amount | float | Yes | quantity of outcome tokens | | |
| price | float | No | limit price (0–1 range for prediction markets) | | |
| params | object | No | extra parameters specific to the exchange API endpoint | | |
| params.timeInForce | string | No | 'Gtc' | 'Ioc' | 'Alo' (default 'Gtc') |
| params.postOnly | boolean | No | if true sets timeInForce to 'Alo' | | |
| params.reduceOnly | boolean | No | if true, marks the order as reduce only so it can only decrease an existing position | | |
| params.slippage | string | No | slippage for market orders (default 5%) | | |
| params.clientOrderId | string | No | hex cloid | | |
| params.vaultAddress | string | No | optional subaccount/vault address to trade on behalf of (master signer must be authorized) | | |
```javascript
hyperliquid.createOrder (outcome, type, side, amount, price?, params?)
```
### cancelOrder [#cancelorder]
cancels a single open order
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | -------------------------------------------------------- |
| id | string | Yes | order id |
| outcome | string | No | unified outcome |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.clientOrderId | string | No | cancel by client order id |
| params.vaultAddress | string | No | optional subaccount/vault address to cancel on behalf of |
```javascript
hyperliquid.cancelOrder (id, outcome?, params?)
```
### cancelOrders [#cancelorders]
cancels multiple open orders
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| ids | Array\ | Yes | order ids |
| outcome | string | No | unified outcome (required) |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
hyperliquid.cancelOrders (ids, outcome?, params?)
```
### fetchOpenOrders [#fetchopenorders]
fetches currently open orders for the user
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-users-open-orders](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-users-open-orders)
| Param | Type | Required | Description | |
| ------------- | ------------------- | -------- | ------------------------------------------------------ | ------------------------------ |
| outcome | string | No | filter by outcome | |
| since | int | No | only return orders updated since this timestamp in ms | |
| limit | int | No | max number of orders to return | |
| params | object | No | extra parameters specific to the exchange API endpoint | |
| params.user | string | No | wallet address | |
| params.method | string | No | 'openOrders' | 'frontendOpenOrders' (default) |
```javascript
hyperliquid.fetchOpenOrders (outcome?, since?, limit?, params?)
```
### fetchOrders [#fetchorders]
fetches all historical orders for the user
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-users-historical-orders](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-users-historical-orders)
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter by outcome |
| since | int | No | only return orders updated since this timestamp in ms |
| limit | int | No | max number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.user | string | No | wallet address |
```javascript
hyperliquid.fetchOrders (outcome?, since?, limit?, params?)
```
### fetchOrder [#fetchorder]
fetches a single order by id
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#query-order-status-by-oid-or-cloid](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#query-order-status-by-oid-or-cloid)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| outcome | string | No | outcome |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.user | string | No | wallet address |
| params.clientOrderId | string | No | fetch by client order id instead |
```javascript
hyperliquid.fetchOrder (id, outcome?, params?)
```
### fetchTrades [#fetchtrades]
fetches the most recent public trades for an outcome
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-coins-recent-trades](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-coins-recent-trades)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome |
| since | int | No | only return trades at or after this timestamp in ms |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
hyperliquid.fetchTrades (outcome, since?, limit?, params?)
```
### fetchMyTrades [#fetchmytrades]
fetches the authenticated user's fill history
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-users-fills](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-users-fills)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter by outcome |
| since | int | No | start timestamp in ms |
| limit | int | No | max number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.user | string | No | wallet address |
| params.until | int | No | end timestamp in ms |
```javascript
hyperliquid.fetchMyTrades (outcome?, since?, limit?, params?)
```
### fetchEvents [#fetchevents]
Groups outcome markets by their underlying (e.g. BTC\_ABOVE\_78213) into event structures. Each event contains both the YES and NO markets.
**Kind**: instance method of [hyperliquid](#hyperliquid)\
**Returns**: Array\ - array of event structures
| Param | Type | Required | Description |
| -------------- | --------------------------- | -------- | ---------------------------------------------------------------- |
| params | object | No | extra parameters |
| params.query | string | No | a single query string to filter by (matches description/outcome) |
| params.queries | Array\ | No | multiple query strings (alternative to query) |
```javascript
hyperliquid.fetchEvents (params?)
```
# Prediction Markets (/docs/prediction)
# Prediction Markets [#prediction-markets]
CCXT supports prediction-market exchanges (Polymarket, Kalshi, Limitless, Myriad, and Hyperliquid prediction markets) through a dedicated `prediction` namespace. Prediction exchanges implement the same unified API as regular crypto exchanges, with prices quoted between 0 and 1 USDC per outcome share.
> Per-exchange API references live in the **[Prediction Markets](/docs/prediction)** section, and runnable **[prediction examples](/docs/examples/ts/prediction-markets)** walk through end-to-end trading on each venue.
JavaScript / TypeScript
Python
PHP
C#
Go
Java
```javascript
const exchange = new ccxt.prediction.polymarket ()
```
```python
# async-only — ccxt.prediction. IS the async class
import ccxt.prediction
exchange = ccxt.prediction.polymarket()
```
```php
// async-only, ReactPHP — \ccxt\prediction\ IS the async class
$exchange = new \ccxt\prediction\polymarket();
```
```csharp
var exchange = new ccxt.prediction.polymarket();
```
```go
import ccxtprediction "github.com/ccxt/ccxt/go/v4/prediction"
exchange := ccxtprediction.NewPolymarket()
```
```java
import io.github.ccxt.exchanges.prediction.Polymarket;
Polymarket exchange = new Polymarket();
```
Prediction exchanges are flagged with `exchange.has['prediction']`. Their data model has three levels:
* **events** — a question or grouping, like *"Will X happen by July?"*
* **markets** — each event contains one or more markets, returned by `fetchMarkets()` / `loadMarkets()` with `market['type'] === 'prediction'`
* **outcomes** — each market carries an `outcomes` list (for example YES and NO tokens); each outcome has its own `outcome` handle like `TRUMP_OUT_PRESIDENT_2027:YES`, an exchange-specific `outcomeId`, the parent `market`, and a `label` (e.g. `YES`/`NO`)
How the structures relate — `PredictionEvent` → market → `PredictionOutcome`, where the **outcome** is the tradeable unit that every price/trade method takes. Each market is a standard ccxt `Market` row that additionally carries prediction fields (`marketType`, `executionModel`, `collateral`, …) and its own `outcomes` list:
```prediction-diagram
```
Prices are probabilities between 0 and 1 per share, `amount` is the number of shares, and `cost` is the collateral spent.
## Unified methods [#unified-methods]
Prediction exchanges expose the same unified API as crypto exchanges. Discovery starts with events; every **price and trade** method then takes an **outcome handle** (or outcome id) through the `outcome` / `outcomes` parameter instead of a market symbol. Support varies per venue — always check `exchange.has[methodName]` and the [per-exchange reference](/docs/prediction/polymarket).
**Discovery & markets**
* `fetchEvents (params?)` — search events (scope by `query`/`queries`/`tags`/`eventId`/`slug`), caching their markets and outcomes
* `fetchEvent (id, params?)` — a single event by id, slug or ticker
* `fetchMarkets (params?)` / `loadMarkets (reload?)` — every market (each carries `type: 'prediction'` and an `outcomes` list)
* `fetchTime (params?)` — exchange server time
**Market data** — each takes an outcome handle
* `fetchTicker (outcome, params?)` / `fetchTickers (outcomes?, params?)` — last price, bid/ask and volume
* `fetchOrderBook (outcome, limit?, params?)` — bids and asks for an outcome
* `fetchOHLCV (outcome, timeframe?, since?, limit?, params?)` — price-history candles
* `fetchTrades (outcome, since?, limit?, params?)` — public trades
* `fetchOpenInterest (outcome, params?)` — open interest
* `fetchTradingFee (outcome, params?)` — taker / maker fees
* `fetchTradeQuote (outcome, ...)` — an executable quote on AMM venues
**Trading** — `amount` is the number of shares, `price` is a probability between 0 and 1
* `createOrder (outcome, type, side, amount, price?, params?)` — place an order
* `createOrders (orders, params?)` — batch create
* `editOrder (id, outcome, ...)` — amend a resting order
* `cancelOrder (id, outcome?, params?)`, `cancelOrders (ids, ...)`, `cancelAllOrders (outcome?, params?)`
**Account & orders**
* `fetchBalance (params?)` — collateral balances
* `fetchOrder (id, outcome?, params?)`, `fetchOrders`, `fetchOpenOrders`, `fetchClosedOrders`, `fetchCanceledOrders`, `fetchOrderTrades`
* `fetchMyTrades (outcome?, since?, limit?, params?)` — your fills
* `fetchPositions (outcomes?, params?)` / `fetchPosition (outcome, params?)` — open positions
* `fetchStatus (params?)` — exchange operational status
**WebSocket (Pro)** — live streams, also keyed by the outcome handle
* `watchTicker`, `watchTickers`, `watchOrderBook`, `watchTrades`, `watchOHLCV`, `watchOrders`, `watchMyTrades`, `watchPositions`
The rest of this page documents `fetchEvents`, `fetchEvent` and `createOrder`; the remaining methods behave like their crypto counterparts in [the Manual](/docs/manual), only addressed by outcome.
## fetchEvents [#fetchevents]
```javascript
fetchEvents (params = {})
```
* `params` — a `fetchEventsParams` object; **must be scoped** by at least one of `query` (a search string), `queries` (a list of strings), `tags`, `eventId` or `slug` — an unscoped call throws `ArgumentsRequired` on every venue (some venues accept extra scope keys, e.g. Kalshi's `category` / `series_ticker`). Optional: `limit`, `sort` (`volume`/`liquidity`/`newest`), `status` (`active`/`inactive`/`closed`/`all`), `searchIn` (`title`/`description`/`both`). The scope is pushed to the venue's API server-side: `tags` resolve to Kalshi series, Polymarket `tag_slug` listings (one per tag), Limitless categories, and Myriad keyword searches. For an unscoped "most active markets" browse use `fetchMarkets ()` — it returns a capped, volume-ordered listing where the venue supports it
* returns an **array of [event structures](#prediction-event-structure)** and caches the discovered events, markets and outcomes on the instance (`exchange.events`, `exchange.outcomes`)
A typical workflow:
```javascript
const exchange = new ccxt.prediction.polymarket ()
const events = await exchange.fetchEvents ({ 'query': 'Trump' })
const outcome = events[0]['markets'][0]['outcomes'][0]
const ticker = await exchange.fetchTicker (outcome['outcome'])
const orderbook = await exchange.fetchOrderBook (outcome['outcome'])
const candles = await exchange.fetchOHLCV (outcome['outcome'], '1h')
// place a limit buy of 5 YES shares at 0.40 USDC; prices are 0..1 per share
const order = await exchange.createOrder (outcome['outcome'], 'limit', 'buy', 5, 0.40)
```
Outcome-addressed methods (`fetchTicker`, `createOrder`, …) auto-load the outcome cache on first use — like `loadMarkets()` + `market(symbol)` in regular ccxt — so you don't need to `fetchEvents`/`loadMarkets` first. The auto-load is scoped to the requested outcome: a by-id fetch where the venue has one (Kalshi tickers, Polymarket token ids), otherwise a search derived from the handle — never a bulk listing download. A genuinely unknown outcome throws `BadSymbol`. Call `loadOutcomes()` to warm the cache explicitly, or `getEvent(idOrHandle)` to read a cached event.
## fetchEvent [#fetchevent]
```javascript
fetchEvent (id, params = {})
```
* `id` — the identifier of a single event. Polymarket accepts the numeric event id or its slug, Kalshi the event ticker, Myriad the `networkId:marketId` market id, and Limitless the market slug or address
* returns a single **[event structure](#prediction-event-structure)** (same shape as the entries returned by `fetchEvents`)
```javascript
const exchange = new ccxt.prediction.polymarket ()
const events = await exchange.fetchEvents ({ 'query': 'Trump' })
const event = await exchange.fetchEvent (events[0]['id'])
```
Supported by `polymarket`, `kalshi`, `myriad` and `limitless` (check `exchange.has['fetchEvent']`); Hyperliquid has no single-event endpoint.
## createOrder [#createorder]
```javascript
createOrder (outcome, type, side, amount, price = undefined, params = {})
```
* `outcome` — the outcome handle (e.g. `TRUMP_WINS:YES`) or its raw `outcomeId`, taken from a market's `outcomes` list; it replaces the market symbol used on crypto exchanges
* `type` — `'limit'` or `'market'` (venue support varies — check `exchange.has['createMarketOrder']`)
* `side` — `'buy'` or `'sell'`
* `amount` — the number of shares
* `price` — a probability between 0 and 1 USDC per share; required for `limit`, ignored for `market`
* returns a **[prediction order structure](#prediction-order-structure)** — addressed by outcome instead of symbol
```javascript
const exchange = new ccxt.prediction.polymarket ()
const events = await exchange.fetchEvents ({ 'query': 'Trump' })
const outcome = events[0]['markets'][0]['outcomes'][0]['outcome']
// place a limit buy of 5 YES shares at 0.40 USDC; prices are 0..1 per share
const order = await exchange.createOrder (outcome, 'limit', 'buy', 5, 0.40)
```
Trading needs credentials — each venue's auth (wallet + private key, API keys, …) is documented in the [per-exchange reference](/docs/prediction/polymarket). Batch with `createOrders`, amend with `editOrder`, and cancel with `cancelOrder` / `cancelAllOrders`. See the runnable [prediction examples](/docs/examples/ts/prediction-markets) for full buy → check → cancel flows.
## Prediction structures [#prediction-structures]
Prediction trading structures are **standalone** — they do **not** extend the crypto `Ticker` / `Order` / `Position` / `Trade` / `OrderBook` types, and they have no `symbol`. Identity is the `outcome` handle (`MARKET:LABEL`) plus its raw `outcomeId`. Throughout, `price` is a probability between 0 and 1, `amount` is a number of shares, and `cost` is the collateral spent; `info` always carries the raw venue payload.
### Prediction event structure [#prediction-event-structure]
```javascript
{
'info': { ... }, // the raw exchange response
'id': '903193', // raw exchange event id
'event': 'US_ELECTION_2024', // unified event handle (getEvent resolves this)
'title': 'Will X happen by July?', // human-readable title
'description': '...',
'slug': 'will-x-happen-by-july', // url slug of the event
'category': 'Politics',
'tags': [ 'elections', ... ],
'markets': [ ... ], // grouped ccxt market rows, each with an outcomes list
'mutuallyExclusive': true, // exactly one market in the event resolves YES
'active': true, // whether the event is still tradable
'resolved': false, // whether the event has been resolved
'volume': 1250000,
'liquidity': 84000,
'created': 1770000000000,
'createdDatetime': '2026-02-01T00:00:00Z',
'end': 1781234567890, // resolution deadline timestamp in ms
'endDatetime': '2026-07-01T00:00:00Z',
'image': 'https://...',
'url': 'https://...',
}
```
### Prediction ticker structure [#prediction-ticker-structure]
```javascript
{
'info': { ... },
'outcome': 'TRUMP_WIN_2024:YES', // outcome handle — identity (there is no symbol)
'outcomeId': '123...', // raw exchange / on-chain outcome id
'label': 'Yes', // short outcome name
'market': 'TRUMP_WIN_2024', // parent market handle
'event': 'US_ELECTION_2024',
'timestamp': 1710000000000,
'datetime': '2026-07-01T00:00:00Z',
'last': 0.62, // last traded probability (0..1)
'bid': 0.61,
'bidVolume': 1200, // shares
'ask': 0.63,
'askVolume': 900,
'high': 0.66,
'low': 0.58,
'open': 0.60,
'close': 0.62,
'change': 0.02,
'percentage': 3.33,
'average': 0.61,
'baseVolume': 45000, // shares traded
'quoteVolume': 27000, // collateral traded
'openInterest': 15000,
}
```
### Prediction order book structure [#prediction-order-book-structure]
```javascript
{
'outcome': 'TRUMP_WIN_2024:YES', // required — books are per-outcome
'outcomeId': '123...',
'market': 'TRUMP_WIN_2024',
'bids': [ [ 0.61, 1200 ], ... ], // [ price (0..1), amount in shares ], best first
'asks': [ [ 0.63, 900 ], ... ],
'timestamp': 1710000000000,
'datetime': '2026-07-01T00:00:00Z',
'nonce': 123456,
}
```
### Prediction order structure [#prediction-order-structure]
```javascript
{
'info': { ... },
'id': '0xabc...',
'clientOrderId': '...',
'outcome': 'TRUMP_WIN_2024:YES', // identity (there is no symbol)
'outcomeId': '123...',
'label': 'Yes',
'market': 'TRUMP_WIN_2024',
'event': 'US_ELECTION_2024',
'timestamp': 1710000000000,
'datetime': '2026-07-01T00:00:00Z',
'lastTradeTimestamp': 1710000005000,
'lastUpdateTimestamp': 1710000005000,
'status': 'open', // 'open' | 'closed' | 'canceled'
'type': 'limit',
'timeInForce': 'GTC',
'side': 'buy',
'price': 0.40, // limit probability (0..1)
'average': 0.40, // average fill probability
'amount': 5, // shares ordered
'filled': 0,
'remaining': 5,
'cost': 0, // collateral spent = average * filled
'reduceOnly': false,
'postOnly': false,
'fee': { ... },
'trades': [ ... ], // prediction trade structures
}
```
### Prediction trade structure [#prediction-trade-structure]
```javascript
{
'info': { ... },
'id': '...',
'order': '0xabc...', // parent order id
'outcome': 'TRUMP_WIN_2024:YES',
'outcomeId': '123...',
'label': 'Yes',
'market': 'TRUMP_WIN_2024',
'timestamp': 1710000005000,
'datetime': '2026-07-01T00:00:00.000Z',
'type': 'limit',
'side': 'buy',
'takerOrMaker': 'taker',
'price': 0.40, // fill probability (0..1)
'amount': 5, // shares
'cost': 2.0, // collateral = price * amount
'fee': { ... },
'realizedPnl': 0,
}
```
### Prediction position structure [#prediction-position-structure]
```javascript
{
'info': { ... },
'id': '...',
'outcome': 'TRUMP_WIN_2024:YES',
'outcomeId': '123...',
'label': 'Yes',
'market': 'TRUMP_WIN_2024',
'event': 'US_ELECTION_2024',
'timestamp': 1710000000000,
'datetime': '2026-07-01T00:00:00Z',
'side': 'long',
'contracts': 10, // shares held
'contractSize': 1,
'notional': 6.2, // position value in collateral
'entryPrice': 0.55, // average entry probability (0..1)
'markPrice': 0.62,
'lastPrice': 0.62,
'unrealizedPnl': 0.7,
'realizedPnl': 0,
'percentage': 12.7,
'collateral': 5.5,
'resolved': false, // has the event resolved?
'won': false, // did this outcome win?
'settleFraction': undefined, // 0..1 fractional settlement
'payout': undefined, // claimable collateral after resolution
}
```
The discovery structures — the `PredictionEvent`'s `markets` (ccxt market rows carrying `marketType`, `executionModel`, `collateral`, …) and each market's `outcomes` (`outcome` handle, `outcomeId`, `label`, `price`, `bid`, `ask`) — are described in the [data model](#prediction-markets) above.
## The outcome cache [#the-outcome-cache]
Prediction exchanges address an **outcome** (e.g. `TRUMP_WINS:YES`, or its raw `outcomeId`) the way regular ccxt addresses a `symbol`. You rarely manage the cache yourself: the first outcome-addressed call (`fetchTicker`, `createOrder`, …) resolves and caches just that outcome — the analogue of `loadMarkets()` + `market(symbol)` — and later calls hit the cache with no extra request. You never need to pre-load; an unknown outcome throws `BadSymbol`.
To warm the cache up front (before a burst of calls), `loadOutcomes (outcomes?)` resolves a list in batched requests, or the whole capped listing when called with no argument; `getEvent (idOrHandle)` reads back an event you already discovered with `fetchEvents`. Everything else about the cache is an implementation detail you can ignore.
> **`fetchTickers` needs an `outcomes` list.** Kalshi, Polymarket, Limitless and Myriad have no "all tickers" endpoint, so a no-arg `fetchTickers ()` throws `ArgumentsRequired` rather than silently returning a capped subset — pass the handles you want. Hyperliquid serves its whole universe in one request, so its no-arg call works.
## CLI [#cli]
Every language CLI can target a prediction exchange with the `-p` / `--prediction` flag. Regular ids win for ids present in both namespaces (e.g. `hyperliquid`); `-p` forces the prediction namespace, and prediction-only ids (`polymarket`, `kalshi`, `limitless`, `myriad`) resolve there automatically:
```bash
npm run cli.ts -- -p polymarket fetchEvents '{"query":"trump"}'
npm run cli.py -- --prediction kalshi fetchTicker KXBTC-25DEC31-B100000:YES --sandbox
npm run cli.go -- -p hyperliquid fetchBalance
```
## Supported prediction exchanges [#supported-prediction-exchanges]
* [binance](/docs/prediction/binance) — unified API methods, parameters and endpoints
* [hyperliquid](/docs/prediction/hyperliquid) — unified API methods, parameters and endpoints
* [kalshi](/docs/prediction/kalshi) — unified API methods, parameters and endpoints
* [limitless](/docs/prediction/limitless) — unified API methods, parameters and endpoints
* [myriad](/docs/prediction/myriad) — unified API methods, parameters and endpoints
* [opinion](/docs/prediction/opinion) — unified API methods, parameters and endpoints
* [polymarket](/docs/prediction/polymarket) — unified API methods, parameters and endpoints
# kalshi (/docs/prediction/kalshi)
## kalshi [#kalshi]
**Kind**: global class\
**Extends**: Exchange
* [fetchMarkets](#fetchmarkets)
* [fetchTicker](#fetchticker)
* [fetchStatus](#fetchstatus)
* [fetchOpenInterest](#fetchopeninterest)
* [fetchTickers](#fetchtickers)
* [fetchOrderBook](#fetchorderbook)
* [fetchOHLCV](#fetchohlcv)
* [fetchTrades](#fetchtrades)
* [fetchMyTrades](#fetchmytrades)
* [fetchBalance](#fetchbalance)
* [fetchPositions](#fetchpositions)
* [fetchSettlements](#fetchsettlements)
* [fetchOpenOrders](#fetchopenorders)
* [fetchOrders](#fetchorders)
* [fetchClosedOrders](#fetchclosedorders)
* [fetchOrder](#fetchorder)
* [createOrder](#createorder)
* [editOrder](#editorder)
* [cancelOrder](#cancelorder)
* [cancelAllOrders](#cancelallorders)
* [fetchEvents](#fetchevents)
* [fetchEvent](#fetchevent)
### fetchMarkets [#fetchmarkets]
fetches kalshi markets; with a query it resolves the query via the events endpoint and returns the matched events' markets, otherwise it pages the markets listing
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: Array\ - an array of objects representing market data
**See**: [https://trading-api.readme.io/reference/getmarkets](https://trading-api.readme.io/reference/getmarkets)
| Param | Type | Required | Description |
| -------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.query | string | No | a single search query; resolved against the events endpoint (event title/ticker), then the matched events' markets are returned |
| params.queries | Array\ | No | multiple search queries (alternative to query); markets from any matching event are returned |
| params.limit | int | No | for an unscoped listing (no query), the max number of markets to collect (defaults to options.maxFetchMarketsLimit, 1000) |
```javascript
kalshi.fetchMarkets (params?)
```
### fetchTicker [#fetchticker]
fetches the current market price and bid/ask for a single kalshi outcome
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: object - a [prediction ticker structure](/docs/prediction#prediction-ticker-structure)
**See**: [https://docs.kalshi.com/api-reference/market/get-market](https://docs.kalshi.com/api-reference/market/get-market)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | -------------------------------------------------------------------------------------------------- |
| outcome | string | Yes | the unified outcome like TRUMP\_BRING\_BACK\_MANUFACTURING:YES or outcomeId like KXGDPSHAREMANU-29 |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchTicker (outcome, params?)
```
### fetchStatus [#fetchstatus]
fetches the kalshi exchange status
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: object - a [status structure](/docs/manual#exchange-status-structure)
**See**: [https://docs.kalshi.com/api-reference/exchange/get-exchange-status](https://docs.kalshi.com/api-reference/exchange/get-exchange-status)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchStatus (params?)
```
### fetchOpenInterest [#fetchopeninterest]
fetches the open interest of a prediction market outcome
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: object - an [open interest structure](/docs/manual#open-interest-structure)
**See**: [https://docs.kalshi.com/api-reference/market/get-market](https://docs.kalshi.com/api-reference/market/get-market)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchOpenInterest (outcome, params?)
```
### fetchTickers [#fetchtickers]
fetches tickers for multiple outcomes at once, batching their market tickers through the markets endpoint (100 per request)
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: object - a dictionary of [prediction ticker structures](/docs/prediction#prediction-ticker-structure) indexed by outcome
**See**: [https://docs.kalshi.com/api-reference/market/get-markets](https://docs.kalshi.com/api-reference/market/get-markets)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| outcomes | Array\ | Yes | unified outcomes — required: kalshi has tens of thousands of markets and no endpoint returning all tickers at once, so an unscoped call is not supported |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchTickers (outcomes, params?)
```
### fetchOrderBook [#fetchorderbook]
fetches the order book for a single kalshi outcome
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: object - a [prediction order book structure](/docs/prediction#prediction-order-book-structure)
**See**: [https://docs.kalshi.com/api-reference/market/get-market-orderbook](https://docs.kalshi.com/api-reference/market/get-market-orderbook)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ----------------------------------------------------------------------------------------------------------------- |
| outcome | string | Yes | unified outcome or outcome id |
| limit | int | No | the maximum number of bids/asks to return (not enforced by kalshis API, reserved for future client-side trimming) |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchOrderBook (outcome, limit?, params?)
```
### fetchOHLCV [#fetchohlcv]
fetches OHLCV candlesticks for a single kalshi outcome from the candlesticks endpoint
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: Array\> - a list of candles ordered as timestamp, open, high, low, close, volume
**See**: [https://docs.kalshi.com/api-reference/market/get-market-candlesticks](https://docs.kalshi.com/api-reference/market/get-market-candlesticks)
| Param | Type | Required | Description |
| --------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome |
| timeframe | string | Yes | the length of time each candle represents |
| since | int | No | timestamp in ms of the earliest candle to fetch |
| limit | int | No | the maximum number of candles to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchOHLCV (outcome, timeframe, since?, limit?, params?)
```
### fetchTrades [#fetchtrades]
fetches public trade history for a single kalshi market ticker
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.kalshi.com/api-reference/market/get-trades](https://docs.kalshi.com/api-reference/market/get-trades)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome |
| since | int | No | timestamp in ms of the earliest trade to fetch |
| limit | int | No | the maximum number of trades to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchTrades (outcome, since?, limit?, params?)
```
### fetchMyTrades [#fetchmytrades]
fetch the fills (executed trades) of the authenticated kalshi user
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://trading-api.readme.io/reference/getfills](https://trading-api.readme.io/reference/getfills)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter to a single unified outcome |
| since | int | No | the earliest fill timestamp (ms) to fetch |
| limit | int | No | the maximum number of fills to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchMyTrades (outcome?, since?, limit?, params?)
```
### fetchBalance [#fetchbalance]
fetches the authenticated user's USD portfolio balance from kalshi
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: object - a [balance structure](/docs/manual#balance-structure)
**See**: [https://trading-api.readme.io/reference/getbalance](https://trading-api.readme.io/reference/getbalance)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchBalance (params?)
```
### fetchPositions [#fetchpositions]
fetches open market positions for the authenticated kalshi user
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: Array\ - a list of [prediction position structures](/docs/prediction#prediction-position-structure)
**See**: [https://trading-api.readme.io/reference/getportfoliopositions](https://trading-api.readme.io/reference/getportfoliopositions)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ------------------------------------------------------ |
| outcomes | Array\ | No | filter by outcome ids or outcomes |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchPositions (outcomes?, params?)
```
### fetchSettlements [#fetchsettlements]
fetches the user's settled (resolved) positions, with the collateral paid out and realized pnl
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: Array\ - a list of prediction settlement structures
**See**: [https://trading-api.readme.io/reference/getportfoliosettlements](https://trading-api.readme.io/reference/getportfoliosettlements)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter to a single unified outcome |
| since | int | No | timestamp in ms of the earliest settlement to fetch |
| limit | int | No | the maximum number of settlements to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchSettlements (outcome?, since?, limit?, params?)
```
### fetchOpenOrders [#fetchopenorders]
fetches resting (open) orders for the authenticated kalshi user, optionally filtered by ticker
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://trading-api.readme.io/reference/getorders](https://trading-api.readme.io/reference/getorders)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter by unified outcome |
| since | int | No | timestamp in ms of the earliest order to fetch |
| limit | int | No | the maximum number of orders to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchOpenOrders (outcome?, since?, limit?, params?)
```
### fetchOrders [#fetchorders]
fetches all orders (resting, executed and canceled) for the authenticated kalshi user
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://trading-api.readme.io/reference/getorders](https://trading-api.readme.io/reference/getorders)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter by unified outcome |
| since | int | No | timestamp in ms of the earliest order to fetch |
| limit | int | No | the maximum number of orders to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchOrders (outcome?, since?, limit?, params?)
```
### fetchClosedOrders [#fetchclosedorders]
fetches the closed (executed or canceled) orders for the authenticated kalshi user
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://trading-api.readme.io/reference/getorders](https://trading-api.readme.io/reference/getorders)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter by unified outcome |
| since | int | No | timestamp in ms of the earliest order to fetch |
| limit | int | No | the maximum number of orders to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchClosedOrders (outcome?, since?, limit?, params?)
```
### fetchOrder [#fetchorder]
fetches a single order by id from the kalshi portfolio endpoint
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://trading-api.readme.io/reference/getorder](https://trading-api.readme.io/reference/getorder)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| outcome | string | No | unified outcome |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchOrder (id, outcome?, params?)
```
### createOrder [#createorder]
places a limit or market order on kalshi for the given outcome token
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://trading-api.readme.io/reference/createorder](https://trading-api.readme.io/reference/createorder)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome |
| type | string | Yes | 'limit' or 'market' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | number of contracts |
| price | float | No | limit price in dollars (0–1 range) |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.createOrder (outcome, type, side, amount, price?, params?)
```
### editOrder [#editorder]
edits a resting order by cancelling it and placing a new one with the updated terms
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://trading-api.readme.io/reference/createorder](https://trading-api.readme.io/reference/createorder)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the id of the order to edit |
| outcome | string | Yes | unified outcome |
| type | string | Yes | 'limit' (kalshi has only limit orders) |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | No | the new number of contracts |
| price | float | No | the new price (0..1) |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.editOrder (id, outcome, type, side, amount?, price?, params?)
```
### cancelOrder [#cancelorder]
cancels a single open order by id on kalshi
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://trading-api.readme.io/reference/cancelorder](https://trading-api.readme.io/reference/cancelorder)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| outcome | string | No | unified outcome |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.cancelOrder (id, outcome?, params?)
```
### cancelAllOrders [#cancelallorders]
cancels all open orders on kalshi, optionally scoped to one outcome ticker
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://trading-api.readme.io/reference/cancelorders](https://trading-api.readme.io/reference/cancelorders)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | unified outcome to scope the cancellation to |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.cancelAllOrders (outcome?, params?)
```
### fetchEvents [#fetchevents]
fetches kalshi events scoped by a search query, tag, category or series ticker — always live from the API, never from the local cache (it POPULATES the cache for later event()/outcome lookups). the scope decides the endpoint: a free-text `query` hits kalshi's ranked search endpoint and the top `limit` matches are fetched canonically; `tags`/`category` resolve to series via the /series listing then fetch their events; `series_ticker` is used verbatim. `limit` bounds how many events are actually fetched (broad scopes stop early), and any other param is forwarded straight to the /events endpoint.
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: Array\ - an array of event structures
**See**: [https://docs.kalshi.com/api-reference/events/get-events](https://docs.kalshi.com/api-reference/events/get-events)
| Param | Type | Required | Description | | |
| --------------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint (unrecognised keys are forwarded to GET /events) | | |
| params.query | string | No | free-text search resolved server-side via kalshi's series search endpoint | | |
| params.queries | Array\ | No | multiple free-text searches (alternative to query, unioned) | | |
| params.series\_ticker | string | No | one or more comma-separated kalshi series tickers (e.g. 'KXBTC') — used verbatim, no search | | |
| params.tags | Array\ | No | kalshi series tags (e.g. \['BTC']) — resolved to series via the /series listing | | |
| params.category | string | No | a kalshi series category (e.g. 'Crypto') — resolved to series via the /series listing | | |
| params.status | string | No | 'active' | 'inactive' | 'closed', defaults to options.defaultEventStatus |
| params.limit | int | No | max number of events to return | | |
```javascript
kalshi.fetchEvents (params?)
```
### fetchEvent [#fetchevent]
fetches a single prediction-market event by its event ticker
**Kind**: instance method of [kalshi](#kalshi)\
**Returns**: object - a [prediction event structure](/docs/prediction#prediction-event-structure)
**See**: [https://trading-api.readme.io/reference/getevent](https://trading-api.readme.io/reference/getevent)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the event ticker |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
kalshi.fetchEvent (id, params?)
```
# limitless (/docs/prediction/limitless)
## limitless [#limitless]
**Kind**: global class\
**Extends**: Exchange
* [fetchMarkets](#fetchmarkets)
* [fetchEvent](#fetchevent)
* [fetchTicker](#fetchticker)
* [fetchTickers](#fetchtickers)
* [fetchTrades](#fetchtrades)
* [fetchOrderBook](#fetchorderbook)
* [fetchOHLCV](#fetchohlcv)
* [fetchOrders](#fetchorders)
* [fetchOpenOrders](#fetchopenorders)
* [fetchClosedOrders](#fetchclosedorders)
* [fetchOrdersByIds](#fetchordersbyids)
* [fetchOrder](#fetchorder)
* [fetchAccounts](#fetchaccounts)
* [createOrder](#createorder)
* [approve](#approve)
* [cancelOrder](#cancelorder)
* [redeem](#redeem)
* [cancelOrders](#cancelorders)
* [cancelAllOrders](#cancelallorders)
* [fetchMyTrades](#fetchmytrades)
* [fetchPositions](#fetchpositions)
* [fetchEvents](#fetchevents)
### fetchMarkets [#fetchmarkets]
fetches all active limitless markets paginated and returns one CCXT market per child market, each containing a list of outcome objects (YES/NO)
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - an array of objects representing market data
**See**: [https://docs.limitless.exchange/api-reference/markets/get-active-markets](https://docs.limitless.exchange/api-reference/markets/get-active-markets)
| Param | Type | Required | Description |
| -------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.query | string | No | a single search query string to filter markets by |
| params.queries | Array\ | No | multiple search query strings (alternative to query) |
| params.limit | int | No | max number of markets to collect (defaults to options.fetchMarketsLimit, 1000); caps the pages fetched |
```javascript
limitless.fetchMarkets (params?)
```
### fetchEvent [#fetchevent]
fetches a single prediction-market event by its market slug or address
**Kind**: instance method of [limitless](#limitless)\
**Returns**: object - a [prediction event structure](/docs/prediction#prediction-event-structure)
**See**: [https://docs.limitless.exchange/api-reference/markets/get-market](https://docs.limitless.exchange/api-reference/markets/get-market)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the market slug or address |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchEvent (id, params?)
```
### fetchTicker [#fetchticker]
fetches the current price and best bid/ask for a single outcome token, combining the market detail and order book endpoints
**Kind**: instance method of [limitless](#limitless)\
**Returns**: object - a [prediction ticker structure](/docs/prediction#prediction-ticker-structure)
**See**
* [https://docs.limitless.exchange/api-reference/markets/get-market](https://docs.limitless.exchange/api-reference/markets/get-market)
* [https://docs.limitless.exchange/api-reference/trading/orderbook](https://docs.limitless.exchange/api-reference/trading/orderbook)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | --------------------------------------------------------------------------- |
| outcome | string | Yes | unified outcome like TRUMP\_OUT\_PRESIDENT\_2027:YES or an outcome token id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchTicker (outcome, params?)
```
### fetchTickers [#fetchtickers]
fetches tickers for multiple outcome tokens, grouping requested outcomes by their parent market (two requests per market: detail + order book)
**Kind**: instance method of [limitless](#limitless)\
**Returns**: object - a dictionary of [prediction ticker structures](/docs/prediction#prediction-ticker-structure) indexed by outcome
**See**
* [https://docs.limitless.exchange/api-reference/markets/get-market](https://docs.limitless.exchange/api-reference/markets/get-market)
* [https://docs.limitless.exchange/api-reference/trading/orderbook](https://docs.limitless.exchange/api-reference/trading/orderbook)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| outcomes | Array\ | Yes | unified outcomes or outcome token ids — required: limitless has no endpoint returning all tickers at once, so an unscoped call is not supported |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchTickers (outcomes, params?)
```
### fetchTrades [#fetchtrades]
fetches recent public trades for a single outcome token from the market events feed
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.limitless.exchange/api-reference/trading/market-events](https://docs.limitless.exchange/api-reference/trading/market-events)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | --------------------------------------------------------------------------- |
| outcome | string | Yes | unified outcome like TRUMP\_OUT\_PRESIDENT\_2027:YES or an outcome token id |
| since | int | No | timestamp in ms of the earliest trade to fetch |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchTrades (outcome, since?, limit?, params?)
```
### fetchOrderBook [#fetchorderbook]
fetches the order book for a single outcome token, converting 6-decimal USDC sizes to whole units, no outcomes are quoted at 1 - price with the sides swapped
**Kind**: instance method of [limitless](#limitless)\
**Returns**: object - a [prediction order book structure](/docs/prediction#prediction-order-book-structure)
**See**: [https://docs.limitless.exchange/api-reference/trading/orderbook](https://docs.limitless.exchange/api-reference/trading/orderbook)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | --------------------------------------------------------------------------- |
| outcome | string | Yes | unified outcome like TRUMP\_OUT\_PRESIDENT\_2027:YES or an outcome token id |
| limit | int | No | not used by limitless fetchOrderBook |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchOrderBook (outcome, limit?, params?)
```
### fetchOHLCV [#fetchohlcv]
fetches historical prices for a single limitless market outcome and maps them to OHLCV format, uses the `interval` query parameter and selects the YES/NO series that matches the requested outcome
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\> - a list of candles ordered as timestamp, open, high, low, close, volume
**See**: [https://docs.limitless.exchange/api-reference/trading/historical-price](https://docs.limitless.exchange/api-reference/trading/historical-price)
| Param | Type | Required | Description |
| --------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | outcome, e.g. "TRUMP\_OUT:YES" |
| timeframe | string | Yes | the length of time each candle represents |
| since | int | No | timestamp in ms of the earliest candle to fetch |
| limit | int | No | the maximum number of candles to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchOHLCV (outcome, timeframe, since?, limit?, params?)
```
### fetchOrders [#fetchorders]
fetches orders for the authenticated user for a single outcome
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.limitless.exchange/api-reference/orders/get-user-orders](https://docs.limitless.exchange/api-reference/orders/get-user-orders)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | outcome, e.g. "TRUMP\_OUT:YES" |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchOrders (outcome?, since?, limit?, params?)
```
### fetchOpenOrders [#fetchopenorders]
fetches open orders for the authenticated user for a single outcome
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.limitless.exchange/api-reference/orders/get-user-orders](https://docs.limitless.exchange/api-reference/orders/get-user-orders)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | outcome, e.g. "TRUMP\_OUT:YES" |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchOpenOrders (outcome?, since?, limit?, params?)
```
### fetchClosedOrders [#fetchclosedorders]
fetches closed orders for the authenticated user for a single outcome
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.limitless.exchange/api-reference/orders/get-user-orders](https://docs.limitless.exchange/api-reference/orders/get-user-orders)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | outcome, e.g. "TRUMP\_OUT:YES" |
| since | int | No | the earliest time in ms to fetch orders for |
| limit | int | No | the maximum number of order structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchClosedOrders (outcome?, since?, limit?, params?)
```
### fetchOrdersByIds [#fetchordersbyids]
fetch orders by the list of order id
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.limitless.exchange/api-reference/trading/order-status-batch](https://docs.limitless.exchange/api-reference/trading/order-status-batch)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| ids | Array\ | Yes | list of order id |
| outcome | string | No | market outcome, e.g. "TRUMP\_OUT:YES" |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchOrdersByIds (ids, outcome?, params?)
```
### fetchOrder [#fetchorder]
fetches information on an order made by the user
**Kind**: instance method of [limitless](#limitless)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.limitless.exchange/api-reference/trading/order-status-batch](https://docs.limitless.exchange/api-reference/trading/order-status-batch)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the order id |
| outcome | string | No | market outcome, e.g. "TRUMP\_OUT:YES" |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchOrder (id, outcome?, params?)
```
### fetchAccounts [#fetchaccounts]
query for account id and info
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - a list of \[account structures]
**See**: [https://docs.limitless.exchange/api-reference/portfolio/get-current-profile](https://docs.limitless.exchange/api-reference/portfolio/get-current-profile)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchAccounts (params?)
```
### createOrder [#createorder]
places a limit or market order on limitless for the given outcome token
**Kind**: instance method of [limitless](#limitless)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.limitless.exchange/api-reference/orders/create-order](https://docs.limitless.exchange/api-reference/orders/create-order)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | outcome, e.g. "TRUMP\_OUT:YES" |
| type | string | Yes | 'limit' or 'market' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | amount of outcome tokens |
| price | float | No | limit price (0–1 range) |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.createOrder (outcome, type, side, amount, price?, params?)
```
### approve [#approve]
sets the on-chain ERC20 collateral (USDC) allowance for the limitless exchange contract on Base, which is required before an EOA maker can place orders ("Insufficient collateral allowance" otherwise). Sends a real on-chain transaction signed with the privateKey and waits for the receipt
**Kind**: instance method of [limitless](#limitless)\
**Returns**: object - the transaction receipt
| Param | Type | Required | Description |
| --------------- | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------- |
| params | object | No | extra parameters |
| params.token | string | No | the collateral token address (default USDC on Base) |
| params.spender | string | No | the exchange contract to approve (default the limitless CTF exchange); read from a market's venue when omitted |
| params.owner | string | No | the token holder address (default this.walletAddress or the address derived from the privateKey) |
| params.amount | float | No | the allowance in USDC (default: unlimited / maxUint256) |
| params.rpcUrl | string | No | the Base RPC url to broadcast through |
| params.gasLimit | string | No | gas limit hex for the approve tx (default '0x186a0') |
```javascript
limitless.approve (params?)
```
### cancelOrder [#cancelorder]
cancels a single open order by id
**Kind**: instance method of [limitless](#limitless)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.limitless.exchange/api-reference/orders/cancel-order](https://docs.limitless.exchange/api-reference/orders/cancel-order)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | order id |
| outcome | string | No | outcome, e.g. "TRUMP\_OUT:YES" |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.cancelOrder (id, outcome?, params?)
```
### redeem [#redeem]
redeem a resolved winning position back to collateral (gasless — the operator settles on-chain)
**Kind**: instance method of [limitless](#limitless)\
**Returns**: object - the raw redemption response
**See**: [https://docs.limitless.exchange/api-reference/portfolio/redeem](https://docs.limitless.exchange/api-reference/portfolio/redeem)
| Param | Type | Required | Description |
| ------------------ | ------------------- | -------- | ---------------------------------------------------------------------------------------------- |
| outcome | string | No | a unified outcome on the resolved market to redeem (used to resolve the market conditionId) |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.conditionId | string | No | the CTF condition id (bytes32 hex) to redeem directly, instead of resolving it from an outcome |
```javascript
limitless.redeem (outcome?, params?)
```
### cancelOrders [#cancelorders]
cancel multiple orders at the same time
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.limitless.exchange/api-reference/trading/cancel-batch](https://docs.limitless.exchange/api-reference/trading/cancel-batch)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| ids | Array\ | Yes | order ids |
| outcome | string | No | unified market outcome, default is undefined |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.cancelOrders (ids, outcome?, params?)
```
### cancelAllOrders [#cancelallorders]
cancels all open orders for one market slug
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.limitless.exchange/api-reference/orders/cancel-all-orders](https://docs.limitless.exchange/api-reference/orders/cancel-all-orders)
| Param | Type | Required | Description |
| ----------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | outcome, e.g. "TRUMP\_OUT:YES" |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.slug | string | No | the market slug to cancel all orders for |
```javascript
limitless.cancelAllOrders (outcome?, params?)
```
### fetchMyTrades [#fetchmytrades]
fetch all trades made by the user
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.limitless.exchange/api-reference/trades/get-trades](https://docs.limitless.exchange/api-reference/trades/get-trades)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | outcome, e.g. "TRUMP\_OUT:YES" |
| since | int | No | the earliest time in ms to fetch trades for |
| limit | int | No | the maximum number of trades structures to retrieve |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchMyTrades (outcome?, since?, limit?, params?)
```
### fetchPositions [#fetchpositions]
fetches open positions for the authenticated limitless user from the portfolio endpoint
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - a list of [prediction position structures](/docs/prediction#prediction-position-structure)
**See**: [https://docs.limitless.exchange/api-reference/portfolio/get-positions](https://docs.limitless.exchange/api-reference/portfolio/get-positions)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ------------------------------------------------------ |
| outcomes | Array\ | No | filter by outcome ids or outcomes |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
limitless.fetchPositions (outcomes?, params?)
```
### fetchEvents [#fetchevents]
fetches prediction-market events matching the given scope (query/queries/tags/eventId/slug — required) and caches their markets and outcomes on the instance
**Kind**: instance method of [limitless](#limitless)\
**Returns**: Array\ - an array of event structures
**See**: [https://docs.limitless.exchange/api-reference/markets/search](https://docs.limitless.exchange/api-reference/markets/search)
| Param | Type | Required | Description |
| -------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| params | object | No | extra exchange-specific parameters |
| params.query | string | No | a single search term; an eventId/slug does a direct lookup and tags resolve to limitless categories, paging only those categories' listings |
| params.queries | Array\ | No | multiple search terms (alternative to query) |
| params.tags | Array\ | No | category names to scope by (matched against GET /categories, e.g. \['crypto']) |
| params.eventId | string | No | direct lookup by market address or slug |
| params.limit | int | No | maximum number of markets per query, defaults to 50 |
```javascript
limitless.fetchEvents (params?)
```
# myriad (/docs/prediction/myriad)
## myriad [#myriad]
**Kind**: global class\
**Extends**: Exchange
* [fetchMarkets](#fetchmarkets)
* [fetchEvent](#fetchevent)
* [fetchPositions](#fetchpositions)
* [fetchTradeQuote](#fetchtradequote)
* [createOrder](#createorder)
* [createOrders](#createorders)
* [editOrder](#editorder)
* [createMarketBuyOrderWithCost](#createmarketbuyorderwithcost)
* [cancelOrder](#cancelorder)
* [cancelAllOrders](#cancelallorders)
* [cancelOrders](#cancelorders)
* [fetchOrder](#fetchorder)
* [fetchOrders](#fetchorders)
* [fetchOpenOrders](#fetchopenorders)
* [fetchClosedOrders](#fetchclosedorders)
* [fetchCanceledOrders](#fetchcanceledorders)
* [fetchMyTrades](#fetchmytrades)
* [fetchBalance](#fetchbalance)
* [fetchTicker](#fetchticker)
* [fetchTradingFee](#fetchtradingfee)
* [fetchOrderBook](#fetchorderbook)
* [fetchOHLCV](#fetchohlcv)
* [fetchTickers](#fetchtickers)
* [fetchTrades](#fetchtrades)
* [fetchEvents](#fetchevents)
* [watchOrderBook](#watchorderbook)
* [watchTrades](#watchtrades)
* [watchMyTrades](#watchmytrades)
* [watchTicker](#watchticker)
* [watchTickers](#watchtickers)
* [watchOHLCV](#watchohlcv)
* [watchOrders](#watchorders)
* [watchPositions](#watchpositions)
### fetchMarkets [#fetchmarkets]
retrieves data on all markets for myriad, each prediction market becomes one market with its outcome tokens listed under the outcomes key
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - an array of objects representing market data
**See**: [https://docs.myriad.markets/builders/myriad-api-reference](https://docs.myriad.markets/builders/myriad-api-reference)
| Param | Type | Required | Description |
| -------------- | --------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------- |
| params | object | No | extra exchange-specific parameters |
| params.query | string | No | a single search term used to filter the fetched markets |
| params.queries | Array\ | No | multiple search terms (alternative to query) |
| params.state | string | No | 'open', 'closed' or 'resolved', the state of the markets to fetch, defaults to 'open' |
| params.limit | int | No | max number of markets to collect (defaults to options.fetchMarketsLimit, 1000); stops the pagination once reached |
```javascript
myriad.fetchMarkets (params?)
```
### fetchEvent [#fetchevent]
fetches a single prediction-market event by its market id, or orderbook slug
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [prediction event structure](/docs/prediction#prediction-event-structure)
**See**: [https://docs.myriad.markets/builders/myriad-api-reference](https://docs.myriad.markets/builders/myriad-api-reference)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the market id, or orderbook slug |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchEvent (id, params?)
```
### fetchPositions [#fetchpositions]
fetch the open outcome-token positions held by a wallet (myriad settles trades on-chain, so only read-only portfolio data is exposed by the API)
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction position structures](/docs/prediction#prediction-position-structure)
**See**: [https://docs.myriad.markets/builders/myriad-api-reference](https://docs.myriad.markets/builders/myriad-api-reference)
| Param | Type | Required | Description |
| -------------- | --------------------------- | -------- | ----------------------------------------------------------- |
| outcomes | Array\ | No | unified outcomes to filter by |
| params | object | No | extra exchange-specific parameters |
| params.address | string | No | the wallet address to query, defaults to this.walletAddress |
```javascript
myriad.fetchPositions (outcomes?, params?)
```
### fetchTradeQuote [#fetchtradequote]
fetches a trade quote — price, shares, fees and the on-chain calldata — for buying or selling an outcome. Myriad settles trades on-chain, so this returns the calldata to submit to the prediction-market contract rather than placing an off-chain order
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a quote object with price, shares, fees and the on-chain calldata
**See**: [https://docs.myriad.markets/builders/myriad-api-reference](https://docs.myriad.markets/builders/myriad-api-reference)
| Param | Type | Required | Description |
| --------------- | ------------------- | -------- | -------------------------------------------------------------------------------- |
| outcome | string | Yes | unified outcome or outcome id |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | for 'buy' the collateral value to spend; for 'sell' the number of shares to sell |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.slippage | float | No | maximum slippage tolerance (default 0.005) |
```javascript
myriad.fetchTradeQuote (outcome, side, amount, params?)
```
### createOrder [#createorder]
create a trade order. Myriad has two trading models: a gasless order book (CLOB) where an EIP-712 signed order is posted off-chain and settled by the operator, and an on-chain AMM. Order-book markets are used by default; the model can be forced via params.tradingModel
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281e2bc49cf4914b07528](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281e2bc49cf4914b07528)
| Param | Type | Required | Description |
| ------------------- | ------------------- | -------- | --------------------------------------------------------------------------------------------- |
| outcome | string | Yes | unified outcome or outcome id |
| type | string | Yes | 'limit' or 'market' (order book); ignored by the AMM path |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | number of outcome shares to trade (AMM 'buy' spends this as collateral value instead) |
| price | float | No | price per share as a fraction in \[0, 1] (required for order-book limit orders) |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.tradingModel | string | No | 'ob' to force the order book, 'amm' to force the on-chain AMM; defaults to the market's model |
| params.timeInForce | string | No | order-book time in force: 'GTC', 'GTD', 'FOK', 'FAK' or 'PO' |
| params.expiration | string | No | unix-seconds expiration for a GTD order |
```javascript
myriad.createOrder (outcome, type, side, amount, price?, params?)
```
### createOrders [#createorders]
places multiple order book orders. Myriad's batch endpoint is not reliable, so the
orders are signed and submitted sequentially (not atomically)
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281e2bc49cf4914b07528](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281e2bc49cf4914b07528)
| Param | Type | Required | Description |
| ------ | --------------------------- | -------- | --------------------------------------------------------------------------------- |
| orders | Array\ | Yes | a list of order requests, each with outcome, type, side, amount, price and params |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.createOrders (orders, params?)
```
### editOrder [#editorder]
edits an open order by cancelling it and placing a replacement (gasless). Myriad's
batch-modify endpoint is not reliable, so the cancel and replace are submitted sequentially
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281b58c5adb2f5998eec8](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281b58c5adb2f5998eec8)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| id | string | Yes | the hash of the order to replace |
| outcome | string | Yes | unified outcome of the new order |
| type | string | Yes | 'limit' or 'market' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | number of outcome shares for the new order |
| price | float | No | price per share as a fraction in \[0, 1] |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.orderResponse | object | No | a pre-fetched fetchOrder-style response for the order being replaced; avoids the internal lookup when already available, call fetchOrder to retrieve this data |
| params.rawOrder | object | No | the raw order payload to cancel as an alternative to params.orderResponse, call fetchOrder to retrieve this data |
| params.networkId | string | No | the order-book network id, required when using params.rawOrder without an embedded network id |
```javascript
myriad.editOrder (id, outcome, type, side, amount, price?, params?)
```
### createMarketBuyOrderWithCost [#createmarketbuyorderwithcost]
buys an outcome by spending a fixed collateral amount on the AMM (dollar-sizing)
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: createAmmOrder supports params.quote from fetchTradeQuote(outcome, 'buy', amount)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------- |
| outcome | string | Yes | unified outcome handle |
| cost | number | Yes | collateral amount to spend |
| params | object | No | extra parameters passed through to createAmmOrder |
```javascript
myriad.createMarketBuyOrderWithCost (outcome, cost, params?)
```
### cancelOrder [#cancelorder]
cancels an open order book order by its hash (re-signs the original order to prove ownership; gasless)
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281b58c5adb2f5998eec8](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281b58c5adb2f5998eec8)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| id | string | Yes | the order hash returned by createOrder |
| outcome | string | No | unified outcome the order belongs to |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.orderResponse | object | No | a pre-fetched fetchOrder-style response for the target order; avoids the internal order lookup when already available, call fetchOrder to retrieve this data |
| params.rawOrder | object | No | the raw order payload to sign as an alternative to params.orderResponse, call fetchOrder to retrieve this data |
| params.networkId | string | No | the order-book network id, required when using params.rawOrder without an embedded network id |
```javascript
myriad.cancelOrder (id, outcome?, params?)
```
### cancelAllOrders [#cancelallorders]
cancels all open order book orders for the wallet, optionally scoped to one market (gasless)
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list with one [prediction order structure](/docs/prediction#prediction-order-structure) whose `info` carries the cancelled count
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281e7a14cd34e6a716761](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281e7a14cd34e6a716761)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | -------------------------------------------------------- |
| outcome | string | No | unified outcome; when omitted cancels across all markets |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.cancelAllOrders (outcome?, params?)
```
### cancelOrders [#cancelorders]
cancels multiple open order book orders by hash in one request (gasless)
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828177961fd94a6055966f](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828177961fd94a6055966f)
| Param | Type | Required | Description |
| --------------------- | --------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ids | Array\ | Yes | the order hashes to cancel |
| outcome | string | No | not used by myriad cancelOrders |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.orderResponses | object | No | pre-fetched fetchOrder-style responses keyed by order hash, or an array of such responses; avoids the internal per-order lookups when already available, call fetchOrder for each id to retrieve this data |
| params.networkId | string | No | the order-book network id fallback for any supplied raw order data |
```javascript
myriad.cancelOrders (ids, outcome?, params?)
```
### fetchOrder [#fetchorder]
fetches a single order book order by its hash
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828116b8a0d976baea1df0](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828116b8a0d976baea1df0)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the order hash |
| outcome | string | No | unified outcome the order belongs to |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchOrder (id, outcome?, params?)
```
### fetchOrders [#fetchorders]
fetches order book orders for the wallet (or any trader passed via params.trader), or amm closed orders
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828171a003cf996487d008](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828171a003cf996487d008)
| Param | Type | Required | Description |
| ------------- | ------------------- | -------- | ----------------------------------------------------------- |
| outcome | string | No | unified outcome to filter by |
| since | int | No | timestamp in ms of the earliest order |
| limit | int | No | the maximum number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.trader | string | No | wallet address to query (defaults to the configured wallet) |
| params.status | string | No | 'open', 'filled', 'cancelled' or 'expired' |
```javascript
myriad.fetchOrders (outcome?, since?, limit?, params?)
```
### fetchOpenOrders [#fetchopenorders]
fetches open order book orders for the wallet
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828171a003cf996487d008](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828171a003cf996487d008)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | unified outcome to filter by |
| since | int | No | timestamp in ms of the earliest order |
| limit | int | No | the maximum number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchOpenOrders (outcome?, since?, limit?, params?)
```
### fetchClosedOrders [#fetchclosedorders]
fetches the wallet's filled order book orders
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828171a003cf996487d008](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828171a003cf996487d008)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | unified outcome to filter by |
| since | int | No | timestamp in ms of the earliest order |
| limit | int | No | the maximum number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchClosedOrders (outcome?, since?, limit?, params?)
```
### fetchCanceledOrders [#fetchcanceledorders]
fetches the wallet's cancelled order book orders
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828171a003cf996487d008](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828171a003cf996487d008)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | unified outcome to filter by |
| since | int | No | timestamp in ms of the earliest order |
| limit | int | No | the maximum number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchCanceledOrders (outcome?, since?, limit?, params?)
```
### fetchMyTrades [#fetchmytrades]
fetches the wallet's filled order book orders as trades. Note: Myriad's REST exposes the order's
limit price, not the per-fill execution price, so the price reflects the order's limit (exact for resting/limit
fills, an upper/lower bound for market orders) — use watchTrades for live execution prices
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828171a003cf996487d008](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da828171a003cf996487d008)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | unified outcome to filter by |
| since | int | No | timestamp in ms of the earliest trade |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchMyTrades (outcome?, since?, limit?, params?)
```
### fetchBalance [#fetchbalance]
fetches the wallet's on-chain collateral balance for the order-book network (USD1 on BNB Chain)
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [balance structure](/docs/manual#balance-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api](https://docs.myriad.markets/builders/myriad-order-book/order-book-api)
| Param | Type | Required | Description |
| ------------------ | ------------------- | -------- | ------------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.network\_id | string | No | the network id (defaults to options.defaultNetworkId, '56') |
| params.network | string | No | alias for params.network\_id |
| params.currency | string | No | output balance currency code override, e.g. 'USDC' or 'USDT' |
| params.decimals | int | No | for USDC and USDT it's 6, default is 18 for USD1 |
```javascript
myriad.fetchBalance (params?)
```
### fetchTicker [#fetchticker]
fetches the current price for a single outcome by loading the parent market
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [prediction ticker structure](/docs/prediction#prediction-ticker-structure)
**See**: [https://docs.myriad.markets/builders/myriad-api-reference](https://docs.myriad.markets/builders/myriad-api-reference)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | -------------------------------------------------------------------- |
| outcome | string | Yes | unified outcome like TRUMP\_WIN:YES or an outcome id like 2741:756/0 |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchTicker (outcome, params?)
```
### fetchTradingFee [#fetchtradingfee]
fetches the buy/sell fee rates for a market outcome
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [fee structure](/docs/manual#fee-structure)
**See**: [https://docs.myriad.markets/builders/myriad-api-reference](https://docs.myriad.markets/builders/myriad-api-reference)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchTradingFee (outcome, params?)
```
### fetchOrderBook [#fetchorderbook]
fetches the real order book for order-book markets, or synthesizes a one-level book from the AMM price otherwise
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [prediction order book structure](/docs/prediction#prediction-order-book-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281bba6aaf24dd61f2bb1](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da8281bba6aaf24dd61f2bb1)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome like TRUMP\_WIN:YES or an outcome id |
| limit | int | No | not used by myriad fetchOrderBook |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchOrderBook (outcome, limit?, params?)
```
### fetchOHLCV [#fetchohlcv]
fetches price history for an outcome from the price\_charts bucket embedded in the market response
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\> - a list of candles ordered as timestamp, open, high, low, close, volume
**See**: [https://docs.myriad.markets/builders/myriad-api-reference](https://docs.myriad.markets/builders/myriad-api-reference)
| Param | Type | Required | Description |
| --------- | ------------------- | -------- | ------------------------------------------------------------- |
| outcome | string | Yes | unified outcome like TRUMP\_WIN:YES or an outcome id |
| timeframe | string | Yes | mapped to the closest available chart bucket (24h, 7d or 30d) |
| since | int | No | timestamp in ms of the earliest candle to fetch |
| limit | int | No | the maximum number of candles to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchOHLCV (outcome, timeframe, since?, limit?, params?)
```
### fetchTickers [#fetchtickers]
fetches tickers for multiple outcomes, grouping requested outcomes by their parent market to fetch each market only once
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a dictionary of [prediction ticker structures](/docs/prediction#prediction-ticker-structure) indexed by outcome
**See**: [https://docs.myriad.markets/builders/myriad-api-reference](https://docs.myriad.markets/builders/myriad-api-reference)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- |
| outcomes | Array\ | Yes | unified outcomes — required: myriad has no endpoint returning all tickers at once, so an unscoped call is not supported |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchTickers (outcomes, params?)
```
### fetchTrades [#fetchtrades]
fetches recent public trades for a single outcome from the market action feed
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.myriad.markets/builders/myriad-api-reference](https://docs.myriad.markets/builders/myriad-api-reference)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome like TRUMP\_WIN:YES or an outcome id |
| since | int | No | timestamp in ms of the earliest trade to fetch |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.fetchTrades (outcome, since?, limit?, params?)
```
### fetchEvents [#fetchevents]
fetches prediction-market events matching the given scope (query/queries/tags/eventId) and caches their markets and outcomes on the instance
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - an array of event structures
**See**: [https://docs.myriad.markets/builders/myriad-api-reference](https://docs.myriad.markets/builders/myriad-api-reference)
| Param | Type | Required | Description |
| -------------- | --------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| params | object | No | extra exchange-specific parameters |
| params.query | string | No | a single search term; an eventId does a direct lookup and tags map to server-side keyword searches |
| params.queries | Array\ | No | multiple search terms (alternative to query) |
| params.tags | Array\ | No | tag slugs to scope by (searched as keywords, e.g. \['bitcoin', 'world-cup']) |
| params.eventId | string | No | direct lookup by unified event id (composite networkId:marketId) like '56:170145' or questions path like '793bfc47-ddcd-47d2-aad5-52c7002fc823' |
| params.limit | int | No | maximum number of markets per query, defaults to 50 |
| params.state | string | No | 'open', 'closed' or 'resolved', defaults to 'open' |
```javascript
myriad.fetchEvents (params?)
```
### watchOrderBook [#watchorderbook]
streams the order book for an outcome over the Centrifugo websocket; the channel is delta-only so the book is seeded from the REST snapshot
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [prediction order book structure](/docs/prediction#prediction-order-book-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome |
| limit | int | No | the maximum number of order book entries to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.watchOrderBook (outcome, limit?, params?)
```
### watchTrades [#watchtrades]
streams public trades for an outcome over the Centrifugo websocket
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome |
| since | int | No | timestamp in ms of the earliest trade |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.watchTrades (outcome, since?, limit?, params?)
```
### watchMyTrades [#watchmytrades]
streams the wallet's own fills for a market over the Centrifugo trades channel (real
execution prices, unlike the REST fetchMyTrades); requires a market outcome since the channel is per-market
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome whose market to watch |
| since | int | No | timestamp in ms of the earliest trade |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.watchMyTrades (outcome, since?, limit?, params?)
```
### watchTicker [#watchticker]
streams best bid/ask/last for an outcome over the Centrifugo prices channel
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a [prediction ticker structure](/docs/prediction#prediction-ticker-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.watchTicker (outcome, params?)
```
### watchTickers [#watchtickers]
streams best bid/ask/last for several outcomes over the Centrifugo prices channels
**Kind**: instance method of [myriad](#myriad)\
**Returns**: object - a dict of [prediction ticker structures](/docs/prediction#prediction-ticker-structure) indexed by outcome
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ------------------------------------------------------ |
| outcomes | Array\ | Yes | unified outcomes to watch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.watchTickers (outcomes, params?)
```
### watchOHLCV [#watchohlcv]
streams OHLCV candles for an outcome, synthesised from the live trades channel
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\> - a list of \[timestamp, open, high, low, close, volume] candles
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa)
| Param | Type | Required | Description |
| --------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome |
| timeframe | string | Yes | the length of each candle (e.g. '1m', '1h', '1d') |
| since | int | No | timestamp in ms of the earliest candle |
| limit | int | No | the maximum number of candles to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.watchOHLCV (outcome, timeframe, since?, limit?, params?)
```
### watchOrders [#watchorders]
streams the wallet's order lifecycle updates over the Centrifugo orders channel
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | unified outcome to filter by |
| since | int | No | timestamp in ms of the earliest order |
| limit | int | No | the maximum number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.watchOrders (outcome?, since?, limit?, params?)
```
### watchPositions [#watchpositions]
streams the wallet's share-balance changes over the Centrifugo positions channel
**Kind**: instance method of [myriad](#myriad)\
**Returns**: Array\ - a list of [prediction position structures](/docs/prediction#prediction-position-structure)
**See**: [https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa](https://docs.myriad.markets/builders/myriad-order-book/order-book-api#37dc9e49da82810581f8d2c8be2364fa)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ------------------------------------------------------ |
| outcomes | Array\ | No | unified outcomes to filter by |
| since | int | No | timestamp in ms of the earliest position update |
| limit | int | No | the maximum number of position updates to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
myriad.watchPositions (outcomes?, since?, limit?, params?)
```
# opinion (/docs/prediction/opinion)
## opinion [#opinion]
**Kind**: global class\
**Extends**: Exchange
* [fetchMarkets](#fetchmarkets)
* [fetchEvents](#fetchevents)
* [fetchEvent](#fetchevent)
* [fetchTicker](#fetchticker)
* [fetchTickers](#fetchtickers)
* [fetchOrderBook](#fetchorderbook)
* [fetchOHLCV](#fetchohlcv)
* [parseOHLCV](#parseohlcv)
* [createOrder](#createorder)
* [cancelOrder](#cancelorder)
* [parsePredictionOrder](#parsepredictionorder)
* [fetchOrders](#fetchorders)
* [fetchOrder](#fetchorder)
* [fetchOpenOrders](#fetchopenorders)
* [fetchClosedOrders](#fetchclosedorders)
* [fetchMyTrades](#fetchmytrades)
* [fetchBalance](#fetchbalance)
* [fetchPositions](#fetchpositions)
* [createApiKey](#createapikey)
* [fetchApiKey](#fetchapikey)
* [deleteApiKey](#deleteapikey)
* [watchOrderBook](#watchorderbook)
* [watchTicker](#watchticker)
* [watchTrades](#watchtrades)
* [watchOrders](#watchorders)
* [watchMyTrades](#watchmytrades)
### fetchMarkets [#fetchmarkets]
fetches every kind of opinion market
categorical parents double as our unified "events" and are cached into this.events as a side effect
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\ - an array of objects representing market data
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/market](https://docs.opinion.trade/developer-guide/opinion-open-api/market)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | -------------------------------------------------------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.limit | int | No | max number of markets to collect (defaults to options.marketsPageLimit \* options.maxMarketsPages, 1000) |
```javascript
opinion.fetchMarkets (params?)
```
### fetchEvents [#fetchevents]
fetches Opinion's categorical markets - scope required via query/queries/tags/eventId/slug/labelId
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\ - an array of event structures
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/market](https://docs.opinion.trade/developer-guide/opinion-open-api/market)
| Param | Type | Required | Description |
| -------------- | ------------------- | -------- | ----------------------------------------------------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.labelId | int | No | filter by opinion category label id |
| params.limit | int | No | max number of events to fetch (paginated server-side; defaults to options.maxFetchEventsResults, 100) |
```javascript
opinion.fetchEvents (params?)
```
### fetchEvent [#fetchevent]
fetches a single prediction-market event by its market id, or slug
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - a [prediction event structure](/docs/prediction#prediction-event-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/market](https://docs.opinion.trade/developer-guide/opinion-open-api/market)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the numeric marketId, or the market slug |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchEvent (id, params?)
```
### fetchTicker [#fetchticker]
fetches the latest trade price and top of book for a single outcome token
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - a [prediction ticker structure](/docs/prediction#prediction-ticker-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/token](https://docs.opinion.trade/developer-guide/opinion-open-api/token)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchTicker (outcome, params?)
```
### fetchTickers [#fetchtickers]
fetches tickers for multiple outcome tokens - opinion has no all-tickers endpoint, each token needs its own latest-price + orderbook request
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - a dictionary of [prediction ticker structures](/docs/prediction#prediction-ticker-structure) indexed by outcome
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/token](https://docs.opinion.trade/developer-guide/opinion-open-api/token)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ------------------------------------------------------------------------------------- |
| outcomes | Array\ | Yes | unified outcomes or outcome token ids - required, opinion has no all-tickers endpoint |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchTickers (outcomes, params?)
```
### fetchOrderBook [#fetchorderbook]
fetches the order book for a single outcome token
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - a [prediction order book structure](/docs/prediction#prediction-order-book-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/token](https://docs.opinion.trade/developer-guide/opinion-open-api/token)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| limit | int | No | not used by opinion fetchOrderBook |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchOrderBook (outcome, limit?, params?)
```
### fetchOHLCV [#fetchohlcv]
fetches historical candlestick data for an outcome token
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\> - a list of candles ordered as timestamp, open, high, low, close, volume
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/token](https://docs.opinion.trade/developer-guide/opinion-open-api/token)
| Param | Type | Required | Description |
| --------- | ------------------- | -------- | --------------------------------------------------------------------------------- |
| outcome | string | Yes | unified outcome or outcome token id |
| timeframe | string | Yes | the length of time each candle represents - only '1h' and '1d' are supported live |
| since | int | No | timestamp in ms of the earliest candle to fetch |
| limit | int | No | the maximum number of candles to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchOHLCV (outcome, timeframe, since?, limit?, params?)
```
### parseOHLCV [#parseohlcv]
parses a single opinion price-history point into a unified OHLCV candle
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\ - a candle ordered as timestamp, open, high, low, close, volume
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ---------------------------------------- |
| ohlcv | object | Yes | the raw \{ p, t } point |
| market | object | No | the outcome object the candle belongs to |
```javascript
opinion.parseOHLCV (ohlcv, market?)
```
### createOrder [#createorder]
places a limit or market order on the CLOB for the given outcome token
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/order](https://docs.opinion.trade/developer-guide/opinion-open-api/order)
| Param | Type | Required | Description |
| --------------- | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| outcome | string | Yes | unified outcome or outcome token id |
| type | string | Yes | 'market' or 'limit' |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | for limit orders, the number of outcome shares to trade; for market orders, the quote (USDT) to spend on a BUY or the shares to sell on a SELL |
| price | float | No | the price per outcome token between 0 and 1; required for limit orders and market SELL orders (where it acts as the reference / worst acceptable price for the taker amount); ignored for market BUY orders (amount is already the quote to spend) |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.postOnly | bool | No | limit orders only - reject the order if it would cross the spread |
```javascript
opinion.createOrder (outcome, type, side, amount, price?, params?)
```
### cancelOrder [#cancelorder]
cancels a single open order by id
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/order](https://docs.opinion.trade/developer-guide/opinion-open-api/order)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the order id |
| outcome | string | No | not used by opinion cancelOrder |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.cancelOrder (id, outcome?, params?)
```
### parsePredictionOrder [#parsepredictionorder]
parses a raw opinion order object into a unified prediction order structure
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | --------------------------------------- |
| order | object | Yes | the raw opinion OrderData object |
| market | object | No | the outcome object the order belongs to |
```javascript
opinion.parsePredictionOrder (order, market?)
```
### fetchOrders [#fetchorders]
fetches all of the authenticated user's orders
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/order](https://docs.opinion.trade/developer-guide/opinion-open-api/order)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter by unified outcome or outcome token id |
| since | int | No | timestamp in ms of the earliest order to fetch |
| limit | int | No | the maximum number of orders to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchOrders (outcome?, since?, limit?, params?)
```
### fetchOrder [#fetchorder]
fetches a single order by id
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/order](https://docs.opinion.trade/developer-guide/opinion-open-api/order)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the order id |
| outcome | string | No | unified outcome or outcome token id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchOrder (id, outcome?, params?)
```
### fetchOpenOrders [#fetchopenorders]
fetches the authenticated user's open orders
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/order](https://docs.opinion.trade/developer-guide/opinion-open-api/order)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter by unified outcome or outcome token id |
| since | int | No | timestamp in ms of the earliest order to fetch |
| limit | int | No | the maximum number of orders to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchOpenOrders (outcome?, since?, limit?, params?)
```
### fetchClosedOrders [#fetchclosedorders]
fetches the authenticated user's closed orders
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/order](https://docs.opinion.trade/developer-guide/opinion-open-api/order)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter by unified outcome or outcome token id |
| since | int | No | timestamp in ms of the earliest order to fetch |
| limit | int | No | the maximum number of orders to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchClosedOrders (outcome?, since?, limit?, params?)
```
### fetchMyTrades [#fetchmytrades]
fetches the authenticated user's trades
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/trade](https://docs.opinion.trade/developer-guide/opinion-open-api/trade)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | filter by unified outcome or outcome token id |
| since | int | No | timestamp in ms of the earliest trade to fetch |
| limit | int | No | the maximum number of trades to fetch |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchMyTrades (outcome?, since?, limit?, params?)
```
### fetchBalance [#fetchbalance]
fetches the authenticated user's quote-token balances
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - a [balance structure](/docs/manual#balance-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/quote-token](https://docs.opinion.trade/developer-guide/opinion-open-api/quote-token)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchBalance (params?)
```
### fetchPositions [#fetchpositions]
fetches the authenticated user's open positions
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\ - a list of [prediction position structures](/docs/prediction#prediction-position-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/position](https://docs.opinion.trade/developer-guide/opinion-open-api/position)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ------------------------------------------------------ |
| outcomes | Array\ | No | filter by unified outcomes or outcome token ids |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.fetchPositions (outcomes?, params?)
```
### createApiKey [#createapikey]
self-service creation of an Open API key linked to this.walletAddress via
an EIP-712-signed request - there is no "generate key" button in the Opinion GUI, this is
the only documented way to obtain a wallet-linked key
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - the api credentials \{ apiKey, walletAddress }
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/authentication](https://docs.opinion.trade/developer-guide/opinion-open-api/authentication)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ---------------- |
| params | object | No | extra parameters |
```javascript
opinion.createApiKey (params?)
```
### fetchApiKey [#fetchapikey]
fetches the currently active Open API key for this.walletAddress
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - the api credentials \{ apiKey, walletAddress }
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/authentication](https://docs.opinion.trade/developer-guide/opinion-open-api/authentication)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ---------------- |
| params | object | No | extra parameters |
```javascript
opinion.fetchApiKey (params?)
```
### deleteApiKey [#deleteapikey]
revokes the Open API key for this.walletAddress
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - raw response, result.deleted confirms revocation
**See**: [https://docs.opinion.trade/developer-guide/opinion-open-api/authentication](https://docs.opinion.trade/developer-guide/opinion-open-api/authentication)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ---------------- |
| params | object | No | extra parameters |
```javascript
opinion.deleteApiKey (params?)
```
### watchOrderBook [#watchorderbook]
streams the order book of an outcome token; the channel is delta-only so the live book is seeded from the REST snapshot
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - a [prediction order book structure](/docs/prediction#prediction-order-book-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-websocket/market-channels](https://docs.opinion.trade/developer-guide/opinion-websocket/market-channels)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| limit | int | No | the maximum number of order book entries to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.watchOrderBook (outcome, limit?, params?)
```
### watchTicker [#watchticker]
streams last-price updates of an outcome token
**Kind**: instance method of [opinion](#opinion)\
**Returns**: object - a [prediction ticker structure](/docs/prediction#prediction-ticker-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-websocket/market-channels](https://docs.opinion.trade/developer-guide/opinion-websocket/market-channels)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.watchTicker (outcome, params?)
```
### watchTrades [#watchtrades]
streams public trades of an outcome token
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-websocket/market-channels](https://docs.opinion.trade/developer-guide/opinion-websocket/market-channels)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| since | int | No | timestamp in ms of the earliest trade to return |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.watchTrades (outcome, since?, limit?, params?)
```
### watchOrders [#watchorders]
streams the authenticated user's order updates of one market - the venue channel is per-market, so the outcome argument is required
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-websocket/user-channels](https://docs.opinion.trade/developer-guide/opinion-websocket/user-channels)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | --------------------------------------------------------- |
| outcome | string | Yes | unified outcome or outcome token id whose market to watch |
| since | int | No | timestamp in ms of the earliest order to return |
| limit | int | No | the maximum number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.watchOrders (outcome, since?, limit?, params?)
```
### watchMyTrades [#watchmytrades]
streams the authenticated user's executed trades of one market - the venue channel is per-market, so the outcome argument is required
**Kind**: instance method of [opinion](#opinion)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.opinion.trade/developer-guide/opinion-websocket/user-channels](https://docs.opinion.trade/developer-guide/opinion-websocket/user-channels)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | --------------------------------------------------------- |
| outcome | string | Yes | unified outcome or outcome token id whose market to watch |
| since | int | No | timestamp in ms of the earliest trade to return |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
opinion.watchMyTrades (outcome, since?, limit?, params?)
```
# polymarket (/docs/prediction/polymarket)
## polymarket [#polymarket]
**Kind**: global class\
**Extends**: Exchange
* [fetchMarkets](#fetchmarkets)
* [fetchTicker](#fetchticker)
* [fetchTickers](#fetchtickers)
* [fetchOrderBook](#fetchorderbook)
* [fetchOHLCV](#fetchohlcv)
* [fetchTime](#fetchtime)
* [fetchStatus](#fetchstatus)
* [fetchOpenInterest](#fetchopeninterest)
* [fetchTradingFee](#fetchtradingfee)
* [fetchTrades](#fetchtrades)
* [fetchMyTrades](#fetchmytrades)
* [fetchOrderTrades](#fetchordertrades)
* [fetchBalance](#fetchbalance)
* [fetchPositions](#fetchpositions)
* [fetchPosition](#fetchposition)
* [fetchOpenOrders](#fetchopenorders)
* [fetchOrder](#fetchorder)
* [createOrder](#createorder)
* [createOrders](#createorders)
* [createMarketBuyOrderWithCost](#createmarketbuyorderwithcost)
* [cancelOrder](#cancelorder)
* [cancelOrders](#cancelorders)
* [cancelAllOrders](#cancelallorders)
* [fetchEvents](#fetchevents)
* [fetchEvent](#fetchevent)
* [deriveApiKey](#deriveapikey)
* [createApiKey](#createapikey)
* [createOrDeriveApiKey](#createorderiveapikey)
* [watchOrderBook](#watchorderbook)
* [watchTrades](#watchtrades)
* [watchTicker](#watchticker)
* [watchOrders](#watchorders)
* [watchMyTrades](#watchmytrades)
### fetchMarkets [#fetchmarkets]
retrieves data on all markets for polymarket, each prediction market becomes one market with its outcome tokens listed under the outcomes key
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - an array of objects representing market data
**See**
* [https://docs.polymarket.com/api-reference/events/list-events](https://docs.polymarket.com/api-reference/events/list-events)
* [https://docs.polymarket.com/api-reference/search/search-markets-events-and-profiles](https://docs.polymarket.com/api-reference/search/search-markets-events-and-profiles)
| Param | Type | Required | Description |
| -------------- | --------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| params | object | No | extra exchange-specific parameters |
| params.query | string | No | a single search term used to filter the fetched events |
| params.queries | Array\ | No | multiple search terms (alternative to query) |
| params.tags | Array\ | No | filter events by tag — human-readable labels ("Fed Rates") or slugs ("fed-rates") both work; multiple tags match ANY (one gamma listing per tag, unioned) |
| params.status | string | No | 'active', 'closed' or 'all', the status of the events to fetch, defaults to 'active' |
| params.limit | int | No | max number of events to fetch when no query is given (defaults to options.fetchMarketsLimit, 200); the listing is ordered by 24h volume so the most active markets come first — outcomes on lower-volume markets are resolvable on demand by their token id (fetchOutcome) |
```javascript
polymarket.fetchMarkets (params?)
```
### fetchTicker [#fetchticker]
fetches the current mid-price and best bid/ask for a single outcome token
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [prediction ticker structure](/docs/prediction#prediction-ticker-structure)
**See**
* [https://docs.polymarket.com/api-reference/data/get-midpoint-price](https://docs.polymarket.com/api-reference/data/get-midpoint-price)
* [https://docs.polymarket.com/api-reference/market-data/get-order-book](https://docs.polymarket.com/api-reference/market-data/get-order-book)
* [https://docs.polymarket.com/api-reference/data/get-last-trade-price](https://docs.polymarket.com/api-reference/data/get-last-trade-price)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------------------------ |
| outcome | string | Yes | unified outcome like TRUMP\_DANCE\_TODAY\_997:YES or an outcome token id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchTicker (outcome, params?)
```
### fetchTickers [#fetchtickers]
fetches tickers for multiple outcome tokens at once using the batched CLOB book, midpoint and last-trade-price endpoints (200 per request trio)
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a dictionary of [prediction ticker structures](/docs/prediction#prediction-ticker-structure) indexed by outcome
**See**
* [https://docs.polymarket.com/api-reference/market-data/get-order-books-request-body](https://docs.polymarket.com/api-reference/market-data/get-order-books-request-body)
* [https://docs.polymarket.com/api-reference/market-data/get-midpoint-prices-request-body](https://docs.polymarket.com/api-reference/market-data/get-midpoint-prices-request-body)
* [https://docs.polymarket.com/api-reference/data/get-last-trades-prices](https://docs.polymarket.com/api-reference/data/get-last-trades-prices)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| outcomes | Array\ | Yes | unified outcomes or outcome token ids — required: polymarket has no endpoint returning all tickers at once, so an unscoped call is not supported |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchTickers (outcomes, params?)
```
### fetchOrderBook [#fetchorderbook]
fetches the CLOB order book for a single outcome token
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [prediction order book structure](/docs/prediction#prediction-order-book-structure)
**See**: [https://docs.polymarket.com/api-reference/market-data/get-order-book](https://docs.polymarket.com/api-reference/market-data/get-order-book)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| limit | int | No | not used by polymarket fetchOrderBook |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchOrderBook (outcome, limit?, params?)
```
### fetchOHLCV [#fetchohlcv]
fetches price history ticks for a single outcome token and buckets them client-side into OHLCV candles, snapping tick timestamps to the candle boundary
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\> - a list of candles ordered as timestamp, open, high, low, close, volume
**See**: [https://docs.polymarket.com/api-reference/markets/get-prices-history](https://docs.polymarket.com/api-reference/markets/get-prices-history)
| Param | Type | Required | Description |
| --------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| timeframe | string | Yes | the length of time each candle represents |
| since | int | No | timestamp in ms of the earliest candle to fetch |
| limit | int | No | the maximum number of candles to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchOHLCV (outcome, timeframe, since?, limit?, params?)
```
### fetchTime [#fetchtime]
fetches the current timestamp from the CLOB server
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: int - the current server time in milliseconds
**See**: [https://docs.polymarket.com/api-reference/data/get-server-time](https://docs.polymarket.com/api-reference/data/get-server-time)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchTime (params?)
```
### fetchStatus [#fetchstatus]
fetches the gamma API health status
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [status structure](/docs/manual#exchange-status-structure)
**See**: [https://docs.polymarket.com/api-reference/events/list-events](https://docs.polymarket.com/api-reference/events/list-events)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchStatus (params?)
```
### fetchOpenInterest [#fetchopeninterest]
fetches the open interest of a prediction market outcome
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - an [open interest structure](/docs/manual#open-interest-structure)
**See**: [https://docs.polymarket.com/api-reference/misc/get-open-interest](https://docs.polymarket.com/api-reference/misc/get-open-interest)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchOpenInterest (outcome, params?)
```
### fetchTradingFee [#fetchtradingfee]
fetches the base fee rate for a prediction market outcome token
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [fee structure](/docs/manual#fee-structure)
**See**: [https://docs.polymarket.com/api-reference/market-data/get-fee-rate](https://docs.polymarket.com/api-reference/market-data/get-fee-rate)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchTradingFee (outcome, params?)
```
### fetchTrades [#fetchtrades]
fetches public trade history for a single outcome token from the data API
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.polymarket.com/api-reference/core/get-trades-for-a-user-or-markets](https://docs.polymarket.com/api-reference/core/get-trades-for-a-user-or-markets)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| since | int | No | not used by polymarket fetchTrades |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchTrades (outcome, since?, limit?, params?)
```
### fetchMyTrades [#fetchmytrades]
fetches the authenticated user's trade history from the CLOB, optionally filtered by outcome token
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.polymarket.com/api-reference/trade/get-trades](https://docs.polymarket.com/api-reference/trade/get-trades)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | unified outcome or outcome token id |
| since | int | No | the earliest time in ms to fetch trades for |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchMyTrades (outcome?, since?, limit?, params?)
```
### fetchOrderTrades [#fetchordertrades]
fetches all the trades made from a single order
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.polymarket.com/api-reference/trade/get-trades](https://docs.polymarket.com/api-reference/trade/get-trades)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | -------------------------------------------------------- |
| id | string | Yes | the order id |
| outcome | string | No | unified outcome or outcome token id to narrow the lookup |
| since | int | No | the earliest time in ms to fetch trades for |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchOrderTrades (id, outcome?, since?, limit?, params?)
```
### fetchBalance [#fetchbalance]
fetches the USDC collateral balance available for trading on the CLOB
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [balance structure](/docs/manual#balance-structure)
**See**: [https://docs.polymarket.com/api-reference/trade/get-balance-allowance](https://docs.polymarket.com/api-reference/trade/get-balance-allowance)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.signatureType | int | No | 0=EOA, 1=POLY\_PROXY, 2=GNOSIS\_SAFE, 3=POLY\_1271 (deposit wallet); defaults to options.signatureType |
```javascript
polymarket.fetchBalance (params?)
```
### fetchPositions [#fetchpositions]
fetches open outcome token positions for the wallet from the data API
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - a list of [prediction position structures](/docs/prediction#prediction-position-structure)
**See**: [https://docs.polymarket.com/api-reference/core/get-current-positions-for-a-user](https://docs.polymarket.com/api-reference/core/get-current-positions-for-a-user)
| Param | Type | Required | Description |
| -------- | --------------------------- | -------- | ------------------------------------------------------ |
| outcomes | Array\ | No | unified outcomes to filter by |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchPositions (outcomes?, params?)
```
### fetchPosition [#fetchposition]
fetches the open position for a single outcome token
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [prediction position structure](/docs/prediction#prediction-position-structure)
**See**: [https://docs.polymarket.com/api-reference/core/get-current-positions-for-a-user](https://docs.polymarket.com/api-reference/core/get-current-positions-for-a-user)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchPosition (outcome, params?)
```
### fetchOpenOrders [#fetchopenorders]
fetches open resting orders for the authenticated user, optionally filtered by outcome token
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.polymarket.com/api-reference/trade/get-user-orders](https://docs.polymarket.com/api-reference/trade/get-user-orders)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | unified outcome or outcome token id |
| since | int | No | not used by polymarket fetchOpenOrders |
| limit | int | No | the maximum number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchOpenOrders (outcome?, since?, limit?, params?)
```
### fetchOrder [#fetchorder]
fetches a single order by id from the CLOB private data endpoint
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.polymarket.com/api-reference/trade/get-single-order-by-id](https://docs.polymarket.com/api-reference/trade/get-single-order-by-id)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the order id |
| outcome | string | No | unified outcome or outcome token id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchOrder (id, outcome?, params?)
```
### createOrder [#createorder]
places a limit or market order on the CLOB for the given outcome token
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.polymarket.com/api-reference/trade/post-a-new-order](https://docs.polymarket.com/api-reference/trade/post-a-new-order)
| Param | Type | Required | Description |
| -------------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| outcome | string | Yes | unified outcome or outcome token id |
| type | string | Yes | 'market' or 'limit'; market orders default to FOK and, when no price is given, use the outcome's current price as the marketable reference |
| side | string | Yes | 'buy' or 'sell' |
| amount | float | Yes | how many outcome tokens to trade |
| price | float | No | the price per outcome token between 0 and 1; required for limit orders, defaults to the outcome's current price for market orders |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.orderType | string | No | time-in-force override: 'GTC' (default for limit), 'FOK' (default for market), 'GTD' or 'FAK' |
| params.signatureType | int | No | 0=EOA, 1=POLY\_PROXY, 2=GNOSIS\_SAFE, 3=POLY\_1271 (deposit wallet); defaults to options.signatureType |
| params.funder | string | No | the wallet that holds the USDC collateral; defaults to options.funder or the signing address |
| params.tickSize | string | No | the market tick size ('0.1'/'0.01'/'0.001'/'0.0001'); read from the outcome when omitted |
| params.negRisk | bool | No | whether the market is a neg-risk market; read from the outcome when omitted |
| params.salt | string | No | order salt; defaults to the current time in ms (pin it for idempotent retries) |
| params.timestamp | string | No | order timestamp; defaults to the current time in ms |
| params.expiration | string | No | unix-seconds expiration for GTD orders; defaults to '0' (no expiry) |
| params.builderCode | string | No | builder wallet address or full bytes32 builder code attached to the order for attribution (zero fee — tracking only); defaults to options.builder |
```javascript
polymarket.createOrder (outcome, type, side, amount, price?, params?)
```
### createOrders [#createorders]
places multiple orders on the CLOB in a single batched request
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.polymarket.com/api-reference/trade/post-orders](https://docs.polymarket.com/api-reference/trade/post-orders)
| Param | Type | Required | Description |
| ------ | --------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------- |
| orders | Array\ | Yes | a list of order requests, each an object with outcome, type, side, amount, price and optional params (same params as createOrder) |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.createOrders (orders, params?)
```
### createMarketBuyOrderWithCost [#createmarketbuyorderwithcost]
places a market buy order sized by USDC cost (how much to spend) rather than shares
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.polymarket.com/api-reference/trade/post-a-new-order](https://docs.polymarket.com/api-reference/trade/post-a-new-order)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------------------------ |
| outcome | string | Yes | unified outcome or outcome token id |
| cost | float | Yes | the amount of USDC to spend |
| params | object | No | extra parameters specific to the exchange API endpoint (see createOrder) |
```javascript
polymarket.createMarketBuyOrderWithCost (outcome, cost, params?)
```
### cancelOrder [#cancelorder]
cancels a single open order by id on the CLOB
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [prediction order structure](/docs/prediction#prediction-order-structure)
**See**: [https://docs.polymarket.com/api-reference/trade/cancel-single-order](https://docs.polymarket.com/api-reference/trade/cancel-single-order)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the order id |
| outcome | string | No | unified outcome or outcome token id |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.cancelOrder (id, outcome?, params?)
```
### cancelOrders [#cancelorders]
cancels multiple open orders by id on the CLOB in a single request
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.polymarket.com/api-reference/trade/cancel-orders](https://docs.polymarket.com/api-reference/trade/cancel-orders)
| Param | Type | Required | Description |
| ------- | --------------------------- | -------- | ------------------------------------------------------ |
| ids | Array\ | Yes | the order ids to cancel |
| outcome | string | No | not used by polymarket cancelOrders |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.cancelOrders (ids, outcome?, params?)
```
### cancelAllOrders [#cancelallorders]
cancels all open orders on the CLOB, optionally scoped to one outcome token
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**
* [https://docs.polymarket.com/api-reference/trade/cancel-all-orders](https://docs.polymarket.com/api-reference/trade/cancel-all-orders)
* [https://docs.polymarket.com/api-reference/trade/cancel-market-orders](https://docs.polymarket.com/api-reference/trade/cancel-market-orders)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ---------------------------------------------------------------------------------------- |
| outcome | string | No | unified outcome or outcome token id; when given only that outcome's orders are cancelled |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.cancelAllOrders (outcome?, params?)
```
### fetchEvents [#fetchevents]
fetches prediction-market events matching the given scope (query/queries/tags/eventId/slug — required) and caches their markets and outcomes on the instance; for an unscoped top-volume browse use fetchMarkets ()
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - an array of event structures
**See**
* [https://docs.polymarket.com/api-reference/search/search-markets-events-and-profiles](https://docs.polymarket.com/api-reference/search/search-markets-events-and-profiles)
* [https://docs.polymarket.com/api-reference/events/list-events](https://docs.polymarket.com/api-reference/events/list-events)
| Param | Type | Required | Description |
| --------------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| params | object | No | extra exchange-specific parameters |
| params.query | string | No | a single keyword search term |
| params.queries | Array\ | No | multiple search terms (alternative to query) |
| params.tags | Array\ | No | filter events by tag — human-readable labels ("Fed Rates") or slugs ("fed-rates") both work; multiple tags match ANY (one gamma listing per tag, unioned and deduped) |
| params.limit | int | No | max number of events to return |
| params.sort | string | No | 'volume' (default), 'liquidity' or 'newest' — mapped to the gamma order field |
| params.status | string | No | 'active' (default), 'inactive', 'closed' or 'all' ('inactive' and 'closed' are interchangeable) |
| params.searchIn | string | No | when searching, restrict the match to 'title' (default), 'description' or 'both' |
| params.eventId | string | No | direct lookup by event id (short-circuits the listing/search) |
| params.slug | string | No | direct lookup by event slug |
| params.searchPageSize | int | No | search page size (gamma limit\_per\_type, default 100); lower it to shrink the download when a small limit is enough, higher to over-fetch before client-side status/title filtering |
| params.maxSearchPages | int | No | max search pages to fetch when no limit is given (default 5), bounding a broad query |
```javascript
polymarket.fetchEvents (params?)
```
### fetchEvent [#fetchevent]
fetches a single prediction-market event by its id or slug
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [prediction event structure](/docs/prediction#prediction-event-structure)
**See**
* [https://docs.polymarket.com/api-reference/events/get-event-by-id](https://docs.polymarket.com/api-reference/events/get-event-by-id)
* [https://docs.polymarket.com/api-reference/events/get-event-by-slug](https://docs.polymarket.com/api-reference/events/get-event-by-slug)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| id | string | Yes | the event id (numeric) or slug |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.fetchEvent (id, params?)
```
### deriveApiKey [#deriveapikey]
derives the L2 api credentials (apiKey, secret, passphrase) deterministically from the wallet private key
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - the api credentials \{ apiKey, secret, passphrase }
**See**: [https://docs.polymarket.com/developers/CLOB/authentication](https://docs.polymarket.com/developers/CLOB/authentication)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.nonce | int | No | the nonce used to derive the credentials, defaults to 0 |
```javascript
polymarket.deriveApiKey (params?)
```
### createApiKey [#createapikey]
creates new L2 api credentials (apiKey, secret, passphrase) for the wallet private key
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - the api credentials \{ apiKey, secret, passphrase }
**See**: [https://docs.polymarket.com/developers/CLOB/authentication](https://docs.polymarket.com/developers/CLOB/authentication)
| Param | Type | Required | Description |
| ------------ | ------------------- | -------- | ------------------------------------------------------- |
| params | object | No | extra parameters specific to the exchange API endpoint |
| params.nonce | int | No | the nonce used to create the credentials, defaults to 0 |
```javascript
polymarket.createApiKey (params?)
```
### createOrDeriveApiKey [#createorderiveapikey]
derives the existing L2 api credentials for the wallet private key, creating them if none exist yet
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - the api credentials \{ apiKey, secret, passphrase }
**See**: [https://docs.polymarket.com/developers/CLOB/authentication](https://docs.polymarket.com/developers/CLOB/authentication)
| Param | Type | Required | Description |
| ------ | ------------------- | -------- | ------------------------------------------------------ |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.createOrDeriveApiKey (params?)
```
### watchOrderBook [#watchorderbook]
streams live order-book updates for a single Polymarket outcome token
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [prediction order book structure](/docs/prediction#prediction-order-book-structure)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | --------------------------------------------------------------------- |
| outcome | string | Yes | unified outcome (e.g. "TRUMP\_WINS\_2028:YES") or an outcome token id |
| limit | int | No | optional depth limit applied after resolving |
| params | object | No | extra params (currently unused) |
```javascript
polymarket.watchOrderBook (outcome, limit?, params?)
```
### watchTrades [#watchtrades]
streams live fills for a single Polymarket outcome token
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ---------------------------------------- |
| outcome | string | Yes | unified outcome |
| since | int | No | optional unix timestamp (ms) lower bound |
| limit | int | No | optional max number of trades to return |
| params | object | No | extra params (unused) |
```javascript
polymarket.watchTrades (outcome, since?, limit?, params?)
```
### watchTicker [#watchticker]
streams a synthetic ticker derived from order-book snapshots and deltas (mid = (bid + ask) / 2)
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: object - a [prediction ticker structure](/docs/prediction#prediction-ticker-structure)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | --------------------- |
| outcome | string | Yes | unified outcome |
| params | object | No | extra params (unused) |
```javascript
polymarket.watchTicker (outcome, params?)
```
### watchOrders [#watchorders]
watches the authenticated user's order updates over the CLOB user websocket channel
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - a list of [prediction order structures](/docs/prediction#prediction-order-structure)
**See**: [https://docs.polymarket.com/developers/CLOB/websocket/user-channel](https://docs.polymarket.com/developers/CLOB/websocket/user-channel)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | unified outcome to filter the stream to one market |
| since | int | No | the earliest time in ms to return orders for |
| limit | int | No | the maximum number of orders to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.watchOrders (outcome?, since?, limit?, params?)
```
### watchMyTrades [#watchmytrades]
watches the authenticated user's trade fills over the CLOB user websocket channel
**Kind**: instance method of [polymarket](#polymarket)\
**Returns**: Array\ - a list of [prediction trade structures](/docs/prediction#prediction-trade-structure)
**See**: [https://docs.polymarket.com/developers/CLOB/websocket/user-channel](https://docs.polymarket.com/developers/CLOB/websocket/user-channel)
| Param | Type | Required | Description |
| ------- | ------------------- | -------- | ------------------------------------------------------ |
| outcome | string | No | unified outcome to filter the stream to one market |
| since | int | No | the earliest time in ms to return trades for |
| limit | int | No | the maximum number of trades to return |
| params | object | No | extra parameters specific to the exchange API endpoint |
```javascript
polymarket.watchMyTrades (outcome?, since?, limit?, params?)
```
# CCXT vs the Alpaca API and alpaca-py (/docs/comparisons/ccxt-vs-alpaca-api)
[Alpaca](https://alpaca.markets) is a US broker that offers stocks, options and crypto through one account and one set of API keys. It maintains its own client libraries — [alpaca-py](https://github.com/alpacahq/alpaca-py) for Python, plus official SDKs for .NET/C#, Node, Go and Java listed on its [SDKs and Tools](https://docs.alpaca.markets/us/docs/sdks-and-tools) page.
If you trade only crypto, and only at Alpaca, those SDKs are a reasonable default. The question that decides this comparison is narrower than usual: **is Alpaca where your crypto trading ends, or where it starts?**
## TL;DR [#tldr]
* **Pick alpaca-py** if Alpaca is your whole platform — equities, options and crypto in one account — and you want request/response models that mirror Alpaca's own reference, plus the Broker API for building an investment app.
* **Pick CCXT** if crypto is the point and Alpaca is one venue among several. The same `fetch_ticker` / `create_order` calls work on Alpaca, Binance, Coinbase, Kraken and 100 more, in eight languages.
* **CCXT does not cover Alpaca's equities or options.** It is a crypto library. If you need stocks and crypto in one client, that is what alpaca-py is for, and running both is a normal setup.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Alpaca SDKs** |
| --------------------------------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| Venues covered | 104 (Alpaca is one of them) | Alpaca only |
| Asset classes | crypto (spot, margin, swaps, futures, options on other venues) | stocks, options and crypto |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, .NET/C#, Node, Go, Java — separate codebases |
| Packages to install | **1** (`ccxt`) | one per language (`alpaca-py` for Python) |
| Unified market data + trading API | yes — 38 capabilities on `alpaca` | no — Alpaca's own request models and payloads |
| Programming model | call a method, get a value | build a request object, pass it to a client method |
| Clients per job | one `ccxt.alpaca` instance | `TradingClient`, `CryptoHistoricalDataClient`, `CryptoDataStream`, `TradingStream`, `BrokerClient` |
| WebSockets | yes — 6 `watch*` methods | yes — `CryptoDataStream`, `TradingStream`, and SSE endpoints |
| Raw endpoint access | yes — 70 Alpaca endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 333 ms) | not covered in the SDK README |
| Unified error types | yes — 41 typed exceptions in one hierarchy | `APIError` plus pydantic validation errors |
| Paper trading | `exchange.set_sandbox_mode(True)` swaps in `paper-api.alpaca.markets` | `paper=True` and paper keys on each client |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | `alpaca-py` 1.5k stars · **1.83M PyPI installs/month**; archived `alpaca-trade-api` 1.9k stars · 587k installs/month |
| Licence | MIT | Apache-2.0 |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues, Alpaca forum and Slack |
Figures verified September 2026 against CCXT v4.5.78, the `alpacahq/alpaca-py` and `alpacahq/alpaca-trade-api-python` repositories, Alpaca's SDKs and Tools page, and install counts from PyPI and npm.
One thing that makes this comparison unusually clean: **Alpaca already uses slash-separated crypto symbols**. `BTC/USD` is Alpaca's own symbol *and* CCXT's unified symbol, so the migration table below has almost nothing to translate.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a price [#fetch-a-price]
CCXT
alpaca-py
```python
import ccxt
exchange = ccxt.alpaca()
ticker = exchange.fetch_ticker('BTC/USD')
print(ticker['last'], ticker['bid'], ticker['ask'])
```
```python
from alpaca.data.historical.crypto import CryptoHistoricalDataClient
from alpaca.data.requests import CryptoLatestQuoteRequest
crypto_historical_data_client = CryptoHistoricalDataClient()
symbol = "BTC/USD"
req = CryptoLatestQuoteRequest(
symbol_or_symbols = [symbol],
)
res = crypto_historical_data_client.get_crypto_latest_quote(req)
print(res)
```
The shape of the difference is the SDK's design, not its quality: alpaca-py is deliberately object-oriented, so nearly every call is "import a request model, construct it, hand it to the right client". CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, types and units on Alpaca as on any other venue.
### Place a limit order [#place-a-limit-order]
CCXT
alpaca-py
```python
import ccxt
exchange = ccxt.alpaca({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USD', 'limit', 'buy', 0.01, 60000)
print(order['id'], order['status'])
```
```python
from alpaca.trading.client import TradingClient
from alpaca.trading.requests import LimitOrderRequest
from alpaca.trading.enums import OrderSide, OrderType, TimeInForce
trade_client = TradingClient(api_key='...', secret_key='...', paper=True)
req = LimitOrderRequest(
symbol = "BTC/USD",
qty = 0.01,
limit_price = 60000,
side = OrderSide.BUY,
type = OrderType.LIMIT,
time_in_force = TimeInForce.GTC,
)
res = trade_client.submit_order(req)
print(res)
```
Alpaca supports market, limit and stop-limit orders for crypto with `gtc` and `ioc` time in force. CCXT maps those onto `create_order` with unified `type`, `side` and params, so the call reads the same as it does on the next exchange, and the returned [order structure](/docs/manual#order-structure) has the same keys.
### Stream order updates [#stream-order-updates]
CCXT
alpaca-py
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.alpaca({'apiKey': '...', 'secret': '...'})
while True:
orders = await exchange.watch_orders()
for order in orders:
print(order['id'], order['symbol'], order['status'], order['filled'])
asyncio.run(main())
```
```python
from alpaca.trading.stream import TradingStream
trade_stream_client = TradingStream(api_key, secret_key, paper=paper)
async def trade_updates_handler(data):
print(data)
trade_stream_client.subscribe_trade_updates(trade_updates_handler)
trade_stream_client.run()
```
Both work. The difference is the control flow: alpaca-py registers a callback and hands the loop to `run()`, while CCXT's `watch_orders` is a method you `await`, returning the same structure `fetch_orders` returns. That matters when the code that reacts to a fill also has to place the next order — with CCXT both live in the same function.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Alpaca is a venue, not a strategy [#alpaca-is-a-venue-not-a-strategy]
Alpaca lists a limited set of crypto assets — its own market-data documentation describes coverage as "5000+ stocks, 20+ crypto, and options". For a crypto strategy that is one book among many. In CCXT the venue is a variable, so adding a second one is configuration rather than a second integration:
```python
for exchange_id in ['alpaca', 'coinbase', 'kraken', 'binance']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USD')['last'])
```
The official SDK cannot do that, by design. It is Alpaca's client for Alpaca.
### Eight languages, one API [#eight-languages-one-api]
Alpaca publishes official SDKs for Python, .NET/C#, Node, Go and Java — genuinely good language coverage for a broker. They are five separate codebases, though, with their own idioms and release schedules. CCXT is written once in TypeScript and transpiled, so the method names, arguments and return structures are identical everywhere:
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.alpaca()
ticker = exchange.fetch_ticker('BTC/USD')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.alpaca ();
const ticker = await exchange.fetchTicker ('BTC/USD');
```
```csharp
var exchange = new ccxt.alpaca();
var ticker = await exchange.FetchTicker("BTC/USD");
```
```go
exchange := ccxt.NewAlpaca(nil)
ticker, err := exchange.FetchTicker("BTC/USD")
```
### Three hosts behind one client [#three-hosts-behind-one-client]
Alpaca splits its API across a trading host, a market-data host and a broker host, and paper trading uses a different trading host again. CCXT models `trader`, `market` and `broker` as separate base URLs inside one exchange object, so `fetch_ohlcv` and `create_order` are calls on the same instance, and paper trading is one flag:
```python
exchange = ccxt.alpaca({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps the trading host to paper-api.alpaca.markets
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Alpaca's responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once, and the same handler keeps working when the order goes to a different venue.
### Precision and string math [#precision-and-string-math]
`load_markets()` reads Alpaca's asset metadata and exposes it through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities do not drift through float rounding:
```python
amount = exchange.amount_to_precision('BTC/USD', 0.0012345678)
price = exchange.price_to_precision('BTC/USD', 61234.56789)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 38 unified capabilities CCXT implements for Alpaca, **all 70 endpoints in Alpaca's API are generated as callable implicit methods**, with signing, rate limiting and error mapping applied:
```python
# any raw Alpaca endpoint, camelCased from its path
response = exchange.trader_private_get_v2_account()
```
Browse them on the [alpaca implicit API page](/docs/exchanges/alpaca/implicit-api). Choosing CCXT does not lock you out of an Alpaca-specific endpoint.
## What the official Alpaca SDKs do better [#what-the-official-alpaca-sdks-do-better]
An honest list, because these are real:
* **Stocks and options.** CCXT is a crypto library. Alpaca's SDKs give you equities, options and crypto in one client with one set of keys, and `StockHistoricalDataClient`, `OptionHistoricalDataClient` and `NewsClient` alongside the crypto ones. If your strategy touches equities at all, this is decisive.
* **The Broker API.** `BrokerClient` lets you open and manage end-user brokerage accounts — building a robo-advisor or a brokerage front end. CCXT has no equivalent and never will; it is a trading connectivity library, not a brokerage platform.
* **Typed, validated request models.** alpaca-py validates every request with pydantic at runtime, so a malformed order fails locally with a clear model error before it reaches the network. CCXT validates unified arguments but returns unified structures rather than Alpaca-shaped typed models.
* **One-to-one fidelity with Alpaca's reference.** `MarketOrderRequest`, `notional`, `TimeInForce.GTC` — the names in the SDK are the names in Alpaca's docs. CCXT's unified names are a deliberate abstraction and one more hop when you are debugging against the vendor reference.
* **News and SSE data.** Alpaca's news stream and server-sent-event endpoints are first-class in the SDK and are outside CCXT's unified surface.
If Alpaca is your brokerage and crypto is one sleeve of a multi-asset book, alpaca-py is the better primary dependency — and nothing stops you adding CCXT for the venues Alpaca does not list.
## Migrating from alpaca-py to CCXT [#migrating-from-alpaca-py-to-ccxt]
| What you are doing | alpaca-py | CCXT |
| ------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------ |
| Symbols | `"BTC/USD"` | `'BTC/USD'` — identical |
| Client | `TradingClient` + `CryptoHistoricalDataClient` | one `ccxt.alpaca({'apiKey': ..., 'secret': ...})` |
| Assets | `GetAssetsRequest` | `load_markets()` |
| Latest quote | `get_crypto_latest_quote(CryptoLatestQuoteRequest(...))` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `get_crypto_latest_orderbook(...)` | `fetch_order_book()` |
| Trades | `get_crypto_trades(CryptoTradesRequest(...))` | `fetch_trades()` |
| Bars / candles | `get_crypto_bars(CryptoBarsRequest(...))` | `fetch_ohlcv()` |
| New order | `submit_order(MarketOrderRequest(...))` | `create_order()` |
| Cancel order | `cancel_order_by_id()` | `cancel_order()` |
| Open orders | `get_orders(GetOrdersRequest(...))` | `fetch_open_orders()` |
| Account | `get_account()` | `fetch_balance()` |
| Streams | `CryptoDataStream`, `TradingStream` + callbacks | `watch_*` on `ccxt.pro.alpaca` |
| Paper trading | `paper=True` on each client | `set_sandbox_mode(True)` |
| Anything not listed | native SDK method | the same endpoint as an [implicit method](/docs/exchanges/alpaca/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [alpaca unified API reference](/docs/exchanges/alpaca).
## FAQ [#faq]
**Can CCXT trade stocks or options on Alpaca?**
No. CCXT is a cryptocurrency trading library, and its `alpaca` class covers Alpaca's crypto markets only — 38 unified capabilities, spot. For equities and options, use Alpaca's own SDKs. The two coexist happily in one project.
**Does CCXT support Alpaca WebSockets?**
Yes. `ccxt.pro.alpaca` implements six streaming methods — `watchTicker`, `watchOHLCV`, `watchOrderBook`, `watchTrades`, `watchOrders` and `watchMyTrades` — against Alpaca's crypto data stream and trading stream. `watch_order_book` returns the same structure as `fetch_order_book`.
**Does CCXT work with Alpaca paper trading?**
Yes. `exchange.set_sandbox_mode(True)` swaps the trading host to `paper-api.alpaca.markets`, both for REST and for the trading WebSocket. Use your paper keys; no other code changes.
**Is alpaca-trade-api still the SDK to use?**
No. `alpaca-trade-api-python` is archived, and its own notice says "A new python SDK, Alpaca-py, is available. This SDK will be the primary python SDK starting in 2023." It still records 587k PyPI installs a month, which is mostly older code. New Alpaca integrations should use `alpaca-py` — or CCXT, if the job is crypto.
**Can I still call Alpaca-specific endpoints from CCXT?**
Yes — all 70 of them, as [implicit methods](/docs/exchanges/alpaca/implicit-api), with signing, rate limiting and error mapping applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [alpaca unified API reference](/docs/exchanges/alpaca)
* [alpaca implicit API](/docs/exchanges/alpaca/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the ApeX Omni API and apexpro-openapi (/docs/comparisons/ccxt-vs-apex-api)
[ApeX Omni](https://apex.exchange/) is a perpetuals DEX whose private endpoints are signed twice: an API key, secret and passphrase authenticate the HTTP request, and a separate zk key signs the order payload itself. That second signature is the part that makes a hand-rolled integration awkward, and it is the reason ApeX publishes [apexpro-openapi](https://github.com/ApeX-Protocol/apexpro-openapi) — the "Official Python3 API connector for Apex omni's HTTP and WebSockets APIs", MIT-licensed, 40 GitHub stars, on PyPI as `apexomni`.
Both libraries produce the same signature. The question that decides between them: **do you need ApeX account onboarding, or do you need ApeX to look like every other venue in your system?**
## TL;DR [#tldr]
* **Pick apexpro-openapi** if you need to *create* an Omni account programmatically — derive zk keys from an Ethereum private key, register the user, rotate the public key — or you want method names that match ApeX's own v3 reference exactly, and Python is your only language.
* **Pick CCXT** if the account already exists and you want ApeX perpetuals to behave like the other venues in your book: `create_order`, `fetch_positions`, `watch_order_book`, the same in TypeScript, Python, PHP, C#, Go and Java.
* **CCXT signs the zk payload itself.** It is not a thin REST wrapper that leaves the hard part to you — supply the Omni seeds once and order placement, transfers and withdrawals are signed by the library.
## At a glance [#at-a-glance]
| | **CCXT** | **apexpro-openapi** |
| --------------------------------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
| Venues covered | 104 (ApeX is one of them) | ApeX only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python 3.9–3.12 |
| Packages to install | **1** (`ccxt`) | 1 (`apexomni`) |
| Unified market data + trading API | yes — 43 capabilities on `apex` | no — ApeX's own `*_v3` method and field names |
| zk order signing | yes, built in — supply `options['seeds']` | yes, built in |
| Account onboarding | no — bring existing credentials | yes — `derive_zk_key`, `register_user_v3`, `change_pub_key_v3` |
| WebSockets | yes — 10 `watch*` methods | yes — `WebSocket` with per-channel callbacks |
| Raw endpoint access | yes — 27 ApeX endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 20 ms) | not covered in the README |
| Unified error types | yes — 41 typed exceptions in one hierarchy | ApeX response codes |
| Testnet | `exchange.set_sandbox_mode(True)` swaps in `testnet.omni.apex.exchange` | `APEX_OMNI_HTTP_TEST` constant |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | 40 GitHub stars · 1.4k PyPI installs/month (`apexomni`) |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `ApeX-Protocol/apexpro-openapi` repository and its `README_V3.md`, and install counts from PyPI and npm.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
apexpro-openapi
```python
import ccxt
exchange = ccxt.apex()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from apexomni.constants import APEX_OMNI_HTTP_MAIN
from apexomni.http_public import HttpPublic
client = HttpPublic(APEX_OMNI_HTTP_MAIN)
print(client.configs_v3())
print(client.ticker_v3(symbol="BTCUSDT"))
```
The connector requires a `configs_v3()` call before most other work — it carries the symbol configuration the SDK signs against. CCXT does the equivalent inside `load_markets()`, which every unified method calls for you, and returns a [unified ticker structure](/docs/manual#ticker-structure) with the same keys you get on Binance or Hyperliquid.
### Place an order [#place-an-order]
CCXT
apexpro-openapi
```python
import ccxt
exchange = ccxt.apex({
'apiKey': '...',
'secret': '...',
'password': '...', # the API passphrase
'options': {'seeds': '...'}, # Omni zk seeds, from API Management > Omni Key
})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.01, 65000)
print(order['id'], order['status'])
```
```python
from apexomni.constants import APEX_OMNI_HTTP_TEST, NETWORKID_TEST
from apexomni.http_private_sign import HttpPrivateSign
import time
client = HttpPrivateSign(APEX_OMNI_HTTP_TEST, network_id=NETWORKID_TEST,
zk_seeds=seeds, zk_l2Key=l2Key,
api_key_credentials={'key': key, 'secret': secret,
'passphrase': passphrase})
configs = client.configs_v3()
accountData = client.get_account_v3()
currentTime = time.time()
createOrderRes = client.create_order_v3(symbol="BTC-USDT", side="SELL",
type="MARKET", size="0.001",
timestampSeconds=currentTime,
price="60000")
print(createOrderRes)
```
Both sign the order with the zk seeds. The difference is what surrounds it: CCXT loads the market configuration, rounds size and price to the symbol's tick and step, builds the signed payload and returns a [unified order structure](/docs/manual#order-structure). With the connector you fetch configs, fetch the account, assemble the parameters ApeX expects — including a timestamp in seconds — and parse the response yourself.
### Stream an order book [#stream-an-order-book]
CCXT
apexpro-openapi
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.apex()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT:USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from time import sleep
from apexomni.websocket_api import WebSocket
ws = WebSocket(
endpoint=endpoint,
api_key_credentials={'key': key, 'secret': secret, 'passphrase': passphrase},
)
def on_trade(msg):
print("[trade]", msg)
ws.trade_stream(on_trade, "BTCUSDT")
ws.account_info_stream_v3(on_account)
while True:
sleep(1)
```
The connector is callback-shaped: register handlers, then block. CCXT is `await`-shaped: `watch_order_book` returns the same structure `fetch_order_book` returns, so a polling loop becomes a streaming loop by changing one word, and the decision code that reacts to the book stays in the same function as the order that follows it.
CCXT also maintains the book rather than handing you deltas — snapshot alignment, buffered updates during the snapshot fetch, gap detection and re-sync, reconnect and resubscribe, and a bounded depth-limited cache. Those are the same code paths it uses on every other venue, so they are exercised constantly.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API [#eight-languages-one-api]
apexpro-openapi is Python only, versions 3.9 to 3.12. If your execution service is Go, C# or Java, ApeX is a from-scratch integration including the zk signature. CCXT is written once in TypeScript and transpiled, with identical method names and return structures:
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.apex()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.apex ();
const ticker = await exchange.fetchTicker ('BTC/USDT:USDT');
```
```csharp
var exchange = new ccxt.apex();
var ticker = await exchange.FetchTicker("BTC/USDT:USDT");
```
```go
exchange := ccxt.NewApex(nil)
ticker, err := exchange.FetchTicker("BTC/USDT:USDT")
```
### Portability across perp venues [#portability-across-perp-venues]
ApeX Omni is one perpetuals book. Most strategies that trade one trade several, and the venue-specific parts — symbol format, signing scheme, position model — are exactly what CCXT normalises:
```python
for exchange_id in ['apex', 'hyperliquid', 'bybit', 'okx']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT:USDT')['last'])
```
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT sets `rateLimit = 20` ms for `apex` — the exchange file records the venue's documented allowance of 600 requests per minute — and ships a token-bucket throttler that is on by default. You write a loop; the library paces it.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads ApeX's symbol configuration and exposes tick size, step size and minimum order size through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class. On a signed-payload venue this matters more than usual: a size that violates the step is rejected *after* you have signed it.
```python
amount = exchange.amount_to_precision('BTC/USDT:USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT:USDT', 65432.10987)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps ApeX's response codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError` and 35 more, all descending from `BaseError`. The same `except` block keeps working when the order goes to a different venue.
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.apex({'apiKey': '...', 'secret': '...', 'password': '...'})
exchange.set_sandbox_mode(True) # swaps in testnet.omni.apex.exchange
```
One flag swaps every REST and WebSocket URL, rather than importing a different endpoint constant at each call site.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
ApeX's API surface is compact. Alongside the 43 unified capabilities, **all 27 endpoints are generated as callable implicit methods** with signing, rate limiting and error mapping applied:
```python
# any raw ApeX endpoint, camelCased from its path
response = exchange.public_get_v3_symbols()
```
Browse them on the [apex implicit API page](/docs/exchanges/apex/implicit-api).
## What apexpro-openapi does better [#what-apexpro-openapi-does-better]
An honest list, because these are real:
* **Account onboarding.** This is the big one. The connector can take an Ethereum private key, derive the zk keys with `derive_zk_key()`, register an Omni account with `register_user_v3()` and complete it with `change_pub_key_v3()`. CCXT expects credentials that already exist — you generate the API key trio and read the Omni seeds from ApeX's own key-management UI. If you are provisioning accounts programmatically, the connector is the only option.
* **Withdrawals and cross-account transfers with zk signing.** `create_withdrawal_v3()`, `create_transfer_out_v3()` and `create_contract_transfer_out_v3()` are first-class SDK calls, including fast-withdraw fee handling.
* **Composite take-profit / stop-loss orders.** `create_order_v3()` accepts the full `isOpenTpslOrder` / `slPrice` / `tpTriggerPrice` parameter set in one call, matching ApeX's own semantics.
* **Legacy ApeX Pro and RWA accounts.** The connector still carries the v1 and v2 interfaces used by older ApeX Pro accounts, and its example gallery includes RWA account registration, transfer and order flows. CCXT models the current Omni v3 perpetuals API.
* **Field-for-field fidelity.** `size`, `timestampSeconds`, `BTC-USDT` — when you are debugging against ApeX's reference, the connector's names are the reference's names. CCXT's unified names are a deliberate abstraction and one more hop.
If you are building ApeX-specific tooling — onboarding, account management, RWA flows — the official connector is the better dependency, and Python is where it lives.
## Migrating from apexpro-openapi to CCXT [#migrating-from-apexpro-openapi-to-ccxt]
| What you are doing | apexpro-openapi | CCXT |
| ------------------- | --------------------------------------------------- | ---------------------------------------------------------------------------- |
| Symbols | `"BTC-USDT"` / `"BTCUSDT"` | `'BTC/USDT:USDT'` |
| Client | `HttpPublic` / `HttpPrivate_v3` / `HttpPrivateSign` | one `ccxt.apex({...})` |
| Configuration | `configs_v3()` | `load_markets()` |
| Ticker | `ticker_v3()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `depth_v3()` | `fetch_order_book()` |
| Trades | `trades_v3()` | `fetch_trades()` |
| Candles | `klines_v3()` | `fetch_ohlcv()` |
| Funding history | `history_funding_v3()` | `fetch_funding_rate_history()` |
| New order | `create_order_v3()` | `create_order()` |
| Cancel order | `delete_order_v3()` | `cancel_order()` |
| Cancel all | `delete_open_orders_v3()` | `cancel_all_orders()` |
| Open orders | `open_orders_v3()` | `fetch_open_orders()` |
| Order history | `history_orders_v3()` | `fetch_orders()` |
| Fills | `fills_v3()` | `fetch_my_trades()` |
| Balance | `get_account_balance_v3()` | `fetch_balance()` |
| Positions | `get_account_v3()` | `fetch_positions()` |
| Transfers | `transfers_v3()` | `fetch_transfers()` |
| Streams | `WebSocket` + per-channel callbacks | `watch_*` on `ccxt.pro.apex` |
| Testnet | `APEX_OMNI_HTTP_TEST` | `set_sandbox_mode(True)` |
| Anything not listed | native SDK method | the same endpoint as an [implicit method](/docs/exchanges/apex/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [apex unified API reference](/docs/exchanges/apex).
## FAQ [#faq]
**Does CCXT handle ApeX's zk order signature?**
Yes. Set `options['seeds']` to the Omni seeds from ApeX's key-management page alongside your `apiKey`, `secret` and `password`, and CCXT builds and signs the zk payload for orders, transfers and withdrawals itself — in all eight languages, not just Python.
**Can CCXT register a new ApeX Omni account?**
No. Onboarding — deriving zk keys from an Ethereum private key, `register_user_v3` and `change_pub_key_v3` — is only in ApeX's own Python connector. Create the account and the API key there or in the ApeX UI, then use CCXT for trading.
**Does CCXT support ApeX WebSockets?**
Yes. `ccxt.pro.apex` implements ten streaming methods, including `watchOrderBook`, `watchOrderBookForSymbols`, `watchTicker`, `watchTickers`, `watchTrades`, `watchOHLCV`, `watchOrders`, `watchMyTrades` and `watchPositions`. They return the same structures as their `fetch*` counterparts.
**Is there an ApeX testnet in CCXT?**
Yes. `exchange.set_sandbox_mode(True)` swaps every REST and WebSocket URL to `testnet.omni.apex.exchange`.
**Can I still call ApeX-specific endpoints?**
Yes — all 27 of them, as [implicit methods](/docs/exchanges/apex/implicit-api), with authentication, rate limiting and error mapping applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [apex unified API reference](/docs/exchanges/apex)
* [apex implicit API](/docs/exchanges/apex/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Aster API and aster-connector-python (/docs/comparisons/ccxt-vs-aster-api)
[Aster](https://www.asterdex.com/en) is a perpetuals and spot DEX whose API comes in two generations. The [official documentation repository](https://github.com/asterdex/api-docs) (95 GitHub stars) presents **V3 as recommended** and V1 as legacy, and carries this notice: *"Starting from March 25, 2026, V1 new API Key creation is no longer supported. Existing API Keys will continue to work."*
That split is what this comparison is really about. Aster's official Python client, [aster-connector-python](https://github.com/asterdex/aster-connector-python) (MIT, 31 stars), authenticates the V1 way: its `api.py` signs every private request with HMAC and sends an `X-MBX-APIKEY` header. CCXT's `aster` class takes an EVM `privateKey` and signs V3 requests with **EIP-712 typed data**.
So the deciding question is not really "SDK or library". It is: **which generation of Aster's API are you building on, and in which language?**
## TL;DR [#tldr]
* **Pick aster-connector-python** if you already hold a V1 API key, you are happy in Python, and you want a thin client whose method names match Aster's V1 reference one for one.
* **Pick CCXT** if you are starting now. New V1 keys can no longer be created, and CCXT signs V3 with your wallet key — spot and perpetuals from one client, in TypeScript, JavaScript, Python, PHP, C#, Go, Java and Rust.
* **CCXT is not a lowest common denominator here.** All 165 Aster endpoints across the spot and futures hosts are callable as implicit methods, with signing applied.
## At a glance [#at-a-glance]
| | **CCXT** | **aster-connector-python** |
| --------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
| Venues covered | 104 (Aster is one of them) | Aster only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python 3.6+ |
| Install | `pip install ccxt` (and the equivalent in six other languages) | from the repository — its `setup.py` name is not published on PyPI |
| Authentication | V3 EIP-712 typed-data signing from a wallet `privateKey` | HMAC signature with `X-MBX-APIKEY` — the V1 scheme |
| Products in one client | spot and perpetuals | its README documents one base URL, `https://fapi.asterdex.com` |
| Unified market data + trading API | yes — 71 capabilities on `aster` | no — Aster's own parameter and field names |
| WebSockets | yes — 26 `watch*` / `unWatch*` methods | yes, a `websocket` module |
| Raw endpoint access | yes — 165 Aster endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 333 ms) | `show_limit_usage` reports headers; pacing is your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | `ClientError` / `ServerError` |
| Testnet / sandbox | **none** — Aster publishes no sandbox URL in CCXT | none |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | 31 GitHub stars; `api-docs` 95 stars |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `asterdex/aster-connector-python` repository (README, `setup.py` and `aster/api.py`), the `asterdex/api-docs` repository, and PyPI package metadata.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
aster-connector-python
```python
import ccxt
exchange = ccxt.aster()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from aster.rest_api import Client
client = Client()
print(client.time())
```
The connector is deliberately thin: it maps endpoints to methods and returns Aster's JSON unchanged. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, the same units, milliseconds for timestamps — and the same structure on every other venue you add.
### Place a limit order [#place-a-limit-order]
CCXT
aster-connector-python
```python
import ccxt
exchange = ccxt.aster({'privateKey': '0x...'})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.002, 59808)
print(order['id'], order['status'])
```
```python
from aster.rest_api import Client
client = Client(key='', secret='')
params = {
'symbol': 'BTCUSDT',
'side': 'SELL',
'type': 'LIMIT',
'timeInForce': 'GTC',
'quantity': 0.002,
'price': 59808
}
response = client.new_order(**params)
```
The two snippets sign differently, and that is the substance of this page. The connector computes an HMAC over the query string and sends it with `X-MBX-APIKEY` — the V1 scheme, for which new keys can no longer be created. CCXT derives the signer from your `privateKey`, performs the `signIn` handshake, and signs the order as **EIP-712 typed data** against Aster's chain id. You supply one credential and never write signing code.
### Stream an order book [#stream-an-order-book]
CCXT
aster-connector-python
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.aster()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT:USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from aster.websocket.client.stream import WebsocketClient as Client
def message_handler(message):
print(message)
ws_client = Client()
ws_client.start()
ws_client.instant_subscribe(
stream=['btcusdt@depth', 'ethusdt@bookTicker'],
callback=message_handler,
)
ws_client.stop()
```
These two are not doing the same work. The connector delivers **raw stream messages** to a callback; CCXT returns a **maintained order book**. Fetching the REST snapshot and aligning it with the stream, buffering updates that arrive during the fetch and replaying them, detecting sequence gaps and re-syncing, reconnecting and resubscribing after a drop, and keeping the cache bounded are all handled inside `watch_order_book` — the same code paths CCXT uses on 77 other venues, so they are exercised constantly.
CCXT also ships matching `unWatch*` methods for all thirteen Aster channels, so a subscription can be torn down without dropping the socket, and `watch_order_book_for_symbols` multiplexes several books on one connection:
```python
symbols = ['BTC/USDT:USDT', 'ETH/USDT:USDT', 'SOL/USDT:USDT']
orderbook = await exchange.watch_order_book_for_symbols(symbols)
print(orderbook['symbol'], orderbook['bids'][0], orderbook['asks'][0])
```
## Where the differences actually bite [#where-the-differences-actually-bite]
### Two API generations, one client [#two-api-generations-one-client]
Aster's documentation carries both V3 (recommended) and V1 (legacy) reference sections, and its spot and futures endpoints live on different hosts. CCXT models those hosts as separate base URLs inside one exchange object and generates **165 implicit methods** across them, so `sapi` and `fapi` endpoints are calls on the same instance:
```python
# any raw Aster endpoint, camelCased from its path
info = exchange.fapi_public_get_v3_exchange_info()
```
Browse them on the [aster implicit API page](/docs/exchanges/aster/implicit-api).
### Eight languages, one API [#eight-languages-one-api]
aster-connector-python is Python only. If your execution service is Go, C# or Java, Aster is a from-scratch integration — including the EIP-712 signing. CCXT is written once in TypeScript and transpiled, with identical method names and return structures:
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.aster()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.aster ();
const ticker = await exchange.fetchTicker ('BTC/USDT:USDT');
```
```csharp
var exchange = new ccxt.aster();
var ticker = await exchange.FetchTicker("BTC/USDT:USDT");
```
```go
exchange := ccxt.NewAster(nil)
ticker, err := exchange.FetchTicker("BTC/USDT:USDT")
```
### Derivatives features as unified methods [#derivatives-features-as-unified-methods]
Aster's `has` block in CCXT covers the perpetuals machinery as first-class unified methods: `fetch_funding_rate`, `fetch_funding_rates`, `fetch_funding_intervals`, `fetch_funding_rate_history`, `fetch_positions`, `fetch_positions_risk`, `fetch_position_mode`, `set_leverage`, `set_margin_mode`, `set_position_mode`, `add_margin`, `reduce_margin`, `fetch_margin_adjustment_history`, `fetch_leverages` and `fetch_ledger` — 71 capabilities in total. The same names work on Bybit, OKX and Hyperliquid, so a perp strategy is not rewritten per venue.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads Aster's exchange information for both spot and futures and exposes tick size, step size and minimum notional through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class. On a venue where the order is signed before it is sent, a size that violates the step costs you a signature and a round trip.
```python
amount = exchange.amount_to_precision('BTC/USDT:USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT:USDT', 59808.123456)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Aster's error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. The connector raises `ClientError` and `ServerError` and leaves the classification to you.
### Portability [#portability]
Aster is one perp book. In CCXT the venue is a variable, so hedging the same exposure elsewhere is configuration rather than a second integration:
```python
for exchange_id in ['aster', 'hyperliquid', 'bybit', 'okx']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT:USDT')['last'])
```
## What the official connector and Aster's own tooling do better [#what-the-official-connector-and-asters-own-tooling-do-better]
An honest list, because these are real:
* **It is first-party, and it tracks Aster's docs literally.** `symbol`, `timeInForce`, `quantity` — the connector's parameters are the reference's parameters. When you are debugging against Aster's documentation, there is no translation layer. CCXT's unified names are a deliberate abstraction and one more hop.
* **V1 compatibility for existing keys.** If you hold a working V1 API key, the connector is built for exactly that scheme and needs no wallet key at all. CCXT's `aster` class requires a `privateKey`.
* **Rate-limit header reporting.** The connector's `show_limit_usage` option returns Aster's limit headers alongside each response, which is useful when you are tuning your own pacing.
* **The wider Aster tooling ecosystem.** The `asterdex` organisation also publishes `aster-mcp` (a Python MCP server, 45 stars) and `aster-skills-hub` (TypeScript agent skills for the Futures API, 69 stars), plus `aster-broker-pro-sdk` for broker integrations. None of those have a CCXT equivalent.
* **No sandbox either way, but a smaller blast radius.** CCXT has no testnet URL for Aster, and neither does the connector — but a thin client that only reaches the endpoints you call is easier to reason about when every test is against production.
If you hold a V1 key, work only in Python, and want a client that reads exactly like Aster's reference, the official connector is a defensible choice.
## Migrating from aster-connector-python to CCXT [#migrating-from-aster-connector-python-to-ccxt]
| What you are doing | aster-connector-python | CCXT |
| ------------------- | ----------------------------- | ----------------------------------------------------------------------------- |
| Symbols | `'BTCUSDT'` | `'BTC/USDT'` (spot), `'BTC/USDT:USDT'` (perp) |
| Credentials | `Client(key=..., secret=...)` | `ccxt.aster({'privateKey': '0x...'})` |
| Server time | `client.time()` | `fetch_time()` |
| Exchange info | `/v3/exchangeInfo` | `load_markets()` |
| Ticker | `/v3/ticker/24hr` | `fetch_ticker()` / `fetch_tickers()` |
| Depth | `/v3/depth` | `fetch_order_book()` |
| Trades | `/v3/trades` | `fetch_trades()` |
| Klines | `/v3/klines` | `fetch_ohlcv()` |
| New order | `client.new_order(**params)` | `create_order()` |
| Cancel order | cancel-order endpoint | `cancel_order()` / `cancel_orders()` |
| Open orders | open-orders endpoint | `fetch_open_orders()` |
| Balance | account endpoint | `fetch_balance()` |
| Positions | position-risk endpoint | `fetch_positions()` / `fetch_positions_risk()` |
| Funding rate | funding-rate endpoint | `fetch_funding_rate()` / `fetch_funding_rate_history()` |
| Leverage | leverage endpoint | `set_leverage()` |
| Streams | `aster.websocket` module | `watch_*` / `un_watch_*` on `ccxt.pro.aster` |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/aster/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [aster unified API reference](/docs/exchanges/aster).
## FAQ [#faq]
**Does CCXT support Aster's V3 API?**
Yes. CCXT's `aster` class requires a `privateKey` and signs V3 requests with EIP-712 typed data, performing the sign-in handshake for you. This matters because Aster's own documentation states that from 25 March 2026 new V1 API keys can no longer be created, so a new integration should be on V3.
**What credentials does CCXT need for Aster?**
Only `privateKey` — the EVM key of the wallet that holds the account. There is no `apiKey` or `secret` in CCXT's `requiredCredentials` for this venue.
**Does CCXT support Aster WebSockets?**
Yes. `ccxt.pro.aster` implements 26 streaming methods — 13 `watch*` channels including `watchOrderBook`, `watchOrderBookForSymbols`, `watchTrades`, `watchOHLCV`, `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchMarkPrice`, `watchPositions`, `watchBalance`, `watchOrders` and `watchMyTrades`, plus 13 matching `unWatch*` methods.
**Does Aster have a testnet in CCXT?**
No. There is no sandbox URL for `aster`, so `set_sandbox_mode(True)` has nothing to point at. Test against CCXT's offline static fixtures and small live orders.
**Can I still call Aster-specific endpoints?**
Yes — all 165 of them, as [implicit methods](/docs/exchanges/aster/implicit-api) across the spot and futures hosts, with signing, rate limiting and error mapping applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [aster unified API reference](/docs/exchanges/aster)
* [aster implicit API](/docs/exchanges/aster/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Backpack Exchange API and its SDKs (/docs/comparisons/ccxt-vs-backpack-api)
[Backpack Exchange](https://backpack.exchange/) has an unusual client situation. Its own repository, [backpack-exchange/bpx-api-client](https://github.com/backpack-exchange/bpx-api-client), is titled "Official API clients for Backpack Exchange" and states plainly: *"Currently, only a `Rust` client is available."* Backpack's [API Clients](https://support.backpack.exchange/exchange/api-and-developer-docs/api-clients) page then lists clients for Python, JavaScript, TypeScript, Go and Rust, prefaced with a caveat — *"Some of the SDKs listed below are community-built and are not officially maintained or endorsed by the Backpack team."*
So unless you write Rust, the choice is between a community SDK and a unified library. The question that decides it: **do you want a Backpack-shaped client, or do you want Backpack to look like the other venues you trade?**
## TL;DR [#tldr]
* **Pick a community SDK** if Backpack is your only venue, you are in Python, and you want method and field names that match Backpack's own reference exactly — `execute_order`, `Bid`, `SOL_USDC`.
* **Pick CCXT** if you want one maintained dependency covering Backpack's spot, margin and perpetual markets with the same 69 unified capabilities and the same method names you already use elsewhere, in eight languages.
* **Backpack's request signing is ED25519, not HMAC**, over a payload prefixed with a per-endpoint `instruction` string. It is a small piece of code to get wrong, and CCXT has already written it.
## At a glance [#at-a-glance]
| | **CCXT** | **Backpack SDKs** |
| --------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| Venues covered | 104 (Backpack is one of them) | Backpack only |
| Official client languages | n/a — CCXT is third-party by design | **Rust only** (`bpx-api-client`) |
| Community client languages | n/a | Python, JavaScript, TypeScript, Go — listed but unendorsed |
| Languages you can use it from | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whichever client exists for your language |
| Packages to install | **1** (`ccxt`) | 1 per language, from a different author each time |
| Markets in one client | spot, margin and perpetuals | per SDK |
| Unified market data + trading API | yes — 69 capabilities on `backpack` | no — Backpack's own payload shapes |
| ED25519 request signing | built in | built in by each SDK |
| WebSockets | yes — 15 `watch*` / `unWatch*` methods | varies: `bpx-py`'s README documents REST only, `backpack-exchange-sdk` ships a `WebSocketClient` |
| Raw endpoint access | yes — 56 endpoints as implicit methods | yes |
| Built-in rate limiter | yes, on by default (`rateLimit` 50 ms) | not documented in either Python SDK README |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus Backpack error payloads |
| Testnet / sandbox | **none** — Backpack publishes no sandbox in CCXT | none |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | `bpx-api-client` (Rust, official) 46 stars; `bpx-py` 29 stars · 974 PyPI installs/month; `backpack_exchange_sdk` 42 stars · 162 PyPI installs/month |
| Licence | MIT | `bpx-api-client` Apache-2.0; `bpx-py` Apache-2.0; `backpack_exchange_sdk` MIT |
| Support | Discord, Telegram, GitHub — usually same-day | each SDK's own GitHub issues; Backpack's Discord for the API itself |
Figures verified September 2026 against CCXT v4.5.78, the `backpack-exchange/bpx-api-client`, `sndmndss/bpx-py` and `solomeowl/backpack_exchange_sdk` repositories, Backpack's API Clients support page, and install counts from PyPI and npm.
## The same job, written both ways [#the-same-job-written-both-ways]
The Python side below uses `backpack-exchange-sdk`, the community SDK that documents both REST and WebSocket coverage.
### Fetch a ticker [#fetch-a-ticker]
CCXT
backpack-exchange-sdk
```python
import ccxt
exchange = ccxt.backpack()
ticker = exchange.fetch_ticker('SOL/USDC')
print(ticker['last'], ticker['baseVolume'])
```
```python
from backpack_exchange_sdk import PublicClient
client = PublicClient()
markets = client.get_markets()
ticker = client.get_ticker("SOL_USDC")
depth = client.get_depth("SOL_USDC")
```
Backpack's market ids are underscore-separated — `SOL_USDC` for spot and `SOL_USDC_PERP` for the perpetual. CCXT translates those into unified symbols, `'SOL/USDC'` and `'SOL/USDC:USDC'`, and returns a [unified ticker structure](/docs/manual#ticker-structure) whose keys are the same on every venue.
### Place a limit order [#place-a-limit-order]
CCXT
backpack-exchange-sdk
```python
import ccxt
exchange = ccxt.backpack({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('SOL/USDC', 'limit', 'buy', 1, 100)
print(order['id'], order['status'])
```
```python
from backpack_exchange_sdk import AuthenticationClient
client = AuthenticationClient("", "")
order = client.execute_order(
orderType="Limit",
side="Bid",
symbol="SOL_USDC",
price="100",
quantity="1"
)
```
Backpack's own vocabulary is `Bid`/`Ask` rather than `buy`/`sell`, `orderType` rather than `type`, and quantities as strings. CCXT maps those onto the unified `create_order(symbol, type, side, amount, price)` signature and returns a [unified order structure](/docs/manual#order-structure), so the call is the same one you make on Binance or Bybit.
### Stream an order book [#stream-an-order-book]
CCXT
backpack-exchange-sdk
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.backpack()
while True:
orderbook = await exchange.watch_order_book('SOL/USDC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from backpack_exchange_sdk import WebSocketClient
ws = WebSocketClient()
def on_message(data):
print(data)
ws.subscribe(
streams=["bookTicker.SOL_USDC"],
callback=on_message
)
```
The SDK hands you raw stream messages through a callback. CCXT hands you a **maintained order book**: the REST snapshot is fetched and aligned with the stream, updates arriving during the fetch are buffered and replayed, sequence gaps trigger a re-sync, and the socket reconnects and resubscribes after a drop. `watch_order_book` returns the same structure as `fetch_order_book`, so swapping polling for streaming does not change the code downstream.
CCXT also implements `watchOrderBookForSymbols`, `watchTradesForSymbols` and `watchOHLCVForSymbols` for multiplexing several symbols onto one connection, plus `unWatchTrades`, `unWatchTradesForSymbols`, `unWatchOrders` and `unWatchPositions` for tearing a subscription down without dropping the socket.
## Where the differences actually bite [#where-the-differences-actually-bite]
### ED25519 signing, with an instruction prefix [#ed25519-signing-with-an-instruction-prefix]
Backpack does not sign with HMAC. Each private request is signed with **ED25519** over a payload that begins with a per-endpoint `instruction` string — `orderExecute`, `balanceQuery`, `orderCancelAll` and so on — followed by the request parameters in sorted order, a millisecond timestamp and a window. The signature goes out as `X-Signature` alongside `X-Timestamp`, `X-Window` and `X-API-Key`, and your secret is a base64-encoded seed rather than a shared HMAC key.
None of that is hard, and all of it is easy to get subtly wrong — a parameter sorted in the wrong order or a missing instruction produces the same unhelpful rejection. CCXT carries the instruction map for every endpoint and does the signing in all eight languages.
### Spot, margin and perpetuals in one client [#spot-margin-and-perpetuals-in-one-client]
`backpack` in CCXT declares `spot`, `margin` and `swap`, and the derivatives capabilities are unified methods rather than raw calls: `fetch_positions`, `fetch_funding_rate`, `fetch_funding_rate_history`, `fetch_funding_history`, `fetch_open_interest`, `fetch_open_interest_history`, `fetch_mark_ohlcv` and `fetch_index_ohlcv`. Order entry covers `create_orders` for batching, `create_order_with_take_profit_and_stop_loss`, `create_trigger_order`, `create_post_only_order` and `create_reduce_only_order` — 69 capabilities in total, with the same names on the next venue.
### Eight languages, one API [#eight-languages-one-api]
Backpack's only official client is Rust, and CCXT now targets Rust too — so on that axis the choice is no longer forced. In TypeScript, Python, PHP, C#, Go or Java, CCXT is the maintained option where otherwise you would pick a community project or write your own:
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.backpack()
ticker = exchange.fetch_ticker('SOL/USDC')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.backpack ();
const ticker = await exchange.fetchTicker ('SOL/USDC');
```
```csharp
var exchange = new ccxt.backpack();
var ticker = await exchange.FetchTicker("SOL/USDC");
```
```go
exchange := ccxt.NewBackpack(nil)
ticker, err := exchange.FetchTicker("SOL/USDC")
```
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT sets `rateLimit = 50` ms for `backpack` — the exchange file records the venue's allowance of twenty requests per second — and ships a token-bucket throttler that is on by default. You call methods in a loop; the library paces them. Neither Python SDK's README documents a rate limiter, so with those the pacing and the back-off are yours to write.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads Backpack's market metadata and exposes tick size, step size and minimum order size through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class. Backpack expects prices and quantities as strings anyway, which is exactly where float formatting quietly ruins an order:
```python
amount = exchange.amount_to_precision('SOL/USDC', 1.23456789)
price = exchange.price_to_precision('SOL/USDC', 100.987654321)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Backpack's error payloads onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 69 unified capabilities, **all 56 endpoints CCXT defines for Backpack are generated as callable implicit methods**, signed and rate-limited:
```python
# any raw Backpack endpoint, camelCased from its path
markets = exchange.public_get_api_v1_markets()
```
Browse them on the [backpack implicit API page](/docs/exchanges/backpack/implicit-api).
## What the Backpack SDKs do better [#what-the-backpack-sdks-do-better]
An honest list, because these are real:
* **A first-party Rust client, written as Rust.** `bpx-api-client` is Backpack's own and Apache-2.0, with an API shaped by the language rather than transpiled into it. CCXT reaches Rust too, but through a generated crate that carries the same vocabulary as its seven other targets.
* **Endpoint coverage.** `backpack_exchange_sdk` describes itself as supporting "all 70 API endpoints including REST and WebSocket", including RFQ and strategy endpoints. CCXT defines 56 endpoints for `backpack`, so a handful of Backpack's newer surfaces are not reachable even as implicit methods.
* **Lend and borrow.** Backpack's borrow/lend product is present in CCXT only as raw implicit endpoints (`api/v1/borrowLend`, `api/v1/borrowLend/positions`) — the source file marks the unified wrappers as still to do. If lending is central to your integration, a Backpack-specific SDK models it directly.
* **Field-for-field fidelity.** `Bid`, `orderType`, `SOL_USDC_PERP`, `TimeInForce.GTC` — when you are reading Backpack's docs while debugging, an SDK that uses those exact names removes a translation step. CCXT's unified names are a deliberate abstraction.
* **Typed enums and hints.** `backpack_exchange_sdk` ships enums for order type, side, time in force and self-trade prevention with full type annotations, which is a nicer editing experience than passing unified strings if you only ever target this venue.
If Backpack is your only venue and you want a Rust client written natively as Rust — or you need its RFQ, strategy or lending endpoints — a Backpack-specific client is the better dependency.
## Migrating from a Backpack SDK to CCXT [#migrating-from-a-backpack-sdk-to-ccxt]
| What you are doing | Backpack SDK | CCXT |
| -------------------------- | -------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Symbols | `"SOL_USDC"`, `"SOL_USDC_PERP"` | `'SOL/USDC'`, `'SOL/USDC:USDC'` |
| Client | `PublicClient` + `AuthenticationClient` | one `ccxt.backpack({'apiKey': ..., 'secret': ...})` |
| Markets | `get_markets()` | `load_markets()` |
| Ticker | `get_ticker(symbol)` / `get_tickers()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `get_depth(symbol)` | `fetch_order_book()` |
| Candles | `get_klines(...)` | `fetch_ohlcv()` |
| Mark price / open interest | `get_mark_price()`, `get_open_interest()` | `fetch_funding_rate()`, `fetch_open_interest()` |
| New order | `execute_order(orderType=..., side=...)` | `create_order()` |
| Batch orders | per-SDK | `create_orders()` |
| Cancel order | cancel-order call | `cancel_order()` / `cancel_all_orders()` |
| Open orders | open-orders call | `fetch_open_orders()` |
| Order history | `get_order_history(symbol=...)` | `fetch_orders()` |
| Fills | `get_fill_history(...)` | `fetch_my_trades()` |
| Balances | `get_balances()` | `fetch_balance()` |
| Positions | positions call | `fetch_positions()` |
| Streams | `WebSocketClient.subscribe(streams=[...], callback=...)` | `watch_*` on `ccxt.pro.backpack` |
| Anything not listed | native SDK method | the same endpoint as an [implicit method](/docs/exchanges/backpack/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [backpack unified API reference](/docs/exchanges/backpack).
## FAQ [#faq]
**Is there an official Backpack Python SDK?**
No. Backpack's own repository says only a Rust client is available, and its API Clients page warns that "Some of the SDKs listed below are community-built and are not officially maintained or endorsed by the Backpack team." The Python options — `bpx-py` and `backpack-exchange-sdk` — are community projects. CCXT is a third-party library too, but one maintained across 104 venues in eight languages.
**How does CCXT sign Backpack requests?**
With ED25519. Your `secret` is a base64-encoded seed; CCXT builds a payload of `instruction=&×tamp=&window=`, signs it, and sends `X-API-Key`, `X-Timestamp`, `X-Window` and `X-Signature`. You never write that code.
**Does CCXT support Backpack WebSockets?**
Yes. `ccxt.pro.backpack` implements 15 streaming methods, including `watchOrderBook`, `watchOrderBookForSymbols`, `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchTrades`, `watchTradesForSymbols`, `watchOHLCV`, `watchOHLCVForSymbols`, `watchOrders` and `watchPositions`, plus four `unWatch*` counterparts.
**Does Backpack have a testnet?**
Not one CCXT can point at. There is no sandbox URL for `backpack`, so `set_sandbox_mode(True)` has nothing to swap in. Test against CCXT's offline static fixtures and small live orders.
**Does CCXT cover Backpack perpetuals?**
Yes. `backpack` declares spot, margin and swap, with `fetch_positions`, funding-rate methods, open interest, mark and index candles, reduce-only and trigger orders all as unified methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [backpack unified API reference](/docs/exchanges/backpack)
* [backpack implicit API](/docs/exchanges/backpack/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs Barter (/docs/comparisons/ccxt-vs-barter)
[Barter](https://github.com/barter-rs/barter-rs) is an "open-source Rust framework for building event-driven live-trading & backtesting systems". It is not one crate but five — Barter (the engine), Barter-Instrument, Barter-Data, Barter-Execution and Barter-Integration — and only two of them, Barter-Data and Barter-Execution, sit on the same layer as [CCXT](/docs/manual).
That is the first thing to be clear about, because it decides most of the comparison. **Barter gives you a trading system; CCXT gives you the venues.** Barter ships an event loop, pluggable Strategy and RiskManager components, indexed position state, a backtester and performance metrics — and streams from eight venues. CCXT ships no engine, no strategy abstraction and no backtester — and reaches 104 exchanges with unified order entry on every one. So: **is the hard part of your system the trading logic, or the connectivity?**
Until recently there was a second question underneath that one — whether you could use CCXT from Rust at all. You can now. CCXT ships a Rust target at the same venue parity as its other languages: `ccxt` carries the typed REST wrappers, `ccxt-pro` the `watch*` venues and `ccxt-prediction` the prediction markets, all on a shared `ccxt-base` engine, async on Tokio, and the Rust build is compiled, clippy-linted and run against the base, id and static request/response suites in CI on every push. So the comparison is no longer "Rust or not" — it is engine versus venues, in the same language.
## TL;DR [#tldr]
* **Pick Barter** if you are building in Rust and want the framework, not just the pipes: an Engine with `Strategy` and `RiskManager` traits, `TradingSummary` metrics (PnL, Sharpe, Sortino, drawdown), an audit stream for out-of-band monitoring, and a backtester that runs your live code path against mock components.
* **Pick CCXT** if the connectivity is your bottleneck: 104 exchanges with REST, 76 with WebSocket, unified order entry, balances, positions and funding on all of them — in Rust, or in TypeScript, JavaScript, Python, PHP, C#/.NET, Go or Java, from the same source.
* **Both are Rust crates now, so pick on what they do.** Barter is the framework — engine, strategy, risk, backtester — over 8 streaming venues. CCXT is the connectivity — 104 REST exchanges and 76 streaming ones — with no engine. Neither replaces the other.
* **Read Barter's disclaimer before you scope around it.** Its README states that the software is "provided solely for educational and research purposes" and is "not intended, designed, tested, verified or certified for commercial deployment, live trading, or production use of any kind." That is the author's own statement of what the project is for.
## At a glance [#at-a-glance]
| | **CCXT** | **Barter** |
| -------------------------------------------- | ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| What it is | unified exchange connectivity library | event-driven trading framework (5 crates) |
| Trading engine, strategy and risk components | no — you write the loop | yes — `Engine`, `Strategy`, `RiskManager` |
| Backtester | no | yes, including concurrent backtest utilities |
| Performance metrics | no | `TradingSummary` — PnL, Sharpe, Sortino, drawdown |
| Streaming venues | **76** exchanges with `watch*` methods | 8 — Binance, Bitfinex, BitMEX, Bybit, Coinbase, Gate.io, Kraken, OKX (15 exchange/instrument constructors) |
| REST venues | **104** exchanges | Barter-Data is WebSocket-first |
| Order entry | unified `create_order` on every supported venue | `ExecutionClient` trait; the client published in `barter-execution` is `mock` |
| Stream kinds | order book, trades, tickers, OHLCV, bids/asks, mark prices, liquidations, plus private streams | `PublicTrades`, `OrderBooksL1`, `OrderBooksL2`, `OrderBooksL3`, `Liquidations`, `Candles` as `SubKind` variants |
| Private / account streams | `watch_orders`, `watch_balance`, `watch_my_trades`, `watch_positions` | `account_stream` on the `ExecutionClient` trait |
| Languages | Rust, plus TypeScript, JavaScript, Python, PHP, C#/.NET, Go and Java from one source | Rust |
| Rust venue coverage | 104 REST exchanges, 76 WebSocket venues, 7 prediction venues | 8 streaming venues |
| Rust crates | `ccxt`, `ccxt-pro`, `ccxt-prediction` over `ccxt-base` | `barter`, `barter-data`, `barter-execution`, `barter-instrument`, `barter-integration` |
| Raw endpoint access | yes — every documented endpoint as an implicit method (808 on Binance) | Barter-Integration provides REST/WebSocket building blocks |
| Latest release | continuous — v4.5.78 | barter 0.14.0, barter-data 0.13.0, barter-execution 0.9.0 — all 20 August 2026 |
| Popularity | 43.8k GitHub stars · 4.7M PyPI + 494k npm installs/month | 2.3k GitHub stars · 91.2k crates.io downloads all-time for `barter` (1.9k in the last 90 days) |
| Licence | MIT | MIT |
| Stated scope | production library | "solely for educational and research purposes" per its README |
| Support | Discord, Telegram, GitHub issues — usually same-day | Discord, GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `rust/` workspace in the CCXT source tree and `.github/workflows/rust.yml`, the barter-rs repository README, the barter-data and barter-execution crate READMEs and sources on the `develop` and `main` branches, docs.rs for barter-execution 0.9.0 and barter-instrument 0.3.3, and the crates.io, npm and PyPI registries.
## The same job, written both ways [#the-same-job-written-both-ways]
### Stream public trades from several venues [#stream-public-trades-from-several-venues]
CCXT
Barter
```python
import ccxt.pro
import asyncio
async def stream(exchange_id, symbol):
exchange = getattr(ccxt.pro, exchange_id)()
while True:
trades = await exchange.watch_trades(symbol)
for t in trades:
print(exchange_id, t['symbol'], t['side'], t['amount'], t['price'])
async def main():
await asyncio.gather(stream('binance', 'BTC/USDT'),
stream('okx', 'BTC/USDT'),
stream('bybit', 'BTC/USDT'))
asyncio.run(main())
```
```text
let streams = Streams::::builder()
.subscribe([
(BinanceSpot::default(), "btc", "usdt", InstrumentKind::Spot, PublicTrades),
(BinanceSpot::default(), "eth", "usdt", InstrumentKind::Spot, PublicTrades),
])
.subscribe([
(Okx, "btc", "usdt", InstrumentKind::Spot, PublicTrades),
])
.subscribe([
(BybitSpot::default(), "btc", "usdt", InstrumentKind::Spot, PublicTrades),
])
.init()
.await
.unwrap();
let mut joined_stream = streams.select_all();
while let Some(event) = joined_stream.next().await {
println!("{event:?}");
}
```
Both normalise. Barter's `StreamBuilder` is declarative and the venue, instrument kind and subscription kind are checked at compile time — an unsupported combination does not build. CCXT resolves the exchange at runtime from a string, which is what lets `exchange_id` be a configuration value and the same loop cover 76 venues.
Each call to `subscribe()` in Barter opens a separate WebSocket connection, which its own examples use deliberately to isolate high-volume instruments; CCXT pools one client per URL and multiplexes subscriptions over it.
### Keep a live level-2 order book [#keep-a-live-level-2-order-book]
CCXT
Barter
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.binance()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```text
let mut streams = Streams::::builder()
.subscribe([
(BinanceSpot::default(), "btc", "usdt", MarketDataInstrumentKind::Spot, OrderBooksL2),
])
.init()
.await
.unwrap();
let mut l2_stream = streams
.select(ExchangeId::BinanceSpot)
.unwrap()
.with_error_handler(|error| warn!(?error, "MarketStream generated error"));
while let Some(event) = l2_stream.next().await {
info!("{event:?}");
}
```
Both maintain the book for you rather than handing you raw deltas — this is the part that is genuinely hard, and both projects have done it. The difference is reach: Barter-Data's published table advertises `OrderBooksL2` for BinanceSpot and BinanceFuturesUsd, and `OrderBooksL1` for those two plus Kraken. CCXT's `watch_order_book` is implemented on all 76 of its WebSocket exchanges, with the venue's checksum verified where one is published.
### Turn a signal into an order [#turn-a-signal-into-an-order]
This is where the two projects stop being comparable, so the honest version shows each doing its own job.
CCXT
Barter
```python
import ccxt
exchange = ccxt.binance({'apiKey': '...', 'secret': '...'})
exchange.load_markets()
amount = exchange.amount_to_precision('BTC/USDT', 0.001)
price = exchange.price_to_precision('BTC/USDT', 60000)
order = exchange.create_order('BTC/USDT', 'limit', 'buy', amount, price)
print(order['id'], order['status'])
exchange.cancel_order(order['id'], 'BTC/USDT')
```
```text
let args = SystemArgs::new(
&instruments,
executions,
LiveClock,
DefaultStrategy::default(),
DefaultRiskManager::default(),
market_stream,
);
let mut system = SystemBuilder::new(args)
.audit_mode(AuditMode::Enabled)
.trading_state(TradingState::Disabled)
.build::()?
.init_with_runtime(tokio::runtime::Handle::current())
.await?;
// the Engine routes market events through Strategy and RiskManager,
// and issues orders through the configured execution client
system.trading_state(TradingState::Enabled);
system.close_positions(InstrumentFilter::None);
```
CCXT's is a function call: you decided, now send it, and the same call works on any of 104 venues. Barter's is a system: you hand the engine a strategy and a risk manager, and it decides and sends on your behalf, tracks the resulting positions, and can be enabled, disabled and commanded from outside the process.
If you want the second shape with CCXT, you write it. If you want CCXT's breadth in Barter, you implement its `ExecutionClient` and `MarketStream` traits per venue — the crates are explicitly designed for that, and it is real work per exchange.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Venue coverage [#venue-coverage]
Barter-Data's README publishes its supported subscriptions as a table: 15 exchange/instrument constructors across eight distinct venues — Binance (spot and USD-M futures), Bitfinex, BitMEX, Bybit (spot and USD perpetuals), Coinbase, Gate.io (six spot, futures, perpetual and options variants), Kraken and OKX. Twelve of those fifteen rows advertise `PublicTrades` only.
Barter-Instrument's `ExchangeId` enum is wider — 42 variants including Bitget, Bitvavo, Cryptocom, Deribit, HTX, KuCoin, MEXC and Poloniex — but an identifier is not an integration; the streaming implementations are the ones in the table.
CCXT implements 104 exchanges over REST and 76 over WebSocket, plus 7 prediction-market venues in `ccxt.prediction`. Adding a venue is a change of identifier, not a new integration:
```python
for exchange_id in ['binance', 'bybit', 'okx', 'coinbase', 'kraken', 'hyperliquid']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
### The execution layer [#the-execution-layer]
Barter-Execution is built around an `ExecutionClient` trait — `account_snapshot`, `account_stream`, `open_order`, `cancel_order`, `fetch_balances` and their batch forms. That trait is a good abstraction, and the crate ships a feature-rich `MockExchange` and `MockExecutionClient` behind it for backtesting and paper trading. In barter-execution 0.9.0, `mock` is the execution client the crate exposes publicly; the source tree also declares a private `binance` module, whose file is empty.
CCXT implements order entry as a first-class unified API on every exchange it supports, including the parts that are easy to underestimate — trigger, stop-loss, take-profit, trailing, post-only and reduce-only orders, leverage and margin mode, positions, funding rates and transfers, all with the same names on the next venue.
### The scope the authors declare [#the-scope-the-authors-declare]
Barter's README carries an explicit legal disclaimer. Section 1, headed EDUCATIONAL PURPOSE, reads: "This software and related documentation ("Software") are provided solely for educational and research purposes. The Software is not intended, designed, tested, verified or certified for commercial deployment, live trading, or production use of any kind." Contributors are asked to accept the same terms.
That is a statement of intent by the author, not a bug report, and it is more forthcoming than most projects are. It is also the kind of thing a procurement or legal review will find, so it is better read at the start of an evaluation than at the end. CCXT is MIT-licensed and carries the standard MIT warranty disclaimer with no comparable scope limitation.
### One API, and now Rust is one of its targets [#one-api-and-now-rust-is-one-of-its-targets]
CCXT is written once in TypeScript and transpiled, with the same method names, arguments and return structures in every target — `fetch_ticker` in Python, `fetchTicker` in TypeScript, `FetchTicker` in Go and C#, all returning the same [ticker structure](/docs/manual#ticker-structure). A strategy researched in a Python notebook moves to a Go or C# execution service without a second data model.
Rust is now one of those targets. `rust/ccxt` exposes typed wrappers that return native Rust types rather than dynamic values, `rust/ccxt-pro` carries the 76 `watch*` venues and `rust/ccxt-prediction` the prediction markets, all over a shared `ccxt-base` engine, async on Tokio:
```text
use ccxt::{Binance, Params};
let mut exchange = Binance::new(None);
exchange.load_markets(false).await;
let ticker = exchange.fetch_ticker("BTC/USDT", Params::none()).await?;
println!("{} {:?}", ticker.symbol, ticker.last);
```
The difference that remains is shape, not language. Barter's crates give you an engine and expect you to bring venues it already adapts; CCXT's give you venues and expect you to bring the engine.
Barter is Rust and only Rust. That is a deliberate and coherent choice — see below — but it does mean the research and execution halves of a team share one language or build a bridge.
### History, rate limits and the REST surface [#history-rate-limits-and-the-rest-surface]
Barter-Data is a WebSocket integration library, and Barter-Execution reaches REST for account snapshots and order requests. Neither is a general REST client for a venue's historical endpoints.
CCXT unifies both directions: `fetch_ohlcv` to backfill candles and `watch_ohlcv` to continue live, returning the same structure, so the code downstream cannot tell which produced the bar — plus `fetch_my_trades`, `fetch_orders`, `fetch_funding_rate_history`, `fetch_positions`, `fetch_deposits` and the rest of the account surface. It also encodes each venue's per-endpoint request weights behind a throttler that is on by default, exposes `amount_to_precision` and `price_to_precision` backed by the `Precise` string-arithmetic class, and maps venue error codes onto a [typed exception tree](/docs/manual#error-handling) of 41 classes. Barter solves the precision half at the language level — `rust_decimal::Decimal` throughout rather than floats — and leaves per-venue request pacing to the integration.
## What Barter does better [#what-barter-does-better]
Real, specific advantages. Several of them are things CCXT deliberately does not attempt:
* **It is a trading system, not a client library.** The `Engine` gives you an event loop, pluggable `Strategy` and `RiskManager` components, a centralised state store with O(1) indexed lookups, position and PnL tracking, and `TradingSummary` reports with PnL, Sharpe, Sortino and drawdown. With CCXT all of that is your code. If your team's scarce resource is engineering time rather than venue coverage, that is a large head start.
* **Backtesting shares the live code path.** Swapping in a mock `MarketStream` and the `MockExecutionClient` lets a backtest run on what its README calls "a near-identical trading system as live-trading", with utilities for running thousands of concurrent backtests. CCXT has no backtester and no simulated venue; you supply both.
* **Rust from the ground up, not generated into it.** Barter is written as Rust rather than transpiled to it, so its API is shaped by the language: typed `SubKind` variants, trait-based extension seams, `Decimal` arithmetic and data-oriented state. CCXT's Rust target inherits the vocabulary of a library designed to read the same in eight languages, which is a real cost in idiom.
* **Operational control is designed in, not bolted on.** The `AuditStream` and the EngineState replica manager give you an out-of-band channel for monitoring and persistence; `TradingState` can be flipped from an external process; and Engine Commands (`CloseAllPositions`, `OpenOrders`, `CancelOrders`) let a UI or a Telegram bot intervene while the engine keeps consuming market and account data. CCXT is a library — it has no notion of a running system to observe or command.
* **Compile-time correctness across the whole pipeline.** `barter-instrument` models exchanges, assets and instruments as types, and a Barter-Data subscription checks the venue, instrument kind and subscription kind at compile time. CCXT's equivalent is the runtime `has` capability map: you find out that a venue does not support `watchOHLCV` when you call it.
* **A clean extension seam.** `MarketStream` and `ExecutionClient` are small, well-shaped traits. Adding a venue means implementing an interface the framework already understands, rather than forking a large library.
If you are building a Rust trading system and the hard part is the engine, the risk layer and the backtest loop rather than the number of venues, Barter is the better starting point — with its own stated scope factored into your plan.
## Migrating from Barter to CCXT [#migrating-from-barter-to-ccxt]
Only the connectivity half maps, and you stay in Rust while you do it: the `ccxt` and `ccxt-pro` crates cover the same 104 REST and 76 WebSocket venues as every other CCXT target. The Engine, `Strategy`, `RiskManager`, backtester and `TradingSummary` have no CCXT equivalent, so if you move, you keep writing those yourself or bring another library.
| What you are doing | Barter | CCXT |
| ----------------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------- |
| Identify a venue | `ExchangeId::BinanceSpot` | `ccxt.binance` / `ccxt.pro.binance` |
| Identify an instrument | `("btc", "usdt", InstrumentKind::Spot)` | `'BTC/USDT'` (spot), `'BTC/USDT:USDT'` (linear swap) |
| Instrument metadata | `IndexedInstruments` from `barter-instrument` | `load_markets()` |
| Public trades | `SubKind::PublicTrades` | `watch_trades()` / `fetch_trades()` |
| Order book | `SubKind::OrderBooksL2` | `watch_order_book()` / `fetch_order_book()` |
| Candles | `SubKind::Candles` | `watch_ohlcv()` / `fetch_ohlcv()` |
| Liquidations | `SubKind::Liquidations` | `watch_liquidations()` |
| Account snapshot | `ExecutionClient::account_snapshot` | `fetch_balance()` + `fetch_positions()` |
| Account stream | `ExecutionClient::account_stream` | `watch_orders()`, `watch_balance()`, `watch_my_trades()` |
| Open / cancel an order | `ExecutionClient::open_order` / `cancel_order` | `create_order(...)` / `cancel_order(id, symbol)` |
| Paper trading | `MockExecutionClient` | `set_sandbox_mode(True)` where the venue offers a testnet |
| Venue-specific calls | write it with Barter-Integration | the same endpoint as an [implicit method](/docs/exchanges/binance/implicit-api) |
| Engine, strategy, risk, backtest, metrics | built in | not provided — your code |
Start with [Install](/docs/install), then the [Manual](/docs/manual) and the [CCXT Pro manual](/docs/pro-manual).
## FAQ [#faq]
**Which exchanges does Barter support?**
Barter-Data's README table lists 15 exchange/instrument constructors across eight venues: Binance (spot and USD futures), Bitfinex, BitMEX, Bybit (spot and USD perpetuals), Coinbase, Gate.io (six spot, futures, perpetual and options variants), Kraken and OKX. Most advertise public trades; level-2 order books are listed for BinanceSpot and BinanceFuturesUsd. CCXT covers 104 exchanges over REST and 76 over WebSocket.
**Can Barter place live orders?**
Its `ExecutionClient` trait defines order entry, and `barter-execution` 0.9.0 publishes a `mock` client behind it for paper trading and backtesting; a live venue client is something you implement against that trait. Barter's README also states that the software is "not intended, designed, tested, verified or certified for commercial deployment, live trading, or production use of any kind". CCXT implements unified live order entry on every venue it supports.
**Is CCXT available in Rust?**
Yes. Rust is one of the targets generated from CCXT's single TypeScript source, alongside TypeScript, JavaScript, Python, PHP, C#/.NET, Go and Java. `ccxt` carries typed REST wrappers for all 104 exchanges, `ccxt-pro` the 76 WebSocket venues and `ccxt-prediction` the prediction markets — all async on Tokio, all MIT-licensed, and all compiled, clippy-linted and run against the base, id and static request/response suites in CI. See [Install CCXT](/docs/install) for the Rust setup.
**Is CCXT slower than Barter?**
Barter is native Rust with no garbage collector and data-oriented state, so on raw per-message cost it will win, and for the workloads its design targets that gap is real. For most strategy and dashboard workloads the bottleneck is network round-trip time and your own consumer, not the parsing layer. If you are optimising microseconds you are writing custom code against a colocated endpoint anyway, which is a different comparison from either of these libraries.
**Does CCXT have a backtester or a strategy framework?**
No. CCXT is connectivity: market data, order entry, accounts and funding across venues, with unified structures. Backtesting, strategy composition, risk management and performance reporting are exactly what Barter provides and CCXT does not.
**Can I use Barter and CCXT together?**
Yes, and now in the same process. Barter's `MarketStream` and `ExecutionClient` are traits, and CCXT's Rust crates give you 104 REST and 76 WebSocket venues to implement them against — Barter's engine, strategy and risk layer on top, CCXT reaching the venues Barter does not integrate. That adapter is your integration to build and maintain, but it no longer needs a language boundary. Splitting across processes still works too: CCXT in Python or Go for research, backfill and long-tail venues, Rust on the hot path.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [Supported exchanges](/docs/exchange-markets)
* [More comparisons](/docs/comparisons)
# CCXT vs the Bequant API (/docs/comparisons/ccxt-vs-bequant-api)
`bequant` is a white-label venue of HitBTC — a Malta-based exchange running on the HitBTC engine, so its API is HitBTC-shaped.
Because it shares an API dialect with HitBTC, CCXT implements it by extending its `hitbtc` class. Everything in the [CCXT vs the HitBTC API](/docs/comparisons/ccxt-vs-hitbtc-api) comparison applies here — this page covers only what is specific to `bequant`.
## What is different [#what-is-different]
A distinct venue with its own accounts and listings, but the request/response formats are inherited from HitBTC. CCXT therefore implements it by extending its HitBTC class rather than duplicating a parser.
> Credentials and markets are its own; only the API dialect is shared.
## What CCXT gives you here [#what-ccxt-gives-you-here]
| | `bequant` |
| --------------------------------- | ------------------------------------------------------------ |
| Unified capabilities | 65 (inherited from `hitbtc` plus its own overrides) |
| `fetch*` methods | 35 |
| WebSocket `watch*` methods | 8 |
| Raw endpoints as implicit methods | 111 |
| Testnet via `setSandboxMode` | no |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust |
| Licence | MIT |
Figures verified September 2026 against CCXT v4.5.78, read from the source tree with `build/comparisons-facts.cjs`. Counts include everything inherited from `hitbtc`.
## Using it [#using-it]
The class name is the only thing that changes — every unified method behaves as it does everywhere else in CCXT:
Python
TypeScript
```python
import ccxt
exchange = ccxt.bequant({'apiKey': '...', 'secret': '...'})
markets = exchange.load_markets()
ticker = exchange.fetch_ticker(list(markets)[0])
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bequant ({ apiKey: '...', secret: '...' });
const markets = await exchange.loadMarkets ();
const ticker = await exchange.fetchTicker (Object.keys (markets)[0]);
```
Because `bequant` lists a different market set from `hitbtc`, call `load_markets()` and pick symbols from it rather than assuming a pair exists.
Streaming works the same way:
```python
import ccxt.pro, asyncio
async def main():
exchange = ccxt.pro.bequant()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
## Should you use this class or the parent? [#should-you-use-this-class-or-the-parent]
Use `bequant` when you hold an account with Bequant specifically. Use [`hitbtc`](/docs/exchanges/hitbtc) when you hold an account with the global venue. They are different venues with separate credentials, so this is not a preference — it follows from where your account is.
## FAQ [#faq]
**Do my `hitbtc` API keys work with `bequant`?**
No. It is a separate legal entity with separate accounts; you need keys issued by Bequant.
**Does `bequant` support the full unified API?**
It inherits 65 unified capabilities from `hitbtc`. Where the venue does not offer a feature, the corresponding `has` flag is turned off, and the method raises `NotSupported` rather than failing quietly. Check `exchange.has` at runtime.
**Can I reach Bequant-specific endpoints?**
Yes — all 111 endpoints in this class's `api` block are generated as implicit methods, with signing, rate limiting and error mapping applied. The mechanism is documented on the [`hitbtc` implicit API page](/docs/exchanges/hitbtc/implicit-api); this venue's own endpoint list differs slightly from the parent's.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [CCXT vs the HitBTC API](/docs/comparisons/ccxt-vs-hitbtc-api) — the full comparison
* [`hitbtc` API reference](/docs/exchanges/hitbtc) — `bequant` inherits it; it has no separate reference page
* [Install CCXT](/docs/install)
* [Manual](/docs/manual)
* [More comparisons](/docs/comparisons)
# CCXT vs the raw BigONE API (/docs/comparisons/ccxt-vs-bigone-api)
[BigONE](https://big.one) documents its API at [open.big.one](https://open.big.one/docs/api.html), and publishes machine-readable specifications in [bigone-eng/openapi-specs](https://github.com/bigone-eng/openapi-specs) — five OpenAPI YAML files covering spot trading, contract trading, wallet and asset management, and one-click swap. What it does not publish is a client library. The specs repository has no released SDK, and BigONE's getting-started page offers token-generation snippets in Python, Go and JavaScript rather than a package to install.
The most-starred community option, [jeffkit/bigone-python](https://github.com/jeffkit/bigone-python), describes itself as "An unofficial Python implementation of the latest Open API for big.one exchange", is MIT-licensed with 4 stars and 12 commits, and targets the **v2** API — while BigONE's current documented version is **v3**.
So the real comparison here is not CCXT against a vendor SDK. It is **CCXT against the HTTP client you were about to write**.
## TL;DR [#tldr]
* **Write it yourself** if you need two public endpoints, work in a language CCXT does not target, or you specifically need BigONE's **WebSocket feeds** — which CCXT does not implement for this exchange.
* **Pick CCXT** if you want per-request JWT signing, rate limiting, precision handling, pagination and typed errors already written and tested, with 29 unified capabilities and all 41 BigONE endpoints exposed.
* **BigONE's auth is a JWT you mint per request**, not a static HMAC header, and spot and contracts live on two different API generations. Both are small things that cost an afternoon the first time.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw BigONE REST API** |
| --------------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Exchanges covered | 104 (BigONE is one of them) | BigONE only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write it in |
| Packages to install | **1** (`ccxt`) | an HTTP client, a JWT library, and your own wrapper |
| First-party client library | n/a | **none** — OpenAPI specifications only |
| Unified market data + trading API | yes — 29 capabilities on `bigone` | no — raw JSON payloads |
| Spot and contracts in one client | yes — v3 spot and v2 contract hosts behind one object | two API generations, five base paths |
| WebSockets | **no** — 0 `watch*` methods for `bigone` | BigONE documents Spot and Contract WebSocket guides you would implement yourself |
| Raw endpoint access | yes — 41 endpoints as implicit methods | yes, it is all you have |
| Built-in rate limiter | yes, on by default (`rateLimit` 20 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus BigONE error payloads |
| Testnet / sandbox | none — BigONE publishes no sandbox | none |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** | `openapi-specs` 0 stars; `bigone-python` 4 stars (unofficial, v2) |
| Licence | MIT | n/a (`bigone-python` is MIT) |
| Support | Discord, Telegram, GitHub — usually same-day | BigONE support channels |
Figures verified September 2026 against CCXT v4.5.78, BigONE's getting-started documentation, the `bigone-eng/openapi-specs` and `jeffkit/bigone-python` repositories, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.bigone()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://big.one/api/v3/asset_pairs/BTC-USDT/ticker')
data = r.json()['data']
# 'asset_pair_name', 'bid', 'ask', 'open', 'high', 'low', 'close', 'volume', ...
print(data['close'], data['volume'])
```
The raw call is short, which is why people write it. What it does not give you is a [unified ticker structure](/docs/manual#ticker-structure): consistent key names, milliseconds instead of BigONE's own timestamp format, base volume separated from quote volume, and the same shape on the next exchange.
### Place a limit order [#place-a-limit-order]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.bigone({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import jwt, time, requests
token = jwt.encode({
'type': 'OpenAPIV2',
'sub': API_KEY,
'nonce': str(time.time_ns()), # nanoseconds
}, API_SECRET, algorithm='HS256')
r = requests.post(
'https://big.one/api/v3/viewer/orders',
headers={'Authorization': 'Bearer ' + token,
'Content-Type': 'application/json'},
json={'asset_pair_name': 'BTC-USDT',
'side': 'BID', # BID / ASK, not buy / sell
'type': 'LIMIT',
'price': '60000',
'amount': '0.001'})
print(r.json())
```
Four details in that snippet are easy to get wrong and produce the same unhelpful rejection: the credential is a **JWT you mint for every request** with `type`, `sub` and a **nanosecond** nonce; the side values are `BID` and `ASK` rather than `buy` and `sell`; price and amount are strings; and for a **market buy**, BigONE expects the `amount` field to carry the quote-currency cost rather than the base quantity. CCXT handles all four, and does the equivalent for the other 103 exchanges without you learning each one's variant.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Two API generations behind one client [#two-api-generations-behind-one-client]
BigONE's spot API is v3, at `https://big.one/api/v3` with private calls under `/api/v3/viewer`. Its contract API is a different generation entirely, at `https://big.one/api/contract/v2`. CCXT models `public`, `private`, `contractPublic`, `contractPrivate` and `webExchange` as five base URLs inside a single exchange object, so spot and swap markets are loaded together and `fetch_ticker` works on both:
```python
exchange = ccxt.bigone()
exchange.load_markets() # spot (v3) and swap (contract v2) in one call
```
Hand-rolled, that is two clients, two signing paths and two response vocabularies to keep in step.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
BigONE's documentation references rate limits in general terms without publishing per-endpoint numbers. CCXT ships a concrete, tunable default — `rateLimit = 20` ms, recorded in the exchange file as 500 requests per 10 seconds — and a token-bucket throttler that is on by default. You write a loop; the library paces it. If you need it stricter or looser, it is one constructor option:
```python
exchange = ccxt.bigone({'enableRateLimit': True, 'rateLimit': 50})
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps BigONE's responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. Matching on BigONE's error codes and hoping the wording never changes is the alternative, and it does not survive adding a second venue.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads BigONE's asset-pair metadata and exposes tick size, step size and minimum notional through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class. BigONE takes prices and amounts as strings, which is exactly where naive float formatting produces a rejected order:
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### Eight languages, one API [#eight-languages-one-api]
There is no BigONE client in any language, so every language is a from-scratch integration. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and structures:
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.bigone()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bigone ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```csharp
var exchange = new ccxt.bigone();
var ticker = await exchange.FetchTicker("BTC/USDT");
```
```go
exchange := ccxt.NewBigone(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
BigONE's API is compact: **41 endpoints**, and CCXT generates every one of them as a callable implicit method with JWT signing, rate limiting and error mapping applied:
```python
# any raw BigONE endpoint, camelCased from its path
pairs = exchange.public_get_asset_pairs()
contract_account = exchange.contract_private_get_accounts()
```
Browse them on the [bigone implicit API page](/docs/exchanges/bigone/implicit-api).
### Portability [#portability]
In CCXT the exchange id is a variable, so listing the same pair on a second venue is a configuration change rather than a second integration:
```python
for exchange_id in ['bigone', 'binance', 'okx', 'kucoin']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
## What hand-rolling the raw API does better [#what-hand-rolling-the-raw-api-does-better]
An honest list, because these are real:
* **BigONE's WebSocket feeds.** CCXT implements **zero** `watch*` methods for `bigone`, so there is no `ccxt.pro.bigone`. BigONE's documentation includes a Spot WebSocket Guide and a Contract WebSocket Guide. If you want live socket data from this venue, you are writing that client — CCXT will not do it for you.
* **The OpenAPI specifications.** BigONE publishes five OpenAPI YAML files. That is genuinely useful: you can generate a typed client for almost any language with standard tooling and get request/response models that mirror the docs exactly. CCXT gives you unified structures instead, which is a different trade.
* **A far smaller dependency.** One `requests` call against `/api/v3/asset_pairs/BTC-USDT/ticker` is three lines and no third-party library. For a dashboard that reads one price, CCXT is more than you need.
* **Endpoints CCXT does not model as unified methods.** BigONE's convert / one-click-swap product and parts of its contract API are reachable from CCXT only as implicit methods returning raw payloads. If those are the bulk of your integration, the unified layer buys you less.
* **Field-for-field fidelity with the docs.** `asset_pair_name`, `BID`, `filled_amount` — when you are reading BigONE's reference while debugging, raw JSON has no translation layer between you and it.
If BigONE is your only venue, you need streaming, and you are comfortable owning the JWT signing, writing it directly is a defensible choice.
## Migrating from a raw BigONE integration to CCXT [#migrating-from-a-raw-bigone-integration-to-ccxt]
| What you are doing | Raw BigONE API | CCXT |
| ---------------------- | --------------------------------------------- | ------------------------------------------------------------------------------ |
| Symbols | `asset_pair_name: 'BTC-USDT'` | `'BTC/USDT'` |
| Client | your own JWT-signing `requests` wrapper | `ccxt.bigone({'apiKey': ..., 'secret': ...})` |
| Auth | mint an HS256 JWT per request | handled |
| Asset pairs | `GET /api/v3/asset_pairs` | `load_markets()` |
| Ticker | `GET /api/v3/asset_pairs/{pair}/ticker` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `GET /api/v3/asset_pairs/{pair}/depth` | `fetch_order_book()` |
| Trades | `GET /api/v3/asset_pairs/{pair}/trades` | `fetch_trades()` |
| Candles | `GET /api/v3/asset_pairs/{pair}/candles` | `fetch_ohlcv()` |
| New order | `POST /api/v3/viewer/orders` | `create_order()` |
| Cancel order | `POST /api/v3/viewer/orders/{id}/cancel` | `cancel_order()` |
| Cancel all | `POST /api/v3/viewer/orders/cancel` | `cancel_all_orders()` |
| Orders | `GET /api/v3/viewer/orders` | `fetch_orders()` / `fetch_open_orders()` / `fetch_closed_orders()` |
| Balance | `GET /api/v3/viewer/accounts` | `fetch_balance()` |
| My trades | `GET /api/v3/viewer/trades` | `fetch_my_trades()` |
| Deposits / withdrawals | `GET /api/v3/viewer/deposits`, `/withdrawals` | `fetch_deposits()` / `fetch_withdrawals()` |
| Transfers | `POST /api/v3/viewer/transfer` | `transfer()` |
| Contracts | `GET /api/contract/v2/...` | the same client — swap markets load alongside spot |
| Streams | BigONE WebSocket guides, hand-written | **not available in CCXT for `bigone`** |
| Anything not listed | native call | the same endpoint as an [implicit method](/docs/exchanges/bigone/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [bigone unified API reference](/docs/exchanges/bigone).
## FAQ [#faq]
**Is there an official BigONE SDK?**
No. BigONE publishes OpenAPI specifications in `bigone-eng/openapi-specs` and code snippets for generating an auth token, but no client library in any language. The community `bigone-python` package is unofficial, has 4 GitHub stars, and targets the v2 API rather than the current v3.
**Does CCXT support BigONE WebSockets?**
No. `bigone` has zero `watch*` methods, so there is no `ccxt.pro.bigone`. REST is fully covered — 29 unified capabilities and all 41 endpoints — but BigONE's documented Spot and Contract WebSocket feeds are not implemented.
**How does CCXT authenticate with BigONE?**
It mints a JWT for every private request, signed HS256 with your API secret, whose payload is `{"type": "OpenAPIV2", "sub": , "nonce": }`, and sends it as `Authorization: Bearer `. You never write that code.
**Does CCXT cover BigONE's contract (swap) markets?**
Yes. `bigone` declares both `spot` and `swap`, and CCXT models BigONE's v3 spot API and v2 contract API as separate base URLs behind one client, so both market types load from a single `load_markets()`.
**Does BigONE have a testnet?**
No sandbox environment is published, so `set_sandbox_mode(True)` has nothing to point at for `bigone`. Test against CCXT's offline static fixtures and small live orders.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support for the 76 exchanges that have it.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bigone unified API reference](/docs/exchanges/bigone)
* [bigone implicit API](/docs/exchanges/bigone/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the Binance API and official Binance SDKs (/docs/comparisons/ccxt-vs-binance-api)
If you are integrating Binance, you have two realistic options: call the Binance REST and WebSocket APIs through Binance's own SDKs, or go through [CCXT](/docs/manual), which speaks Binance natively but behind an API shared with 100+ other exchanges.
Both work. They optimise for different things, and the right answer depends on one question: **is Binance the only venue you will ever touch?**
## TL;DR [#tldr]
* **Pick the official Binance SDKs** if Binance is your only venue, you want request/response types that mirror the Binance docs one-for-one, and you are happy to install and track a separate package per product line.
* **Pick CCXT** if you want one dependency, one mental model and one codebase that already runs against Binance spot, margin, USD-M futures, COIN-M futures, options and portfolio margin — and against Bybit, OKX, Coinbase and 100 more the day you add a second venue.
* **You do not have to choose blind.** CCXT exposes every raw Binance endpoint as an [implicit method](/docs/exchanges/binance/implicit-api), so picking CCXT never locks you out of a Binance-specific feature.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Binance SDKs** |
| --------------------------------- | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Binance is one of them) | Binance only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, TypeScript/JS, Java, Go, Rust, PHP, Ruby, C# — separate codebases, coverage varies |
| Packages to install | **1** (`ccxt`) | **one per product line** — 27 published `binance-sdk-*` Python packages |
| Binance products in one client | spot, margin, USD-M futures, COIN-M futures, options, portfolio margin | separate client class + package per product |
| Unified market data + trading API | yes — same method names across every exchange | no — Binance's own request/response shapes |
| WebSockets | yes, `watch*` methods with the same shape as `fetch*` | yes, per-product stream clients |
| Raw endpoint access | yes — 808 Binance endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default | partial / manual |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP + Binance error codes |
| Testnet / sandbox | `exchange.setSandboxMode(true)` | separate base-URL constants |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | `python-binance` 7.2k stars · 539k PyPI installs/month; official `binance-connector-python` 2.9k stars · `binance-sdk-spot` 46k installs/month |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues, Binance developer channels |
Figures verified September 2026 against CCXT v4.5.78, Binance's published connector repositories, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
binance-sdk-spot
```python
import ccxt
exchange = ccxt.binance()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from binance_common.configuration import ConfigurationRestAPI
from binance_common.constants import SPOT_REST_API_PROD_URL
from binance_sdk_spot.spot import Spot
configuration = ConfigurationRestAPI(base_path=SPOT_REST_API_PROD_URL)
client = Spot(config_rest_api=configuration)
response = client.rest_api.ticker24hr(symbol='BTCUSDT')
print(response.data())
```
The CCXT call returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, the same types, the same units, whether the venue is Binance, Kraken or Hyperliquid. The SDK returns Binance's own payload, which you parse yourself.
### Place a limit order [#place-a-limit-order]
CCXT
binance-sdk-spot
```python
import ccxt
exchange = ccxt.binance({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from binance_common.configuration import ConfigurationRestAPI
from binance_common.constants import SPOT_REST_API_PROD_URL
from binance_sdk_spot.spot import Spot
configuration = ConfigurationRestAPI(
api_key='...', api_secret='...', base_path=SPOT_REST_API_PROD_URL)
client = Spot(config_rest_api=configuration)
response = client.rest_api.new_order(
symbol='BTCUSDT', side='BUY', type='LIMIT',
time_in_force='GTC', quantity=0.001, price=60000)
print(response.data())
```
To place that same order on USD-M futures with the official SDKs you install `binance-sdk-derivatives-trading-usds-futures`, import a different client and learn a different method signature. With CCXT you change one option:
```python
exchange = ccxt.binance({'apiKey': '...', 'secret': '...',
'options': {'defaultType': 'future'}})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.001, 60000)
```
### Stream an order book [#stream-an-order-book]
CCXT
binance-sdk-spot
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.binance()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from binance_common.configuration import ConfigurationWebSocketStreams
from binance_common.constants import SPOT_WS_STREAMS_PROD_URL
from binance_sdk_spot.spot import Spot
configuration_ws_streams = ConfigurationWebSocketStreams(
stream_url=SPOT_WS_STREAMS_PROD_URL)
client = Spot(config_ws_streams=configuration_ws_streams)
connection = await client.websocket_streams.create_connection()
stream = await connection.diff_book_depth(symbol='btcusdt')
stream.on('message', lambda data: print(data))
```
These two snippets look comparable. They are not doing remotely the same thing.
CCXT returns a **live, fully merged order book**. The SDK returns **raw diff messages**. Turning the second into the first is the part nobody budgets for, and CCXT has already done it for every exchange it supports:
| | CCXT | raw stream |
| ------------------------------------------------------------------ | ------------ | ---------- |
| Fetch the REST snapshot and align it with the stream | done for you | your code |
| Buffer deltas arriving during the snapshot fetch, then replay them | done for you | your code |
| Detect sequence / update-id gaps and re-sync automatically | done for you | your code |
| Verify the venue's order-book checksum where one is published | done for you | your code |
| Reconnect, re-subscribe and re-seed after a drop | done for you | your code |
| Keep a bounded, depth-limited cache instead of growing forever | done for you | your code |
Every one of those is a place a hand-rolled book goes quietly wrong — it does not throw, it just drifts, and you find out from a fill you did not expect. Binance's own stream documentation devotes a whole section to [How to manage a local order book correctly](https://developers.binance.com/docs/binance-spot-api-docs/web-socket-streams) precisely because it is easy to get wrong. With CCXT that section is a method call, and the same method call works on the next exchange, whose sequencing rules are different.
## Where the differences actually bite [#where-the-differences-actually-bite]
### One package versus twenty-seven [#one-package-versus-twenty-seven]
Binance's official Python connector is no longer one library. It has been split into a modular family — `binance-sdk-spot`, `binance-sdk-margin-trading`, `binance-sdk-derivatives-trading-usds-futures`, `binance-sdk-derivatives-trading-coin-futures`, `binance-sdk-derivatives-trading-options`, `binance-sdk-derivatives-trading-portfolio-margin`, `binance-sdk-wallet`, `binance-sdk-convert`, `binance-sdk-staking`, `binance-sdk-simple-earn`, and about seventeen more. A strategy that trades spot, hedges on USD-M futures and sweeps balances through the wallet API pulls in three packages, three client classes and three release cadences to track.
CCXT ships those product lines as one `ccxt.binance` instance. `defaultType` and unified params select the venue; the method names do not change.
### Portability is the whole point [#portability-is-the-whole-point]
This is the difference that shows up six months in, not on day one. Adding a second exchange to an official-SDK integration means a second SDK, a second set of payload shapes, a second symbol convention, a second error taxonomy and a second WebSocket dialect — then a translation layer of your own so the rest of your code can stay venue-agnostic. That translation layer is precisely what CCXT already is, maintained by people who do it full time across 104 venues.
In CCXT the venue is a variable:
```python
for exchange_id in ['binance', 'bybit', 'okx', 'coinbase', 'kraken']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, so the method names, arguments and return structures are identical in every one of them. A strategy prototyped in a Python notebook ports to a Go or C# execution service without redesigning the data model.
TypeScript
Python
PHP
C#
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.binance ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```python
import ccxt
exchange = ccxt.binance()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```php
$exchange = new \ccxt\binance();
$ticker = $exchange->fetch_ticker('BTC/USDT');
```
```csharp
var exchange = new ccxt.binance();
var ticker = await exchange.FetchTicker("BTC/USDT");
```
```go
exchange := ccxt.NewBinance(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
Binance publishes connectors in several languages too, but they are separate codebases with separate coverage, separate idioms and separate release schedules — not one API expressed eight ways.
### WebSockets that look like REST [#websockets-that-look-like-rest]
CCXT Pro (bundled in the same `ccxt` package, no separate purchase) gives Binance 31 streaming methods — `watchOrderBook`, `watchTrades`, `watchOHLCV`, `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchMarkPrices`, `watchBalance`, `watchOrders`, `watchPositions`, `watchMyTrades`, `watchLiquidations` and their `unWatch*` counterparts — plus `createOrderWs`, `editOrderWs`, `cancelOrderWs` and `cancelAllOrdersWs` for order entry over the socket.
`watchOrderBook` returns the same structure as `fetchOrderBook`. `watchOrders` returns the same structure as `fetchOrders`. Swapping a polling loop for a stream is a one-word change, and the code downstream is untouched.
Underneath, CCXT handles the parts that are tedious to get right: connection pooling per URL, ping/pong keep-alive with miss detection, automatic reconnect and resubscribe, order-book checksum verification, bounded caches for trades and candles, and — specific to Binance — the **`listenKey` lifecycle for user-data streams**, refreshed on a timer so your private stream does not silently die after 60 minutes.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Binance meters by request weight, and the weight differs per endpoint and sometimes per parameter — `fetchOrderBook` with `limit=5000` costs far more than with `limit=100`. CCXT encodes those weights in the exchange definition and ships a token-bucket throttler that is **on by default** (`enableRateLimit = true`, `rateLimit = 50`ms for Binance), with a rolling-window algorithm available for venues that need it. You call methods in a loop; the library paces them.
With raw SDKs, respecting weights — and backing off correctly on a 418 or 429 — is application code you write and maintain.
### Precision, rounding and string math [#precision-rounding-and-string-math]
Every exchange rejects orders that violate its tick size, step size or minimum notional. CCXT loads Binance's market metadata and gives you `amountToPrecision`, `priceToPrecision` and `costToPrecision`, backed by the `Precise` string-arithmetic class so quantities never drift through float rounding — the failure mode where `0.1 + 0.2` costs you a rejected order at 3am.
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Binance's numeric error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once and it keeps working when you add a second exchange, instead of matching on `-2010` and hoping the string never changes.
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.binance({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps in Binance's testnet endpoints
```
One flag swaps every REST and WebSocket URL. No constant swapping, no forked configuration.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
The most common objection to a unified library is that it must be a lowest common denominator. It is not. Alongside the 155 unified capabilities CCXT implements for Binance, **all 808 endpoints in Binance's API are generated as callable implicit methods**:
```python
# any raw Binance endpoint, camelCased from its path
response = exchange.sapi_get_copytrading_futures_userstatus()
```
Signing, timestamping, rate-limit accounting and error mapping still apply. So the unified API covers the 95% every venue shares, and the implicit API covers the Binance-specific 5% — without dropping to raw HTTP or adding a second dependency. Browse them all on the [Binance implicit API page](/docs/exchanges/binance/implicit-api).
### Maintenance and support [#maintenance-and-support]
CCXT is MIT-licensed, has \~43.8k GitHub stars and a large contributor base, and ships releases continuously — exchange APIs change without notice, and the fixes land in a single dependency bump rather than in your integration code.
Support is unusually direct for an open-source project: an active [Discord](https://discord.gg/dhzSKYU), a [Telegram chat](https://t.me/ccxt_chat), and GitHub issues, with questions routinely answered the same day by maintainers who wrote the exchange implementation you are asking about.
## What the official SDKs do better [#what-the-official-sdks-do-better]
An honest list, because these are real:
* **One-to-one mapping with the Binance docs.** If you are reading Binance's API reference, the official SDK's method and field names match it exactly. CCXT's unified names are a deliberate abstraction, which is an extra hop when debugging against the vendor docs.
* **New Binance features land there first.** A brand-new Binance product line usually appears in Binance's own connector before it is modelled in a unified CCXT method. (CCXT's implicit API closes most of this gap on day one, but a *unified* wrapper may lag.)
* **Typed request/response models per product.** The generated SDKs give you Binance-shaped typed models. CCXT gives you typed *unified* structures — better for portability, less literal about Binance's payloads.
* **Smaller dependency if you truly only need one product.** If all you ever do is spot market data, `binance-sdk-spot` alone is a smaller install than all of CCXT.
If Binance is your only venue, forever, and you value literal fidelity to their docs over portability, the official SDKs are a defensible choice.
## Migrating from a Binance SDK to CCXT [#migrating-from-a-binance-sdk-to-ccxt]
| What you are doing | Binance SDK | CCXT |
| ------------------- | -------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `'BTCUSDT'` | `'BTC/USDT'` (spot), `'BTC/USDT:USDT'` (USD-M swap) |
| Product selection | different package + client | `options.defaultType` = `spot` / `margin` / `future` / `delivery` / `option` |
| Exchange info | `exchange_info()` | `load_markets()` |
| 24h ticker | `ticker24hr()` | `fetch_ticker()` / `fetch_tickers()` |
| Depth | `depth()` | `fetch_order_book()` |
| Klines | `klines()` | `fetch_ohlcv()` |
| New order | `new_order()` | `create_order()` |
| Cancel | `cancel_order()` | `cancel_order()` |
| Open orders | `get_open_orders()` | `fetch_open_orders()` |
| Account | `account()` | `fetch_balance()` |
| Streams | per-product stream client | `watch_*` on `ccxt.pro.binance` |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/binance/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [binance unified API reference](/docs/exchanges/binance).
## FAQ [#faq]
**Is CCXT slower than calling the Binance API directly?**
CCXT adds parsing and normalisation on top of the same HTTP and WebSocket calls, so there is a small constant overhead per message. For everything short of latency-sensitive market making, network round-trip time dominates it. If you are optimising microseconds, you are writing custom code against a colocated endpoint anyway — that is not a comparison between two general-purpose libraries.
**Does CCXT support Binance futures, options and margin?**
Yes — spot, margin (cross and isolated), USD-M futures, COIN-M futures, options and portfolio margin, all from one `ccxt.binance` instance selected by `options.defaultType` and unified params.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.binance` (or `ccxt.binance` in the WS-capable languages) and call `watch*` methods.
**Can I still call Binance-specific endpoints?**
Yes — all 808 of them, as [implicit methods](/docs/exchanges/binance/implicit-api), with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
**What if Binance changes its API?**
The fix lands in CCXT and reaches you as a version bump. With a hand-rolled integration it lands in your backlog.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [binance unified API reference](/docs/exchanges/binance)
* [binance implicit API](/docs/exchanges/binance/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Binance COIN-M Futures API (/docs/comparisons/ccxt-vs-binancecoinm-api)
`binancecoinm` is a product line of Binance — Binance's coin-margined futures, where the contract is collateralised in the base asset rather than in USDT.
Because it shares an API dialect with Binance, CCXT implements it by extending its `binance` class. Everything in the [CCXT vs the Binance API](/docs/comparisons/ccxt-vs-binance-api) comparison applies here — this page covers only what is specific to `binancecoinm`.
## What is different [#what-is-different]
Same exchange and credentials as `binance`, different product line and host. The equivalent of `ccxt.binance({"options": {"defaultType": "delivery"}})`.
> Inverse contracts: margin, PnL and position size are denominated in the base coin, so notional maths differs from the USD-M class. Symbols look like `BTC/USD:BTC`.
## What CCXT gives you here [#what-ccxt-gives-you-here]
| | `binancecoinm` |
| --------------------------------- | ------------------------------------------------------------ |
| Unified capabilities | 153 (inherited from `binance` plus its own overrides) |
| `fetch*` methods | 79 |
| WebSocket `watch*` methods | 31 |
| Raw endpoints as implicit methods | 808 |
| Testnet via `setSandboxMode` | no |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust |
| Licence | MIT |
Figures verified September 2026 against CCXT v4.5.78, read from the source tree with `build/comparisons-facts.cjs`. Counts include everything inherited from `binance`.
## Using it [#using-it]
The class name is the only thing that changes — every unified method behaves as it does everywhere else in CCXT:
Python
TypeScript
```python
import ccxt
exchange = ccxt.binancecoinm({'apiKey': '...', 'secret': '...'})
markets = exchange.load_markets()
ticker = exchange.fetch_ticker(list(markets)[0])
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.binancecoinm ({ apiKey: '...', secret: '...' });
const markets = await exchange.loadMarkets ();
const ticker = await exchange.fetchTicker (Object.keys (markets)[0]);
```
Because `binancecoinm` lists a different market set from `binance`, call `load_markets()` and pick symbols from it rather than assuming a pair exists.
Streaming works the same way:
```python
import ccxt.pro, asyncio
async def main():
exchange = ccxt.pro.binancecoinm()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
## Should you use this class or the parent? [#should-you-use-this-class-or-the-parent]
Use `binancecoinm` when you hold an account with Binance COIN-M Futures specifically. Use [`binance`](/docs/exchanges/binance) when you hold an account with the main venue and want its other product lines from one client. They are different hosts, so this is not a preference — it follows from where your account is.
## FAQ [#faq]
**Do my `binance` API keys work with `binancecoinm`?**
Yes — it is the same account and the same credentials, just a different product host.
**Does `binancecoinm` support the full unified API?**
It inherits 153 unified capabilities from `binance`. Where the venue does not offer a feature, the corresponding `has` flag is turned off, and the method raises `NotSupported` rather than failing quietly. Check `exchange.has` at runtime.
**Can I reach Binance COIN-M Futures-specific endpoints?**
Yes — all 808 endpoints in this class's `api` block are generated as implicit methods, with signing, rate limiting and error mapping applied. The mechanism is documented on the [`binance` implicit API page](/docs/exchanges/binance/implicit-api); this venue's own endpoint list differs slightly from the parent's.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [CCXT vs the Binance API](/docs/comparisons/ccxt-vs-binance-api) — the full comparison
* [`binance` API reference](/docs/exchanges/binance) — `binancecoinm` inherits it; it has no separate reference page
* [Install CCXT](/docs/install)
* [Manual](/docs/manual)
* [More comparisons](/docs/comparisons)
# CCXT vs the Binance.US API (/docs/comparisons/ccxt-vs-binanceus-api)
`binanceus` is a regional entity of Binance — the separate US entity of Binance, operated under US regulation with its own domain, its own listings and its own API host.
Because it shares an API dialect with Binance, CCXT implements it by extending its `binance` class. Everything in the [CCXT vs the Binance API](/docs/comparisons/ccxt-vs-binance-api) comparison applies here — this page covers only what is specific to `binanceus`.
## What is different [#what-is-different]
A different venue with a different market list, not a flag on the main exchange. Accounts and API keys are not shared with binance.com, and the traded pairs are a subset. CCXT ships it as its own id for exactly that reason — `ccxt.binance()` credentials will not work against it.
> The instrument list is materially smaller than binance.com, so code that hardcodes a symbol available on the global venue may not find it here. Call `load_markets()` and check.
## What CCXT gives you here [#what-ccxt-gives-you-here]
| | `binanceus` |
| --------------------------------- | ------------------------------------------------------------ |
| Unified capabilities | 103 (inherited from `binance` plus its own overrides) |
| `fetch*` methods | 50 |
| WebSocket `watch*` methods | 24 |
| Raw endpoints as implicit methods | 860 |
| Testnet via `setSandboxMode` | no |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust |
| Licence | MIT |
Figures verified September 2026 against CCXT v4.5.78, read from the source tree with `build/comparisons-facts.cjs`. Counts include everything inherited from `binance`.
## Using it [#using-it]
The class name is the only thing that changes — every unified method behaves as it does everywhere else in CCXT:
Python
TypeScript
```python
import ccxt
exchange = ccxt.binanceus({'apiKey': '...', 'secret': '...'})
markets = exchange.load_markets()
ticker = exchange.fetch_ticker(list(markets)[0])
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.binanceus ({ apiKey: '...', secret: '...' });
const markets = await exchange.loadMarkets ();
const ticker = await exchange.fetchTicker (Object.keys (markets)[0]);
```
Because `binanceus` lists a different market set from `binance`, call `load_markets()` and pick symbols from it rather than assuming a pair exists.
Streaming works the same way:
```python
import ccxt.pro, asyncio
async def main():
exchange = ccxt.pro.binanceus()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
## Should you use this class or the parent? [#should-you-use-this-class-or-the-parent]
Use `binanceus` when you hold an account with Binance.US specifically. Use [`binance`](/docs/exchanges/binance) when you hold an account with the global venue. They are different venues with separate credentials, so this is not a preference — it follows from where your account is.
## FAQ [#faq]
**Do my `binance` API keys work with `binanceus`?**
No. It is a separate legal entity with separate accounts; you need keys issued by Binance.US.
**Does `binanceus` support the full unified API?**
It inherits 103 unified capabilities from `binance`. Where the venue does not offer a feature, the corresponding `has` flag is turned off, and the method raises `NotSupported` rather than failing quietly. Check `exchange.has` at runtime.
**Can I reach Binance.US-specific endpoints?**
Yes — all 860 endpoints in this class's `api` block are generated as implicit methods, with signing, rate limiting and error mapping applied. The mechanism is documented on the [`binance` implicit API page](/docs/exchanges/binance/implicit-api); this venue's own endpoint list differs slightly from the parent's.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [CCXT vs the Binance API](/docs/comparisons/ccxt-vs-binance-api) — the full comparison
* [`binance` API reference](/docs/exchanges/binance) — `binanceus` inherits it; it has no separate reference page
* [Install CCXT](/docs/install)
* [Manual](/docs/manual)
* [More comparisons](/docs/comparisons)
# CCXT vs the Binance USDⓈ-M Futures API (/docs/comparisons/ccxt-vs-binanceusdm-api)
`binanceusdm` is a product line of Binance — Binance's USD-margined perpetual and delivery futures, exposed as its own CCXT class.
Because it shares an API dialect with Binance, CCXT implements it by extending its `binance` class. Everything in the [CCXT vs the Binance API](/docs/comparisons/ccxt-vs-binance-api) comparison applies here — this page covers only what is specific to `binanceusdm`.
## What is different [#what-is-different]
Same exchange and same credentials as `binance`, different product line and different API host. You can reach the same markets through `ccxt.binance({"options": {"defaultType": "future"}})`; the dedicated class is the explicit form, useful when a process only ever trades USD-M futures.
> Symbols are linear swaps: `BTC/USDT:USDT`. Position, leverage and margin-mode methods apply here and not on the spot class.
## What CCXT gives you here [#what-ccxt-gives-you-here]
| | `binanceusdm` |
| --------------------------------- | ------------------------------------------------------------ |
| Unified capabilities | 153 (inherited from `binance` plus its own overrides) |
| `fetch*` methods | 79 |
| WebSocket `watch*` methods | 31 |
| Raw endpoints as implicit methods | 808 |
| Testnet via `setSandboxMode` | no |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust |
| Licence | MIT |
Figures verified September 2026 against CCXT v4.5.78, read from the source tree with `build/comparisons-facts.cjs`. Counts include everything inherited from `binance`.
## Using it [#using-it]
The class name is the only thing that changes — every unified method behaves as it does everywhere else in CCXT:
Python
TypeScript
```python
import ccxt
exchange = ccxt.binanceusdm({'apiKey': '...', 'secret': '...'})
markets = exchange.load_markets()
ticker = exchange.fetch_ticker(list(markets)[0])
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.binanceusdm ({ apiKey: '...', secret: '...' });
const markets = await exchange.loadMarkets ();
const ticker = await exchange.fetchTicker (Object.keys (markets)[0]);
```
Because `binanceusdm` lists a different market set from `binance`, call `load_markets()` and pick symbols from it rather than assuming a pair exists.
Streaming works the same way:
```python
import ccxt.pro, asyncio
async def main():
exchange = ccxt.pro.binanceusdm()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
## Should you use this class or the parent? [#should-you-use-this-class-or-the-parent]
Use `binanceusdm` when you hold an account with Binance USDⓈ-M Futures specifically. Use [`binance`](/docs/exchanges/binance) when you hold an account with the main venue and want its other product lines from one client. They are different hosts, so this is not a preference — it follows from where your account is.
## FAQ [#faq]
**Do my `binance` API keys work with `binanceusdm`?**
Yes — it is the same account and the same credentials, just a different product host.
**Does `binanceusdm` support the full unified API?**
It inherits 153 unified capabilities from `binance`. Where the venue does not offer a feature, the corresponding `has` flag is turned off, and the method raises `NotSupported` rather than failing quietly. Check `exchange.has` at runtime.
**Can I reach Binance USDⓈ-M Futures-specific endpoints?**
Yes — all 808 endpoints in this class's `api` block are generated as implicit methods, with signing, rate limiting and error mapping applied. The mechanism is documented on the [`binance` implicit API page](/docs/exchanges/binance/implicit-api); this venue's own endpoint list differs slightly from the parent's.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [CCXT vs the Binance API](/docs/comparisons/ccxt-vs-binance-api) — the full comparison
* [`binance` API reference](/docs/exchanges/binance) — `binanceusdm` inherits it; it has no separate reference page
* [Install CCXT](/docs/install)
* [Manual](/docs/manual)
* [More comparisons](/docs/comparisons)
# CCXT vs the BingX API (/docs/comparisons/ccxt-vs-bingx-api)
If you are integrating [BingX](https://bingx.com/), the first thing you notice is what is missing. The [BingX-API GitHub organisation](https://github.com/BingX-API) publishes documentation repositories — `docs`, `docs-v3`, `BingX-swap-api-doc`, `BingX-swap-api-v2-doc`, `BingX-spot-api-doc`, `BingX-comm-api-doc`, `BingX-Standard-Contract-doc` — plus a proof-of-reserves tool and an AI coding-assistant skill library. There is **no official client library in any language**.
What exists instead is a set of community SDKs of varying scope, and [CCXT](/docs/manual), where BingX is a **certified** integration. The question that decides between them: **do you want a BingX-shaped client, or do you want BingX to behave like the other venues you trade?**
## TL;DR [#tldr]
* **Write it yourself, or use a community SDK,** if BingX is your only venue, you are in Python or PHP, and you want method names that track BingX's own reference — including surfaces like TWAP and copy trading that CCXT exposes only as raw endpoints.
* **Pick CCXT** if you want spot, USDT-M perpetuals and BingX's other product lines behind one client with 84 unified capabilities, 12 streaming methods, demo trading behind one flag, and the same method names on 103 other venues.
* **Nothing is walled off.** All 188 BingX endpoints across eleven API sections are generated as implicit methods, signed and rate-limited.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw BingX API and community SDKs** |
| --------------------------------- | --------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (BingX is one of them) | BingX only |
| Official client library | n/a — CCXT is third-party by design | **none** — BingX publishes documentation repositories only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whichever community client exists, or whatever you write |
| Packages to install | **1** (`ccxt`) | one per language, from a different author each time |
| Product lines in one client | spot, USDT-M perpetuals, sub-accounts, wallet, copy trading — eleven API sections behind one object | you route each section yourself |
| Unified market data + trading API | yes — 84 capabilities on `bingx` | no — BingX's own payload shapes |
| WebSockets | yes — 12 `watch*` / `unWatch*` methods | varies by SDK |
| Raw endpoint access | yes — 188 endpoints as implicit methods | yes, it is all you have |
| Built-in rate limiter | yes, on by default (`rateLimit` 100 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus BingX error codes |
| Demo trading | `exchange.set_sandbox_mode(True)` swaps every host to `open-api-vst.bingx.com` | swap the base URL yourself |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | `bingx-python` (community) 19 stars · 234 PyPI installs/month; `ccxt/bingx-python` 16 stars · 2.7k PyPI installs/month for the `bingx` package |
| Licence | MIT | community SDKs vary; `bingx-python` is MIT |
| Support | Discord, Telegram, GitHub — usually same-day | BingX developer channels; each SDK's own issues |
Figures verified September 2026 against CCXT v4.5.78, the `BingX-API` GitHub organisation's repository listing, the `tigusigalpa/bingx-python` and `ccxt/bingx-python` repositories, and install counts from PyPI and npm.
## The same job, written both ways [#the-same-job-written-both-ways]
The community side below uses `bingx-python`, an unofficial MIT-licensed client that describes itself as covering "USDT-M and Coin-M perpetual futures, spot trading, copy trading, sub-accounts, WebSocket streaming" with 190+ methods.
### Fetch a price [#fetch-a-price]
CCXT
bingx-python (community)
```python
import ccxt
exchange = ccxt.bingx()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from bingx import BingXClient
client = BingXClient(
api_key="your_api_key",
api_secret="your_api_secret"
)
price = client.market().get_latest_price("BTC-USDT")
```
BingX uses `BTC-USDT` for both spot and perpetual symbols, which means the market id alone does not tell you which book you are on. CCXT resolves that into unified symbols — `'BTC/USDT'` for spot and `'BTC/USDT:USDT'` for the USDT-margined perpetual — and returns a [unified ticker structure](/docs/manual#ticker-structure) with the same keys on every venue.
### Place an order [#place-an-order]
CCXT
bingx-python (community)
```python
import ccxt
exchange = ccxt.bingx({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from bingx import BingXClient
client = BingXClient(api_key="your_api_key", api_secret="your_api_secret")
order = client.trade().create_order({
"symbol": "BTC-USDT",
"side": "BUY",
"type": "MARKET",
"quantity": 0.001
})
```
Both sign with HMAC-SHA256 over the sorted query string and an `X-BX-APIKEY` header. The difference is what happens around it: CCXT loads market metadata, rounds amount and price to BingX's tick and step, routes the call to the right one of eleven API sections, and returns a [unified order structure](/docs/manual#order-structure). Switching the same order to spot is one symbol change:
```python
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000) # spot
```
### Stream an order book [#stream-an-order-book]
CCXT
bingx-python (community)
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bingx()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT:USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from bingx.websocket import MarketDataStream
stream = MarketDataStream()
stream.connect()
stream.subscribe_depth("BTC-USDT", 20)
def on_message(data):
print(data)
stream.on_message(on_message)
stream.listen() # blocking
```
The SDK delivers **raw stream messages** to a callback. CCXT returns a **maintained book**: snapshot alignment, buffered updates during the snapshot fetch, gap detection and re-sync, reconnect and resubscribe, and a bounded cache. `unWatchOrderBook`, `unWatchTicker`, `unWatchTrades` and `unWatchOHLCV` tear a subscription down without dropping the socket.
Private streams are the sharper difference. BingX's user-data socket requires a **listen key** that you create and then refresh on a timer, or the stream stops delivering. The community SDK makes that explicit — you call `client.listen_key().generate()` and pass the key to the stream yourself. CCXT manages the whole lifecycle, refreshing the key every 59 minutes, inside ordinary method calls:
```python
exchange = ccxt.pro.bingx({'apiKey': '...', 'secret': '...'})
orders = await exchange.watch_orders()
```
A forgotten refresh is a stream that goes quiet without raising anything — the failure mode you find out about from a fill you did not see.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eleven API sections, one client [#eleven-api-sections-one-client]
BingX's API is not one surface. CCXT models `spot`, `swap`, `contract`, `fund`, `wallets`, `user`, `subAccount`, `account`, `copyTrading`, `cswap` and a general `api` section as separate routes inside a single exchange object, each with its own path prefix and, in some cases, its own content-type and signing encoding. From your side it is one instance and one set of method names.
That is also where the **188 implicit methods** live:
```python
# any raw BingX endpoint, camelCased from its path
symbols = exchange.spot_v1_public_get_common_symbols()
balance = exchange.fund_v1_private_get_account_balance()
```
Browse them on the [bingx implicit API page](/docs/exchanges/bingx/implicit-api).
### Demo trading without a second code path [#demo-trading-without-a-second-code-path]
BingX runs a virtual-money environment on a separate host. CCXT swaps every one of the eleven hosts in one call:
```python
exchange = ccxt.bingx({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # every host becomes open-api-vst.bingx.com
```
No constant swapping, no forked configuration, and the WebSocket URLs move with it.
### Eight languages, one API [#eight-languages-one-api]
There is no official BingX client in any language, so every language is either a community project or a from-scratch integration. CCXT is written once in TypeScript and transpiled, with identical method names and return structures:
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.bingx()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bingx ();
const ticker = await exchange.fetchTicker ('BTC/USDT:USDT');
```
```csharp
var exchange = new ccxt.bingx();
var ticker = await exchange.FetchTicker("BTC/USDT:USDT");
```
```go
exchange := ccxt.NewBingx(nil)
ticker, err := exchange.FetchTicker("BTC/USDT:USDT")
```
If you want a single-venue package rather than all of CCXT, the CCXT project also publishes [ccxt/bingx-python](https://github.com/ccxt/bingx-python) — MIT, generated from the same source, installed as `bingx` — so the choice of scope does not have to be a choice of maintainer.
### Derivatives features as unified methods [#derivatives-features-as-unified-methods]
BingX's perpetuals machinery is unified rather than raw: `fetch_positions`, `fetch_positions_history`, `fetch_position_mode`, `set_position_mode`, `set_leverage`, `set_margin_mode`, `set_margin`, `add_margin`, `reduce_margin`, `fetch_market_leverage_tiers`, `fetch_funding_rate`, `fetch_funding_rate_history`, `fetch_funding_history`, `fetch_open_interest`, `fetch_my_liquidations`, `close_position` and `close_all_positions`. Order entry covers trailing amount and percent orders, trigger, stop-loss, take-profit, reduce-only, batch `create_orders`, `edit_order` and `cancel_all_orders_after` — 84 capabilities in total.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT sets `rateLimit = 100` ms for `bingx` and applies per-endpoint weights from the exchange definition, with a token-bucket throttler on by default. You call methods in a loop; the library paces them. Hand-rolled, pacing plus correct back-off is application code you write and maintain, and the failure mode is a temporary ban rather than a clean error.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads BingX's symbol metadata and exposes tick size, step size and minimum notional through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding:
```python
amount = exchange.amount_to_precision('BTC/USDT:USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT:USDT', 61234.56789)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps BingX's numeric error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once instead of matching on a code and hoping it never moves.
## What the raw API and community SDKs do better [#what-the-raw-api-and-community-sdks-do-better]
An honest list, because these are real:
* **BingX's documentation is the authority, and raw calls match it exactly.** `symbol`, `positionSide`, `quantity`, `BTC-USDT` — when you are debugging against BingX's reference, raw JSON or a BingX-shaped SDK has no translation layer between you and it. CCXT's unified names are a deliberate abstraction and one more hop.
* **New BingX features appear in the docs first.** A brand-new BingX surface is documented before it is modelled as a unified CCXT method. CCXT's implicit API closes most of that gap on day one, but a *unified* wrapper can lag.
* **Product lines CCXT does not unify.** BingX's TWAP algorithmic orders, copy trading, standard contracts and sub-account management are reachable from CCXT only as implicit methods returning raw payloads. `bingx-python` wraps them as named services with typed methods — 13 copy-trading methods, 20 sub-account methods, 7 TWAP methods by its own count. If those are the bulk of your integration, the unified layer buys you less.
* **Coin-M perpetuals.** The community SDK documents dedicated Coin-M market, trade and listen-key services. CCXT's `bingx` class is built around spot and USDT-M perpetuals.
* **A much smaller dependency.** One signed `requests` call is a few lines. For a dashboard that reads one price, CCXT is more than you need.
If BingX is your only venue and TWAP, copy trading or sub-account provisioning is the centre of your integration, a BingX-specific client is the better primary dependency.
## Migrating from a raw BingX integration to CCXT [#migrating-from-a-raw-bingx-integration-to-ccxt]
| What you are doing | Raw BingX API | CCXT |
| ---------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| Symbols | `'BTC-USDT'` | `'BTC/USDT'` (spot), `'BTC/USDT:USDT'` (USDT-M perp) |
| Client | your own signed `requests` wrapper | `ccxt.bingx({'apiKey': ..., 'secret': ...})` |
| Auth | HMAC-SHA256 over sorted params, `X-BX-APIKEY` | handled |
| Symbols / contracts | `/openApi/spot/v1/common/symbols`, `/openApi/swap/v2/quote/contracts` | `load_markets()` |
| Ticker | `/openApi/spot/v1/ticker/24hr` | `fetch_ticker()` / `fetch_tickers()` |
| Depth | `/openApi/spot/v1/market/depth` | `fetch_order_book()` |
| Klines | `/openApi/spot/v1/market/kline` | `fetch_ohlcv()` |
| New order | trade order endpoint | `create_order()` / `create_orders()` |
| Edit order | trade order endpoint | `edit_order()` |
| Cancel | cancel endpoints | `cancel_order()` / `cancel_orders()` / `cancel_all_orders()` |
| Open orders | open-orders endpoint | `fetch_open_orders()` |
| Balance | `/openApi/fund/v1/account/balance` | `fetch_balance()` |
| Positions | positions endpoint | `fetch_positions()` / `fetch_position()` |
| Leverage / margin mode | leverage and margin-type endpoints | `set_leverage()` / `set_margin_mode()` |
| Funding rate | funding-rate endpoints | `fetch_funding_rate()` / `fetch_funding_rate_history()` |
| Transfers | transfer endpoints | `transfer()` / `fetch_transfers()` |
| Streams | your own socket plus listen-key refresh | `watch_*` on `ccxt.pro.bingx` |
| Demo trading | swap base URL to `open-api-vst` | `set_sandbox_mode(True)` |
| Anything not listed | native call | the same endpoint as an [implicit method](/docs/exchanges/bingx/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [bingx unified API reference](/docs/exchanges/bingx).
## FAQ [#faq]
**Is there an official BingX SDK?**
No. The BingX-API GitHub organisation publishes API documentation repositories, a proof-of-reserves tool and an AI coding-assistant skill library — not a client library. Every BingX SDK you will find is community-built. CCXT is third-party too, but it is a certified BingX integration maintained across 104 venues in eight languages.
**Does CCXT support BingX perpetual futures?**
Yes. `bingx` declares both spot and swap, with positions, leverage, margin mode, funding rates, leverage tiers, liquidations and trailing/trigger order types as unified methods — 84 capabilities in total.
**Does CCXT support BingX WebSockets?**
Yes. `ccxt.pro.bingx` implements 12 streaming methods — `watchTrades`, `watchOrderBook`, `watchOHLCV`, `watchTicker`, `watchOrders`, `watchMyTrades`, `watchBalance` and `watchPositions`, plus `unWatchOHLCV`, `unWatchOrderBook`, `unWatchTicker` and `unWatchTrades` — including the listen-key refresh that keeps the private stream alive.
**Can I use BingX demo trading with CCXT?**
Yes. `exchange.set_sandbox_mode(True)` swaps every REST and WebSocket host to BingX's VST environment at `open-api-vst.bingx.com`. Use demo keys; no other code changes.
**Can I still call BingX-specific endpoints?**
Yes — all 188 of them, across eleven API sections, as [implicit methods](/docs/exchanges/bingx/implicit-api), with signing, rate limiting and error mapping applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bingx unified API reference](/docs/exchanges/bingx)
* [bingx implicit API](/docs/exchanges/bingx/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the raw Bit2C API (/docs/comparisons/ccxt-vs-bit2c-api)
[Bit2C](https://www.bit2c.co.il) is an Israeli exchange trading crypto against the shekel. Its API is documented on a single page at [bit2c.co.il/home/api](https://www.bit2c.co.il/home/api), and it is small: public ticker, order book, order-book top and trades; private balance, orders, order history and account history; add and cancel orders; crypto and NIS withdrawals; plus merchant and broker endpoints.
What Bit2C does not publish is a client library. The wrappers that exist are individual community projects: [OferE/bit2c](https://github.com/OferE/bit2c) (Node.js, MIT, 5 stars, 46 commits), [Amitabitbul/Bit2c.co.il.API.Python](https://github.com/Amitabitbul/Bit2c.co.il.API.Python) (1 star, described by its own README as a fork of a Python 2 library made to work on Python 3), and [macdosi/Bit2C.ApiClient](https://github.com/macdosi/Bit2C.ApiClient) (C#, 0 stars, covering "most of the calls").
So the real comparison here is not CCXT against a vendor SDK. It is **CCXT against the HTTP client you were about to write**.
## TL;DR [#tldr]
* **Write it yourself** if you need one public endpoint, work in a language CCXT does not target, or the merchant and broker checkout endpoints are the point of your integration.
* **Pick CCXT** if you want HMAC-SHA512 signing, nonce handling, rate limiting, precision and typed errors already written and tested, with 12 unified capabilities and all 23 Bit2C endpoints exposed.
* **Bit2C has no WebSocket API**, and CCXT implements no `watch*` methods for it. If you need live data here, it is REST polling either way.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw Bit2C REST API** |
| --------------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------- |
| Exchanges covered | 104 (Bit2C is one of them) | Bit2C only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write it in |
| Packages to install | **1** (`ccxt`) | an HTTP client plus your own wrapper |
| First-party client library | n/a | **none** — only small community wrappers |
| Markets | `BTC/NIS`, `ETH/NIS`, `LTC/NIS`, `USDC/NIS` as unified symbols | `BtcNis`, `EthNis`, `LtcNis`, `UsdcNis` |
| Unified market data + trading API | yes — 12 capabilities on `bit2c` | no — raw JSON payloads |
| WebSockets | **no** — 0 `watch*` methods for `bit2c` | Bit2C's API documentation describes no WebSocket API |
| Raw endpoint access | yes — 23 endpoints as implicit methods | yes, it is all you have |
| Built-in rate limiter | yes, on by default (`rateLimit` 3000 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus Bit2C error strings |
| Testnet / sandbox | none — Bit2C publishes no sandbox | none |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** | `OferE/bit2c` 5 stars; the Python fork 1 star; the C# client 0 stars |
| Licence | MIT | n/a (`OferE/bit2c` is MIT) |
| Support | Discord, Telegram, GitHub — usually same-day | Bit2C support |
Figures verified September 2026 against CCXT v4.5.78, Bit2C's own API documentation page, and the `OferE/bit2c`, `Amitabitbul/Bit2c.co.il.API.Python` and `macdosi/Bit2C.ApiClient` repositories.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.bit2c()
ticker = exchange.fetch_ticker('BTC/NIS')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://bit2c.co.il/Exchanges/BtcNis/Ticker.json')
data = r.json()
# Bit2C's own keys: 'h' bid, 'l' ask, 'll' last, 'a' volume, 'av' average
print(data['ll'], data['a'])
```
The raw call is short, which is why people write it. What it does not give you is a [unified ticker structure](/docs/manual#ticker-structure): readable key names instead of Bit2C's abbreviations, milliseconds for timestamps, base volume separated from quote volume, and the same shape on the next exchange. Note also the `.json` suffix on the public path — CCXT appends it for you.
### Place a limit order [#place-a-limit-order]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.bit2c({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/NIS', 'limit', 'buy', 0.001, 250000)
print(order['id'], order['status'])
```
```python
import base64, hashlib, hmac, time, requests
from urllib.parse import urlencode
body = urlencode({
'nonce': int(time.time() * 1000), # must strictly increase
'Pair': 'BtcNis',
'Amount': 0.001,
'Price': 250000,
'Total': 0.001 * 250000, # required, and must match
'IsBid': True, # not 'side': 'buy'
})
signature = base64.b64encode(
hmac.new(API_SECRET.encode(), body.encode(), hashlib.sha512).digest()
).decode()
r = requests.post(
'https://bit2c.co.il/Order/AddOrder',
headers={'Content-Type': 'application/x-www-form-urlencoded',
'key': API_KEY, 'sign': signature},
data=body)
print(r.json())
```
Four details in that snippet are easy to get wrong and produce the same unhelpful rejection. Bit2C's documentation states that "All POST/GET data (param1=val1\¶m2=val2\&nonce=(number)) signed by a secret key according to HMAC-SHA512 method", so the signature covers the **exact urlencoded body** — reorder a field and it breaks. The nonce "must always be greater than the previous requests nonce value", which makes concurrent requests from two processes a real problem you have to solve. The order carries a redundant `Total` field that must equal amount times price. And the side is a boolean `IsBid`, not a string.
There is a fifth: a **market order is a different endpoint entirely** — `Order/AddOrderMarketPriceBuy` or `Order/AddOrderMarketPriceSell`, with no price or `IsBid` field. CCXT routes that for you from `create_order(symbol, 'market', side, amount)`.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Bit2C's API page does not publish a rate limit. That is the awkward case: with no documented number, a hand-rolled client either guesses or finds out the hard way. CCXT ships a deliberately conservative default — `rateLimit = 3000` ms, one request every three seconds — with a token-bucket throttler on by default, and it is one option to change if you learn you have more headroom:
```python
exchange = ccxt.bit2c({'enableRateLimit': True, 'rateLimit': 1000})
```
### The nonce problem, solved once [#the-nonce-problem-solved-once]
Bit2C requires a strictly increasing nonce per API key. CCXT generates one from the millisecond clock and lets you override the generator, so the same handling works for every other venue in your system that has the same requirement — and there are many. Getting this wrong is the classic symptom of two processes sharing one key and both failing intermittently.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Bit2C's responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. Matching on error strings from a Hebrew-market API and hoping the wording never changes is the alternative, and it does not survive adding a second venue.
### Precision and string math [#precision-and-string-math]
CCXT exposes `amount_to_precision`, `price_to_precision` and `cost_to_precision` for Bit2C's markets, backed by the `Precise` string-arithmetic class. Shekel prices for BTC run to six figures while amounts run to eight decimals, which is exactly the range where float rounding produces a `Total` that does not match `Amount × Price`:
```python
amount = exchange.amount_to_precision('BTC/NIS', 0.0012345678)
price = exchange.price_to_precision('BTC/NIS', 254321.987)
```
### Eight languages, one API [#eight-languages-one-api]
There is no maintained Bit2C client for Python, Go, Java or PHP, so in every one of those languages you would be starting from zero. CCXT is written once in TypeScript and transpiled, with identical method names and structures:
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.bit2c()
ticker = exchange.fetch_ticker('BTC/NIS')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bit2c ();
const ticker = await exchange.fetchTicker ('BTC/NIS');
```
```csharp
var exchange = new ccxt.bit2c();
var ticker = await exchange.FetchTicker("BTC/NIS");
```
```go
exchange := ccxt.NewBit2c(nil)
ticker, err := exchange.FetchTicker("BTC/NIS")
```
### Portability [#portability]
A NIS book is one leg of a trade, not the whole of it. In CCXT the exchange id is a variable, so pricing the other leg offshore is a configuration change rather than a second integration:
```python
import ccxt
print('bit2c', ccxt.bit2c().fetch_ticker('BTC/NIS')['last'])
for exchange_id in ['binance', 'kraken', 'okx']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Bit2C's API is small: **23 endpoints**, and CCXT generates every one of them as a callable implicit method with signing, nonce handling, rate limiting and error mapping applied:
```python
# any raw Bit2C endpoint, camelCased from its path
top = exchange.public_get_exchanges_pair_orderbook({'pair': 'BtcNis'})
```
Browse them on the [bit2c implicit API page](/docs/exchanges/bit2c/implicit-api).
## What hand-rolling the raw API does better [#what-hand-rolling-the-raw-api-does-better]
An honest list, because these are real:
* **The merchant and broker endpoints.** `Merchant/CreateCheckout`, `Payment/Send`, `Payment/Pay` and the broker coin-data calls are payment-processing features, not trading features. CCXT exposes them only as implicit methods returning raw payloads, and it will never model them as unified methods. If a Bit2C checkout flow is what you are building, the unified layer buys you nothing.
* **NIS deposits and withdrawals.** Bit2C's shekel funding rails are venue-specific by nature. CCXT covers `fetch_deposit_address`, but the fiat side is reachable only as raw endpoints.
* **A far smaller dependency.** One `requests` call against `Ticker.json` is three lines and no third-party library. For a script that prints the BTC/NIS price, CCXT is more than you need.
* **A faster default.** CCXT's 3-second throttle is deliberately conservative because Bit2C publishes no limit. A hand-rolled client that knows its own usage pattern can poll faster without thinking about it — though so can CCXT, with one option.
* **Field-for-field fidelity.** `IsBid`, `Total`, `BtcNis` — when you are reading Bit2C's single documentation page while debugging, raw JSON has no translation layer between you and it.
If Bit2C is your only venue, you are building a payments integration rather than a trading one, and you are comfortable owning the signing code, writing it directly is a defensible choice.
## Migrating from a raw Bit2C integration to CCXT [#migrating-from-a-raw-bit2c-integration-to-ccxt]
| What you are doing | Raw Bit2C API | CCXT |
| ------------------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| Symbols | `Pair: 'BtcNis'` | `'BTC/NIS'` |
| Client | your own signed `requests` wrapper | `ccxt.bit2c({'apiKey': ..., 'secret': ...})` |
| Auth | HMAC-SHA512 over the urlencoded body, `key` and `sign` headers | handled |
| Markets | hard-coded pair list | `load_markets()` |
| Ticker | `GET /Exchanges/{pair}/Ticker.json` | `fetch_ticker()` |
| Order book | `GET /Exchanges/{pair}/orderbook.json` | `fetch_order_book()` |
| Trades | `GET /Exchanges/{pair}/trades.json` | `fetch_trades()` |
| New limit order | `POST /Order/AddOrder` | `create_order()` |
| New market order | `POST /Order/AddOrderMarketPriceBuy` / `...Sell` | `create_order()` with `'market'` |
| Cancel order | `POST /Order/CancelOrder` | `cancel_order()` |
| Order by id | `GET /Order/GetById` | `fetch_order()` |
| Open orders | `GET /Order/MyOrders` | `fetch_open_orders()` |
| My trades | `GET /Order/OrderHistory` | `fetch_my_trades()` |
| Balance | `GET /Account/Balance/v2` | `fetch_balance()` |
| Deposit address | `POST /Funds/AddCoinFundsRequest` | `fetch_deposit_address()` |
| Trading fees | account balance payload | `fetch_trading_fees()` |
| Streams | none — Bit2C documents no WebSocket API | **not available in CCXT for `bit2c`** |
| Anything not listed | native call | the same endpoint as an [implicit method](/docs/exchanges/bit2c/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [bit2c unified API reference](/docs/exchanges/bit2c).
## FAQ [#faq]
**Is there an official Bit2C SDK?**
No. Bit2C documents its API on one page and publishes no client library. The wrappers that exist are small community projects — a Node.js module with 5 GitHub stars, a Python 3 fork of an older Python 2 library with 1 star, and a C# client with 0 stars. CCXT's Bit2C support is a normal `pip install ccxt` (or the equivalent in six other languages).
**Does CCXT support Bit2C WebSockets?**
No. `bit2c` has zero `watch*` methods, so there is no `ccxt.pro.bit2c`. Bit2C's own API documentation describes no WebSocket API either, so live data means REST polling regardless of which client you use — and CCXT's rate limiter is on by default while you do it.
**How does CCXT sign Bit2C requests?**
It builds the urlencoded parameter string with an incrementing `nonce`, signs it with HMAC-SHA512 using your secret, base64-encodes the result, and sends `key` and `sign` headers with `Content-Type: application/x-www-form-urlencoded`. You never write that code.
**Which markets does CCXT support on Bit2C?**
Four shekel pairs: `BTC/NIS`, `ETH/NIS`, `LTC/NIS` and `USDC/NIS`, whose Bit2C ids are `BtcNis`, `EthNis`, `LtcNis` and `UsdcNis`.
**Does Bit2C have a testnet?**
No sandbox environment is published, so `set_sandbox_mode(True)` has nothing to point at for `bit2c`. Test against CCXT's offline static fixtures and small live orders.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support for the 76 exchanges that have it.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bit2c unified API reference](/docs/exchanges/bit2c)
* [bit2c implicit API](/docs/exchanges/bit2c/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the bitbank API and pythonbitbankcc (/docs/comparisons/ccxt-vs-bitbank-api)
[bitbank](https://bitbank.cc/) is a Japanese exchange trading crypto against the yen, and it is unusually well served by its own tooling. The [bitbankinc](https://github.com/bitbankinc) GitHub organisation maintains [bitbank-api-docs](https://github.com/bitbankinc/bitbank-api-docs) — "Official Documentation for the bitbank.cc APIs and Streams", 126 stars — plus first-party clients in four languages: [python-bitbankcc](https://github.com/bitbankinc/python-bitbankcc) (66 stars, MIT), [node-bitbankcc](https://github.com/bitbankinc/node-bitbankcc) (TypeScript, 30 stars, MIT), [ruby\_bitbankcc](https://github.com/bitbankinc/ruby_bitbankcc) (9 stars) and [java-bitbankcc](https://github.com/bitbankinc/java-bitbankcc) (6 stars).
That is a real vendor SDK situation, not an absence. The question that decides between them: **is bitbank the only venue you will ever touch, and is one of those four languages yours?**
## TL;DR [#tldr]
* **Pick bitbank's own client** if bitbank is your only venue, you work in Python, Node, Ruby or Java, and you want method names that match bitbank's own reference — or you need its **real-time streams**, which CCXT does not implement for this exchange.
* **Pick CCXT** if you want bitbank's spot markets behind the same API you use everywhere else, in eight languages, with rate limiting, precision handling and typed errors included.
* **Be clear about the gap:** `bitbank` in CCXT has **zero** `watch*` methods. bitbank documents both public and private streams; if you need them, that is code you write, or a reason to use the vendor client.
## At a glance [#at-a-glance]
| | **CCXT** | **bitbank's official clients** |
| --------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (bitbank is one of them) | bitbank only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, Node/TypeScript, Ruby, Java — four separate codebases |
| Packages to install | **1** (`ccxt`) | one per language |
| Install route | `pip install ccxt`, `npm install ccxt`, and so on | `node-bitbankcc` is on npm; `python_bitbankcc`'s README recommends `pip install git+https://github.com/bitbankinc/python-bitbankcc@` |
| Documentation language | English | Japanese (with English code samples) |
| Unified market data + trading API | yes — 15 capabilities on `bitbank` | no — bitbank's own payload shapes |
| WebSockets / streams | **no** — 0 `watch*` methods for `bitbank` | bitbank documents `public-stream` and `private-stream`; `node-bitbankcc`'s README covers REST |
| Raw endpoint access | yes — 28 endpoints as implicit methods | yes, it is the whole product |
| Auth modes | `ACCESS-NONCE` | `ACCESS-NONCE` **and** `ACCESS-TIME-WINDOW` |
| Built-in rate limiter | yes, on by default (`rateLimit` 100 ms, per-endpoint weights) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | bitbank error codes |
| Testnet / sandbox | none — bitbank publishes no sandbox | none |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | `python-bitbankcc` 66 stars; `node-bitbankcc` 30 stars · 211 npm installs/month; `bitbank-api-docs` 126 stars |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues on each repository |
Figures verified September 2026 against CCXT v4.5.78, the `bitbankinc` GitHub organisation's repository listing, the `python-bitbankcc` README and `setup.py`, the `node-bitbankcc` README, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
python_bitbankcc
```python
import ccxt
exchange = ccxt.bitbank()
ticker = exchange.fetch_ticker('BTC/JPY')
print(ticker['last'], ticker['baseVolume'])
```
```python
import json
import python_bitbankcc
pub = python_bitbankcc.public()
value = pub.get_ticker('btc_jpy')
print(json.dumps(value))
```
bitbank's pair ids are lowercase and underscore-separated — `btc_jpy`, `eth_jpy`, `xrp_jpy`. CCXT maps them to unified symbols and returns a [unified ticker structure](/docs/manual#ticker-structure): the same keys, the same units, milliseconds for timestamps, and the same shape on the next exchange.
### Place a limit order [#place-a-limit-order]
CCXT
python_bitbankcc
```python
import ccxt
exchange = ccxt.bitbank({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/JPY', 'limit', 'buy', 0.0001, 131594)
print(order['id'], order['status'])
```
```python
import python_bitbankcc
prv = python_bitbankcc.private(API_KEY, API_SECRET, config={'auth_method': 'nonce'})
value = prv.order(
'btc_jpy', # pair
'131594', # price (None for a market order)
'0.0001', # amount
'buy', # side: buy | sell
'limit', # type: limit | market | stop | stop_limit
)
```
The vendor client's `order()` takes **positional arguments** in bitbank's own order, with prices and amounts as strings and further optional positional parameters after the type — `post_only`, `trigger_price`, and a margin position side. CCXT's `create_order(symbol, type, side, amount, price)` is the same signature you use on every other exchange, and returns a [unified order structure](/docs/manual#order-structure).
## Where the differences actually bite [#where-the-differences-actually-bite]
### Three hosts, one client [#three-hosts-one-client]
bitbank splits public market data onto `public.bitbank.cc` and private trading onto `api.bitbank.cc`, with a third route for the pair list. CCXT models those as separate base URLs inside one exchange object, so `fetch_ticker` and `create_order` are calls on the same instance and `load_markets()` pulls the pair list without you knowing there was a third host.
### Signing, done once [#signing-done-once]
CCXT signs bitbank requests with `ACCESS-KEY`, `ACCESS-NONCE` and `ACCESS-SIGNATURE`, where the signature is HMAC-SHA256 over the nonce concatenated with either the JSON body (POST) or the request path and query string (GET). That asymmetry between GET and POST is the part people get wrong on the first afternoon. You never write it.
### Rate limits with per-endpoint weights [#rate-limits-with-per-endpoint-weights]
CCXT sets `rateLimit = 100` ms for `bitbank` and carries per-endpoint weights taken from bitbank's own documented limits — the trading POST endpoints (`user/spot/order`, `user/spot/cancel_order`, `user/spot/orders_info`) are weighted more heavily than the read endpoints. The token-bucket throttler is on by default, so you write a loop and the library paces it.
### One error hierarchy [#one-error-hierarchy]
CCXT maps bitbank's numeric error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. One `except ccxt.InsufficientFunds` keeps working when the order goes to a different venue.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads bitbank's `spot/pairs` metadata and exposes tick size, step size and minimum order size through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class. JPY prices for BTC run to seven figures while amounts run to eight decimals — precisely the range where float rounding starts producing rejected orders:
```python
amount = exchange.amount_to_precision('BTC/JPY', 0.00012345678)
price = exchange.price_to_precision('BTC/JPY', 13159412.3456)
```
### Eight languages, one API [#eight-languages-one-api]
bitbank's own clients cover Python, Node/TypeScript, Ruby and Java. CCXT covers TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with **identical** method names and return structures, because it is one codebase transpiled rather than four codebases maintained in parallel:
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.bitbank()
ticker = exchange.fetch_ticker('BTC/JPY')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bitbank ();
const ticker = await exchange.fetchTicker ('BTC/JPY');
```
```csharp
var exchange = new ccxt.bitbank();
var ticker = await exchange.FetchTicker("BTC/JPY");
```
```go
exchange := ccxt.NewBitbank(nil)
ticker, err := exchange.FetchTicker("BTC/JPY")
```
If your execution service is Go, PHP or C#, there is no bitbank client for it at all.
### Portability [#portability]
A JPY book is one leg of a trade. In CCXT the exchange id is a variable, so pricing the other leg offshore is a configuration change rather than a second integration:
```python
import ccxt
print('bitbank', ccxt.bitbank().fetch_ticker('BTC/JPY')['last'])
for exchange_id in ['binance', 'kraken', 'okx']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
bitbank's API is compact: **28 endpoints**, and CCXT generates every one of them as a callable implicit method with signing, rate limiting and error mapping applied:
```python
# any raw bitbank endpoint, camelCased from its path
info = exchange.public_get_pair_circuit_break_info({'pair': 'btc_jpy'})
positions = exchange.private_get_user_margin_positions()
```
Browse them on the [bitbank implicit API page](/docs/exchanges/bitbank/implicit-api).
## What bitbank's own clients do better [#what-bitbanks-own-clients-do-better]
An honest list, because these are real:
* **The real-time streams.** This is the decisive one. bitbank's documentation repository includes `public-stream.md` and `private-stream.md`, and CCXT implements **zero** `watch*` methods for `bitbank`. If you want live ticker, depth or order updates from this venue over a socket, CCXT will not give them to you — that is code you write against bitbank's own stream documentation.
* **`ACCESS-TIME-WINDOW` authentication.** `python_bitbankcc` supports both auth modes: a nonce, or a request timestamp with a time window (`'auth_method': 'request_time', 'time_window': 5000`). CCXT uses the nonce mode only. The time-window mode is friendlier when several processes share one API key, because it removes the strictly-increasing-nonce constraint.
* **Margin positions.** `python_bitbankcc` exposes `get_margin_positions()` directly, and its `order()` accepts a margin position side. CCXT's `bitbank` class declares spot only; margin positions are reachable only as the raw `user/margin/positions` implicit endpoint.
* **Endpoints CCXT does not model as unified methods.** Circuit-break info, deposit confirmation (`user/confirm_deposits`), unconfirmed deposits and deposit originators are unified-API gaps that the vendor client wraps directly.
* **Field-for-field fidelity with the Japanese documentation.** `btc_jpy`, `post_only`, `1hour` candle types — bitbank's docs and its clients use the same names, which removes a translation step when you are debugging. CCXT's unified names are a deliberate abstraction and one more hop.
If bitbank is your only venue, you need its streams, or you rely on margin, its own client is the better dependency.
## Migrating from python\_bitbankcc to CCXT [#migrating-from-python_bitbankcc-to-ccxt]
| What you are doing | python\_bitbankcc | CCXT |
| ------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `'btc_jpy'` | `'BTC/JPY'` |
| Client | `python_bitbankcc.public()` + `.private(key, secret)` | one `ccxt.bitbank({'apiKey': ..., 'secret': ...})` |
| Pairs | `spot/pairs` | `load_markets()` |
| Ticker | `pub.get_ticker(pair)` | `fetch_ticker()` |
| Order book | `pub.get_depth(pair)` | `fetch_order_book()` |
| Trades | `pub.get_transactions(pair)` | `fetch_trades()` |
| Candles | `pub.get_candlestick(pair, '1hour', 'YYYYMMDD')` | `fetch_ohlcv()` |
| New order | `prv.order(pair, price, amount, side, type)` | `create_order()` |
| Cancel order | `prv.cancel_order(pair, order_id)` | `cancel_order()` |
| Order by id | `prv.get_order(pair, order_id)` | `fetch_order()` |
| Open orders | `prv.get_active_orders(pair)` | `fetch_open_orders()` |
| My trades | `prv.get_trade_history(pair, count)` | `fetch_my_trades()` |
| Balance | `prv.get_asset()` | `fetch_balance()` |
| Trading fees | asset payload | `fetch_trading_fees()` |
| Withdrawal address | `prv.get_withdrawal_account(asset)` | `fetch_deposit_address()` |
| Margin positions | `prv.get_margin_positions()` | raw `user/margin/positions` implicit method |
| Streams | bitbank's public and private stream docs | **not available in CCXT for `bitbank`** |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/bitbank/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [bitbank unified API reference](/docs/exchanges/bitbank).
## FAQ [#faq]
**Does CCXT support bitbank WebSockets?**
No. `bitbank` has zero `watch*` methods, so there is no `ccxt.pro.bitbank`. REST is fully covered — 15 unified capabilities and all 28 endpoints — but bitbank's documented public and private streams are not implemented. If streaming is a requirement, use bitbank's own stream documentation or one of its clients.
**Is there an official bitbank SDK?**
Yes, four of them — Python, Node/TypeScript, Ruby and Java, all under the `bitbankinc` GitHub organisation and all maintained. Note that `python_bitbankcc` is not distributed on PyPI: its README recommends installing from GitHub pinned to a commit hash. `node-bitbankcc` is on npm.
**How does CCXT authenticate with bitbank?**
It sends `ACCESS-KEY`, `ACCESS-NONCE` and `ACCESS-SIGNATURE`, where the signature is HMAC-SHA256 over the nonce plus the JSON body for POST requests, or the nonce plus the path and query string for GET requests. CCXT does not currently use bitbank's alternative `ACCESS-TIME-WINDOW` mode.
**Does CCXT cover bitbank margin trading?**
Not as unified methods. `bitbank` declares spot only. The `user/margin/positions` endpoint is reachable as an implicit method returning bitbank's raw payload.
**Does bitbank have a testnet?**
No sandbox environment is published, so `set_sandbox_mode(True)` has nothing to point at for `bitbank`. Test against CCXT's offline static fixtures and small live orders.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support for the 76 exchanges that have it.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitbank unified API reference](/docs/exchanges/bitbank)
* [bitbank implicit API](/docs/exchanges/bitbank/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the Bitbns API and official Bitbns SDKs (/docs/comparisons/ccxt-vs-bitbns-api)
Bitbns, the Indian exchange, publishes official clients under the [bitbns-official](https://github.com/bitbns-official) GitHub organisation: [bitbnspy](https://github.com/bitbns-official/bitbnspy) for Python and [node-bitbns-api](https://github.com/bitbns-official/node-bitbns-api) for Node.js. [CCXT](/docs/manual) implements the same REST API behind method names shared with 103 other venues.
The question that decides between them is narrower here than usual, because both sides have a real gap: **do you need live streaming, or do you need portability?**
## TL;DR [#tldr]
* **Pick the official Bitbns SDKs** if Bitbns is your only venue and you want live order book and ticker streams — `bitbnspy` has Socket.IO-based feeds and CCXT's `bitbns` has no WebSocket support at all.
* **Pick CCXT** if you want unified symbols, one error hierarchy and the same 17 capabilities expressed the way every other exchange expresses them, in eight languages.
* **Nothing is hidden.** All 36 Bitbns endpoints CCXT models are callable as [implicit methods](/docs/exchanges/bitbns/implicit-api), signed and rate-limited.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Bitbns SDKs** |
| --------------------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Bitbns is one of them) | Bitbns only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python (`bitbnspy`), Node.js (`bitbns`) |
| Packages to install | 1 (`ccxt`) | one per language |
| Unified market data + trading API | yes — same names on every exchange | no — Bitbns's own method and payload shapes |
| Unified capabilities | 17 | n/a — endpoint wrappers |
| Symbols | `'BTC/INR'`, `'BTC/USDT'` | bare coin tickers: `'BTC'`, `'XRPUSDT'` |
| WebSockets | **no** — `bitbns` has no `watch*` methods | yes — `getOrderBookSocket`, `getTickerSocket` in `bitbnspy` |
| Raw endpoint access | yes — 36 endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 1000 ms) | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Bitbns `status` / `error` fields in the payload |
| Testnet / sandbox | not available for `bitbns` | not offered |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `bitbnspy` 8 stars · 628 PyPI installs/month; `bitbns` on npm 527 installs/month |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the bitbns-official repositories, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch tickers [#fetch-tickers]
CCXT
bitbnspy
```python
import ccxt
exchange = ccxt.bitbns()
ticker = exchange.fetch_ticker('BTC/INR')
print(ticker['last'], ticker['baseVolume'])
```
```python
from bitbnspy import bitbns
bitbnsObj = bitbns.publicEndpoints()
print(bitbnsObj.fetchTickers())
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) for one unified symbol. The SDK returns Bitbns's payload for everything at once, and you index into it by coin name.
### Place a limit order [#place-a-limit-order]
CCXT
bitbnspy
```python
import ccxt
exchange = ccxt.bitbns({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('XRP/INR', 'limit', 'buy', 200, 25)
print(order['id'], order['status'])
```
```python
from bitbnspy import bitbns
key = 'yourKey'
secretKey = 'yourSecretKey'
bitbnsObj = bitbns(key, secretKey)
bitbnsObj.placeBuyOrder('XRP', 200, 25)
```
Two differences worth noticing. The SDK has a separate method per side — `placeBuyOrder` and `placeSellOrder` — where CCXT takes `'buy'` / `'sell'` as an argument, so a strategy that flips direction does not branch on the method name. And the SDK's `'XRP'` is a coin, not a market: which quote currency you get depends on the endpoint you happened to call.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Symbols are markets, not coins [#symbols-are-markets-not-coins]
Bitbns addresses INR markets by the bare coin ticker (`BTC`) and USDT markets by a concatenation (`XRPUSDT`). CCXT resolves both into ordinary unified symbols — `'BTC/INR'`, `'XRP/USDT'` — with `base`, `quote`, precision and limits attached to each market. Call `load_markets()` and you get the venue's real market list rather than a coin list you have to pair up yourself.
### The INR and USDT endpoint split [#the-inr-and-usdt-endpoint-split]
This is the Bitbns-specific trap. Several operations use **different endpoint names depending on the quote currency**: cancelling an order on an INR market and cancelling one on a USDT market are different paths, and so is listing open orders. Hand-rolled code ends up carrying an `if quote == 'USDT'` branch in every trading function. CCXT keeps the branch in one place — it reads the market's quote currency and picks the endpoint — so `cancel_order(id, 'BTC/INR')` and `cancel_order(id, 'XRP/USDT')` are the same call.
### Signing [#signing]
Private Bitbns requests carry three headers: `X-BITBNS-APIKEY`, `X-BITBNS-PAYLOAD` — a base64 encoding of the JSON body including a timestamp — and `X-BITBNS-SIGNATURE`, an **HMAC-SHA512** over that base64 string. You sign the encoded bytes, so key ordering inside the JSON matters. CCXT implements it once, in the base class, for all eight languages.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT ships a token-bucket throttler that is **on by default** (`enableRateLimit = true`, `rateLimit = 1000` ms for Bitbns) and maps rate-limit responses onto `RateLimitExceeded`. Bitbns's own archived endpoint documentation does not publish a numeric limit, which makes a conservative client-side pacer more useful, not less.
### One error hierarchy [#one-error-hierarchy]
Bitbns answers with a `status` field and an `error` string rather than HTTP status codes alone. CCXT translates those onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded`, `NetworkError` and 35 more, all under `BaseError` — so `except ccxt.InsufficientFunds` is the same line of code here and on the next exchange.
### Eight languages, one API [#eight-languages-one-api]
TypeScript
Python
PHP
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bitbns ();
const ticker = await exchange.fetchTicker ('BTC/INR');
```
```python
import ccxt
exchange = ccxt.bitbns()
ticker = exchange.fetch_ticker('BTC/INR')
```
```php
$exchange = new \ccxt\bitbns();
$ticker = $exchange->fetch_ticker('BTC/INR');
```
Bitbns publishes Python and Node clients. CCXT gives you the same API in eight languages from one source of truth, so a Python research script and a Go execution service share a data model.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
```python
# any raw Bitbns endpoint, camelCased from its path
status = exchange.v1_get_platform_status()
```
All 36 endpoints CCXT models are reachable this way, with the `X-BITBNS-*` signature, rate-limit accounting and error mapping applied. Browse them on the [bitbns implicit API page](/docs/exchanges/bitbns/implicit-api).
## What the official Bitbns SDKs do better [#what-the-official-bitbns-sdks-do-better]
These are real, and the first one is the big one:
* **They stream and CCXT does not.** `bitbnspy` exposes `getOrderBookSocket(coinName, marketName)` and `getTickerSocket(marketName)` as Socket.IO event feeds. CCXT has **no** `watch*` methods for Bitbns — if you need a live book or live ticks from this venue, the official SDK is the only one of the two that offers them.
* **Bitbns-specific products are wrapped.** The Python SDK covers ground CCXT does not model as unified methods, including margin, swap and futures endpoints and Bitbns's FIP subscription calls.
* **Names match the API one-for-one.** `placeBuyOrder`, `getSellOrderBook`, `currentCoinBalance` — you can read Bitbns's endpoint list and type the call, with no unified-symbol translation in between.
* **A Node client exists as a first-party package.** `bitbns` on npm is published by the exchange; if your service is Node-only and Bitbns is your only venue, that is a smaller dependency than CCXT.
If Bitbns is your only venue and you need live streams, use the official SDK — or use both, with the SDK for the socket feeds and CCXT for order entry and account state.
## Migrating from a Bitbns SDK to CCXT [#migrating-from-a-bitbns-sdk-to-ccxt]
| What you are doing | Bitbns SDK | CCXT |
| ---------------------- | -------------------------------------------- | ------------------------------------------------------------------------------ |
| Symbols | `'BTC'`, `'XRPUSDT'` | `'BTC/INR'`, `'XRP/USDT'` |
| Market list | ticker payload keys | `load_markets()` |
| Ticker | `fetchTickers()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `getBuyOrderBook()` / `getSellOrderBook()` | `fetch_order_book()` |
| Buy | `placeBuyOrder()` | `create_order(symbol, 'limit', 'buy', ...)` |
| Sell | `placeSellOrder()` | `create_order(symbol, 'limit', 'sell', ...)` |
| Stop-loss | stop-loss buy/sell methods | `create_order(..., params={'triggerPrice': ...})` |
| Cancel | cancel-order method (INR / USDT variants) | `cancel_order()` |
| Open orders | `listOpenOrders()` | `fetch_open_orders()` |
| Order status | order-status method | `fetch_order()` |
| Balance | `currentCoinBalance()` | `fetch_balance()` |
| My trades | trade-history method | `fetch_my_trades()` |
| Deposit address | `getCoinAddress()` | `fetch_deposit_address()` |
| Deposits / withdrawals | history methods | `fetch_deposits()` / `fetch_withdrawals()` |
| Streams | `getOrderBookSocket()` / `getTickerSocket()` | not available in CCXT for `bitbns` |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/bitbns/implicit-api) |
## FAQ [#faq]
**Does CCXT support Bitbns WebSockets?**
No. CCXT's `bitbns` class implements REST only — there are no `watch*` methods for this venue. CCXT Pro covers 76 of the 104 supported exchanges; Bitbns is not one of them. For live streams from Bitbns today, use the official `bitbnspy` socket helpers.
**How do Bitbns INR and USDT markets work in CCXT?**
Both are ordinary unified symbols — `'BTC/INR'` and `'BTC/USDT'`. CCXT reads the quote currency from the market and routes to the correct endpoint, which differs between INR and USDT pairs on several operations. You never write that branch yourself.
**Does `setSandboxMode` work for Bitbns?**
No. CCXT's `bitbns` class does not declare sandbox URLs, so test with small orders on a low-balance key instead.
**Which Bitbns Python package is current?**
The `bitbnspy` repository is the one Bitbns points at; the older `python-bitbns-api` README says to use Bitbnspy instead. `bitbnspy` is MIT-licensed, and its most recent PyPI release, 0.3.1, was published in July 2022.
**Can I still call Bitbns-specific endpoints from CCXT?**
Yes — all 36 endpoints CCXT models are available as [implicit methods](/docs/exchanges/bitbns/implicit-api), with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitbns unified API reference](/docs/exchanges/bitbns)
* [bitbns implicit API](/docs/exchanges/bitbns/implicit-api) — every raw endpoint
* [Supported exchanges](/docs/exchange-markets)
* [More comparisons](/docs/comparisons)
# CCXT vs the Bitfinex API and official Bitfinex SDKs (/docs/comparisons/ccxt-vs-bitfinex-api)
Bitfinex maintains its own open-source connectors — [bitfinex-api-py](https://github.com/bitfinexcom/bitfinex-api-py), [bitfinex-api-node](https://github.com/bitfinexcom/bitfinex-api-node) and Go, Ruby and PHP siblings listed on its [open source libraries page](https://docs.bitfinex.com/docs/open-source-libraries). [CCXT](/docs/manual) speaks the same v2 REST and WebSocket API, but behind method names shared with 103 other venues.
Both work. The question that decides between them: **is Bitfinex the only venue your code will ever talk to?**
## TL;DR [#tldr]
* **Pick the official Bitfinex SDKs** if Bitfinex is your only venue and you want typed models named exactly the way Bitfinex's own reference names them — `Notification[Order]`, `TradingPairTicker`, `tBTCUSD`.
* **Pick CCXT** if you want one dependency covering Bitfinex spot, margin and perpetuals, in eight languages, with the same method names you will use on the next exchange.
* **Choosing CCXT does not hide the venue.** All 136 Bitfinex endpoints CCXT knows about are callable as [implicit methods](/docs/exchanges/bitfinex/implicit-api), signed and rate-limited.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Bitfinex SDKs** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Bitfinex is one of them) | Bitfinex only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, Node.js, Go, Ruby, PHP — separate repositories, coverage varies |
| Packages to install | 1 (`ccxt`) | one per language |
| Unified market data + trading API | yes — same names on every exchange | no — Bitfinex's own request/response shapes |
| Response format | named unified structures | Python SDK maps arrays to dataclasses; raw v2 returns positional arrays |
| Bitfinex products in one client | spot, margin, perpetual swaps | one client, Bitfinex-shaped endpoints |
| WebSockets | yes — 11 `watch*` / `unWatch*` methods | yes, event/callback based |
| Raw endpoint access | yes — 136 endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP + Bitfinex error payloads |
| Testnet / sandbox | not available for `bitfinex` | not offered |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `bitfinex-api-py` 219 stars · 2.2k PyPI installs/month; `bitfinex-api-node` 479 stars · 13.1k npm installs/month |
| Licence | MIT | `bitfinex-api-py` Apache-2.0; `bitfinex-api-node` MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the Bitfinex connector repositories and documentation, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
bitfinex-api-py
```python
import ccxt
exchange = ccxt.bitfinex()
ticker = exchange.fetch_ticker('BTC/USD')
print(ticker['last'], ticker['baseVolume'])
```
```python
from bfxapi import Client, REST_HOST
bfx = Client(rest_host=REST_HOST)
ticker = bfx.rest.public.get_t_ticker("tBTCUSD")
print(ticker.last_price, ticker.volume)
```
The SDK does real work here that raw HTTP does not. Bitfinex's v2 REST returns **positional arrays with no field names** — `GET /v2/ticker/tBTCUSD` answers with a bare eleven-element list, and index 6 is the last price only because the docs say so. The Python SDK maps that onto a `TradingPairTicker` dataclass; CCXT maps it onto the [unified ticker structure](/docs/manual#ticker-structure) whose keys are identical on Kraken, OKX and every other venue.
### Place a limit order [#place-a-limit-order]
CCXT
bitfinex-api-py
```python
import ccxt
exchange = ccxt.bitfinex({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USD', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from bfxapi import Client, REST_HOST
from bfxapi.types import Notification, Order
bfx = Client(rest_host=REST_HOST, api_key="...", api_secret="...")
notification: Notification[Order] = bfx.rest.auth.submit_order(
type="EXCHANGE LIMIT", symbol="tBTCUSD", amount=0.165212, price=30264.0)
order: Order = notification.data
```
Note the two Bitfinex-specific things the SDK asks you to carry: the order type string carries the account (`EXCHANGE LIMIT` for the exchange wallet, `LIMIT` for margin), and the side is encoded in the *sign* of `amount`. CCXT takes `'buy'` / `'sell'` and a positive amount, and picks the wallet from the market type.
### Stream an order book [#stream-an-order-book]
CCXT
bitfinex-api-py
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bitfinex()
while True:
orderbook = await exchange.watch_order_book('BTC/USD')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from bfxapi import Client, PUB_WSS_HOST
bfx = Client(wss_host=PUB_WSS_HOST)
@bfx.wss.on("open")
async def on_open():
await bfx.wss.subscribe("ticker", symbol="tBTCUSD")
@bfx.wss.on("candles_update")
def on_candles_update(sub, candle):
print(f"Candle update: {candle}")
bfx.wss.run()
```
Two different programming models. CCXT is pull-shaped: `await` a method, get a merged, depth-limited order book back, and decide in the same function. The SDK is push-shaped: register handlers and hand control to `wss.run()`. Underneath, CCXT also does the book maintenance — applying Bitfinex's channel updates into a live book, reconnecting and resubscribing after a drop, and keeping the cache bounded rather than growing forever.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Named fields instead of array indices [#named-fields-instead-of-array-indices]
This is the single biggest day-to-day difference on Bitfinex specifically. Every v2 endpoint answers with positional arrays, and the position of a field changes between endpoints — a trade array is not laid out like a ticker array, and an authenticated order array is longer again. CCXT parses each of them into the same named structures (`order['id']`, `order['filled']`, `trade['fee']['cost']`) so a field never moves when you change endpoint or exchange.
### Spot, margin and derivatives in one client [#spot-margin-and-derivatives-in-one-client]
CCXT's `bitfinex` class declares `spot`, `margin` and `swap` support and 61 unified capabilities, including `fetchPositions`, `fetchFundingRates`, `fetchFundingRateHistory`, `fetchOpenInterest`, `fetchLiquidations`, `setMargin` and `createTrailingAmountOrder`. Derivative ids like `tBTCF0:USTF0` become the unified symbol `'BTC/USDT:USDT'`, so the same `create_order` call works on spot and on the perpetual.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Bitfinex documents its rate limit as varying per endpoint, "in the range of 10 to 90 requests per minute". CCXT encodes those per-endpoint costs against a `rateLimit` of 250 ms and ships a token-bucket throttler that is **on by default** (`enableRateLimit = true`). You call methods in a loop; the library paces them. Rolling your own means tracking a different budget per path.
### Signing, nonces and the parts that go wrong at 3am [#signing-nonces-and-the-parts-that-go-wrong-at-3am]
Private Bitfinex requests are signed with `bfx-apikey`, `bfx-nonce` and `bfx-signature`, where the signature is an HMAC-SHA384 over the path, nonce and body. Nonces must increase monotonically per key, which is exactly the thing that breaks when two processes share one key. CCXT implements the scheme and the nonce discipline once, in the base class, for every language.
### Eight languages, one API [#eight-languages-one-api]
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bitfinex ();
const ticker = await exchange.fetchTicker ('BTC/USD');
```
```python
import ccxt
exchange = ccxt.bitfinex()
ticker = exchange.fetch_ticker('BTC/USD')
```
```go
exchange := ccxt.NewBitfinex(nil)
ticker, err := exchange.FetchTicker("BTC/USD")
```
Bitfinex publishes connectors in five languages too, but they are five codebases with five sets of idioms and five release schedules — not one API expressed eight ways.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Bitfinex's error payloads onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError` and 35 more, all under `BaseError`. `except ccxt.InsufficientFunds` keeps working when you add a second venue.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 61 unified capabilities, all 136 Bitfinex endpoints CCXT models are callable directly:
```python
# any raw Bitfinex endpoint, camelCased from its path
status = exchange.public_get_platform_status()
```
Signing, rate-limit accounting and error mapping still apply. Browse them on the [bitfinex implicit API page](/docs/exchanges/bitfinex/implicit-api).
## What the official Bitfinex SDKs do better [#what-the-official-bitfinex-sdks-do-better]
An honest list:
* **Literal fidelity to the Bitfinex reference.** `submit_order`, `get_t_ticker`, `tBTCUSD`, `fUSD` — the SDK names match the docs you are reading. CCXT's unified names are a deliberate abstraction, which is one extra hop when you are debugging against Bitfinex's own reference.
* **Typed Bitfinex-shaped models with mypy support.** `bitfinex-api-py` ships dataclasses and generics such as `Notification[Order]`, and documents an optional typing extra. CCXT gives you typed *unified* structures instead — better for portability, less literal about Bitfinex's payloads.
* **Funding-market coverage is first class.** Bitfinex's lending/funding book (`f`-prefixed symbols, `get_f_ticker`, `get_f_book`, funding offers) is a Bitfinex-specific product with a direct SDK surface. In CCXT you reach it through implicit methods rather than a unified funding-market API.
* **New Bitfinex features land there first.** A brand-new endpoint usually appears in Bitfinex's own connector before it is modelled as a unified CCXT method. CCXT's implicit API closes most of that gap on day one, but the *unified* wrapper can lag.
If Bitfinex is your only venue and you want your code to read like the Bitfinex reference, the official SDKs are a defensible choice.
## Migrating from a Bitfinex SDK to CCXT [#migrating-from-a-bitfinex-sdk-to-ccxt]
| What you are doing | Bitfinex SDK | CCXT |
| ------------------- | ------------------------------- | -------------------------------------------------------------------------------- |
| Symbols | `'tBTCUSD'`, `'tBTCF0:USTF0'` | `'BTC/USD'`, `'BTC/USDT:USDT'` |
| Order side | sign of `amount` | `'buy'` / `'sell'` |
| Wallet selection | `'EXCHANGE LIMIT'` vs `'LIMIT'` | market type + unified params |
| Ticker | `get_t_ticker()` | `fetch_ticker()` |
| Order book | `get_t_book()` | `fetch_order_book()` |
| Candles | `get_candles_hist()` | `fetch_ohlcv()` |
| New order | `submit_order()` | `create_order()` |
| Cancel order | cancel-order endpoint | `cancel_order()` |
| Open orders | active-orders endpoint | `fetch_open_orders()` |
| Balance | wallets endpoint | `fetch_balance()` |
| Streams | `wss.subscribe()` + handlers | `watch_*` on `ccxt.pro.bitfinex` |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/bitfinex/implicit-api) |
## FAQ [#faq]
**Does CCXT support Bitfinex derivatives and margin?**
Yes. The `bitfinex` class declares spot, margin and swap support, with `fetch_positions`, `fetch_funding_rates`, `fetch_funding_rate_history`, `fetch_open_interest`, `fetch_liquidations` and `set_margin` among its 61 unified capabilities. Perpetuals use unified symbols like `'BTC/USDT:USDT'`.
**How do I deal with Bitfinex's array responses in CCXT?**
You do not — that is the point. CCXT parses the positional arrays into named unified structures before you see them. If you want the raw array anyway, every parsed structure keeps it under the `info` key.
**Does Bitfinex have a testnet I can use through CCXT?**
Not through `setSandboxMode`. CCXT's `bitfinex` class does not declare sandbox URLs, so test against small live orders on a low-balance key instead.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.bitfinex` and call `watch*` methods — 11 of them are implemented for Bitfinex, including `watch_order_book`, `watch_trades`, `watch_ohlcv`, `watch_orders`, `watch_my_trades` and `watch_balance`.
**Can I still call Bitfinex-specific endpoints from CCXT?**
Yes — 136 of them, as [implicit methods](/docs/exchanges/bitfinex/implicit-api), with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitfinex unified API reference](/docs/exchanges/bitfinex)
* [bitfinex implicit API](/docs/exchanges/bitfinex/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the bitFlyer API (/docs/comparisons/ccxt-vs-bitflyer-api)
bitFlyer's [Lightning API documentation](https://lightning.bitflyer.com/docs?lang=en) is thorough — base endpoint, signature scheme, product codes and rate limits are all spelled out — but it lists **no official client libraries**. So the honest comparison here is not CCXT against a vendor SDK. It is CCXT against the HTTP client you would otherwise write yourself.
The question that decides between them: **how much of that plumbing do you want to own?**
## TL;DR [#tldr]
* **Write it yourself** if you need one or two endpoints, want zero dependencies, or need bitFlyer's Realtime API — which CCXT does not currently wrap.
* **Pick CCXT** if you want signing, per-request pacing, unified symbols for `FX_BTC_JPY` and the expiring futures, typed errors and precision handling that already work, in eight languages.
* **Be aware of the gap.** CCXT's `bitflyer` class is REST-only: it has **no** `watch*` methods, so live streaming from bitFlyer is not something CCXT does today.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw bitFlyer Lightning API** |
| --------------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------- |
| Exchanges covered | 104 (bitFlyer is one of them) | bitFlyer only |
| Official client library | n/a | none listed in bitFlyer's documentation |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write |
| Unified market data + trading API | yes — 16 capabilities, same names on every exchange | raw JSON from `/v1/...` |
| Symbols | `'BTC/JPY'`, `'BTC/JPY:JPY'`, `'BTC/JPY:JPY-YYMMDD'` | product codes: `BTC_JPY`, `FX_BTC_JPY`, `BTCJPY11MAR2022` |
| Regional market lists | handled — `getmarkets`, `getmarkets/usa`, `getmarkets/eu` | you pick the endpoint per region |
| Request signing | built in — `ACCESS-KEY` / `ACCESS-TIMESTAMP` / `ACCESS-SIGN`, HMAC-SHA256 | your code |
| Raw endpoint access | yes — 35 endpoints as implicit methods | yes, by definition |
| Built-in rate limiter | yes, on by default (`rateLimit` 1000 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + bitFlyer error payloads |
| WebSockets | **no** — `bitflyer` has no `watch*` methods | yes — Socket.IO 2.0 and JSON-RPC 2.0 over WebSocket |
| Testnet / sandbox | not available for `bitflyer` | not offered |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month | n/a |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub issues — usually same-day | bitFlyer support |
Figures verified September 2026 against CCXT v4.5.78 and bitFlyer's published Lightning API and Realtime API documentation.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bitflyer()
ticker = exchange.fetch_ticker('BTC/JPY')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://api.bitflyer.com/v1/getticker',
params={'product_code': 'BTC_JPY'})
data = r.json()
print(data['ltp'], data['volume_by_product'])
```
Two things the raw version leaves to you. The last traded price is `ltp`, not `last`. And there are two volume fields — `volume` and `volume_by_product` — where only the second is the base-asset volume for that product; CCXT maps that one to `baseVolume` so the number means the same thing here as on Binance or Kraken.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bitflyer({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/JPY', 'limit', 'buy', 0.001, 12000000)
print(order['id'], order['status'])
```
```python
import hashlib, hmac, json, time, requests
timestamp = str(int(time.time()))
method, path = 'POST', '/v1/me/sendchildorder'
body = json.dumps({'product_code': 'BTC_JPY', 'child_order_type': 'LIMIT',
'side': 'BUY', 'price': 12000000, 'size': 0.001})
sign = hmac.new(b'YOUR_SECRET',
(timestamp + method + path + body).encode(),
hashlib.sha256).hexdigest()
r = requests.post('https://api.bitflyer.com' + path, data=body, headers={
'ACCESS-KEY': 'YOUR_KEY',
'ACCESS-TIMESTAMP': timestamp,
'ACCESS-SIGN': sign,
'Content-Type': 'application/json',
})
print(r.json())
```
That is the whole signing scheme: HMAC-SHA256 over the timestamp, HTTP method, path and body concatenated. It is not hard — it is just something you now own in every language your stack uses, along with the part where the body you sign must be byte-identical to the body you send.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Product codes are not symbols [#product-codes-are-not-symbols]
bitFlyer's product codes carry the product type in the string. `BTC_JPY` is spot. `FX_BTC_JPY` is the perpetual. `BTCJPY11MAR2022` is an expiring future, and it may also carry an alias like `BTCJPY_MAT1WK` meaning "the contract maturing in one week", which points at a different contract every week.
CCXT reads bitFlyer's `market_type` field and the alias, parses the expiry out of the code, and produces stable unified symbols:
| bitFlyer product code | `market_type` | CCXT symbol |
| --------------------- | ------------- | -------------------- |
| `BTC_JPY` | `Spot` | `BTC/JPY` |
| `ETH_BTC` | `Spot` | `ETH/BTC` |
| `FX_BTC_JPY` | `FX` | `BTC/JPY:JPY` |
| `BTCJPY11MAR2022` | `Futures` | `BTC/JPY:JPY-220311` |
Code that subscribes to "the weekly future" no longer has to re-resolve an alias by hand every Friday.
### Three regional market lists [#three-regional-market-lists]
bitFlyer runs Japanese, US and EU entities, and the market list differs: `getmarkets`, `getmarkets/usa` and `getmarkets/eu` are three endpoints. CCXT's `bitflyer` class knows about all three, so `load_markets()` returns the right set and every later call uses ids from it.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
bitFlyer publishes several limits at once: roughly 500 queries per 5 minutes per IP for the public API, 500 per 5 minutes for private API calls, a tighter 300 per 5 minutes on the order-placement and cancellation endpoints, and a separate cap of 100 placements per minute for orders of 0.1 or smaller. Modelling four overlapping budgets is exactly the kind of code that gets written once, badly, and then quietly throttles you in production.
CCXT ships a token-bucket throttler that is **on by default** (`enableRateLimit = true`, `rateLimit = 1000` ms for bitFlyer) and maps rate-limit responses onto `RateLimitExceeded`.
### Precision and string math [#precision-and-string-math]
bitFlyer rejects orders that violate a product's size or price step. CCXT loads the market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so a quantity never drifts through float rounding into a rejection:
```python
amount = exchange.amount_to_precision('BTC/JPY', 0.0012345678)
price = exchange.price_to_precision('BTC/JPY', 12345678.9)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps bitFlyer's error payloads onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all under `BaseError`. Raw HTTP gives you a status code and a JSON body whose shape you match on with string comparisons.
### Derivatives and collateral are covered [#derivatives-and-collateral-are-covered]
Among the 16 capabilities CCXT implements for bitFlyer: `fetch_positions`, `fetch_funding_rate`, `fetch_trading_fee`, `fetch_my_trades`, `fetch_orders`, `fetch_deposits` and `fetch_withdrawals`. The FX and futures products have their own collateral endpoints on bitFlyer's side; CCXT's unified `fetch_balance` and `fetch_positions` cover the common ground with the same signatures they have on every other derivatives venue.
### Eight languages, one API [#eight-languages-one-api]
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bitflyer ();
const ticker = await exchange.fetchTicker ('BTC/JPY');
```
```python
import ccxt
exchange = ccxt.bitflyer()
ticker = exchange.fetch_ticker('BTC/JPY')
```
```go
exchange := ccxt.NewBitflyer(nil)
ticker, err := exchange.FetchTicker("BTC/JPY")
```
A hand-rolled bitFlyer client is written once per language. CCXT is written once and transpiled to eight, so the signing code and the alias parsing are the same code everywhere.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
```python
# any raw bitFlyer endpoint, camelCased from its path
health = exchange.public_get_gethealth()
```
All 35 endpoints CCXT models are reachable this way, with `ACCESS-KEY` / `ACCESS-TIMESTAMP` / `ACCESS-SIGN` signing, rate-limit accounting and error mapping applied. Browse them on the [bitflyer implicit API page](/docs/exchanges/bitflyer/implicit-api).
## What the raw bitFlyer API does better [#what-the-raw-bitflyer-api-does-better]
Honest, and the first one matters:
* **The Realtime API.** bitFlyer publishes a streaming API supporting Socket.IO 2.0 and JSON-RPC 2.0 over WebSocket, with public and private channels. CCXT's `bitflyer` class has **no** `watch*` methods, so if you need live ticks, executions or board updates from bitFlyer, going direct is the only option of the two.
* **Endpoints CCXT does not model as unified methods.** Chat, board state, collateral history and the exchange-health endpoints are all in the Lightning API. CCXT reaches them through implicit methods, but there is no unified wrapper with a stable cross-exchange shape.
* **Zero dependencies.** The signature is four concatenated strings and an HMAC. If your program calls two endpoints, a hand-written client is a few dozen lines and no supply chain.
* **The documentation is the contract.** Reading bitFlyer's reference and writing the request yourself means no translation layer between what the docs say and what your process sends — useful when you are debugging a rejected order.
If you need bitFlyer streaming, or you only need a couple of endpoints, going direct is the right call.
## Migrating from raw bitFlyer HTTP to CCXT [#migrating-from-raw-bitflyer-http-to-ccxt]
| What you are doing | bitFlyer Lightning API | CCXT |
| ------------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Symbols | `product_code=BTC_JPY` | `'BTC/JPY'` |
| Perpetual | `product_code=FX_BTC_JPY` | `'BTC/JPY:JPY'` |
| Markets | `GET /v1/getmarkets` | `load_markets()` |
| Ticker | `GET /v1/getticker` | `fetch_ticker()` |
| Order book | `GET /v1/getboard` | `fetch_order_book()` |
| Public trades | `GET /v1/getexecutions` | `fetch_trades()` |
| Funding rate | `GET /v1/getfundingrate` | `fetch_funding_rate()` |
| New order | `POST /v1/me/sendchildorder` | `create_order()` |
| Cancel order | `POST /v1/me/cancelchildorder` | `cancel_order()` |
| Open orders | `GET /v1/me/getchildorders` | `fetch_orders()` |
| Balance | `GET /v1/me/getbalance` | `fetch_balance()` |
| Positions | `GET /v1/me/getpositions` | `fetch_positions()` |
| My trades | `GET /v1/me/getexecutions` | `fetch_my_trades()` |
| Trading fee | `GET /v1/me/gettradingcommission` | `fetch_trading_fee()` |
| Signing | `ACCESS-KEY` / `ACCESS-TIMESTAMP` / `ACCESS-SIGN` by hand | automatic |
| Streams | Realtime API | not available in CCXT for `bitflyer` |
| Anything not listed | the endpoint | the same endpoint as an [implicit method](/docs/exchanges/bitflyer/implicit-api) |
## FAQ [#faq]
**Does bitFlyer have an official SDK?**
Its Lightning API documentation does not list one. Several third-party wrappers exist on GitHub in various languages, but they are community projects rather than exchange-published clients — which is why this page compares CCXT with the raw API instead.
**Does CCXT support bitFlyer WebSockets?**
No. CCXT's `bitflyer` class is REST-only and has no `watch*` methods. CCXT Pro covers 76 of the 104 supported exchanges; bitFlyer is not currently one of them. bitFlyer's own Realtime API supports Socket.IO 2.0 and JSON-RPC 2.0 over WebSocket if you need streaming.
**How does CCXT name bitFlyer's FX and futures products?**
`FX_BTC_JPY` becomes the unified swap symbol `'BTC/JPY:JPY'`, and an expiring contract such as `BTCJPY11MAR2022` becomes `'BTC/JPY:JPY-220311'`. CCXT parses the expiry from the product code — and from the `_MAT1WK`-style alias when one is present — so you do not track it by hand.
**Does `setSandboxMode` work for bitFlyer?**
No. CCXT's `bitflyer` class does not declare sandbox URLs, so test with the smallest permitted order size on a low-balance key instead.
**Can I still call bitFlyer-specific endpoints from CCXT?**
Yes — all 35 endpoints CCXT models are available as [implicit methods](/docs/exchanges/bitflyer/implicit-api), with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitflyer unified API reference](/docs/exchanges/bitflyer)
* [bitflyer implicit API](/docs/exchanges/bitflyer/implicit-api) — every raw endpoint
* [Supported exchanges](/docs/exchange-markets)
* [More comparisons](/docs/comparisons)
# CCXT vs the Bitget API and the official Bitget SDK (/docs/comparisons/ccxt-vs-bitget-api)
Bitget publishes its client libraries in one repository, [`BitgetLimited/v3-bitget-api-sdk`](https://github.com/BitgetLimited/v3-bitget-api-sdk), with separate SDKs for Java, Python, Node, Go and PHP. The Python one is not on PyPI: its README tells you to download the `bitget-python-sdk-api` directory, then `pip install requests` and `pip install websocket-client`. Underneath, much of it is a signed HTTP client — you call `baseApi.get(path, params)` with the literal endpoint path.
[CCXT](/docs/manual) offers the same reach with a different shape: every Bitget endpoint as a named method with signing and rate limiting attached, plus a unified trading API shared with 103 other exchanges.
The question that decides between them: **do you want a signed HTTP client for one venue, or a trading API that happens to include this venue?**
## TL;DR [#tldr]
* **Pick the official Bitget SDK** if Bitget is your only venue, you want request payloads that mirror Bitget's docs literally — `productType: "umcbl"`, `symbol: "BTCUSDT_UMCBL"` — and you are comfortable vendoring the directory into your project.
* **Pick CCXT** if you want spot, margin and futures behind one client, in any of eight languages, with the order book, rate limiter, precision handling and error types already written.
* **Raw access is not what you trade away.** CCXT generates **637** Bitget endpoints as implicit methods, so choosing it does not cut you off from anything Bitget publishes.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Bitget SDK** |
| --------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Bitget is one of them) | Bitget only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Java, Python, Node, Go, PHP — separate SDKs in one repository |
| Install (Python) | `pip install ccxt` | copy the `bitget-python-sdk-api` directory, then `pip install requests websocket-client` |
| Unified market data + trading API | yes — 94 unified capabilities, 47 `fetch*` methods | no — Bitget's own paths, params and payloads |
| Products in one client | spot, margin, USDT-M, coin-M and USDC-M futures | product type is a parameter you pass (`umcbl`, `dmcbl`, …) |
| WebSockets | yes — 12 `watch*`/`unWatch*` methods, same shapes as `fetch*` | yes — `BitgetWsClient` with `SubscribeReq` channels and callbacks |
| Raw endpoint access | yes — **637** Bitget endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 50 ms) | manual |
| Unified error types | yes — 41 typed exceptions in one hierarchy | `BitgetAPIException` with Bitget's message |
| Demo trading | `exchange.set_sandbox_mode(True)` — sends Bitget's demo-trading header | not documented in the SDK README |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 286 GitHub stars for the SDK repository; its Python SDK installs from the repository, not from PyPI |
| Licence | MIT | no licence declared on the repository |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues, Telegram link in the README |
Figures verified September 2026 against CCXT v4.5.78, the `BitgetLimited/v3-bitget-api-sdk` repository with its Python README and examples, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch market data [#fetch-market-data]
CCXT
bitget-python-sdk-api
```python
import ccxt
exchange = ccxt.bitget()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
import bitget.bitget_api as baseApi
from bitget.exceptions import BitgetAPIException
baseApi = baseApi.BitgetApi(apiKey, secretKey, passphrase)
try:
params = {"productType": "umcbl"}
response = baseApi.get("/api/mix/v1/market/contracts", params)
print(response)
except BitgetAPIException as e:
print(e.message)
```
That is the shape of the official Python SDK for most calls: you pass the endpoint path and Bitget's own parameter names, and you parse Bitget's response yourself. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) with the same keys and units as every other venue, and takes a unified symbol rather than `BTCUSDT_UMCBL`.
### Place a limit order [#place-a-limit-order]
CCXT
bitget-python-sdk-api
```python
import ccxt
exchange = ccxt.bitget({
'apiKey': '...', 'secret': '...', 'password': '...',
})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.01, 27012)
print(order['id'], order['status'])
exchange.cancel_order(order['id'], 'BTC/USDT:USDT')
```
```python
import bitget.v1.mix.order_api as maxOrderApi
maxOrderApi = maxOrderApi.OrderApi(apiKey, secretKey, passphrase)
params = {
"symbol": "BTCUSDT_UMCBL",
"marginCoin": "USDT",
"side": "open_long",
"orderType": "limit",
"price": "27012",
"size": "0.01",
}
response = maxOrderApi.placeOrder(params)
```
`side: "open_long"` is Bitget's position-opening vocabulary, and the symbol carries the product suffix. CCXT expresses the same order as `'buy'` on `'BTC/USDT:USDT'` and returns a [unified order structure](/docs/manual#order-structure) with `id`, `status`, `filled` and `average` in the places every other exchange puts them. Switching the same code to spot is a symbol change to `'BTC/USDT'`.
### Stream a ticker [#stream-a-ticker]
CCXT
bitget-python-sdk-api
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bitget()
while True:
ticker = await exchange.watch_ticker('BTC/USDT:USDT')
print(ticker['symbol'], ticker['last'])
asyncio.run(main())
```
```python
from bitget.ws.bitget_ws_client import BitgetWsClient, SubscribeReq
from bitget import consts as c
def handle(message):
print("handle:" + message)
client = BitgetWsClient(c.CONTRACT_WS_URL, need_login=True) \
.api_key(api_key) \
.api_secret_key(secret_key) \
.passphrase(passphrase) \
.build()
channles = [SubscribeReq("mc", "ticker", "BTCUSD")]
client.subscribe(channles, handle)
```
The SDK hands your callback the raw message string. CCXT's `watch_ticker` returns the same structure as `fetch_ticker`, so replacing a polling loop with a stream is a one-word change and nothing downstream is touched. The same holds for `watch_order_book`, which maintains a merged, depth-limited book across reconnects rather than handing you deltas.
## Where the differences actually bite [#where-the-differences-actually-bite]
### 637 endpoints, named and rate-limited [#637-endpoints-named-and-rate-limited]
Bitget has an unusually large API surface, and CCXT generates **all 637 of its endpoints** as callable implicit methods:
```python
response = exchange.public_mix_get_v2_mix_market_tickers({'productType': 'USDT-FUTURES'})
```
The difference from `baseApi.get(path, params)` is not reach — both reach everything — it is what comes with the call. Implicit methods carry the endpoint's rate-limit weight, the signing scheme, timestamping and error mapping, and they are enumerated on the [bitget implicit API page](/docs/exchanges/bitget/implicit-api) instead of living in the docs you happen to have open.
### Spot, margin and futures from one client [#spot-margin-and-futures-from-one-client]
`ccxt.bitget` declares `spot`, `margin`, `swap` and `future` true, and the unified symbol picks the product — no `productType`, no `_UMCBL` suffix, no separate client:
```python
exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000) # spot
exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.01, 60000) # USDT-M perpetual
exchange.create_order('BTC/USD:BTC', 'limit', 'buy', 1, 60000) # coin-M contract
```
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, so method names, arguments and return structures are identical in all of them.
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bitget ();
const ticker = await exchange.fetchTicker ('BTC/USDT:USDT');
```
```python
import ccxt
exchange = ccxt.bitget()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
```
```go
exchange := ccxt.NewBitget(nil)
ticker, err := exchange.FetchTicker("BTC/USDT:USDT")
```
Bitget's repository also holds five language SDKs, but they are five codebases with five sets of names and idioms — not one API expressed eight ways.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Bitget meters per endpoint. CCXT encodes those costs in the exchange definition and ships a token-bucket throttler that is **on by default** (`enableRateLimit = true`, base `rateLimit` 50 ms). You call methods in a loop and the library paces them; with a raw HTTP client, backing off correctly is your code.
### Precision, rounding and string math [#precision-rounding-and-string-math]
Bitget rejects orders that violate its tick size, size increment or minimum notional. CCXT loads the market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities never drift through float rounding.
```python
amount = exchange.amount_to_precision('BTC/USDT:USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT:USDT', 61234.56789)
```
### One error hierarchy [#one-error-hierarchy]
`BitgetAPIException` carries Bitget's message, and matching on it means matching on Bitget's codes and strings. CCXT maps them onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError` and 35 more under one `BaseError` — so `except ccxt.InsufficientFunds` keeps working on the next venue too.
### Demo trading with one flag [#demo-trading-with-one-flag]
Bitget has no separate testnet host; it has a demo-trading mode selected by a request header. CCXT wires that to the standard switch:
```python
exchange = ccxt.bitget({'apiKey': '...', 'secret': '...', 'password': '...'})
exchange.set_sandbox_mode(True) # sends Bitget's demo-trading header
```
`enable_demo_trading(True)` is an alias for the same thing. Note this is Bitget's demo account, not a separate network — use demo API keys with it.
## What the official Bitget SDK does better [#what-the-official-bitget-sdk-does-better]
Real advantages, and they are not small:
* **A brand-new endpoint works immediately.** `baseApi.get("/api/v2/common/trade-rate", params)` takes a literal path, so an endpoint published this morning is callable this morning. CCXT's implicit methods come from a declared endpoint list, so a brand-new path waits for a release.
* **One-to-one with the Bitget docs.** Product types, position-side vocabulary and margin-coin fields are passed exactly as documented. CCXT's unified names are a deliberate abstraction, which is one extra hop when you are debugging against the vendor reference.
* **New Bitget features land there first.** When Bitget ships a new product line, the vendor's own SDK reflects it before a *unified* CCXT wrapper does.
* **A very small dependency footprint.** The Python SDK needs `requests` and `websocket-client` and nothing else; all of CCXT is a larger install if Bitget is all you need.
* **Java and Node clients from the vendor.** If you want the exchange's own code in those languages, with Bitget's Telegram channel behind it, the repository has them.
If Bitget is your only venue and you would rather write against its documented paths directly than against a unified abstraction, the official SDK is a defensible choice.
## Two Bitget SDKs, and how they relate [#two-bitget-sdks-and-how-they-relate]
Searching PyPI for Bitget is confusing, so here is the short version. Bitget's own Python SDK is distributed as a directory in its repository, which you vendor into your project. The `bitget` package on PyPI is CCXT's own single-exchange distribution, [`ccxt/bitget-python`](https://github.com/ccxt/bitget-python), MIT-licensed and built from the same source as `ccxt.bitget`:
```bash
pip install bitget
```
```python
from bitget import BitgetSync
instance = BitgetSync({})
ob = instance.fetch_order_book("BTC/USDT")
```
It exposes `BitgetSync`, `BitgetAsync` and `BitgetWs` — the unified methods, the implicit endpoints and the WebSocket support, without the other 103 exchanges. It is the same code, packaged narrower, so moving to full `ccxt` later is an import change rather than a rewrite.
## Migrating from the Bitget SDK to CCXT [#migrating-from-the-bitget-sdk-to-ccxt]
| What you are doing | Bitget SDK | CCXT |
| ------------------- | --------------------------------------------- | ------------------------------------------------------------------------------ |
| Symbols | `'BTCUSDT'` spot, `'BTCUSDT_UMCBL'` futures | `'BTC/USDT'` spot, `'BTC/USDT:USDT'` perpetual |
| Product selection | `productType` param and symbol suffix | the unified symbol, or `options.defaultType` |
| Credentials | `BitgetApi(apiKey, secretKey, passphrase)` | `ccxt.bitget({'apiKey': …, 'secret': …, 'password': …})` |
| Contract list | `get("/api/mix/v1/market/contracts", …)` | `load_markets()` |
| Ticker | market endpoint by path | `fetch_ticker()` / `fetch_tickers()` |
| Order book | depth endpoint by path | `fetch_order_book()` |
| Candles | candles endpoint by path | `fetch_ohlcv()` |
| New order | `OrderApi.placeOrder(params)` | `create_order()` |
| Cancel order | cancel endpoint by path | `cancel_order()` |
| Balance | `get("/api/spot/v1/account/getInfo", {})` | `fetch_balance()` |
| Streams | `BitgetWsClient` + `SubscribeReq` + callbacks | `watch_*` on `ccxt.pro.bitget` |
| Anything not listed | the path | the same endpoint as an [implicit method](/docs/exchanges/bitget/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [bitget unified API reference](/docs/exchanges/bitget).
## FAQ [#faq]
**How do I install Bitget's official Python SDK?**
By copying it. Its README distributes the SDK as the `bitget-python-sdk-api` directory inside `BitgetLimited/v3-bitget-api-sdk`, which you place in your project alongside `pip install requests` and `pip install websocket-client`. The `bitget` package on PyPI is a different thing: CCXT's single-exchange build of `ccxt.bitget`, under MIT.
**Does CCXT support Bitget futures and demo trading?**
Yes to both. USDT-M, coin-M and USDC-M contracts are unified symbols on the same `ccxt.bitget` instance, and `exchange.set_sandbox_mode(True)` switches the client into Bitget's demo-trading mode by sending the header Bitget expects.
**Can I still call Bitget-specific endpoints through CCXT?**
Yes — all 637 of them, as [implicit methods](/docs/exchanges/bitget/implicit-api), with signing, timestamping and rate limiting applied.
**Is CCXT slower than calling the Bitget API directly?**
CCXT adds parsing and normalisation on top of the same HTTP and WebSocket calls, so there is a small constant overhead per message. Network round-trip time dominates it for anything short of latency-critical market making.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.bitget` and the `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitget unified API reference](/docs/exchanges/bitget)
* [bitget implicit API](/docs/exchanges/bitget/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Bithumb API (/docs/comparisons/ccxt-vs-bithumb-api)
Bithumb, Korea's long-running won-denominated exchange, documents its API thoroughly at [apidocs.bithumb.com](https://apidocs.bithumb.com) — in Korean — and ships **no client library**. Its own "development environment setup" guide walks you through installing `PyJWT` and `requests` in Python, or `jsonwebtoken`, `uuid` and `axios` in Node, and then building the signed request yourself.
So the comparison here is not CCXT against a vendor SDK. It is CCXT against the client you would otherwise write.
## TL;DR [#tldr]
* **Write it yourself** if you need one or two endpoints, want zero dependencies, and are comfortable reading Korean-language reference docs.
* **Pick CCXT** if you want unified symbols, signing, per-request pacing, typed errors and WebSocket streaming that already work, in eight languages, with the same method names you will use on the next exchange.
* **CCXT does not hide the venue.** All 67 Bithumb endpoints it models are callable as [implicit methods](/docs/exchanges/bithumb/implicit-api), signed and rate-limited.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw Bithumb API** |
| --------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------ |
| Exchanges covered | 104 (Bithumb is one of them) | Bithumb only |
| Official client library | n/a | none — the docs point you at generic JWT and HTTP libraries |
| Documentation language | English | Korean |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write |
| Unified market data + trading API | yes — 37 capabilities, same names on every exchange | raw JSON |
| Symbols | `'BTC/KRW'` | `BTC_KRW`, `KRW-BTC` depending on the API generation |
| Request signing | built in | your code — JWT (HS256) with a UUID nonce and a SHA-512 query hash |
| Error handling | 41 typed exceptions in one hierarchy | HTTP 200 with a numeric `status` string and a Korean message |
| WebSockets | yes — 6 `watch*` methods | yes, public and private channels |
| Raw endpoint access | yes — 67 endpoints as implicit methods | yes, by definition |
| Built-in rate limiter | yes, on by default (`rateLimit` 8.334 ms) | your code |
| Testnet / sandbox | not available for `bithumb` | not offered |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month | n/a |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub issues — usually same-day | Bithumb developer support |
Figures verified September 2026 against CCXT v4.5.78 and Bithumb's published developer documentation, including its authentication, rate-limit and WebSocket reference pages.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bithumb()
ticker = exchange.fetch_ticker('BTC/KRW')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://api.bithumb.com/public/ticker/BTC_KRW')
payload = r.json()
if payload['status'] != '0000':
raise RuntimeError(payload['message'])
print(payload['data']['closing_price'], payload['data']['units_traded_24H'])
```
Note what the raw version has to do. Everything is a **string**, the last price lives in `data.closing_price`, and the request either succeeded or it did not — you find out from `status`, not from the HTTP code. A request for a coin that is not listed returns **HTTP 200** with `{"status":"5500","message":"상장 코인이 아닙니다."}`. If your error handling keys on `raise_for_status()`, it will never fire.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bithumb({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/KRW', 'limit', 'buy', 0.001, 100000000)
print(order['id'], order['status'])
```
```python
import hashlib, jwt, requests, time, uuid
from urllib.parse import urlencode
body = {'market': 'KRW-BTC', 'side': 'bid', 'order_type': 'limit',
'price': '100000000', 'volume': '0.001'}
query = urlencode(body)
payload = {
'access_key': 'YOUR_KEY',
'nonce': str(uuid.uuid4()),
'timestamp': round(time.time() * 1000),
'query_hash': hashlib.sha512(query.encode('utf-8')).hexdigest(),
'query_hash_alg': 'SHA512',
}
token = jwt.encode(payload, 'YOUR_SECRET')
r = requests.post('https://api.bithumb.com/v2/orders', json=body, headers={
'Authorization': 'Bearer ' + token,
'Content-Type': 'application/json; charset=utf-8',
})
print(r.json())
```
That is the documented scheme: a JWT carrying the access key, a per-request UUID nonce, a millisecond timestamp, and — whenever the request has parameters — a SHA-512 hash of those parameters *urlencoded into a query string*, plus the literal `query_hash_alg: "SHA512"`. That last part catches people out: the body you POST is JSON, but the string you hash is the urlencoded form of it. Every field is required, and a mismatch produces an authentication error that does not say which part was wrong.
### Stream an order book [#stream-an-order-book]
CCXT
Raw WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bithumb()
while True:
orderbook = await exchange.watch_order_book('BTC/KRW')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import asyncio, json, websockets
async def main():
url = "wss://ws-api.bithumb.com/websocket/v1"
async with websockets.connect(url) as ws:
await ws.send(json.dumps([
{"ticket": "example"},
{"type": "orderbook", "codes": ["KRW-BTC"]},
]))
while True:
print(json.loads(await ws.recv()))
asyncio.run(main())
```
The raw subscription is easy. What is not easy is everything after it: reconnecting when the socket drops, resending the ticket and subscription on reconnect, keeping the book bounded rather than letting it grow, and converting Bithumb's `KRW-BTC` codes back into whatever your system calls that market. `watch_order_book` returns the [unified order book structure](/docs/manual#order-book-structure), the same one `fetch_order_book` returns, and handles the rest.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Two API generations, one class [#two-api-generations-one-class]
Bithumb's public surface has grown in layers: the older `/public/...` endpoints use `BTC_KRW`-style pairs, while the newer `/v1/...` endpoints use `KRW-BTC` market codes and the JWT authentication above. Which naming convention a given endpoint wants is a detail you carry in your head when you write the client yourself. In CCXT the symbol is always `'BTC/KRW'`, and the class maps it to whatever the endpoint expects.
### Private WebSocket auth is a JWT too [#private-websocket-auth-is-a-jwt-too]
Bithumb's private streams — order and asset events — authenticate with the same JWT scheme, delivered as an `Authorization: Bearer` header on the socket handshake. CCXT builds it for you: `watch_orders()` and `watch_balance()` mint the token, including the UUID nonce, and reconnect with a fresh one.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Bithumb meters **by IP and by API category**, not per endpoint, so calls in the same category share a budget. Its documentation sets public categories — candles, order book, ticker, trades and everything else — at 150 requests per second each, private categories at 140 per second each, and bulk order creation and cancellation at 20 per second. Mapping your call sites onto those categories is real work.
CCXT ships a token-bucket throttler that is **on by default** (`enableRateLimit = true`, `rateLimit = 8.334` ms for Bithumb) and maps rate-limit responses onto `RateLimitExceeded`, so a naive loop does not walk into a ban.
### Errors that arrive as HTTP 200 [#errors-that-arrive-as-http-200]
This is the failure mode most likely to reach production. Bithumb returns a `status` string — `"0000"` for success, `"5500"` and friends for failures — inside an HTTP 200 response, with a human-readable message in Korean. CCXT inspects that field and raises from a [typed exception tree](/docs/manual#error-handling): `AuthenticationError`, `PermissionDenied`, `InvalidAddress`, `BadRequest`, `ExchangeNotAvailable`, `InsufficientFunds`, `InvalidOrder` and 34 more, all under `BaseError`. Your `except` clauses read the same as they do on every other venue, and they do not depend on matching a Korean string.
### Precision and string math [#precision-and-string-math]
Bithumb prices are large numbers in KRW and sizes are small decimals, and every value in its responses arrives as a string. CCXT loads the market metadata and gives you `amount_to_precision` and `price_to_precision`, backed by the `Precise` string-arithmetic class, so nothing drifts through float rounding on the way to a rejected order:
```python
amount = exchange.amount_to_precision('BTC/KRW', 0.0012345678)
price = exchange.price_to_precision('BTC/KRW', 106354321.4)
```
### Eight languages, one API [#eight-languages-one-api]
TypeScript
Python
C#
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bithumb ();
const ticker = await exchange.fetchTicker ('BTC/KRW');
```
```python
import ccxt
exchange = ccxt.bithumb()
ticker = exchange.fetch_ticker('BTC/KRW')
```
```csharp
var exchange = new ccxt.bithumb();
var ticker = await exchange.FetchTicker("BTC/KRW");
```
Bithumb's setup guide shows the JWT construction separately for Node, Python and Java, because there is no shared client to point at. CCXT is written once and transpiled to eight languages, so the token construction is the same code everywhere.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
```python
# any raw Bithumb endpoint, camelCased from its path
info = exchange.public_get_network_info()
```
All 67 endpoints CCXT models are reachable this way, with signing, rate-limit accounting and error mapping applied. Browse them on the [bithumb implicit API page](/docs/exchanges/bithumb/implicit-api).
## What going direct does better [#what-going-direct-does-better]
Real advantages, and they are not trivial for this venue:
* **The API surface is larger than CCXT's unified layer.** Bithumb's reference covers TWAP orders, bulk order creation and cancellation (up to 30 per request), KRW deposit and withdrawal flows, withdrawal allow-lists and API-key expiry listings. CCXT reaches these through implicit methods, but they have no unified cross-exchange wrapper.
* **The newest endpoints appear in the docs first.** Bithumb versions its API (v1.2.0, v2.1.0, v2.1.5) and publishes migration guides — for example the private WebSocket `myOrder` v1-to-v2 migration. A hand-rolled client can adopt a new version the day it is documented.
* **Bithumb ships tooling of its own.** Alongside the reference it publishes an "AI Trade Kit" — a CLI, an MCP server and agent skills — for driving the API without writing a client at all. That is a different, and for some workflows better, answer than a library.
* **Zero dependencies.** If your program reads one ticker, a `requests` call and a `status` check is a dozen lines and no supply chain.
If you need TWAP orders, bulk order batches or the KRW banking endpoints, going direct — or going direct alongside CCXT — is the right call.
## Migrating from raw Bithumb HTTP to CCXT [#migrating-from-raw-bithumb-http-to-ccxt]
| What you are doing | Bithumb API | CCXT |
| ------------------- | ------------------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `BTC_KRW` / `KRW-BTC` | `'BTC/KRW'` |
| Markets | market-list endpoint | `load_markets()` |
| Ticker | `/public/ticker/{pair}` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `/public/orderbook/{pair}` | `fetch_order_book()` |
| Public trades | `/public/transaction_history/{pair}` | `fetch_trades()` |
| Candles | `/public/candlestick/{pair}/{interval}` | `fetch_ohlcv()` |
| New order | order-request endpoint | `create_order()` |
| Cancel order | order-cancel endpoint | `cancel_order()` |
| Open orders | pending-order list | `fetch_open_orders()` |
| Order detail | individual-order lookup | `fetch_order()` |
| Balance | account/balance endpoint | `fetch_balance()` |
| Signing | JWT with UUID nonce + SHA-512 query hash, by hand | automatic |
| Error checking | compare `status` to `"0000"` | typed exceptions |
| Streams | ticket + subscription JSON on the socket | `watch_*` on `ccxt.pro.bithumb` |
| Anything not listed | the endpoint | the same endpoint as an [implicit method](/docs/exchanges/bithumb/implicit-api) |
## FAQ [#faq]
**Does Bithumb have an official SDK?**
Not a client library. Its developer documentation ships reference pages, quick-start guides and an AI Trade Kit (CLI, MCP server, agent skills), and its environment-setup guide instructs you to install generic JWT and HTTP packages — `PyJWT` and `requests`, or `jsonwebtoken`, `uuid` and `axios` — and construct the signed request yourself.
**Does CCXT support Bithumb WebSockets?**
Yes. `ccxt.pro.bithumb` implements 6 `watch*` methods — `watch_order_book`, `watch_ticker`, `watch_tickers`, `watch_trades`, `watch_orders` and `watch_balance` — including the JWT handshake for the private streams.
**How does CCXT handle Bithumb's HTTP-200 errors?**
It reads the `status` field rather than the HTTP status code and raises a typed exception — `AuthenticationError`, `PermissionDenied`, `BadRequest`, `ExchangeNotAvailable` and so on — so a failed call raises instead of returning a payload your code then treats as data.
**Does `setSandboxMode` work for Bithumb?**
No. CCXT's `bithumb` class does not declare sandbox URLs, so test with the smallest permitted order size on a low-balance key instead.
**Can I still call Bithumb-specific endpoints from CCXT?**
Yes — all 67 endpoints CCXT models are available as [implicit methods](/docs/exchanges/bithumb/implicit-api), with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bithumb unified API reference](/docs/exchanges/bithumb)
* [bithumb implicit API](/docs/exchanges/bithumb/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the BitMEX API and official BitMEX connectors (/docs/comparisons/ccxt-vs-bitmex-api)
BitMEX documents its whole REST surface as a single [Swagger 2.0 specification](https://www.bitmex.com/api/explorer/swagger.json) and publishes [api-connectors](https://github.com/BitMEX/api-connectors) — a repository of clients generated from that spec, plus a handful of hand-vetted ones under `official-http/` and `official-ws/`. [CCXT](/docs/manual) talks to the same API but presents it through method names shared with 103 other venues.
The question that decides between them: **do you want BitMEX's payloads, or structures that survive adding a second venue?**
## TL;DR [#tldr]
* **Pick a BitMEX connector** if BitMEX is your only venue and you want a client whose method names are literally `Order_new`, `Quote_get` and `Instrument_get`, generated straight from the spec you are reading.
* **Pick CCXT** if you want BitMEX's spot, perpetual swaps and expiring futures resolved into unified symbols, satoshi balances converted for you, and the same code running against Bybit or OKX tomorrow.
* **CCXT does not hide the venue.** All 93 BitMEX endpoints it models are callable as [implicit methods](/docs/exchanges/bitmex/implicit-api), signed and rate-limited.
## At a glance [#at-a-glance]
| | **CCXT** | **Official BitMEX connectors** |
| --------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (BitMEX is one of them) | BitMEX only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | hand-vetted: C#, Node, Python, VBA, mIRC; auto-generated from Swagger: \~15 more |
| How the client is produced | hand-written and tested per exchange | generated from the Swagger 2.0 spec (`swagger.json`, 120 operations) |
| Unified market data + trading API | yes — same names on every exchange | no — BitMEX's own operation names |
| Instrument model | spot / swap / future resolved into unified symbols | one `/instrument` namespace, 98 fields, disambiguated by a `typ` code |
| Balance units | converted to real amounts (BTC, not satoshis) | raw — BitMEX reports `XBt` |
| WebSockets | yes — 13 `watch*` methods | yes — `official-ws/` NodeJS, Python, browser, plus a Delta Server |
| Order-book maintenance | merged book from `partial`/`insert`/`update`/`delete` rows | your code, or the Delta Server |
| Raw endpoint access | yes — 93 endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 100 ms) | not a feature of the generated clients |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + BitMEX error payloads |
| Testnet / sandbox | `exchange.set_sandbox_mode(True)` swaps REST and WS hosts | point the client at `testnet.bitmex.com` yourself |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `api-connectors` 908 GitHub stars; the `bitmex` PyPI package 2.3k installs/month, latest release 0.2.2 (January 2018) |
| Licence | MIT | per connector |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, BitMEX's published Swagger specification and api-connectors repository, and install counts from PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
bitmex (official-http/python-swaggerpy)
```python
import ccxt
exchange = ccxt.bitmex()
ticker = exchange.fetch_ticker('BTC/USD:BTC')
print(ticker['last'], ticker['baseVolume'])
```
```python
import bitmex
client = bitmex.bitmex(test=False)
result = client.Quote.Quote_get(symbol="XBTUSD", reverse=True, count=1).result()
print(result[0][0]['bidPrice'])
```
The generated client is a thin skin over the spec: `client.Quote.Quote_get` exists because the spec has a `Quote` tag and a `Quote_get` operation, and the object is built at runtime by Bravado from BitMEX's Swagger JSON. That is faithful, and it means the shape you get back is BitMEX's — you resolve `XBTUSD` to "inverse perpetual, settled in satoshis" yourself.
### Place a limit order [#place-a-limit-order]
CCXT
bitmex (official-http/python-swaggerpy)
```python
import ccxt
exchange = ccxt.bitmex({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USD:BTC', 'limit', 'buy', 100, 60000)
print(order['id'], order['status'])
```
```python
import bitmex
client = bitmex.bitmex(test=False, api_key="...", api_secret="...")
client.Order.Order_new(symbol='XBTUSD', orderQty=10, price=12345.0).result()
```
Side is the sign of `orderQty` in the raw API — `orderQty=-10` sells. CCXT takes `'buy'` / `'sell'` and a positive amount.
### Stream an order book [#stream-an-order-book]
CCXT
official-ws/python
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bitmex()
while True:
orderbook = await exchange.watch_order_book('BTC/USD:BTC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from bitmex_websocket import BitMEXWebsocket
ws = BitMEXWebsocket(endpoint="wss://ws.testnet.bitmex.com/realtime",
symbol="XBTUSD", api_key=None, api_secret=None)
print(ws.market_depth())
```
The two calls do not return the same thing. `watch_order_book` gives you a merged, depth-limited book with sorted `bids` and `asks`. `market_depth()` gives you BitMEX's rows — the connector's own sample output is `[{'id': 15500000950, 'side': 'Sell', 'size': 384, ...}]`.
That is because BitMEX's `orderBookL2` feed does not send usable price levels. It sends **rows keyed by an integer `id`**, with an `action` of `partial` (the snapshot), `insert`, `update` or `delete` — and `update` rows carry a size but not always a price. Reconstructing a book means holding an id-indexed side, applying every action in order, and re-seeding on reconnect. CCXT keeps an indexed order book internally and does exactly that. BitMEX ships a whole separate service, the Delta Server, for people who would rather not write it themselves.
## Where the differences actually bite [#where-the-differences-actually-bite]
### One instrument namespace, several products [#one-instrument-namespace-several-products]
Everything BitMEX lists — spot, perpetual swaps and expiring futures — comes back from one `/instrument` endpoint whose objects have 98 fields. What kind of thing an instrument *is* lives in a `typ` code: `FFWCSX` for a perpetual, `IFXXXP` for spot, `FFCCSX` and `FFMCSX` for futures, and so on. CCXT decodes those codes and produces unified symbols instead:
| BitMEX id | `typ` | CCXT symbol |
| ----------------- | -------- | ---------------------------------- |
| `XBTUSD` | `FFWCSX` | `BTC/USD:BTC` (inverse perpetual) |
| `XBTUSDT` | `FFWCSX` | `BTC/USDT:USDT` (linear perpetual) |
| expiring contract | `FFCCSX` | `BTC/USD:BTC-YYMMDD` |
It also reads `isInverse`, `isQuanto` and `multiplier` to set `contractSize`, `linear` / `inverse` and leverage limits on the market, so downstream code can branch on `market['inverse']` rather than on a four-letter code.
### Satoshis are not bitcoins [#satoshis-are-not-bitcoins]
BitMEX denominates BTC balances, fees and ledger entries in `XBt` — satoshis. A wallet with 1 BTC reports `100000000`. Get that wrong and every number in your risk display is off by eight decimal places. CCXT reads the currency's scale and converts on the way through (`convertToRealAmount` / `convertFromRealAmount`), so `fetch_balance()` gives you BTC and `fetch_ledger()` gives you real amounts.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
BitMEX applies a per-minute request budget and, on top of it, a second-layer limit of **10 requests per second** on order-management routes — `POST/PUT/DELETE /api/v1/order`, `/order/bulk`, `/order/all`, and the `/position/isolate`, `/position/leverage`, `/position/transferMargin` endpoints. CCXT ships a token-bucket throttler that is on by default (`enableRateLimit = true`, `rateLimit = 100` ms for BitMEX) with per-endpoint costs, and maps 429s onto `RateLimitExceeded`.
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.bitmex({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps in testnet.bitmex.com and ws.testnet.bitmex.com
```
One flag swaps both the REST and the WebSocket host. With a generated client you carry two base URLs and remember which one the running process is pointed at.
### Derivatives features that are unified, not bespoke [#derivatives-features-that-are-unified-not-bespoke]
Among the 57 unified capabilities CCXT implements for BitMEX: `set_leverage`, `set_margin_mode`, `close_position`, `fetch_positions`, `fetch_positions_adl_rank`, `fetch_funding_rates`, `fetch_funding_rate_history`, `fetch_liquidations`, `fetch_settlement_history`, `create_trigger_order`, `create_trailing_amount_order`, and `cancel_all_orders_after` — the dead-man's-switch backed by `POST /order/cancelAllAfter`. Each has the same signature on Bybit, OKX and every other derivatives venue CCXT supports.
### One error hierarchy [#one-error-hierarchy]
CCXT maps BitMEX's error payloads onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `ExchangeNotAvailable` and 35 more, all descending from `BaseError`. A generated client raises whatever its HTTP layer raises.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
```python
# any raw BitMEX endpoint, camelCased from its path
instruments = exchange.public_get_instrument_active()
```
All 93 endpoints CCXT models are reachable this way, with signing (`api-key`, `api-expires`, `api-signature`), rate-limit accounting and error mapping applied. Browse them on the [bitmex implicit API page](/docs/exchanges/bitmex/implicit-api).
## What the official BitMEX connectors do better [#what-the-official-bitmex-connectors-do-better]
Real advantages, not throat-clearing:
* **Total coverage, automatically.** The generated clients come from `swagger.json`, which currently describes 120 operations across 29 tags. Anything BitMEX adds to the spec appears in a regenerated client without anyone writing a parser. CCXT's unified layer models what it has modelled.
* **Names that match the reference exactly.** `Order_new`, `Quote_get`, `Instrument_getActive`, `OrderBook_getL2` — you can read BitMEX's API Explorer and type the call. No mapping step.
* **A Delta Server you can run instead of writing client code.** `official-ws/delta-server` is a local webserver that maintains BitMEX state from the WebSocket feed and serves it over HTTP, which is a genuinely different and sometimes better architecture than embedding a streaming client in your process.
* **Language reach beyond CCXT's eight.** The auto-generated directory covers Ruby, Scala, Swift, Objective-C, Clojure, C++ and others. If your service is written in one of those, a generated BitMEX client exists and a CCXT binding does not.
If BitMEX is your only venue and you value one-to-one fidelity with its Swagger spec — or you want the Delta Server architecture — the official connectors are the better fit.
## Migrating from a BitMEX connector to CCXT [#migrating-from-a-bitmex-connector-to-ccxt]
| What you are doing | BitMEX connector | CCXT |
| ------------------- | ------------------------------------ | ------------------------------------------------------------------------------ |
| Symbols | `'XBTUSD'`, `'XBTUSDT'` | `'BTC/USD:BTC'`, `'BTC/USDT:USDT'` |
| Order side | sign of `orderQty` | `'buy'` / `'sell'` |
| Instruments | `Instrument_get()` + read `typ` | `load_markets()` |
| Ticker | `Quote_get()` / `Instrument_get()` | `fetch_ticker()` |
| Order book | `OrderBook_getL2()` | `fetch_order_book()` |
| Candles | `Trade_getBucketed()` | `fetch_ohlcv()` |
| New order | `Order_new()` | `create_order()` |
| Amend order | `Order_amend()` | `edit_order()` |
| Cancel | `Order_cancel()` | `cancel_order()` |
| Cancel-all-after | `Order_cancelAllAfter()` | `cancel_all_orders_after()` |
| Open orders | `Order_getOrders()` with a filter | `fetch_open_orders()` |
| Balance | `User_getWallet()` (satoshis) | `fetch_balance()` (real amounts) |
| Positions | `Position_get()` | `fetch_positions()` |
| Leverage | `Position_updateLeverage()` | `set_leverage()` |
| Testnet | second base URL | `set_sandbox_mode(True)` |
| Streams | `official-ws` client or Delta Server | `watch_*` on `ccxt.pro.bitmex` |
| Anything not listed | native operation | the same endpoint as an [implicit method](/docs/exchanges/bitmex/implicit-api) |
## FAQ [#faq]
**Why does CCXT call BitMEX's XBTUSD `BTC/USD:BTC`?**
Because it is an inverse perpetual: quoted in USD, margined and settled in BTC. CCXT's symbol grammar puts the settlement currency after the colon, so `BTC/USD:BTC` is inverse and `BTC/USDT:USDT` is linear. The same grammar identifies the same thing on every other derivatives venue.
**Does CCXT handle BitMEX's satoshi-denominated balances?**
Yes. BitMEX reports BTC amounts in `XBt`, and CCXT converts them to real amounts before returning balances, ledger entries and fees, so you never divide by 100,000,000 by hand.
**Does `setSandboxMode` work for BitMEX?**
Yes. `exchange.set_sandbox_mode(True)` swaps in `testnet.bitmex.com` for REST and `ws.testnet.bitmex.com` for WebSockets — no second code path.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.bitmex` and call `watch*` methods — 13 are implemented, including `watch_order_book`, `watch_trades`, `watch_ohlcv`, `watch_orders`, `watch_positions`, `watch_my_trades` and `watch_liquidations`.
**Can I still call BitMEX-specific endpoints?**
Yes — 93 of them, as [implicit methods](/docs/exchanges/bitmex/implicit-api), with `api-key` / `api-expires` / `api-signature` signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitmex unified API reference](/docs/exchanges/bitmex)
* [bitmex implicit API](/docs/exchanges/bitmex/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the BitoPro API and official BitoPro SDKs (/docs/comparisons/ccxt-vs-bitopro-api)
BitoPro (幣託), Taiwan's exchange, publishes its [API documentation](https://github.com/bitoex/bitopro-official-api-docs) and official wrappers under the [bitoex GitHub organisation](https://github.com/bitoex) in Node.js, Python, Go, C#, Ruby and Java. [CCXT](/docs/manual) implements the same v3 REST and WebSocket API behind method names shared with 103 other venues.
The question that decides between them: **is BitoPro the only venue your code will ever talk to?**
## TL;DR [#tldr]
* **Pick a BitoPro wrapper** if BitoPro is your only venue and you want a client whose methods map one-to-one onto BitoPro's v3 reference — `get_tickers`, `create_an_order`, `btc_twd`.
* **Pick CCXT** if you want the same 32 capabilities expressed the way every other exchange expresses them, in eight languages, so adding a second venue is a string change rather than a second integration.
* **Nothing is hidden.** All 26 BitoPro endpoints CCXT models are callable as [implicit methods](/docs/exchanges/bitopro/implicit-api), signed and rate-limited.
## At a glance [#at-a-glance]
| | **CCXT** | **Official BitoPro wrappers** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (BitoPro is one of them) | BitoPro only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Node.js, Python, Go, C#, Ruby, Java — separate repositories, updated at different times |
| Packages to install | 1 (`ccxt`) | one per language |
| Unified market data + trading API | yes — same names on every exchange | no — BitoPro's own v3 shapes |
| Unified capabilities | 32 | n/a — endpoint wrappers |
| WebSockets | yes — 5 `watch*` methods | yes, in some of the wrappers |
| Raw endpoint access | yes — 26 endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 100 ms) | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + BitoPro error payloads |
| Testnet / sandbox | not available for `bitopro` | not offered |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `bitopro-client` (Python) 173 PyPI installs/month; `bitopro-api-node` 24 npm installs/month |
| Licence | MIT | MIT (Python wrapper) |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, BitoPro's official API documentation and wrapper repositories, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
bitopro-api-python
```python
import ccxt
exchange = ccxt.bitopro()
ticker = exchange.fetch_ticker('BTC/TWD')
print(ticker['last'], ticker['baseVolume'])
```
```python
from bitoproClient.bitopro_restful_client import BitoproRestfulClient
bitopro_client = BitoproRestfulClient()
response = bitopro_client.get_tickers(pair="btc_twd")
print(response)
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) with the same keys, types and units you get from any other exchange. The wrapper returns BitoPro's JSON, which you parse yourself.
### Place a limit order [#place-a-limit-order]
CCXT
bitopro-api-python
```python
import ccxt
exchange = ccxt.bitopro({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.0001, 36000)
print(order['id'], order['status'])
```
```python
from bitoproClient.bitopro_restful_client import BitoproRestfulClient, OrderType
bitopro_client = BitoproRestfulClient("apiKey", "apiSecret")
r = bitopro_client.create_an_order(
pair='btc_usdt', action='buy', amount='0.0001',
price='36000', type=OrderType.Limit)
```
### Stream an order book [#stream-an-order-book]
CCXT
Raw BitoPro WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bitopro()
while True:
orderbook = await exchange.watch_order_book('BTC/TWD')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import asyncio, json, websockets
async def main():
url = "wss://stream.bitopro.com:443/ws/v1/pub/order-books/BTC_TWD:5"
async with websockets.connect(url) as ws:
while True:
message = json.loads(await ws.recv())
# bids/asks are objects: {"price": ..., "amount": ..., "count": ..., "total": ...}
print(message['bids'][0], message['asks'][0])
asyncio.run(main())
```
The raw snippet is short because BitoPro's public book channel is a plain subscription in the URL path. What it does not do is reconnect after a drop, bound the cache, or hand you the structure `fetch_order_book` returns — BitoPro pushes `bids` and `asks` as arrays of `{price, amount, count, total}` objects, not the `[price, amount]` pairs the [unified order book structure](/docs/manual#order-book-structure) uses. `watch_order_book` does all three.
## Where the differences actually bite [#where-the-differences-actually-bite]
### The signature is a base64 payload, not a query string [#the-signature-is-a-base64-payload-not-a-query-string]
BitoPro signs private requests with three headers: `X-BITOPRO-APIKEY`, `X-BITOPRO-PAYLOAD` — a base64 encoding of the JSON body, including a nonce — and `X-BITOPRO-SIGNATURE`, an **HMAC-SHA384** over that base64 string. It is a different shape from the query-string HMAC most venues use, and the ordering of keys inside the JSON matters because you sign the encoded bytes. CCXT implements it once, in one place, for all eight languages.
### One API for the parts that are not market data [#one-api-for-the-parts-that-are-not-market-data]
Among the 32 unified capabilities CCXT implements for BitoPro: `fetch_currencies`, `fetch_trading_fees`, `fetch_deposit_withdraw_fees`, `fetch_deposits`, `fetch_withdrawals`, `fetch_withdrawal`, `fetch_my_trades`, `fetch_closed_orders`, `cancel_orders`, `cancel_all_orders`, `create_stop_order` and `create_trigger_order`. These are the calls that differ most between exchanges, and they are exactly the ones you do not want to rewrite when you add a second venue.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
BitoPro's documentation states 600 requests per minute per IP for the open API and 600 per minute per IP *and* per account for the authenticated API, with individual endpoints carrying tighter restrictions on top. CCXT encodes a per-endpoint cost for each of the 26 endpoints against a `rateLimit` of 100 ms and ships a token-bucket throttler that is **on by default** (`enableRateLimit = true`). Order placement and cancellation carry lower costs than the general default, matching BitoPro's tighter per-endpoint limits.
### Precision and string math [#precision-and-string-math]
CCXT loads BitoPro's trading-pair metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so a size never drifts through float rounding into a rejected order:
```python
amount = exchange.amount_to_precision('BTC/TWD', 0.0012345678)
price = exchange.price_to_precision('BTC/TWD', 3012345.6789)
```
BitoPro's own wrapper passes amounts and prices as strings for the same reason.
### One error hierarchy [#one-error-hierarchy]
CCXT maps BitoPro's error responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded`, `NetworkError` and 35 more, all under `BaseError`. `except ccxt.InsufficientFunds` is the same line of code on the next exchange.
### Eight languages, one API [#eight-languages-one-api]
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bitopro ();
const ticker = await exchange.fetchTicker ('BTC/TWD');
```
```python
import ccxt
exchange = ccxt.bitopro()
ticker = exchange.fetch_ticker('BTC/TWD')
```
```go
exchange := ccxt.NewBitopro(nil)
ticker, err := exchange.FetchTicker("BTC/TWD")
```
BitoPro publishes six language wrappers, but they are six codebases: the Python, Go and C# repositories were last touched in June 2026, the Ruby one in July 2022 and the Java one in June 2021. CCXT is one source of truth transpiled to eight languages, so every language gets the same fix in the same release.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
```python
# any raw BitoPro endpoint, camelCased from its path
pairs = exchange.public_get_provisioning_trading_pairs()
```
All 26 endpoints are reachable this way, with the `X-BITOPRO-*` signature, rate-limit accounting and error mapping applied. Browse them on the [bitopro implicit API page](/docs/exchanges/bitopro/implicit-api).
## What the official BitoPro wrappers do better [#what-the-official-bitopro-wrappers-do-better]
Real advantages:
* **Names match the reference exactly.** `get_tickers`, `get_order_book(pair, limit, scale)`, `create_an_order(action, amount, price, type)` — the `scale` parameter on the order book is a BitoPro concept with no unified equivalent, and the wrapper exposes it directly.
* **BitoPro-specific enums are typed.** The Python wrapper ships `OrderType`, `TimeInForce`, `CandlestickResolution`, `OrderStatus`, `WithdrawProtocol` and `DepositStatus` as enums. CCXT gives you unified strings instead, which is better for portability and less literal about BitoPro's vocabulary.
* **Ruby and Java wrappers exist there.** BitoPro publishes both; CCXT does not ship a Ruby binding at all, and its Java support is transpiled rather than hand-written for BitoPro.
* **Batch and conditional order helpers are first class.** `create_batch_order` and `cancel_multiple_orders` are direct wrappers of BitoPro's batch endpoints. In CCXT you would reach the batch endpoints through implicit methods.
If BitoPro is your only venue and you are working in Ruby or Java, the official wrappers are the better fit.
## Migrating from a BitoPro wrapper to CCXT [#migrating-from-a-bitopro-wrapper-to-ccxt]
| What you are doing | BitoPro wrapper | CCXT |
| ---------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `'btc_twd'`, `'btc_usdt'` | `'BTC/TWD'`, `'BTC/USDT'` |
| Trading pairs | `get_trading_pairs()` | `load_markets()` |
| Ticker | `get_tickers()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `get_order_book()` | `fetch_order_book()` |
| Candles | `get_candlestick()` | `fetch_ohlcv()` |
| New order | `create_an_order()` | `create_order()` |
| Cancel order | `cancel_an_order()` | `cancel_order()` |
| Cancel all | `cancel_all_orders()` | `cancel_all_orders()` |
| Open orders | `get_open_orders()` | `fetch_open_orders()` |
| Order history | `get_all_orders()` | `fetch_closed_orders()` |
| My trades | `get_trades_list()` | `fetch_my_trades()` |
| Balance | `get_account_balance()` | `fetch_balance()` |
| Deposits / withdrawals | `get_deposit_history()` / `get_withdraw_history()` | `fetch_deposits()` / `fetch_withdrawals()` |
| Streams | raw WebSocket or wrapper client | `watch_*` on `ccxt.pro.bitopro` |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/bitopro/implicit-api) |
## FAQ [#faq]
**Does CCXT support BitoPro WebSockets?**
Yes. `ccxt.pro.bitopro` implements 5 `watch*` methods — `watch_order_book`, `watch_ticker`, `watch_trades`, `watch_balance` and `watch_my_trades` — with reconnect, resubscribe and bounded caches handled for you.
**Does CCXT handle BitoPro's TWD markets?**
Yes. TWD pairs are ordinary unified symbols such as `'BTC/TWD'` and `'ETH/TWD'`; call `load_markets()` and read the symbol list rather than assuming a pair exists.
**Does `setSandboxMode` work for BitoPro?**
No. CCXT's `bitopro` class does not declare sandbox URLs, so test with small orders on a low-balance key instead.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.bitopro` and call `watch*` methods.
**Can I still call BitoPro-specific endpoints?**
Yes — all 26 endpoints CCXT models are available as [implicit methods](/docs/exchanges/bitopro/implicit-api), with the `X-BITOPRO-*` signature and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitopro unified API reference](/docs/exchanges/bitopro)
* [bitopro implicit API](/docs/exchanges/bitopro/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Bitrue API (/docs/comparisons/ccxt-vs-bitrue-api)
Bitrue documents its [spot](https://github.com/Bitrue-exchange/Spot-official-api-docs) and futures APIs on GitHub and links a couple of demo repositories from its [API portal](https://www.bitrue.com/api-docs). It also says, on that same page, that "the following SDKs are provided by partners and users, and are not officially produced" and that Bitrue "does not make any commitment to the safety and performance of the SDKs".
Taking that at face value: there is no exchange-maintained client library to compare against. So the comparison is CCXT against the HTTP client you would otherwise write.
## TL;DR [#tldr]
* **Write it yourself** if you need one or two endpoints and want zero dependencies — Bitrue's spot API is Binance-shaped, so an `X-MBX-APIKEY` header and an HMAC-SHA256 signature get you a long way.
* **Pick CCXT** if you want spot and futures behind one client, weighted rate limiting, typed errors and WebSocket streaming that already work, in eight languages.
* **Nothing is hidden.** All 65 Bitrue endpoints CCXT models are callable as [implicit methods](/docs/exchanges/bitrue/implicit-api), signed and rate-limited.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw Bitrue API** |
| --------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------ |
| Exchanges covered | 104 (Bitrue is one of them) | Bitrue only |
| Official client library | n/a | none — Bitrue states the listed SDKs are "not officially produced" |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write |
| Unified market data + trading API | yes — 40 capabilities, same names on every exchange | raw JSON |
| Spot and futures | one `ccxt.bitrue` instance, selected by symbol or `defaultType` | separate hosts and separate docs sets |
| Symbols | `'BTC/USDT'`, `'BTC/USDT:USDT'` | `BTCUSDT` |
| Request signing | built in — `X-MBX-APIKEY` + HMAC-SHA256 | your code |
| Raw endpoint access | yes — 65 endpoints as implicit methods | yes, by definition |
| Built-in rate limiter | yes, per-endpoint weights including weight-by-`limit`, on by default | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + Bitrue error codes |
| WebSockets | yes — 6 `watch*` methods | yes, spot and futures sockets on different hosts |
| Testnet / sandbox | not available for `bitrue` | not offered |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month | n/a |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub issues — usually same-day | Bitrue support |
Figures verified September 2026 against CCXT v4.5.78, Bitrue's published API documentation and GitHub organisation, and live responses from its public endpoints.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bitrue()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://openapi.bitrue.com/api/v1/ticker/24hr',
params={'symbol': 'BTCUSDT'})
data = r.json()[0]
print(data['lastPrice'], data['volume'])
```
The payload looks like Binance's — same field names, same shape — which is convenient right up to the point where it is not. Several of those fields come back **null or zero** on Bitrue: `weightedAvgPrice`, `prevClosePrice` and `lastQty` are `null`, and `openTime`, `closeTime` and `count` are `0`. Code lifted from a Binance integration will not crash; it will quietly carry nulls into your data model. CCXT parses defensively and returns a [unified ticker structure](/docs/manual#ticker-structure) with `None` where a value genuinely is not published, and the same keys as every other exchange where it is.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bitrue({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import hashlib, hmac, time, requests
from urllib.parse import urlencode
params = {'symbol': 'BTCUSDT', 'side': 'BUY', 'type': 'LIMIT',
'quantity': '0.001', 'price': '60000',
'timestamp': int(time.time() * 1000), 'recvWindow': 5000}
query = urlencode(params)
params['signature'] = hmac.new(b'YOUR_SECRET', query.encode(),
hashlib.sha256).hexdigest()
r = requests.post('https://openapi.bitrue.com/api/v1/order', params=params,
headers={'X-MBX-APIKEY': 'YOUR_KEY'})
print(r.json())
```
Straightforward — until you need the same thing on futures, which lives on a different host with a different docs set, and until you need it in a second language.
### Stream an order book [#stream-an-order-book]
CCXT
Raw WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bitrue()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import asyncio, gzip, json, websockets
async def main():
async with websockets.connect('wss://ws.bitrue.com/market/ws') as ws:
await ws.send(json.dumps({'event': 'sub', 'params': {
'cb_id': 'btcusdt',
'channel': 'market_btcusdt_simple_depth_step0'}}))
while True:
message = json.loads(gzip.decompress(await ws.recv()))
if 'ping' in message: # keep-alive; unanswered means disconnect
await ws.send(json.dumps({'pong': message['ping']}))
continue
print(message['tick']['buys'][0], message['tick']['asks'][0])
asyncio.run(main())
```
Three things the raw version has to get right before it works at all: every frame is **gzip-compressed**, the server sends `{"ping": ...}` frames that you must answer with `{"pong": ...}` or it drops you, and the book arrives under `tick.buys` / `tick.asks` rather than `bids` / `asks`. Then there is reconnect, resubscribe and cache bounding on top.
Switching that snippet to the futures book means a **different host** — Bitrue's spot market socket and its futures kline socket are separate services with different channel names. In CCXT it is one character:
```python
orderbook = await exchange.watch_order_book('BTC/USDT:USDT')
```
## Where the differences actually bite [#where-the-differences-actually-bite]
### Spot and futures are three hosts, not one [#spot-and-futures-are-three-hosts-not-one]
Bitrue's spot API, USDⓈ-M futures API and COIN-M futures API live behind different base URLs and different documentation sets, and its WebSocket feeds are split the same way. CCXT models all of them inside one `bitrue` class: pick the product with `options.defaultType` or just use a swap symbol.
```python
exchange = ccxt.bitrue({'apiKey': '...', 'secret': '...',
'options': {'defaultType': 'swap'}})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 1, 60000)
```
The 40 unified capabilities include the derivatives ones — `set_leverage`, `set_margin`, `create_reduce_only_order`, `create_stop_order`, `transfer`, `fetch_transfers` — with the signatures they have on every other derivatives venue.
### Rate limits, including weight that depends on your arguments [#rate-limits-including-weight-that-depends-on-your-arguments]
CCXT encodes a cost for each of the 65 endpoints against a `rateLimit` of 10 ms, and the throttler is **on by default** (`enableRateLimit = true`). Some endpoints are weighted by what you ask for rather than by how often you ask — the order-book call costs 0.24 at `limit=100`, 1.2 at `limit=500` and 2.4 at `limit=1000`:
```text
'depth': { 'cost': 1, 'byLimit': [ [ 100, 0.24 ], [ 500, 1.2 ], [ 1000, 2.4 ] ] }
```
Getting this right by hand means reading the weight table, mapping it onto your call sites, and re-reading it whenever the exchange changes it. CCXT ships the table.
### Binance-shaped, but not Binance [#binance-shaped-but-not-binance]
Bitrue's spot API borrows Binance's conventions — `X-MBX-APIKEY`, `timestamp` and `recvWindow` parameters, HMAC-SHA256 over the query string, `BTCUSDT` symbols. That similarity is why people reach for a Binance client and then debug for an afternoon. Field population differs, some endpoints do not exist, and the futures side diverges further. CCXT maintains Bitrue as its own implementation with its own parsers and its own static request/response fixtures, rather than as a Binance derivative.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Bitrue's error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once and it keeps working when you add a second exchange.
### Precision and string math [#precision-and-string-math]
CCXT loads Bitrue's symbol metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding into a rejected order:
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### Eight languages, one API [#eight-languages-one-api]
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bitrue ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```python
import ccxt
exchange = ccxt.bitrue()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```go
exchange := ccxt.NewBitrue(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
Bitrue's two demo repositories are one in Java and one in PHP. CCXT gives you the same API in eight languages from one source of truth, so the signing code and the futures routing are the same code everywhere.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
```python
# any raw Bitrue endpoint, camelCased from its path
info = exchange.spot_v1_public_get_exchangeinfo()
```
All 65 endpoints CCXT models are reachable this way, with `X-MBX-APIKEY` signing, rate-limit accounting and error mapping applied. Browse them on the [bitrue implicit API page](/docs/exchanges/bitrue/implicit-api).
## What going direct does better [#what-going-direct-does-better]
Honest advantages:
* **The API surface is bigger than CCXT's unified layer.** Bitrue documents spot v1, v2 and v3, USDⓈ-M futures, COIN-M futures and a copy-trading API. CCXT models 65 endpoints across spot and futures; the rest — copy trading in particular — has no unified wrapper.
* **Binance familiarity transfers.** If your team already has a Binance integration, the spot signing scheme, parameter names and symbol format are the same, so a minimal client is genuinely quick to write.
* **Zero dependencies.** For a read-only price feed, `requests.get` on a public endpoint is three lines and no supply chain.
* **You control the failure modes.** No abstraction means no surprise about which field a library chose to populate — you see Bitrue's payload exactly as sent, nulls and all.
If you need Bitrue's copy-trading endpoints, or you only need a public price, going direct is reasonable.
## Migrating from raw Bitrue HTTP to CCXT [#migrating-from-raw-bitrue-http-to-ccxt]
| What you are doing | Bitrue API | CCXT |
| ------------------- | ------------------------------------------- | ------------------------------------------------------------------------------ |
| Symbols | `BTCUSDT` | `'BTC/USDT'` (spot), `'BTC/USDT:USDT'` (swap) |
| Product selection | different host and docs set | `options.defaultType` or the symbol |
| Exchange info | `GET /api/v1/exchangeInfo` | `load_markets()` |
| Ticker | `GET /api/v1/ticker/24hr` | `fetch_ticker()` / `fetch_tickers()` |
| Best bid/ask | book-ticker endpoint | `fetch_bids_asks()` |
| Order book | `GET /api/v1/depth` | `fetch_order_book()` |
| Public trades | `GET /api/v1/trades` | `fetch_trades()` |
| Candles | kline endpoint | `fetch_ohlcv()` |
| New order | `POST /api/v1/order` | `create_order()` |
| Cancel | `DELETE /api/v1/order` | `cancel_order()` |
| Open orders | open-orders endpoint | `fetch_open_orders()` |
| Order history | all-orders endpoint | `fetch_closed_orders()` |
| Balance | account endpoint | `fetch_balance()` |
| My trades | my-trades endpoint | `fetch_my_trades()` |
| Leverage | futures leverage endpoint | `set_leverage()` |
| Transfers | transfer endpoint | `transfer()` / `fetch_transfers()` |
| Signing | `X-MBX-APIKEY` + HMAC-SHA256 by hand | automatic |
| Streams | spot and futures sockets on different hosts | `watch_*` on `ccxt.pro.bitrue` |
| Anything not listed | the endpoint | the same endpoint as an [implicit method](/docs/exchanges/bitrue/implicit-api) |
## FAQ [#faq]
**Does Bitrue have an official SDK?**
Not one it stands behind. Its API portal lists SDK links with the note that they "are provided by partners and users, and are not officially produced", and that Bitrue makes no commitment to their safety or performance. The two SDK repositories in its GitHub organisation are labelled "Demo for Bitrue Futures Open APIs" (Java) and "Demo for Bitrue Spot Open APIs" (PHP).
**Can I just use a Binance client against Bitrue?**
The spot API is Binance-shaped — `X-MBX-APIKEY`, HMAC-SHA256 over the query string, `BTCUSDT` symbols — so simple calls often work. But several ticker fields come back null or zero on Bitrue where Binance populates them, some endpoints do not exist, and the futures API diverges further. CCXT maintains Bitrue as its own implementation with its own parsers and regression fixtures.
**Does CCXT support Bitrue futures?**
Yes. The `bitrue` class declares spot and swap, with `set_leverage`, `set_margin`, `create_reduce_only_order`, `fetch_transfers` and the rest among its 40 unified capabilities. Select the product with `options.defaultType` or by using a swap symbol such as `'BTC/USDT:USDT'`.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.bitrue` and call `watch*` methods — 6 are implemented: `watch_order_book`, `watch_ticker`, `watch_trades`, `watch_ohlcv`, `watch_orders` and `watch_balance`, routed to the right socket host for spot or futures.
**Does `setSandboxMode` work for Bitrue?**
No. CCXT's `bitrue` class does not declare sandbox URLs, so test with small orders on a low-balance key instead.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitrue unified API reference](/docs/exchanges/bitrue)
* [bitrue implicit API](/docs/exchanges/bitrue/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Bitso API (/docs/comparisons/ccxt-vs-bitso-api)
[Bitso](https://bitso.com) is the largest exchange in Mexico and one of the larger venues in Latin America. Its public API is documented at [bitso.com/api\_info](https://bitso.com/api_info), and Bitso publishes exactly one client library of its own: [bitso-java](https://github.com/bitsoex/bitso-java), an official Java wrapper for REST v3.
So the choice is narrower than it looks. If you write Java, you can use Bitso's own wrapper. In any other language you are either hand-rolling HTTP against a signed API or using [CCXT](/docs/manual). The question that decides it: **do you want a Bitso-shaped client in one language, or a venue-shaped-agnostic client in seven?**
## TL;DR [#tldr]
* **Pick bitso-java** if you are on the JVM, Bitso is your only venue, and you want types Bitso themselves defined (`BitsoTicker`, `BitsoOrder`, `BigDecimal` amounts) that track their docs one-for-one.
* **Pick CCXT** if you are not on the JVM, or if Bitso is one of several venues. CCXT implements 24 unified capabilities for Bitso and exposes all 40 of its REST endpoints as implicit methods, from TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java and Rust.
* **Neither one streams Bitso.** Bitso publishes a WebSocket API with `trades`, `diff-orders` and `orders` channels; CCXT implements no `watch*` methods for Bitso, and the official Java wrapper's README documents REST only. If you need a live Bitso book, you are writing that socket client yourself either way.
## At a glance [#at-a-glance]
| | **CCXT** | **bitso-java (official)** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------- |
| Exchanges covered | 104 (Bitso is one of them) | Bitso only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Java |
| Unified market data + trading API | yes — same method names across every exchange | no — Bitso's own request/response shapes |
| Bitso capabilities implemented | 24 unified methods, 18 of them `fetch*` | full REST v3 surface |
| Raw endpoint access | yes — 40 Bitso endpoints as implicit methods | yes, it is the whole product |
| WebSockets | no `watch*` methods for Bitso | not documented in the README |
| Built-in rate limiter | yes, on by default (`rateLimit` 2000 ms) | not documented |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Bitso error codes |
| Testnet / sandbox | `setSandboxMode(true)` switches to Bitso's staging host | environment switching added in v4.1.0 |
| Latest release read | continuous | v4.1.0, 11 July 2024 |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 40 GitHub stars |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the bitsoex/bitso-java repository and its releases page, Bitso's published API documentation, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
bitso-java (Java)
```python
import ccxt
exchange = ccxt.bitso()
ticker = exchange.fetch_ticker('BTC/MXN')
print(ticker['last'], ticker['baseVolume'])
```
```text
BitsoTicker[] tickers = bitso.getTicker();
for (Ticker ticker : tickers) {
System.out.println(ticker);
}
```
The CCXT call returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, types and units you get from Kraken or Binance. The Java wrapper returns Bitso's own objects, which is more literal and less portable.
### Place a limit order [#place-a-limit-order]
CCXT
bitso-java (Java)
```python
import ccxt
exchange = ccxt.bitso({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/MXN', 'limit', 'buy', 0.001, 1500000)
print(order['id'], order['status'])
```
```text
String buyOrderId = bitso.placeOrder("btc_mxn", BitsoOrder.SIDE.BUY,
BitsoOrder.TYPE.LIMIT, new BigDecimal("0.1"), null,
new BigDecimal("90000"));
```
Note the symbol. Bitso books are `btc_mxn`; CCXT normalises that to `'BTC/MXN'` and maps it back to the venue id for you, so the same strategy code addresses `'BTC/USDT'` on the next exchange without a lookup table.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Six of eight languages have no official option [#six-of-eight-languages-have-no-official-option]
There is no first-party Bitso client for Python, JavaScript, Go, PHP or C#. The community filled part of the gap — [mariorz/python-bitso](https://github.com/mariorz/python-bitso) is MIT-licensed and does cover the WebSocket channels — but it is one person's project, not a vendor commitment. CCXT gives you the same Bitso implementation in all eight of its targets, written once in TypeScript and transpiled:
TypeScript
Python
PHP
C#
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bitso ();
const ticker = await exchange.fetchTicker ('BTC/MXN');
```
```python
import ccxt
exchange = ccxt.bitso()
ticker = exchange.fetch_ticker('BTC/MXN')
```
```php
$exchange = new \ccxt\bitso();
$ticker = $exchange->fetch_ticker('BTC/MXN');
```
```csharp
var exchange = new ccxt.bitso();
var ticker = await exchange.FetchTicker("BTC/MXN");
```
```go
exchange := ccxt.NewBitso(nil)
ticker, err := exchange.FetchTicker("BTC/MXN")
```
### Signing is fiddly enough to be worth not writing [#signing-is-fiddly-enough-to-be-worth-not-writing]
Bitso authenticates with an `Authorization: Bitso ::` header, where the signature is HMAC-SHA256 over the nonce, the HTTP method, the full request path *including the query string*, and the JSON body when there is one. Get the concatenation order or the path prefix wrong and you get a 401 with no hint as to which part was wrong. CCXT builds that header in `sign()` and keeps it correct across every endpoint, including the ones with path parameters like `orders/{oid}` and `order_trades/{oid}`.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Bitso's documented limits are 60 requests per minute per IP for public endpoints and 300 requests per minute per account for private ones, with a one-minute lockout when you exceed them and longer blocks for repeat offences. CCXT ships a token-bucket throttler that is on by default, with `rateLimit` set to 2000 ms for Bitso. You write a loop; the library paces it.
### Precision and string math [#precision-and-string-math]
Bitso quotes MXN pairs where a single tick is a meaningful amount of money. CCXT loads Bitso's market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding into a rejected order.
```python
amount = exchange.amount_to_precision('BTC/MXN', 0.0012345678)
price = exchange.price_to_precision('BTC/MXN', 1512345.6789)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Bitso's error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError` and 35 more, all descending from `BaseError`. You catch `ccxt.InsufficientFunds` once and it keeps working when you add a second venue, instead of matching on Bitso's `0201` and hoping the payload never changes.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
The 24 unified methods are not a ceiling. Every endpoint in Bitso's API is generated as a callable implicit method, with signing, nonce handling, rate limiting and error mapping applied:
```python
# GET /v3/account_status
status = exchange.private_get_account_status()
# GET /v3/ledger/fundings
fundings = exchange.private_get_ledger_fundings()
```
Bitso-specific endpoints — `mx_bank_codes`, `kyc_documents`, `funding_destination`, the SPEI rails — are reachable without dropping to raw HTTP. Browse them all on the [bitso implicit API page](/docs/exchanges/bitso/implicit-api).
## What bitso-java does better [#what-bitso-java-does-better]
An honest list:
* **It is Bitso's own code.** The wrapper is published by the exchange, so its field names and enums are exactly the ones in Bitso's documentation. When you are debugging against their API reference, there is no translation step.
* **Java-native typed models.** `BitsoTicker`, `BitsoOrder.SIDE`, `BitsoOrder.TYPE` and `BigDecimal` throughout give you compile-time safety over Bitso's actual payloads. CCXT's typed structures are deliberately *unified* — better for portability, less literal about Bitso.
* **Environment switching for JVM users.** Release v4.1.0 (July 2024) added the ability to point the client at environments other than production, which is the shape JVM shops usually want for staging.
* **Smaller dependency for a single-venue Java service.** If you trade only Bitso from a Java service, one MIT-licensed wrapper is a smaller install than all of CCXT.
If you are a JVM shop trading Bitso and only Bitso, bitso-java is a defensible choice — and CCXT's Java target is the alternative to weigh it against, not its Python one.
## Migrating from the Bitso API to CCXT [#migrating-from-the-bitso-api-to-ccxt]
| What you are doing | Bitso REST v3 | CCXT |
| ------------------- | ------------------------- | ----------------------------------------------------------------------------- |
| Symbols | `btc_mxn` | `'BTC/MXN'` |
| Markets | `GET /v3/available_books` | `load_markets()` |
| Ticker | `GET /v3/ticker` | `fetch_ticker()` |
| Order book | `GET /v3/order_book` | `fetch_order_book()` |
| Candles | `GET /v3/ohlc` | `fetch_ohlcv()` |
| Public trades | `GET /v3/trades` | `fetch_trades()` |
| New order | `POST /v3/orders` | `create_order()` |
| Cancel order | `DELETE /v3/orders/{oid}` | `cancel_order()` |
| Cancel all | `DELETE /v3/orders/all` | `cancel_all_orders()` |
| Open orders | `GET /v3/open_orders` | `fetch_open_orders()` |
| Balance | `GET /v3/balance` | `fetch_balance()` |
| My trades | `GET /v3/user_trades` | `fetch_my_trades()` |
| Ledger | `GET /v3/ledger` | `fetch_ledger()` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/bitso/implicit-api) |
## FAQ [#faq]
**Does Bitso have an official Python SDK?**
No. Bitso's GitHub organisation publishes one maintained client library, [bitso-java](https://github.com/bitsoex/bitso-java), for the JVM. For Python, JavaScript, Go, PHP or C# your realistic options are CCXT or your own HTTP client; a community Python wrapper, [mariorz/python-bitso](https://github.com/mariorz/python-bitso), also exists under MIT.
**Does CCXT support Bitso WebSockets?**
No. CCXT implements zero `watch*` methods for Bitso, so streaming is not available through CCXT Pro for this venue. Bitso does publish a WebSocket API with `trades`, `diff-orders` and `orders` channels — if you need it, you connect to it directly. Everything else in this comparison still applies to the REST side.
**Can I test against Bitso without real money?**
CCXT wires `setSandboxMode(true)` to Bitso's staging host, and Bitso separately documents a sandbox server funded with Bitcoin and Ethereum testnet coins. Verify which environment your API keys were issued for before you rely on it.
**Can I still call Bitso-specific endpoints through CCXT?**
Yes — all 40 of them, as [implicit methods](/docs/exchanges/bitso/implicit-api), with the `Authorization: Bitso` header, nonce and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support for the exchanges that have it.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitso unified API reference](/docs/exchanges/bitso)
* [bitso implicit API](/docs/exchanges/bitso/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the raw Bitstamp API (/docs/comparisons/ccxt-vs-bitstamp-api)
[Bitstamp](https://www.bitstamp.net) has been running since 2011 and its [API documentation](https://www.bitstamp.net/api/) is unusually complete — signing examples in Python, Java and C++, a documented rate-limit policy, a v2 WebSocket feed. What it does not include is a client library. Bitstamp's GitHub organisation publishes no public repositories, and the docs link no first-party SDK in any language.
So this is not CCXT versus a vendor SDK. It is **CCXT versus code you write yourself** — or versus a community wrapper, of which the most-installed is [kmadac/bitstamp-python-client](https://github.com/kmadac/bitstamp-python-client), MIT-licensed, whose most recent commit is from October 2022.
## TL;DR [#tldr]
* **Write it yourself** if you need one or two Bitstamp endpoints, are comfortable with the `X-Auth-Signature` scheme, and would rather not add a dependency for a handful of HTTP calls.
* **Pick CCXT** if you need more than that: 34 unified capabilities, all 263 Bitstamp endpoints as implicit methods, a rate limiter that is on by default, and a maintained order-book stream — in TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java and Rust.
* **The community client is not a third option for most people.** It is MIT and works, but it has not had a commit since 2022 and has no WebSocket support.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw Bitstamp API / community client** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| Exchanges covered | 104 (Bitstamp is one of them) | Bitstamp only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write; community wrapper is Python |
| Official vendor SDK | not applicable | none published |
| Unified market data + trading API | yes — same method names across every exchange | no — Bitstamp's own payloads |
| Bitstamp capabilities implemented | 34 unified methods, 21 of them `fetch*` | you implement what you need |
| Raw endpoint access | yes — 263 Bitstamp endpoints as implicit methods | yes, it is all you have |
| WebSockets | yes — `watchOrderBook`, `watchTrades`, `watchOrders` | raw `wss://ws.bitstamp.net`; the community Python client has none |
| Built-in rate limiter | yes, on by default (`rateLimit` 75 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus Bitstamp's `reason` payload |
| Signing | handled in `sign()` | 11-part string you concatenate and HMAC yourself |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `BitstampClient` — 142 GitHub stars · 1.6k PyPI installs/month |
| Licence | MIT | MIT (community client) |
| Support | Discord, Telegram, GitHub issues — usually same-day | Bitstamp support; GitHub issues on the community repo |
Figures verified September 2026 against CCXT v4.5.78, Bitstamp's published API documentation, the kmadac/bitstamp-python-client repository and its commit history, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bitstamp()
ticker = exchange.fetch_ticker('BTC/USD')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://www.bitstamp.net/api/v2/ticker/btcusd/')
data = r.json()
print(data['last'], data['volume']) # strings, Bitstamp's own key names
```
Public endpoints are easy on both sides; this one is nearly a tie. The gap opens the moment you need authentication.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bitstamp({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USD', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import hashlib, hmac, time, uuid, requests
from urllib.parse import urlencode
key, secret = '...', '...'
nonce = str(uuid.uuid4())
timestamp = str(int(round(time.time() * 1000)))
payload = {'amount': '0.001', 'price': '60000'}
body = urlencode(payload)
content_type = 'application/x-www-form-urlencoded'
message = ('BITSTAMP ' + key + 'POST' + 'www.bitstamp.net'
+ '/api/v2/buy/btcusd/' + '' + content_type
+ nonce + timestamp + 'v2' + body)
signature = hmac.new(secret.encode(), message.encode(), hashlib.sha256).hexdigest()
r = requests.post('https://www.bitstamp.net/api/v2/buy/btcusd/',
headers={'X-Auth': 'BITSTAMP ' + key,
'X-Auth-Signature': signature,
'X-Auth-Nonce': nonce,
'X-Auth-Timestamp': timestamp,
'X-Auth-Version': 'v2',
'Content-Type': content_type},
data=body)
```
That signing string is eleven concatenated parts in a fixed order — prefix, key, method, host, path, query, content type, nonce, timestamp, version, body — and every one of them has to match what the server reconstructs. It fails with a 403 that does not tell you which part was wrong. CCXT writes it once, in `sign()`, and keeps it right for every one of the 263 endpoints.
Note also the endpoint names. Bitstamp has no single "create order" route: it has `buy/{pair}/`, `buy/market/{pair}/`, `buy/instant/{pair}/`, and the three `sell/` mirrors. CCXT's `create_order` picks the right one from the `type` and `side` you passed.
### Stream an order book [#stream-an-order-book]
CCXT
Raw WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bitstamp()
while True:
orderbook = await exchange.watch_order_book('BTC/USD')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import json, websockets, asyncio
async def main():
async with websockets.connect('wss://ws.bitstamp.net') as ws:
await ws.send(json.dumps({
'event': 'bts:subscribe',
'data': {'channel': 'diff_order_book_btcusd'},
}))
async for raw in ws:
msg = json.loads(raw)
# deltas only — you still need the REST snapshot,
# the buffer, the sequence check and the re-sync
print(msg)
asyncio.run(main())
```
The two snippets look comparable and are not doing the same thing. CCXT returns a **live, merged order book**; the raw socket returns **diff messages**:
| | CCXT | raw stream |
| ------------------------------------------------------------------ | ------------ | ---------- |
| Fetch the REST snapshot and align it with the stream | done for you | your code |
| Buffer deltas arriving during the snapshot fetch, then replay them | done for you | your code |
| Detect sequence gaps and re-sync automatically | done for you | your code |
| Reconnect, re-subscribe and re-seed after a drop | done for you | your code |
| Keep a bounded, depth-limited cache instead of growing forever | done for you | your code |
None of these fail loudly. A hand-rolled book does not throw when it drifts — you find out from a fill you did not expect.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Bitstamp documents a general ceiling of 400 requests per second with a default threshold of 10,000 requests per 10 minutes, and higher limits by agreement. Those are generous numbers, which is exactly why hand-rolled clients blow through them during a backfill. CCXT's token-bucket throttler is on by default with `rateLimit` set to 75 ms for Bitstamp; you write the loop and the library paces it.
### One error hierarchy [#one-error-hierarchy]
Bitstamp returns errors as HTTP status codes plus a JSON body with a `reason` field whose shape varies by endpoint. CCXT maps those onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once and it keeps working on the next venue.
### Precision, rounding and string math [#precision-rounding-and-string-math]
CCXT loads Bitstamp's market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding into a rejected order:
```python
amount = exchange.amount_to_precision('BTC/USD', 0.0012345678)
price = exchange.price_to_precision('BTC/USD', 61234.56789)
```
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures. A Bitstamp integration prototyped in a Python notebook ports to a Go or C# execution service without redesigning the data model — and without writing that signing string a second time in a second language.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 34 unified capabilities, **all 263 endpoints of Bitstamp's API are generated as callable implicit methods**, with signing, nonce handling, rate limiting and error mapping applied:
```python
# POST /api/v2/fees/trading/
fees = exchange.private_post_fees_trading()
# POST /api/v2/websockets_token/
token = exchange.private_post_websockets_token()
```
Bitstamp-specific surface — earn subscriptions, travel-rule contacts, liquidation addresses, `get_max_order_amount` — is reachable without dropping to raw HTTP. Browse them on the [bitstamp implicit API page](/docs/exchanges/bitstamp/implicit-api).
## What the raw API does better [#what-the-raw-api-does-better]
An honest list, because these are real:
* **Bitstamp's documentation is the source of truth, and it is good.** It publishes working signing examples in Python, Java and C++, so a from-scratch integration has a clear starting point. CCXT's unified names are a deliberate abstraction, which is one extra hop when you are debugging against the vendor docs.
* **No dependency, no abstraction.** If your job is "poll one ticker every minute", 15 lines of `requests` is smaller, easier to audit and easier to deploy than a library covering 104 exchanges.
* **Full fidelity to Bitstamp's payloads.** Fields CCXT does not model — and the exact string formatting Bitstamp uses — reach you unchanged. CCXT preserves the raw payload under `info`, but the top-level structure is unified, not literal.
* **CCXT covers three of Bitstamp's WebSocket channels.** `watchOrderBook`, `watchTrades` and `watchOrders` are implemented; other channels Bitstamp publishes are not, so a consumer that needs one of those connects to the socket directly.
If Bitstamp is your only venue and your integration is small and read-only, hand-rolling it is a perfectly reasonable engineering decision.
## Migrating from the raw Bitstamp API to CCXT [#migrating-from-the-raw-bitstamp-api-to-ccxt]
| What you are doing | Bitstamp v2 | CCXT |
| ------------------- | -------------------------------------------- | -------------------------------------------------------------------------------- |
| Symbols | `btcusd` | `'BTC/USD'` |
| Markets | `GET /api/v2/markets/` | `load_markets()` |
| Ticker | `GET /api/v2/ticker/{pair}/` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `GET /api/v2/order_book/{pair}/` | `fetch_order_book()` |
| Candles | `GET /api/v2/ohlc/{pair}/` | `fetch_ohlcv()` |
| Public trades | `GET /api/v2/transactions/{pair}/` | `fetch_trades()` |
| New order | `POST /api/v2/buy/{pair}/` and five siblings | `create_order()` |
| Cancel order | `POST /api/v2/cancel_order/` | `cancel_order()` |
| Cancel all | `POST /api/v2/cancel_all_orders/` | `cancel_all_orders()` |
| Open orders | `POST /api/v2/open_orders/{pair}/` | `fetch_open_orders()` |
| Balance | `POST /api/v2/account_balances/` | `fetch_balance()` |
| My trades | `POST /api/v2/user_transactions/` | `fetch_my_trades()` |
| Streams | `wss://ws.bitstamp.net` channels | `watch_order_book()`, `watch_trades()`, `watch_orders()` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/bitstamp/implicit-api) |
## FAQ [#faq]
**Does Bitstamp have an official SDK?**
No. Bitstamp publishes API documentation with signing examples in Python, Java and C++, but no client library, and its GitHub organisation has no public repositories. The libraries you find are community projects.
**What is the best Python library for the Bitstamp API?**
The two realistic options are CCXT and the community `BitstampClient` package ([kmadac/bitstamp-python-client](https://github.com/kmadac/bitstamp-python-client), MIT, 142 stars, about 1.6k PyPI installs a month). The community client has not had a commit since October 2022 and does not support WebSockets; CCXT covers 34 unified methods, 263 raw endpoints and three streaming methods, and is maintained continuously.
**Does CCXT support Bitstamp WebSockets?**
Yes — `watch_order_book`, `watch_trades` and `watch_orders`, in the same `ccxt` package via `ccxt.pro.bitstamp`. `watch_order_book` returns the same structure as `fetch_order_book`, fully merged, with reconnect and re-seed handled.
**Does Bitstamp have a testnet?**
CCXT does not wire `setSandboxMode(true)` for Bitstamp, so there is no sandbox switch through the library. Test with small live orders on a low-balance account, and see the [Manual](/docs/manual) for safe-testing guidance.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitstamp unified API reference](/docs/exchanges/bitstamp)
* [bitstamp implicit API](/docs/exchanges/bitstamp/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the raw BIT.TEAM API (/docs/comparisons/ccxt-vs-bitteam-api)
[BIT.TEAM](https://bit.team/) is a spot and P2P exchange launched in 2016 and registered in the United Kingdom. It documents a REST API at [bit.team/trade/api/documentation](https://bit.team/trade/api/documentation), and its [developer page](https://bit.team/docs) describes that API as offering "CCXT support, compatible with 3commas, OctoBot, FreqTrade".
That is the whole comparison in one sentence. BIT.TEAM's GitHub organisation, [bitteamgroup](https://github.com/bitteamgroup), has no public repositories, and there is no first-party or widely used community client in any language. So the realistic choice is **raw HTTP against a signed REST API, or [CCXT](/docs/manual)** — and the venue itself points at the second one.
## TL;DR [#tldr]
* **Write it yourself** if you need one or two endpoints, in one language, and would rather not take a dependency.
* **Pick CCXT** for anything larger: 20 unified capabilities, 16 of them `fetch*`, plus all 25 BIT.TEAM endpoints as implicit methods, from TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java and Rust.
* **There is no WebSocket option on either side of this page.** CCXT implements zero `watch*` methods for BIT.TEAM. If you need live data you are polling, whichever route you take.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw BIT.TEAM API** |
| --------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------ |
| Exchanges covered | 104 (BIT.TEAM is one of them) | BIT.TEAM only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write |
| Official vendor SDK | not applicable | none published; the GitHub organisation has no public repositories |
| Unified market data + trading API | yes — same method names across every exchange | no — BIT.TEAM's own payloads |
| BIT.TEAM capabilities implemented | 20 unified methods, 16 of them `fetch*` | you implement what you need |
| Raw endpoint access | yes — 25 BIT.TEAM endpoints as implicit methods | yes, it is all you have |
| WebSockets | no `watch*` methods for BIT.TEAM | not used by CCXT for this venue |
| Built-in rate limiter | yes, on by default | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus BIT.TEAM's payload |
| Testnet / sandbox | not wired for this venue | none documented |
| Licence | MIT | not applicable |
| Support | Discord, Telegram, GitHub issues — usually same-day | BIT.TEAM support and Telegram |
Figures verified September 2026 against CCXT v4.5.78, BIT.TEAM's developer pages, and the bitteamgroup GitHub organisation.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bitteam()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://bit.team/trade/api/pair/btc_usdt')
data = r.json()['result']
print(data) # BIT.TEAM's own keys, strings and units
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure): the same keys, the same types, timestamps in milliseconds, prices and volumes as numbers. Raw, you get BIT.TEAM's field names and your own parsing to write and keep working.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bitteam({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import base64, requests
key, secret = '...', '...'
token = base64.b64encode((key + ':' + secret).encode()).decode()
r = requests.post(
'https://bit.team/trade/api/ccxt/ordercreate',
headers={'Authorization': 'Basic ' + token,
'Content-Type': 'application/json'},
json={'pairId': 2, 'side': 'buy', 'type': 'limit',
'amount': '0.001', 'price': '60000'})
print(r.json())
```
Two things to notice. First, private requests authenticate with HTTP Basic — the base64 of `apiKey:secret` in an `Authorization` header — so the credential travels on every call and there is no nonce or signature to get wrong; the tradeoff is that there is nothing to bind a request to a timestamp either. Second, orders are keyed by BIT.TEAM's numeric `pairId`, not by a symbol. CCXT resolves that from `load_markets()`, so `'BTC/USDT'` is all you pass.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Portability is the whole point [#portability-is-the-whole-point]
BIT.TEAM is a long-tail venue, and long-tail venues are rarely anyone's only venue. Adding a second exchange to a hand-rolled BIT.TEAM integration means a second payload shape, a second symbol convention, a second auth scheme and a second error taxonomy — plus a translation layer of your own so the rest of the system can stay venue-agnostic. That translation layer is what CCXT already is:
```python
for exchange_id in ['bitteam', 'binance', 'kraken', 'okx']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures. A BIT.TEAM integration prototyped in Python moves to a Go or C# service without a second parsing layer.
TypeScript
Python
PHP
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bitteam ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```python
import ccxt
exchange = ccxt.bitteam()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```php
$exchange = new \ccxt\bitteam();
$ticker = $exchange->fetch_ticker('BTC/USDT');
```
```go
exchange := ccxt.NewBitteam(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps BIT.TEAM's failures onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError` and 35 more, all descending from `BaseError`. You catch `ccxt.InsufficientFunds` once instead of matching on a message string that a redeploy can change.
### Precision and string math [#precision-and-string-math]
CCXT loads BIT.TEAM's pair precisions from `trade/api/pairs/precisions` and gives you `amount_to_precision` and `price_to_precision`, backed by the `Precise` string-arithmetic class, so amounts never drift through float rounding into a rejected order.
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
The 20 unified methods are not a ceiling. Every BIT.TEAM endpoint is generated as a callable implicit method, with auth and rate limiting applied:
```python
# GET /trade/api/cmc/summary
summary = exchange.public_get_trade_api_cmc_summary()
# GET /trade/api/transactionsOfUser
txs = exchange.private_get_trade_api_transactionsofuser()
```
Browse them all on the [bitteam implicit API page](/docs/exchanges/bitteam/implicit-api).
## What the raw API does better [#what-the-raw-api-does-better]
An honest list:
* **The endpoints are few and the auth is simple.** Twenty-five routes and HTTP Basic authentication is about as low a barrier as a signed exchange API gets. For a single read-only integration, `requests` plus a base64 header is genuinely less work than reading a library's conventions.
* **The vendor documentation is the only authoritative description.** BIT.TEAM's docs describe its own P2P and asset endpoints in its own terms; CCXT's unified names are an abstraction over them, which is one extra hop when you are cross-checking behaviour.
* **Full fidelity to the payloads.** Fields CCXT does not model reach you unchanged. CCXT keeps the raw response under `info`, but the top-level structure is unified rather than literal.
* **No WebSocket either way, so the usual CCXT Pro advantage does not apply here.** If live data matters more than portability, neither option saves you anything and you will be building a poller regardless.
If BIT.TEAM is your only venue and your integration is small, hand-rolling it is a reasonable call.
## Migrating from the raw BIT.TEAM API to CCXT [#migrating-from-the-raw-bitteam-api-to-ccxt]
| What you are doing | BIT.TEAM REST | CCXT |
| ------------------- | --------------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `btc_usdt` / numeric `pairId` | `'BTC/USDT'` |
| Markets | `GET /trade/api/pairs` | `load_markets()` |
| Ticker | `GET /trade/api/pair/{name}` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `GET /trade/api/orderbooks/{symbol}` | `fetch_order_book()` |
| Candles | `GET /api/tw/history/{pairName}/{resolution}` | `fetch_ohlcv()` |
| Public trades | `GET /trade/api/trades` | `fetch_trades()` |
| New order | `POST /trade/api/ccxt/ordercreate` | `create_order()` |
| Cancel order | `POST /trade/api/ccxt/cancelorder` | `cancel_order()` |
| Open orders | `GET /trade/api/ccxt/ordersOfUser` | `fetch_open_orders()` |
| Order by id | `GET /trade/api/ccxt/order/{id}` | `fetch_order()` |
| Balance | `GET /trade/api/ccxt/balance` | `fetch_balance()` |
| My trades | `GET /trade/api/ccxt/tradesOfUser` | `fetch_my_trades()` |
| Transactions | `GET /trade/api/transactionsOfUser` | `fetch_deposits_withdrawals()` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/bitteam/implicit-api) |
## FAQ [#faq]
**Does BIT.TEAM have an official SDK?**
No. The bitteamgroup GitHub organisation has no public repositories, and no first-party client library is published for any language. BIT.TEAM's own developer page names CCXT as the supported integration path, alongside 3commas, OctoBot and Freqtrade.
**Does CCXT support BIT.TEAM WebSockets?**
No. CCXT implements zero `watch*` methods for BIT.TEAM, so `ccxt.pro.bitteam` is not available. Live data means polling `fetch_order_book` or `fetch_trades` on a timer.
**How does BIT.TEAM authenticate API requests?**
With HTTP Basic authentication: the base64 encoding of `apiKey:secret` in an `Authorization: Basic …` header. CCXT builds that header for you and applies it to every private endpoint, including the implicit ones.
**Can I still call BIT.TEAM-specific endpoints through CCXT?**
Yes — all 25 of them, as [implicit methods](/docs/exchanges/bitteam/implicit-api), with authentication and rate limiting applied. Choosing CCXT does not cut you off from anything the venue exposes.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitteam unified API reference](/docs/exchanges/bitteam)
* [bitteam implicit API](/docs/exchanges/bitteam/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the raw BitTrade API (/docs/comparisons/ccxt-vs-bittrade-api)
[BitTrade](https://www.bittrade.co.jp) is a Japanese registered exchange, formerly Huobi Japan, and its API is documented in detail at [api-doc.bittrade.co.jp](https://api-doc.bittrade.co.jp/). The documentation is thorough — signature protocol v2, per-endpoint rate limits, public and private WebSocket feeds. What it does not include is a client library.
BitTrade's GitHub organisation, [BitTrade-Inc](https://github.com/BitTrade-Inc), has exactly one public repository: [BitTrade-api-docs](https://github.com/BitTrade-Inc/BitTrade-api-docs), described as "Official Documentation for the BitTrade APIs", last updated in April 2024. There is no first-party SDK in any language.
So the question is not which SDK to use. It is **whether you write the signing, the GZIP socket and the reconnect logic yourself, or use [CCXT](/docs/manual), which already has.**
## TL;DR [#tldr]
* **Write it yourself** if you need a couple of public endpoints and nothing else — the market data routes are unauthenticated and plain JSON.
* **Pick CCXT** as soon as you need private endpoints or streaming: 31 unified capabilities, 110 BitTrade endpoints as implicit methods, and four `watch*` methods, from TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java and Rust.
* **BitTrade's WebSocket feed is GZIP-compressed and requires a bidirectional heartbeat.** That is two more things to get right in a hand-rolled client, and two things CCXT does not make you think about.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw BitTrade API** |
| --------------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------- |
| Exchanges covered | 104 (BitTrade is one of them) | BitTrade only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write |
| Official vendor SDK | not applicable | none — the only public repository is documentation |
| Unified market data + trading API | yes — same method names across every exchange | no — BitTrade's own payloads |
| BitTrade capabilities implemented | 31 unified methods, 19 of them `fetch*` | you implement what you need |
| Raw endpoint access | yes — 110 BitTrade endpoints as implicit methods | yes, it is all you have |
| WebSockets | yes — `watchTicker`, `watchTrades`, `watchOrderBook`, `watchOHLCV` | raw sockets, GZIP framing and heartbeats are yours |
| Built-in rate limiter | yes, on by default (`rateLimit` 100 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | BitTrade `err-code` strings |
| Testnet / sandbox | not wired for this venue | none documented |
| Licence | MIT | not applicable |
| Support | Discord, Telegram, GitHub issues — usually same-day | BitTrade support; the docs repository |
Figures verified September 2026 against CCXT v4.5.78, BitTrade's published API reference at api-doc.bittrade.co.jp, and the BitTrade-Inc GitHub organisation.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bittrade()
ticker = exchange.fetch_ticker('BTC/JPY')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://api-cloud.bittrade.co.jp/market/detail/merged',
params={'symbol': 'btcjpy'})
tick = r.json()['tick']
print(tick['close'], tick['amount']) # BitTrade's own key names
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — `last`, `bid`, `ask`, `baseVolume`, `quoteVolume`, a millisecond `timestamp` and an ISO `datetime` — identical in shape to what you get from any of the other 103 exchanges.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.bittrade({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/JPY', 'limit', 'buy', 0.001, 9000000)
print(order['id'], order['status'])
```
```python
import base64, hashlib, hmac, json, requests
from datetime import datetime, timezone
from urllib.parse import urlencode, quote
key, secret = '...', '...'
host, path = 'api-cloud.bittrade.co.jp', '/v1/order/orders/place'
params = {
'AccessKeyId': key,
'SignatureMethod': 'HmacSHA256',
'SignatureVersion': '2',
'Timestamp': datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%S'),
}
canonical = urlencode(sorted(params.items()), quote_via=quote)
payload = '\n'.join(['POST', host, path, canonical])
signature = base64.b64encode(
hmac.new(secret.encode(), payload.encode(), hashlib.sha256).digest()).decode()
r = requests.post(
'https://' + host + path + '?' + canonical + '&Signature=' + quote(signature),
headers={'Content-Type': 'application/json'},
data=json.dumps({'account-id': '...', 'symbol': 'btcjpy',
'type': 'buy-limit', 'amount': '0.001', 'price': '9000000'}))
print(r.json())
```
BitTrade's signature protocol v2 signs four newline-joined parts — method, lowercase host, request path, and the ASCII-sorted URL-encoded query string — then base64-encodes the HMAC-SHA256 and appends it as a query parameter. The sort order and the encoding of the encoded signature are both easy to get subtly wrong, and the failure is a rejection that does not say which part was at fault. There is also an `account-id` to look up before you can place anything. CCXT does all of that in `sign()` and `fetch_accounts()`.
### Stream an order book [#stream-an-order-book]
CCXT
Raw WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bittrade()
while True:
orderbook = await exchange.watch_order_book('BTC/JPY')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import gzip, json, asyncio, websockets
async def main():
async with websockets.connect('wss://api-cloud.bittrade.co.jp/ws') as ws:
await ws.send(json.dumps({'sub': 'market.btcjpy.mbp.150', 'id': '1'}))
async for raw in ws:
msg = json.loads(gzip.decompress(raw)) # every frame is GZIP
if 'ping' in msg:
await ws.send(json.dumps({'pong': msg['ping']})) # or you are dropped
continue
print(msg)
asyncio.run(main())
```
Every frame on BitTrade's public feed is GZIP-compressed, and the server sends `ping` messages that you must answer with a matching `pong` or the connection is closed. On top of that, a production book still needs the snapshot, the delta buffer, the sequence check and the reconnect-and-re-seed path:
| | CCXT | raw stream |
| ------------------------------------------------ | ------------ | ---------- |
| GZIP decompression on every frame | done for you | your code |
| Ping/pong heartbeat with miss detection | done for you | your code |
| Merge deltas into a live book | done for you | your code |
| Reconnect, re-subscribe and re-seed after a drop | done for you | your code |
| Bounded caches for trades and candles | done for you | your code |
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
BitTrade documents 10 requests per second per IP on public endpoints and 10 per second per API key on signed ones, with tighter per-endpoint limits in places (match results allows 10 calls per 2 seconds), plus WebSocket limits of 100 new connections per second per IP and a maximum of 10 concurrent private connections per API key. CCXT's token-bucket throttler is on by default with `rateLimit` set to 100 ms for BitTrade, so a backfill loop paces itself rather than earning a block.
### One error hierarchy [#one-error-hierarchy]
BitTrade returns errors as `err-code` strings inside a 200-status body — the sort of thing a naive client treats as success. CCXT checks the status field, maps the codes onto a [typed exception tree](/docs/manual#error-handling), and raises `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError` or one of 36 others, all descending from `BaseError`.
### Precision and string math [#precision-and-string-math]
CCXT loads BitTrade's symbol precisions and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class. JPY pairs have large prices and small amounts — exactly the shape where float rounding produces a rejected order.
```python
amount = exchange.amount_to_precision('BTC/JPY', 0.0012345678)
price = exchange.price_to_precision('BTC/JPY', 9123456.789)
```
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures — so the v2 signing scheme is implemented once for you rather than once per language in your codebase.
TypeScript
Python
PHP
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bittrade ();
const ticker = await exchange.fetchTicker ('BTC/JPY');
```
```python
import ccxt
exchange = ccxt.bittrade()
ticker = exchange.fetch_ticker('BTC/JPY')
```
```php
$exchange = new \ccxt\bittrade();
$ticker = $exchange->fetch_ticker('BTC/JPY');
```
```go
exchange := ccxt.NewBittrade(nil)
ticker, err := exchange.FetchTicker("BTC/JPY")
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 31 unified capabilities, **all 110 BitTrade endpoints are generated as callable implicit methods**, with v2 signing, rate limiting and error mapping applied:
```python
# GET /v2/account/ledger
ledger = exchange.v2_private_get_account_ledger()
# GET /v2/etp/reference
etp = exchange.v2_private_get_etp_reference()
```
BitTrade's sub-account management, C2C lending, algo orders and ETP creation and redemption routes are all reachable this way. Browse them on the [bittrade implicit API page](/docs/exchanges/bittrade/implicit-api).
## What the raw API does better [#what-the-raw-api-does-better]
An honest list, because these are real:
* **The documentation is detailed and authoritative.** BitTrade inherited a mature Huobi-lineage API reference, with per-endpoint rate limits, error-code tables and worked signing examples. When behaviour is in question, that reference is the answer; CCXT's unified names are one hop away from it.
* **Private WebSocket channels.** BitTrade publishes an authenticated feed at `wss://api-cloud.bittrade.co.jp/ws/v2` for order and account updates. CCXT's four `watch*` methods for BitTrade cover public market data only, so a live private order stream is something you build against the raw socket.
* **Full fidelity to the payloads.** Fields CCXT does not model — and BitTrade's own units and formatting — reach you unchanged. CCXT preserves the raw response under `info`, but the top-level structure is unified rather than literal.
* **No dependency for a read-only job.** Polling one public ticker is a dozen lines of `requests` and no library at all.
If you only need public market data from BitTrade in one language, hand-rolling it is a reasonable decision.
## Migrating from the raw BitTrade API to CCXT [#migrating-from-the-raw-bittrade-api-to-ccxt]
| What you are doing | BitTrade REST | CCXT |
| ------------------- | ----------------------------------------- | -------------------------------------------------------------------------------- |
| Symbols | `btcjpy` | `'BTC/JPY'` |
| Markets | `GET /v1/common/symbols` | `load_markets()` |
| Ticker | `GET /market/detail/merged` | `fetch_ticker()` |
| All tickers | `GET /market/tickers` | `fetch_tickers()` |
| Order book | `GET /market/depth` | `fetch_order_book()` |
| Candles | `GET /market/history/kline` | `fetch_ohlcv()` |
| Public trades | `GET /market/history/trade` | `fetch_trades()` |
| Accounts | `GET /v1/account/accounts` | `fetch_accounts()` |
| New order | `POST /v1/order/orders/place` | `create_order()` |
| Cancel order | `POST /v1/order/orders/{id}/submitcancel` | `cancel_order()` |
| Open orders | `GET /v1/order/openOrders` | `fetch_open_orders()` |
| Balance | `GET /v1/account/accounts/{id}/balance` | `fetch_balance()` |
| My trades | `GET /v1/order/matchresults` | `fetch_my_trades()` |
| Streams | `wss://api-cloud.bittrade.co.jp/ws`, GZIP | `watch_ticker()`, `watch_trades()`, `watch_order_book()`, `watch_ohlcv()` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/bittrade/implicit-api) |
## FAQ [#faq]
**Does BitTrade have an official SDK?**
No. BitTrade's GitHub organisation publishes one public repository and it contains documentation, not code. There is no first-party client library for Python, JavaScript, Java, Go or any other language, so CCXT or your own HTTP client are the realistic options.
**Does CCXT support BitTrade WebSockets?**
Yes, for public market data: `watch_ticker`, `watch_trades`, `watch_order_book` and `watch_ohlcv` via `ccxt.pro.bittrade`. GZIP decompression and the ping/pong heartbeat are handled inside the library. BitTrade's authenticated `ws/v2` order stream is not currently exposed as a `watch*` method.
**How does BitTrade sign API requests?**
Signature protocol v2: HMAC-SHA256 over the newline-joined HTTP method, lowercase host, request path and ASCII-sorted URL-encoded query string, base64-encoded and passed as a `Signature` query parameter alongside `AccessKeyId`, `SignatureMethod`, `SignatureVersion` and `Timestamp`. CCXT builds this for every private endpoint including the implicit ones.
**Can I still call BitTrade-specific endpoints through CCXT?**
Yes — all 110 of them, as [implicit methods](/docs/exchanges/bittrade/implicit-api), including sub-account management, algo orders, C2C and ETP routes, with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bittrade unified API reference](/docs/exchanges/bittrade)
* [bittrade implicit API](/docs/exchanges/bittrade/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the official Bitvavo SDKs (/docs/comparisons/ccxt-vs-bitvavo-api)
[Bitvavo](https://bitvavo.com/) is a Dutch exchange with a well-documented API at [docs.bitvavo.com](https://docs.bitvavo.com/), and it is one of the few venues its size that ships first-party client libraries. Two of them are maintained: [python-bitvavo-api](https://github.com/bitvavo/python-bitvavo-api) and [node-bitvavo-api](https://github.com/bitvavo/node-bitvavo-api), both ISC-licensed. Three more once existed and are now marked Archived on GitHub: the Java, Go and PHP wrappers.
That shapes the decision. If you write Python or JavaScript, you have a real vendor SDK to weigh against [CCXT](/docs/manual). If you write Java, Go, C# or PHP, Bitvavo's first-party option is either archived or was never there — and CCXT covers all of them.
## TL;DR [#tldr]
* **Pick the official SDK** if you are on Python or Node, Bitvavo is your only venue, and you want a client whose method names are Bitvavo's own — `ticker24h`, `placeOrder`, `getRemainingLimit` — mapping one-for-one onto their docs.
* **Pick CCXT** if you are on any other language, or if Bitvavo is one of several venues: 74 unified capabilities, 33 of them `fetch*`, 17 `watch*` streaming methods and all 41 Bitvavo endpoints as implicit methods, in eight languages.
* **The archived wrappers are the argument.** Bitvavo's Java, Go and PHP clients are read-only repositories now; the same Bitvavo integration in those languages ships in CCXT and is maintained alongside 103 other venues.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Bitvavo SDKs** |
| --------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Bitvavo is one of them) | Bitvavo only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python and Node maintained; Java, Go and PHP wrappers archived |
| Packages to install | 1 (`ccxt`) | 1 per language (`python-bitvavo-api`, `bitvavo` on npm) |
| Unified market data + trading API | yes — same method names across every exchange | no — Bitvavo's own request/response shapes |
| Bitvavo capabilities implemented | 74 unified methods, 33 of them `fetch*` | full Bitvavo API surface |
| Raw endpoint access | yes — 41 Bitvavo endpoints as implicit methods | yes, it is the whole product |
| WebSockets | yes — 17 `watch*` methods, same shapes as `fetch*` | yes — callback-based socket client |
| Programming model | `await` a method, get a value back | callbacks registered on a socket object |
| Built-in rate limiter | yes, on by default (`rateLimit` 60 ms ≈ 1000 weight/min) | `getRemainingLimit()` — you decide when to stop |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Bitvavo error codes |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `python-bitvavo-api` 44 stars · 7.8k PyPI installs/month; `bitvavo` on npm 24 stars · 1.2k installs/month |
| Licence | MIT | ISC |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues, Bitvavo support |
Figures verified September 2026 against CCXT v4.5.78, the bitvavo GitHub organisation's repository listing and READMEs, the npm registry, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
python-bitvavo-api
```python
import ccxt
exchange = ccxt.bitvavo()
ticker = exchange.fetch_ticker('BTC/EUR')
print(ticker['last'], ticker['baseVolume'])
```
```python
from python_bitvavo_api.bitvavo import Bitvavo
bitvavo = Bitvavo({'APIKEY': '...', 'APISECRET': '...'})
socket = bitvavo.newWebsocket()
def on_ticker(response):
for market in response:
if market['market'] == 'BTC-EUR':
print(market['bid'], market['ask'])
socket.ticker24h({}, on_ticker)
```
The SDK's documented quickstart is callback-shaped: you create a socket, hand it a function, and your logic runs when the response arrives. CCXT is value-shaped — you `await` a method and get a [unified ticker structure](/docs/manual#ticker-structure) back, with the same keys and units you get from every other exchange.
### Place a limit order [#place-a-limit-order]
CCXT
python-bitvavo-api
```python
import ccxt
exchange = ccxt.bitvavo({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/EUR', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from python_bitvavo_api.bitvavo import Bitvavo
bitvavo = Bitvavo({'APIKEY': '...', 'APISECRET': '...'})
socket = bitvavo.newWebsocket()
def on_order(response):
print(response)
socket.placeOrder('BTC-EUR', 'buy', 'limit',
{'amount': '0.001', 'price': '60000'},
on_order)
```
Note the market id: Bitvavo uses `BTC-EUR`, CCXT normalises to `'BTC/EUR'` and maps back to the venue id. And note the optional-parameter convention — Bitvavo's SDKs pass required arguments positionally and everything else in a dictionary; CCXT puts venue-specific extras in `params`, with the common ones promoted to named arguments that work the same way on every exchange.
### Stream an order book [#stream-an-order-book]
CCXT
node-bitvavo-api
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bitvavo()
while True:
orderbook = await exchange.watch_order_book('BTC/EUR')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```javascript
const bitvavo = require('bitvavo')()
bitvavo.websocket.subscriptionBook('BTC-EUR', (book) => {
console.log(book.bids[0], book.asks[0])
})
```
Both give you a maintained local book — Bitvavo's SDKs do handle the snapshot-plus-deltas reconciliation for you, which is more than most vendor clients manage. The difference is shape, not correctness: CCXT's `watch_order_book` returns the same structure as `fetch_order_book`, so swapping a polling loop for a stream is a one-word change and the code downstream is untouched.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Four of eight languages have no maintained first-party client [#four-of-eight-languages-have-no-maintained-first-party-client]
Bitvavo's Java, Go and PHP wrappers are archived on GitHub — read-only, no further commits — and there has never been a C#/.NET one. CCXT covers Bitvavo in all eight of its targets from a single TypeScript source, so a Bitvavo integration is available and maintained in the language your execution service is actually written in:
TypeScript
Python
PHP
C#
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bitvavo ();
const ticker = await exchange.fetchTicker ('BTC/EUR');
```
```python
import ccxt
exchange = ccxt.bitvavo()
ticker = exchange.fetch_ticker('BTC/EUR')
```
```php
$exchange = new \ccxt\bitvavo();
$ticker = $exchange->fetch_ticker('BTC/EUR');
```
```csharp
var exchange = new ccxt.bitvavo();
var ticker = await exchange.FetchTicker("BTC/EUR");
```
```go
exchange := ccxt.NewBitvavo(nil)
ticker, err := exchange.FetchTicker("BTC/EUR")
```
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Bitvavo meters by weight: 1000 points per IP or per API key per minute, with the weight of each endpoint published in its docs, and a ban when you exceed it. The official SDKs expose `getRemainingLimit()` so you can read your remaining budget — useful, but it is still your code that has to decide when to slow down.
CCXT encodes the weights in the exchange definition and ships a token-bucket throttler that is **on by default**, with `rateLimit` set to 60 ms for Bitvavo, which is the same 1000 requests per minute expressed as pacing rather than as a budget you watch. You write the loop; the library spaces the calls.
### Two programming models [#two-programming-models]
This is the difference you feel on day one. The official SDKs are callback-based: you register a function and hand control to the socket. CCXT is pull-based: you `await` a method and get a value, so streaming code sits in ordinary control flow next to the REST code and composes with it. Neither is better in the abstract — push suits a long-running collector, pull suits a strategy that reads a book, decides, and sends an order in the same function.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Bitvavo's error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once and it keeps working when you add a second exchange.
### Precision, rounding and string math [#precision-rounding-and-string-math]
CCXT loads Bitvavo's market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding into a rejected order:
```python
amount = exchange.amount_to_precision('BTC/EUR', 0.0012345678)
price = exchange.price_to_precision('BTC/EUR', 61234.56789)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 74 unified capabilities, **all 41 Bitvavo endpoints are generated as callable implicit methods**, with signing, rate limiting and error mapping applied:
```python
# GET /v2/account/fees
fees = exchange.private_get_account_fees()
# GET /v2/subaccounts
subaccounts = exchange.private_get_subaccounts()
```
Bitvavo's staking balance, sub-account transfers and institutional sub-account routes are reachable without leaving the library. Browse them on the [bitvavo implicit API page](/docs/exchanges/bitvavo/implicit-api).
## What the official Bitvavo SDKs do better [#what-the-official-bitvavo-sdks-do-better]
An honest list, because these are real:
* **One-to-one mapping with Bitvavo's docs.** `ticker24h`, `placeOrder`, `getRemainingLimit`, `newWebsocket` — the method names are the ones in the API reference, so there is no translation step when you are debugging against the vendor documentation. CCXT's unified names are a deliberate abstraction.
* **`getRemainingLimit()` is genuinely useful.** Reading your remaining weight budget directly is something CCXT's throttler abstracts away; if you want to make scheduling decisions based on how much budget is left, the SDK hands you the number.
* **New Bitvavo features land there first.** A new endpoint or parameter shows up in Bitvavo's own wrapper before it is modelled as a *unified* CCXT method. CCXT's implicit API closes most of that gap immediately, but a unified wrapper can lag.
* **A smaller install for a single-venue app.** If all you do is read Bitvavo tickers from a Node service, one small ISC-licensed package is less code than a library covering 104 exchanges.
* **Bitvavo's Market Data Pro WebSocket API.** Bitvavo documents a separate low-latency full-fidelity market data feed alongside the exchange WebSocket API; if that is what you need, work directly against Bitvavo's own documentation for it.
If Bitvavo is your only venue and you write Python or Node, the official SDK is a defensible choice.
## Migrating from the Bitvavo SDKs to CCXT [#migrating-from-the-bitvavo-sdks-to-ccxt]
| What you are doing | Bitvavo SDK | CCXT |
| ------------------- | -------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `'BTC-EUR'` | `'BTC/EUR'` |
| Markets | `markets({})` | `load_markets()` |
| Ticker | `ticker24h({})` / `tickerPrice({})` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `book('BTC-EUR', {})` | `fetch_order_book()` |
| Candles | `candles('BTC-EUR', '1h', {})` | `fetch_ohlcv()` |
| Public trades | `publicTrades('BTC-EUR', {})` | `fetch_trades()` |
| New order | `placeOrder(market, side, type, body)` | `create_order()` |
| Edit order | `updateOrder(...)` | `edit_order()` |
| Cancel order | `cancelOrder(market, orderId)` | `cancel_order()` |
| Open orders | `ordersOpen({})` | `fetch_open_orders()` |
| Balance | `balance({})` | `fetch_balance()` |
| My trades | `trades('BTC-EUR', {})` | `fetch_my_trades()` |
| Streams | `newWebsocket()` plus callbacks | `watch_*` on `ccxt.pro.bitvavo` |
| Rate-limit budget | `getRemainingLimit()` | throttler on by default; `exchange.rateLimit` |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/bitvavo/implicit-api) |
## FAQ [#faq]
**Does Bitvavo have an official Python SDK?**
Yes — [python-bitvavo-api](https://github.com/bitvavo/python-bitvavo-api), ISC-licensed, about 7.8k PyPI installs a month. There is also an official Node SDK published to npm as `bitvavo`. The Java, Go and PHP wrappers Bitvavo once published are archived on GitHub.
**Is there an official Bitvavo SDK for Java, Go, C# or PHP?**
Not a maintained one. `java-bitvavo-api` and `go-bitvavo-api` are archived, `php-bitvavo-api` is archived and marked deprecated, and there is no C#/.NET wrapper. CCXT supports Bitvavo in all of those languages with the same unified API it uses everywhere else.
**Do I need CCXT Pro separately for Bitvavo WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.bitvavo` and the 17 `watch*` methods — `watch_ticker`, `watch_tickers`, `watch_bids_asks`, `watch_trades`, `watch_ohlcv`, `watch_order_book`, `watch_orders` and `watch_my_trades`.
**How does CCXT handle Bitvavo's weight-based rate limit?**
It paces requests with a token-bucket throttler that is on by default, with `rateLimit` set to 60 ms — 1000 requests per minute, matching Bitvavo's documented budget. You can still read and adjust `exchange.rateLimit`, or turn the throttler off with `enableRateLimit = False` if you are metering yourself.
**Can I still call Bitvavo-specific endpoints through CCXT?**
Yes — all 41 of them, as [implicit methods](/docs/exchanges/bitvavo/implicit-api), with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bitvavo unified API reference](/docs/exchanges/bitvavo)
* [bitvavo implicit API](/docs/exchanges/bitvavo/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs Blankly (/docs/comparisons/ccxt-vs-blankly)
[Blankly](https://github.com/blankly-finance/blankly) is a Python framework whose GitHub description reads "Easily build, backtest and deploy your algo in just a few lines of code. Trade stocks, cryptos, and forex across exchanges w/ one package." [CCXT](/docs/manual) is a connectivity library: it reaches exchanges and normalises what comes back, and stops there.
They overlap on one layer — placing an order on more than one venue through one interface. The question that decides between them is **whether you need a strategy runtime and a backtester, or exchange coverage.**
## TL;DR [#tldr]
* **Pick Blankly** if you want a backtest engine, paper trading, a scheduling loop and stocks or forex alongside crypto, all in Python, and its venue list covers what you trade.
* **Pick CCXT** if you need exchange coverage — 104 venues, 76 of them with WebSocket — in any of eight languages, and you already have (or intend to write) your own strategy layer.
* **CCXT does not backtest and does not paper trade.** That is not an omission a future release fixes; it is outside what the library is. If backtesting is the reason you are reading this, that is the finding.
## At a glance [#at-a-glance]
| | **CCXT** | **Blankly** |
| ----------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------- |
| What it is | connectivity + normalisation library | strategy framework with a backtest engine |
| Crypto exchanges | 104 REST, 76 with WebSocket | Coinbase Pro, Binance, Binance Futures, KuCoin, OKX, FTX, FTX Futures, Kraken (in development) |
| Non-crypto venues | none | Alpaca (US equities), OANDA (forex) |
| Prediction markets | 7 venues in `ccxt.prediction` | none |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust | Python (README lists 3.7–3.10 as tested) |
| Backtesting | **no** | **yes** — event-driven, with custom event streams |
| Paper trading | no — exchange sandboxes via `setSandboxMode(true)` | yes — `PaperTrade` wrapper on any exchange |
| Strategy runtime | no — you write the loop | yes — `Strategy` + `add_price_event`, scheduling and warm-up handled |
| Indicators | none | `blankly.indicators` |
| Unified order entry | yes — `create_order` across every venue | yes — `interface.market_order` / `limit_order` |
| Raw endpoint access | yes — every venue endpoint as an implicit method (808 for Binance) | `interface.get_calls()` returns the underlying client |
| Built-in rate limiter | yes, per-endpoint weights, on by default | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Python exceptions, not a unified hierarchy |
| Licence | **MIT** | **LGPL-3.0** |
| Latest release | continuous, v4.5.78 | `1.18.25b0` on PyPI, uploaded 23 July 2023 |
| Last commit on default branch | active daily | 30 December 2024 ("support more python versions") |
| Popularity | 43.8k GitHub stars · 4.7M PyPI + 494k npm installs/month | 2.5k GitHub stars · 12k PyPI installs/month |
| Support | Discord, Telegram, GitHub — usually same-day | Discord, GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the blankly-finance/blankly repository (2,474 stars, 312 forks, LGPL-3.0, not archived), its README support table and `setup.py`, its PyPI release history, and install counts from npm and PyPI.
One observation about that support table, stated as a fact rather than a judgement: it still lists **FTX** and **FTX Futures** among supported venues, and `blankly/__init__.py` still exports `FTX` and `FTXFutures`. FTX ceased operating in November 2022.
## The same job, written both ways [#the-same-job-written-both-ways]
### Place a market order [#place-a-market-order]
CCXT
Blankly
```python
import ccxt
exchange = ccxt.binance({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'market', 'buy', 0.001)
print(order['id'], order['status'], order['filled'])
```
```python
from blankly import Alpaca, CoinbasePro
stocks = Alpaca()
crypto = CoinbasePro()
stocks.interface.market_order('AAPL', 'buy', 1)
crypto.interface.market_order('BTC-USD', 'buy', 1)
```
The Blankly snippet is doing something CCXT cannot: buying a share of AAPL and a Bitcoin position through the same call. The CCXT snippet is doing something Blankly cannot: that same line runs unchanged against any of 104 exchanges, and returns a [unified order structure](/docs/manual#order-structure) with the same keys on each.
### An RSI strategy [#an-rsi-strategy]
This is the comparison that matters, so it is worth showing honestly rather than pretending the two produce similar code.
CCXT
Blankly
```python
import ccxt
import time
exchange = ccxt.coinbase({'apiKey': '...', 'secret': '...'})
holding = False
while True:
candles = exchange.fetch_ohlcv('BTC/USD', '1d', limit=150)
closes = [c[4] for c in candles]
rsi = my_rsi(closes) # you supply this
if rsi < 30 and not holding:
exchange.create_order('BTC/USD', 'market', 'buy', 0.001)
holding = True
elif rsi > 70 and holding:
exchange.create_order('BTC/USD', 'market', 'sell', 0.001)
holding = False
time.sleep(exchange.rateLimit / 1000)
```
```python
import blankly
def price_event(price, symbol, state: blankly.StrategyState):
state.variables['history'].append(price)
rsi = blankly.indicators.rsi(state.variables['history'])
if rsi[-1] < 30 and not state.variables['owns_position']:
buy = blankly.trunc(state.interface.cash / price, 2)
state.interface.market_order(symbol, side='buy', size=buy)
state.variables['owns_position'] = True
def init(symbol, state: blankly.StrategyState):
state.variables['history'] = state.interface.history(
symbol, to=150, return_as='deque', resolution=state.resolution)['close']
state.variables['owns_position'] = False
strategy = blankly.Strategy(blankly.CoinbasePro())
strategy.add_price_event(price_event, symbol='BTC-USD', resolution='1d', init=init)
results = strategy.backtest(to='1y', initial_values={'USD': 10000})
```
Blankly supplies the RSI, the warm-up history, the scheduler, the position state and — the part with no CCXT equivalent at all — `strategy.backtest(to='1y')`, which runs the identical `price_event` function over a year of history and returns metrics. Switching to live is `strategy.start()`.
The CCXT version has none of that and never will. What it has instead is `ccxt.coinbase` swapped for any of 103 other ids on the first line, and the same code in Go or C# if the execution service is not written in Python.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Coverage versus runtime [#coverage-versus-runtime]
This is the whole comparison. Blankly's README support table lists ten venues plus a keyless backtesting source, with three US brokerages marked as planned. CCXT lists 104 exchanges with REST support and 76 with WebSocket, plus 7 prediction-market venues.
If the venue you trade is not in Blankly's table, no amount of framework quality helps. If the framework feature you need is a backtester, no amount of CCXT's coverage helps. Neither library is a substitute for the other on the axis where it is weak.
### Symbols and structures [#symbols-and-structures]
Blankly passes venue-shaped symbols through — `'BTC-USD'` on Coinbase Pro, `'AAPL'` on Alpaca. CCXT uses [unified symbols](/docs/manual#symbols-and-market-ids): `'BTC/USDT'` for spot, `'BTC/USDT:USDT'` for a linear swap, resolved to the venue's own market id at call time. On one venue the difference is cosmetic. Across five it is the difference between a symbol map you maintain and one you do not.
The same applies below the symbol: CCXT returns a fixed [order](/docs/manual#order-structure), [ticker](/docs/manual#ticker-structure) and [order book](/docs/manual#order-book-structure) structure with the same keys, types and units on every exchange, and does its precision and rounding in string arithmetic so a float never eats a satoshi.
### Eight languages, one API [#eight-languages-one-api]
Blankly is Python. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with identical method names and return structures, so research in Python and execution in Go share a data model rather than a translation layer.
### The licence [#the-licence]
Blankly is **LGPL-3.0**; CCXT is **MIT**. LGPL is far less demanding than AGPL — linking an unmodified library into a proprietary program is the case it is designed to permit — but modifications to Blankly itself carry a reciprocity obligation, and the practical shape of that is a question for your counsel rather than for a docs page. MIT does not raise the question.
### Release cadence [#release-cadence]
State the observable facts and draw your own conclusion. Blankly's most recent commit on `main` is dated 30 December 2024; its most recent PyPI release, `1.18.25b0`, was uploaded on 23 July 2023; its README lists Python 3.7 through 3.10 as the tested versions. CCXT ships releases continuously — v4.5.78 is current as this page was written — because exchange APIs change weekly and a connectivity library that does not track them stops connecting.
For a backtester this matters less than it does for live connectivity: a backtest engine is mostly independent of what the venues did last Tuesday.
## What Blankly does better [#what-blankly-does-better]
* **It backtests, and that is a large piece of software.** An event-driven engine that replays your `price_event` over historical prices, values the account as it goes, and returns metrics — plus `add_custom_events` for replaying non-price streams such as a JSON file of tweets alongside the prices. The project documents its simulation-accuracy engineering separately in `blankly/BACKTESTING_ENGINEERING.md`. CCXT has nothing in this area and is not trying to.
* **It paper trades.** `PaperTrade` wraps any supported exchange with a simulated account, so the same strategy code runs against fake money on a real feed. CCXT's equivalent is whatever sandbox the venue itself offers, via `setSandboxMode(true)`, and many venues offer none.
* **Stocks and forex, not just crypto.** Alpaca for US equities and OANDA for forex sit behind the same `interface` as the crypto venues. CCXT covers cryptocurrency exchanges and prediction markets only, so a cross-asset book is out of scope for it entirely.
* **It gives you the loop.** `blankly init` scaffolds a project; `Strategy` plus `add_price_event` handles scheduling, resolution, warm-up history and per-symbol state; `blankly.indicators` supplies the indicators. With CCXT all of that is yours to write.
* **One line from backtest to live.** `strategy.backtest(to='1y')` becomes `strategy.start()` with no other change, which is a genuinely useful property and one most frameworks get wrong.
If you are writing a Python strategy against venues Blankly already supports, want a backtester you did not write, and value cross-asset reach over crypto-venue breadth, Blankly is the better choice.
## Migrating from Blankly to CCXT [#migrating-from-blankly-to-ccxt]
| What you are doing | Blankly | CCXT |
| ----------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| Construct a client | `blankly.Binance()` (keys from `keys.json`) | `ccxt.binance({'apiKey': '...', 'secret': '...'})` |
| Symbols | `'BTC-USD'`, `'AAPL'` — venue-shaped | `'BTC/USDT'` spot, `'BTC/USDT:USDT'` linear swap |
| List markets | `interface.get_products()` | `load_markets()` |
| Last price | `interface.get_price(symbol)` | `fetch_ticker(symbol)['last']` |
| Candles | `interface.history(symbol, to=..., resolution=...)` | `fetch_ohlcv(symbol, timeframe, since, limit)` |
| Market order | `interface.market_order(symbol, side, size)` | `create_order(symbol, 'market', side, amount)` |
| Limit order | `interface.limit_order(symbol, side, price, size)` | `create_order(symbol, 'limit', side, amount, price)` |
| Stop loss / take profit | `interface.stop_loss_order()` / `take_profit_order()` | `create_order(..., params={'triggerPrice': ...})` — see [trigger orders](/docs/manual#trigger-order) |
| Cancel | `interface.cancel_order(symbol, order_id)` | `cancel_order(id, symbol)` |
| Open orders | `interface.get_open_orders(symbol)` | `fetch_open_orders(symbol)` |
| One order | `interface.get_order(symbol, order_id)` | `fetch_order(id, symbol)` |
| Balance | `interface.get_account()` / `interface.cash` | `fetch_balance()` |
| Fees | `interface.get_fees(symbol)` | `fetch_trading_fee(symbol)` |
| Streams | `TickerManager` / `OrderbookManager` | `watch_ticker` / `watch_order_book` on `ccxt.pro.` |
| Backtesting | `strategy.backtest(to='1y')` | **no equivalent** — keep Blankly, or feed CCXT candles to a backtester |
| Paper trading | `PaperTrade(exchange)` | `exchange.set_sandbox_mode(True)` where the venue offers a testnet |
| Anything not listed | `interface.get_calls()` for the raw client | the same endpoint as an [implicit method](/docs/exchanges/binance/implicit-api) |
## FAQ [#faq]
**Does CCXT have a backtester?**
No. CCXT connects to exchanges and normalises market data, orders, balances and positions; it has no simulation engine, no historical archive and no strategy runtime. People commonly pull candles with `fetch_ohlcv` and feed them to a separate backtester, or use a framework like Blankly that includes one.
**Can Blankly trade stocks as well as crypto?**
Yes — that is one of its distinguishing features. Alpaca provides US equities and OANDA provides forex, behind the same `interface` as the crypto exchanges. CCXT is cryptocurrency exchanges and prediction markets only.
**Which supports more exchanges, CCXT or Blankly?**
CCXT, by a wide margin on crypto: 104 exchanges with REST and 76 with WebSocket, against the ten venues plus a keyless backtesting source in Blankly's README table. Blankly reaches two asset classes CCXT does not.
**Is CCXT's WebSocket support a paid add-on?**
No. CCXT Pro is bundled in the `ccxt` package under the MIT licence. Use `ccxt.pro.` and the `watch*` methods — see the [CCXT Pro manual](/docs/pro-manual).
**Can I use Blankly and CCXT together?**
Yes, and it is a reasonable split: Blankly for research and backtesting against the venues it covers, CCXT for live connectivity to the venues it does not — or for the execution service if that is written in Go, C# or Java rather than Python.
**Is Blankly still maintained?**
Its repository is not archived. The most recent commit on `main` is dated 30 December 2024 and the most recent PyPI release, `1.18.25b0`, was uploaded on 23 July 2023. Its README support table still lists FTX and FTX Futures, which ceased operating in November 2022. Judge those facts against how quickly your venues change their APIs.
## Next steps [#next-steps]
* [Install CCXT](/docs/install)
* [Manual](/docs/manual) — unified structures and conventions
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [Supported exchanges](/docs/exchange-markets)
* [More comparisons](/docs/comparisons)
# CCXT vs the Blockchain.com Exchange API (/docs/comparisons/ccxt-vs-blockchaincom-api)
[Blockchain.com Exchange](https://exchange.blockchain.com) documents a REST API at [api.blockchain.com/v3](https://api.blockchain.com/v3/) and a WebSocket feed at `wss://ws.blockchain.info/mercury-gateway/v1/ws`. Its official client library is [blockchain/lib-exchange-client](https://github.com/blockchain/lib-exchange-client) — a repository of clients autogenerated from the OpenAPI specification, covering thirteen language targets.
Two facts about that repository decide most of this comparison. It was **archived on 22 January 2026** and is now read-only. And the generated clients cover the REST API only — there is no WebSocket client in them, while the market data most people want from this venue arrives over the socket.
So the question is: **do you want generated REST bindings frozen at their last build, or a maintained client that also streams?**
## TL;DR [#tldr]
* **Pick lib-exchange-client** if you need REST-only bindings in a language CCXT does not target — Kotlin, Haskell, Clojure, Elm and C are all in that repository — and you are comfortable vendoring an archived, generated client.
* **Pick CCXT** if you want the venue maintained: 34 unified capabilities, 19 of them `fetch*`, six `watch*` streaming methods, and all 24 Blockchain.com endpoints as implicit methods, in TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java and Rust.
* **Streaming is the sharpest divide.** Blockchain.com's WebSocket feed uses FIX field naming and is not covered by the generated clients at all; CCXT exposes it as `watch_order_book`, `watch_trades`, `watch_ticker`, `watch_ohlcv`, `watch_orders` and `watch_balance`.
## At a glance [#at-a-glance]
| | **CCXT** | **lib-exchange-client (official)** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| Exchanges covered | 104 (Blockchain.com is one of them) | Blockchain.com Exchange only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | 13 generated targets: Android, C, Clojure, C#, Elm, Go, Haskell, JavaScript, Kotlin, PHP, Python, Rust, TypeScript/Axios |
| Repository status | actively maintained | archived 22 January 2026, read-only |
| How it is built | hand-written unified implementation | autogenerated from the OpenAPI specification |
| Unified market data + trading API | yes — same method names across every exchange | no — Blockchain.com's own models |
| Capabilities implemented | 34 unified methods, 19 of them `fetch*` | the REST surface in the spec |
| Raw endpoint access | yes — 24 Blockchain.com endpoints as implicit methods | yes, it is the whole product |
| WebSockets | yes — 6 `watch*` methods | none — REST only |
| Built-in rate limiter | yes, on by default (`rateLimit` 500 ms) | not provided |
| Unified error types | yes — 41 typed exceptions in one hierarchy | `ApiException` plus HTTP status |
| Testnet / sandbox | not applicable | none documented by Blockchain.com |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 212 GitHub stars; Python package published to no index, JVM artifact `com.blockchain:exchange-rest-api:1.0.0` on Maven Central |
| Licence | MIT | see repository |
| Support | Discord, Telegram, GitHub issues — usually same-day | archived repository; Blockchain.com support |
Figures verified September 2026 against CCXT v4.5.78, the blockchain/lib-exchange-client repository and its Python client README, and Blockchain.com's published API documentation.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
lib-exchange-client (Python)
```python
import ccxt
exchange = ccxt.blockchaincom()
ticker = exchange.fetch_ticker('BTC/USD')
print(ticker['last'], ticker['baseVolume'])
```
```python
import openapi_client
configuration = openapi_client.Configuration(
host='https://api.blockchain.com/v3/exchange')
with openapi_client.ApiClient(configuration) as api_client:
api = openapi_client.UnauthenticatedApi(api_client)
ticker = api.get_ticker_by_symbol('BTC-USD')
print(ticker)
```
Two things stand out. The generated package is named `openapi-client` — the generator's default, never customised — and its README still instructs you to install it from `git+https://github.com/GIT_USER_ID/GIT_REPO_ID.git`, the generator's placeholder. In practice you vendor the directory. CCXT is `pip install ccxt`.
### Place a limit order [#place-a-limit-order]
CCXT
lib-exchange-client (Python)
```python
import ccxt
exchange = ccxt.blockchaincom({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USD', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import openapi_client
configuration = openapi_client.Configuration(
host='https://api.blockchain.com/v3/exchange',
api_key={'X-API-Token': 'YOUR_API_KEY'})
with openapi_client.ApiClient(configuration) as api_client:
api = openapi_client.TradingApi(api_client)
base_order = openapi_client.BaseOrder() # fill in the model fields
summary = api.create_order(base_order)
print(summary)
```
Blockchain.com authenticates with a single `X-API-Token` header, so signing is not the pain point here — the pain point is that everything is a generated model you construct field by field, and the generated classes are frozen at the last build of an archived repository.
### Stream an order book [#stream-an-order-book]
CCXT
Raw WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.blockchaincom()
while True:
orderbook = await exchange.watch_order_book('BTC/USD')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import json, asyncio, websockets
async def main():
async with websockets.connect(
'wss://ws.blockchain.info/mercury-gateway/v1/ws',
origin='https://exchange.blockchain.com') as ws:
await ws.send(json.dumps({'action': 'subscribe',
'channel': 'l2',
'symbol': 'BTC-USD'}))
async for raw in ws:
# FIX-named fields, snapshot then updates — merging is your code
print(json.loads(raw))
asyncio.run(main())
```
There is no official-SDK column here because the generated clients do not cover WebSockets at all. Blockchain.com's socket uses FIX field naming and sends a snapshot followed by updates per channel; turning that into a usable book is your code:
| | CCXT | raw stream |
| ------------------------------------------------------ | ------------ | ---------- |
| Send the required `Origin` header on connect | done for you | your code |
| Apply the snapshot, then merge subsequent updates | done for you | your code |
| Reconnect, re-subscribe and re-seed after a drop | done for you | your code |
| Authenticate the socket for order and balance channels | done for you | your code |
| Bounded caches for trades and candles | done for you | your code |
CCXT's `watch_order_book` returns the same structure as `fetch_order_book`, so a polling loop becomes a stream by changing one word.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Generated versus maintained [#generated-versus-maintained]
Generated clients are a reasonable way to publish bindings in thirteen languages at once. The tradeoff is that they track the specification, not the exchange: whatever the OpenAPI file said at generation time is what you get, and the repository has been read-only since January 2026. CCXT's Blockchain.com implementation is hand-written, tested against live responses, and fixed in a version bump when the venue changes something.
### Six streaming methods versus none [#six-streaming-methods-versus-none]
CCXT implements `watch_ticker`, `watch_trades`, `watch_order_book`, `watch_ohlcv`, `watch_orders` and `watch_balance` for Blockchain.com, over the same `prices`, `ticker`, `trades`, `l2`, `trading` and `balances` channels the venue publishes, with authentication for the private ones handled by the library. The official clients have no WebSocket support to compare against.
### One error hierarchy [#one-error-hierarchy]
The generated Python client raises `ApiException` for anything the server rejects; the meaning is in the status code and the body. CCXT maps Blockchain.com's failures onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError` and 35 more, all descending from `BaseError` — so `except ccxt.InsufficientFunds` keeps working when you add a second venue.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
The generated clients contain no throttling. CCXT ships a token-bucket rate limiter that is on by default, with `rateLimit` set to 500 ms for Blockchain.com, so a backfill loop paces itself instead of relying on you to remember.
### Precision and string math [#precision-and-string-math]
CCXT loads Blockchain.com's symbol metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding into a rejected order:
```python
amount = exchange.amount_to_precision('BTC/USD', 0.0012345678)
price = exchange.price_to_precision('BTC/USD', 61234.56789)
```
### L2 and L3 books, unified [#l2-and-l3-books-unified]
Blockchain.com publishes both an aggregated `l2/{symbol}` book and a full-depth `l3/{symbol}` book. CCXT exposes them as `fetch_l2_order_book` and `fetch_l3_order_book` returning the same [order book structure](/docs/manual#order-book-structure) you get from every other exchange, rather than two venue-specific models.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 34 unified capabilities, **all 24 Blockchain.com endpoints are generated as callable implicit methods**, with the `X-API-Token` header, rate limiting and error mapping applied:
```python
# GET /v3/exchange/whitelist
whitelist = exchange.private_get_whitelist()
# GET /v3/exchange/fees
fees = exchange.private_get_fees()
```
Browse them all on the [blockchaincom implicit API page](/docs/exchanges/blockchaincom/implicit-api).
## What lib-exchange-client does better [#what-lib-exchange-client-does-better]
An honest list, because these are real:
* **Thirteen language targets, including five CCXT does not have.** Kotlin, Haskell, Clojure, Elm and C bindings exist in that repository. If your service is written in one of those, the generated client is the only ready-made option and CCXT is not a substitute.
* **A published JVM artifact.** `com.blockchain:exchange-rest-api:1.0.0` is on Maven Central, so a JVM project can depend on it by coordinate rather than vendoring source.
* **Models map one-to-one onto the OpenAPI specification.** `BaseOrder`, `OrderSummary`, `OrderBook`, `TimeInForce` and the rest are literally the spec's schemas. When you are reading Blockchain.com's API reference, there is no translation step; CCXT's unified structures are a deliberate abstraction over it.
* **One source of truth.** Because every client is generated from the same file, the thirteen targets cannot drift from each other in the way thirteen hand-written wrappers would.
If you work in Kotlin, Haskell or Clojure against Blockchain.com's REST API and do not need streaming, the generated client is the right starting point — with the caveat that you are maintaining a fork of an archived repository.
## Migrating from lib-exchange-client to CCXT [#migrating-from-lib-exchange-client-to-ccxt]
| What you are doing | lib-exchange-client | CCXT |
| ------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------- |
| Symbols | `'BTC-USD'` | `'BTC/USD'` |
| Markets | `UnauthenticatedApi.get_symbols()` | `load_markets()` |
| Ticker | `UnauthenticatedApi.get_ticker_by_symbol()` | `fetch_ticker()` / `fetch_tickers()` |
| L2 book | `UnauthenticatedApi.get_l2_order_book()` | `fetch_l2_order_book()` |
| L3 book | `UnauthenticatedApi.get_l3_order_book()` | `fetch_l3_order_book()` |
| New order | `TradingApi.create_order()` | `create_order()` |
| Cancel order | `TradingApi.delete_order()` | `cancel_order()` |
| Cancel all | `TradingApi.delete_all_orders()` | `cancel_all_orders()` |
| Orders | `TradingApi.get_orders()` | `fetch_open_orders()` / `fetch_closed_orders()` |
| Fills | `TradingApi.get_fills()` | `fetch_my_trades()` |
| Fees | `TradingApi.get_fees()` | `fetch_trading_fees()` |
| Balance | `PaymentsApi.get_accounts()` | `fetch_balance()` |
| Deposits | `PaymentsApi.get_deposits()` | `fetch_deposits()` |
| Streams | not supported | `watch_*` on `ccxt.pro.blockchaincom` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/blockchaincom/implicit-api) |
## FAQ [#faq]
**Does Blockchain.com have an official API client?**
Yes, [blockchain/lib-exchange-client](https://github.com/blockchain/lib-exchange-client) — thirteen clients autogenerated from the OpenAPI specification. The repository was archived on 22 January 2026 and is read-only, and the generated clients cover REST only.
**Does CCXT support Blockchain.com WebSockets?**
Yes — six `watch*` methods via `ccxt.pro.blockchaincom`: `watch_ticker`, `watch_trades`, `watch_order_book`, `watch_ohlcv`, `watch_orders` and `watch_balance`. Socket authentication, reconnect and re-subscribe are handled by the library.
**How does Blockchain.com authenticate API requests?**
With a single `X-API-Token` header carrying an API key created in your exchange account settings; the key must be confirmed by email before it works. There is no request signing, so the main integration cost is elsewhere — pagination, error handling, rate limiting and the socket.
**Is there a Blockchain.com Exchange testnet?**
Blockchain.com's published API documentation does not describe a sandbox or testnet environment. Test with small live orders on a low-balance account.
**Can I still call Blockchain.com-specific endpoints through CCXT?**
Yes — all 24 of them, as [implicit methods](/docs/exchanges/blockchaincom/implicit-api), including the withdrawal whitelist routes, with authentication and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [blockchaincom unified API reference](/docs/exchanges/blockchaincom)
* [blockchaincom implicit API](/docs/exchanges/blockchaincom/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the BloFin API and official SDK (/docs/comparisons/ccxt-vs-blofin-api)
[BloFin](https://www.blofin.com) is a perpetual-futures venue with a documented REST and WebSocket API at [docs.blofin.com](https://docs.blofin.com/) and a demo-trading environment at `demo-trading-openapi.blofin.com`. It publishes one first-party client library: [blofin-sdk-python](https://github.com/blofin/blofin-sdk-python), Apache-2.0, covering REST and WebSockets including BloFin's copy-trading and affiliate APIs.
Two things narrow the choice. That SDK exists in Python only — BloFin's other public repositories are a UI library, a CLI, an MCP server and a skills hub, not SDKs. And it is installed from source (`pip install -e .`), not from a package index; the `blofin` name on PyPI belongs to a separate community project.
So the deciding question is: **is Python the only language you need, and is copy trading part of what you are building?**
## TL;DR [#tldr]
* **Pick blofin-sdk-python** if you are on Python and you need BloFin's copy-trading or affiliate APIs as typed methods, and you do not mind vendoring the repository.
* **Pick CCXT** for anything else: 54 unified capabilities, 26 of them `fetch*`, 13 `watch*` streaming methods and all 79 BloFin endpoints — copy trading and affiliate routes included — as implicit methods, in TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java and Rust.
* **Demo trading works in both.** BloFin's SDK gives you a `DemoClient`; CCXT gives you `set_sandbox_mode(True)`, which swaps the REST and both WebSocket URLs in one call.
## At a glance [#at-a-glance]
| | **CCXT** | **blofin-sdk-python (official)** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| Exchanges covered | 104 (BloFin is one of them) | BloFin only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python |
| Install | `pip install ccxt` and equivalents | `pip install -e .` from a clone |
| Unified market data + trading API | yes — same method names across every exchange | no — BloFin's own request/response shapes |
| BloFin capabilities implemented | 54 unified methods, 26 of them `fetch*` | REST plus WebSocket across trading, market, copytrading, affiliate |
| Raw endpoint access | yes — 79 BloFin endpoints as implicit methods | yes, it is the whole product |
| WebSockets | yes — 13 `watch*` methods, same shapes as `fetch*` | yes — public, private and copytrading clients |
| Copy trading | via implicit methods (`copytrading/*` routes) | first-class `CopyTradingAPI` |
| Built-in rate limiter | yes, on by default (`rateLimit` 100 ms) | not provided |
| Unified error types | yes — 41 typed exceptions in one hierarchy | BloFin error codes |
| Demo trading | `set_sandbox_mode(True)` swaps REST and WebSocket URLs | `DemoClient`, or `isDemo=True` |
| Latest repository update read | continuous | 30 January 2025 |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 4 GitHub stars; the community `blofin` PyPI package — a separate project — has about 1k installs/month |
| Licence | MIT | Apache-2.0 |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the blofin GitHub organisation's repository listing, the blofin-sdk-python README and examples, BloFin's published API documentation, and install counts from PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
blofin-sdk-python
```python
import ccxt
exchange = ccxt.blofin()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from blofin.client import Client
from blofin.rest_market import MarketAPI
client = Client(apiKey='...', apiSecret='...', passphrase='...')
market = MarketAPI(client)
tickers = market.getTickers(instId='BTC-USDT')
print(tickers)
```
BloFin instruments are `BTC-USDT`; CCXT normalises the linear perpetual to `'BTC/USDT:USDT'` — the unified notation that says "BTC against USDT, settled in USDT" and reads identically on Bybit, OKX or Hyperliquid. The CCXT call returns a [unified ticker structure](/docs/manual#ticker-structure); the SDK returns BloFin's payload for you to parse.
### Place a limit order [#place-a-limit-order]
CCXT
blofin-sdk-python
```python
import ccxt
exchange = ccxt.blofin({'apiKey': '...', 'secret': '...', 'password': '...'})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import time
from blofin.client import Client
from blofin.rest_trading import TradingAPI
client = Client(apiKey='...', apiSecret='...', passphrase='...')
trading = TradingAPI(client)
result = trading.placeOrder(
instId='BTC-USDT',
marginMode='cross',
positionSide='net',
side='buy',
orderType='limit',
size='0.1',
price='60000',
clientOrderId=f'test_{int(time.time())}')
print(result)
```
`marginMode` and `positionSide` are BloFin's terms, and every venue spells them differently. CCXT reads sensible defaults from the market and lets you override them through unified helpers — `set_margin_mode`, `set_position_mode`, `set_leverage` — that have the same names on every derivatives venue it supports.
### Stream an order book [#stream-an-order-book]
CCXT
blofin-sdk-python
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.blofin()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT:USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from blofin.websocket_client import BlofinWsPublicClient
public_client = BlofinWsPublicClient() # production
demo_client = BlofinWsPublicClient(isDemo=True) # demo trading
# subscribe to the books channel, then handle messages in a callback
```
CCXT returns a live, merged order book as a value you `await`; the SDK gives you a socket client you subscribe on and handle in callbacks. Underneath, CCXT does the parts that are easy to get wrong: applying the snapshot, merging updates, detecting drops, reconnecting and re-subscribing, and keeping bounded caches for trades and candles.
## Where the differences actually bite [#where-the-differences-actually-bite]
### One language versus eight [#one-language-versus-eight]
BloFin's SDK is Python-only. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with identical method names and return structures, so research in a Python notebook ports to a Go or C# execution service without a second data model:
TypeScript
Python
C#
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.blofin ();
const ticker = await exchange.fetchTicker ('BTC/USDT:USDT');
```
```python
import ccxt
exchange = ccxt.blofin()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
```
```csharp
var exchange = new ccxt.blofin();
var ticker = await exchange.FetchTicker("BTC/USDT:USDT");
```
```go
exchange := ccxt.NewBlofin(nil)
ticker, err := exchange.FetchTicker("BTC/USDT:USDT")
```
### Signing five headers, correctly, every time [#signing-five-headers-correctly-every-time]
BloFin private requests carry `ACCESS-KEY`, `ACCESS-SIGN`, `ACCESS-TIMESTAMP`, `ACCESS-NONCE` and `ACCESS-PASSPHRASE`, where the signature is a base64-encoded HMAC-SHA256 over the request path, method, timestamp, nonce and body concatenated in that order. Both the SDK and CCXT build that for you — the difference is that CCXT builds it in all eight languages, and applies it to the implicit methods too.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
BloFin documents up to 500 requests per minute per IP, 1500 per five minutes, and a tighter 30 requests per 10 seconds on trading endpoints, with timed suspensions when you exceed them. The official SDK does not ship a throttler. CCXT's token-bucket limiter is **on by default**, with `rateLimit` set to 100 ms for BloFin, so a loop paces itself.
### Demo trading without a second code path [#demo-trading-without-a-second-code-path]
```python
exchange = ccxt.blofin({'apiKey': '...', 'secret': '...', 'password': '...'})
exchange.set_sandbox_mode(True) # swaps REST and both WebSocket URLs
```
One flag moves REST to `demo-trading-openapi.blofin.com` and both socket URLs with it. The SDK's equivalent is a different client class (`DemoClient`) or an `isDemo=True` argument on each client you construct.
### One error hierarchy [#one-error-hierarchy]
CCXT maps BloFin's numeric error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError` and 35 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once and it survives adding a second venue, instead of matching on codes like `152007`.
### Derivatives features, unified [#derivatives-features-unified]
BloFin is a perpetuals venue, and CCXT models the parts that matter as unified methods: `fetch_positions`, `fetch_funding_rate`, `fetch_funding_rate_history`, `fetch_funding_history`, `set_leverage`, `set_margin_mode`, `set_position_mode`, `close_position`, `fetch_leverages`, `fetch_positions_adl_rank`, plus `create_order_with_take_profit_and_stop_loss`, `create_trigger_order`, `create_stop_loss_order` and `create_take_profit_order`. The same method names work on Bybit, OKX and the rest.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 54 unified capabilities, **all 79 BloFin endpoints are generated as callable implicit methods**, with the five-header signing, rate limiting and error mapping applied — and that includes the copy-trading and affiliate routes the official SDK wraps:
```python
# GET /api/v1/copytrading/account/balance
balance = exchange.private_get_copytrading_account_balance()
# GET /api/v1/affiliate/invitees
invitees = exchange.private_get_affiliate_invitees()
```
Browse them all on the [blofin implicit API page](/docs/exchanges/blofin/implicit-api).
## What the official BloFin SDK does better [#what-the-official-blofin-sdk-does-better]
An honest list, because these are real:
* **Copy trading and affiliate APIs as typed methods.** `CopyTradingAPI` and `AffiliateAPI` wrap those endpoints with named parameters. CCXT reaches the same routes through implicit methods, but has no *unified* copy-trading abstraction — those are BloFin-specific products, so there is nothing to unify them against.
* **One-to-one naming with BloFin's docs.** `instId`, `marginMode`, `positionSide`, `orderType` are BloFin's own field names, so debugging against the API reference has no translation step. CCXT's unified names are a deliberate abstraction.
* **A dedicated copy-trading WebSocket client.** `BlofinWsCopytradingClient` connects to `wss://openapi.blofin.com/ws/copytrading/private`, a channel CCXT does not expose as a `watch*` method.
* **New BloFin features land there first.** A new endpoint appears in BloFin's own SDK before it is modelled as a unified CCXT method; CCXT's implicit API closes most of that gap on day one, but a unified wrapper can lag.
* **BloFin also ships developer tooling around it.** The same organisation publishes an MCP server and a CLI for the exchange, which are useful if you are building agent- or terminal-driven workflows against BloFin specifically.
If you are writing Python, trading only BloFin, and copy trading is central to what you are building, the official SDK is a defensible choice.
## Migrating from blofin-sdk-python to CCXT [#migrating-from-blofin-sdk-python-to-ccxt]
| What you are doing | blofin-sdk-python | CCXT |
| ------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------ |
| Symbols | `'BTC-USDT'` | `'BTC/USDT:USDT'` |
| Client | `Client(...)` / `DemoClient(...)` | `ccxt.blofin({'apiKey', 'secret', 'password'})` + `set_sandbox_mode()` |
| Instruments | `MarketAPI.getInstruments()` | `load_markets()` |
| Ticker | `MarketAPI.getTickers()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `MarketAPI` books endpoint | `fetch_order_book()` |
| Candles | `MarketAPI` candles endpoint | `fetch_ohlcv()` |
| New order | `TradingAPI.placeOrder()` | `create_order()` |
| Batch orders | `TradingAPI.placeBatchOrders()` | `create_orders()` |
| Cancel order | `TradingAPI` cancel endpoint | `cancel_order()` |
| Open orders | `TradingAPI` pending-orders endpoint | `fetch_open_orders()` |
| Positions | `TradingAPI` positions endpoint | `fetch_positions()` / `fetch_position()` |
| Leverage | `TradingAPI` set-leverage endpoint | `set_leverage()` |
| Balance | `TradingAPI` balance endpoint | `fetch_balance()` |
| Streams | `BlofinWsPublicClient` / `BlofinWsPrivateClient` | `watch_*` on `ccxt.pro.blofin` |
| Copy trading | `CopyTradingAPI` | `copytrading/*` [implicit methods](/docs/exchanges/blofin/implicit-api) |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/blofin/implicit-api) |
## FAQ [#faq]
**Does BloFin have an official SDK?**
Yes, one: [blofin-sdk-python](https://github.com/blofin/blofin-sdk-python), Apache-2.0, covering REST and WebSockets including copy trading and the affiliate API. Its README installs it from a clone with `pip install -e .` rather than from PyPI, and the repository was last updated on 30 January 2025. There is no official SDK for any other language.
**Is the `blofin` package on PyPI the official SDK?**
No. That package points at `nomeida/blofin-python`, a separate MIT-licensed community project. If you want BloFin's own code, clone the `blofin/blofin-sdk-python` repository.
**Does CCXT support BloFin WebSockets?**
Yes — 13 `watch*` methods via `ccxt.pro.blofin`, covering tickers, bids/asks, trades, candles, order books, orders, positions, balance and funding rates, plus the `*ForSymbols` multi-symbol variants. Reconnect, re-subscribe and book merging are handled by the library.
**Can I use BloFin demo trading through CCXT?**
Yes. `exchange.set_sandbox_mode(True)` switches the REST base URL and both public and private WebSocket URLs to `demo-trading-openapi.blofin.com`. Use API keys issued for the demo environment.
**Does CCXT support BloFin spot trading?**
CCXT models BloFin as a swap venue — perpetual futures — which is what the exchange's API is built around. Unified symbols are of the form `'BTC/USDT:USDT'`.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [blofin unified API reference](/docs/exchanges/blofin)
* [blofin implicit API](/docs/exchanges/blofin/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the raw BtcBox API (/docs/comparisons/ccxt-vs-btcbox-api)
[BtcBox](https://www.btcbox.co.jp/) is a Japanese exchange trading a handful of coins against JPY. Its [API documentation](https://blog.btcbox.jp/en/archives/8762) describes eleven endpoints in total — four public, six private, one internal — under `https://www.btcbox.co.jp/api/v1`.
There is no SDK. The only first-party code BtcBox links is [btcbox/python3-demo](https://github.com/btcbox/python3-demo), a four-commit sample script whose README describes it as a "python3-api-request-demo". That is a reference, not a library.
An eleven-endpoint API is genuinely small enough to write yourself, so this page is not going to argue that you cannot. The question is narrower: **is BtcBox the only venue in your system, and will it stay that way?**
## TL;DR [#tldr]
* **Write it yourself** if BtcBox is your only venue and you need two or three endpoints. Eleven routes and one `coin` parameter is not a large surface.
* **Pick CCXT** if BtcBox is one venue among several, or if you want the JPY pairs behind the same interface as everything else: 12 unified capabilities, 9 of them `fetch*`, all 11 endpoints as implicit methods, in TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java and Rust.
* **Neither side streams.** BtcBox publishes no WebSocket API, and CCXT implements no `watch*` methods for it. Live data means polling either way.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw BtcBox API** |
| --------------------------------- | ---------------------------------------------------------------------- | ------------------------------------- |
| Exchanges covered | 104 (BtcBox is one of them) | BtcBox only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write |
| Official vendor SDK | not applicable | none — only a four-commit demo script |
| Unified market data + trading API | yes — same method names across every exchange | no — BtcBox's own payloads |
| BtcBox capabilities implemented | 12 unified methods, 9 of them `fetch*` | you implement what you need |
| Raw endpoint access | yes — 11 BtcBox endpoints as implicit methods | yes, it is all you have |
| WebSockets | no `watch*` methods for BtcBox | BtcBox publishes no WebSocket API |
| Built-in rate limiter | yes, on by default (`rateLimit` 1000 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | numeric `code` in a 200-status body |
| Testnet / sandbox | not wired for this venue | none documented |
| Licence | MIT | not applicable |
| Support | Discord, Telegram, GitHub issues — usually same-day | BtcBox support |
Figures verified September 2026 against CCXT v4.5.78, BtcBox's published API documentation, and the btcbox/python3-demo repository.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.btcbox()
ticker = exchange.fetch_ticker('BTC/JPY')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://www.btcbox.co.jp/api/v1/ticker/', params={'coin': 'btc'})
data = r.json()
print(data['last'], data['vol']) # BtcBox's own key names
```
Public reads are a near tie, as they should be for an API this size. CCXT's version returns a [unified ticker structure](/docs/manual#ticker-structure) with millisecond timestamps and numeric fields, identical to what you get from Kraken or Binance; the raw call returns BtcBox's keys for you to map.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.btcbox({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/JPY', 'limit', 'buy', 0.001, 9000000)
print(order['id'], order['status'])
```
```python
import hashlib, hmac, time, requests
from urllib.parse import urlencode
key, secret = '...', '...'
query = {
'key': key,
'nonce': str(int(time.time() * 1000)),
'coin': 'btc',
'amount': '0.001',
'price': '9000000',
'type': 'buy',
}
# the HMAC key is the MD5 hex digest of your secret, not the secret itself
md5_secret = hashlib.md5(secret.encode()).hexdigest()
query['signature'] = hmac.new(md5_secret.encode(),
urlencode(query).encode(),
hashlib.sha256).hexdigest()
r = requests.post('https://www.btcbox.co.jp/api/v1/trade_add/',
headers={'Content-Type': 'application/x-www-form-urlencoded'},
data=urlencode(query))
print(r.json())
```
Two details bite here. The HMAC key is the **MD5 digest of your secret**, not the secret — an unusual step that is easy to miss on a first read of the docs. And the parameter order in the string you sign has to match the order you send, because the server rebuilds the signature from what it received. Get either wrong and you get a rejection that does not say which. CCXT's `sign()` handles both, for every private endpoint.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Portability is the whole point [#portability-is-the-whole-point]
Nobody trades only BtcBox forever. Adding a second venue to a hand-rolled BtcBox integration means a second payload shape, a second symbol convention, a second signing scheme and a second error taxonomy — plus a translation layer of your own so the strategy code can stay venue-agnostic. That translation layer is what CCXT already is:
```python
for exchange_id in ['btcbox', 'bitflyer', 'kraken', 'binance']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/JPY')['last'])
```
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures — so the MD5-keyed signing is implemented once for you, not once per language in your codebase:
TypeScript
Python
PHP
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.btcbox ();
const ticker = await exchange.fetchTicker ('BTC/JPY');
```
```python
import ccxt
exchange = ccxt.btcbox()
ticker = exchange.fetch_ticker('BTC/JPY')
```
```php
$exchange = new \ccxt\btcbox();
$ticker = $exchange->fetch_ticker('BTC/JPY');
```
```go
exchange := ccxt.NewBtcbox(nil)
ticker, err := exchange.FetchTicker("BTC/JPY")
```
### Errors that arrive with a 200 [#errors-that-arrive-with-a-200]
BtcBox reports failures as a numeric `code` inside a successful HTTP response — the shape a naive client treats as a placed order. CCXT inspects the body, maps the codes onto a [typed exception tree](/docs/manual#error-handling), and raises `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded` or one of 36 others, all descending from `BaseError`.
### Precision and string math [#precision-and-string-math]
JPY pairs price in millions and trade in fractions of a coin, which is exactly the shape where float arithmetic produces an amount the venue rejects. CCXT gives you `amount_to_precision` and `price_to_precision`, backed by the `Precise` string-arithmetic class:
```python
amount = exchange.amount_to_precision('BTC/JPY', 0.0012345678)
price = exchange.price_to_precision('BTC/JPY', 9123456.789)
```
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
BtcBox publishes limits per endpoint — `trade_add` allows two calls per second, `trade_list` one. CCXT ships a token-bucket throttler that is on by default, with `rateLimit` set to 1000 ms for BtcBox, so a polling loop paces itself rather than depending on you to remember which endpoint was which.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
The 12 unified methods are not a ceiling. Every BtcBox endpoint is generated as a callable implicit method, with signing, nonce handling and rate limiting applied:
```python
# POST /api/v1/wallet
wallet = exchange.private_post_wallet({'coin': 'btc'})
# POST /api/v1/trade_view
view = exchange.private_post_trade_view({'coin': 'btc', 'id': '12345'})
```
Browse them all on the [btcbox implicit API page](/docs/exchanges/btcbox/implicit-api).
## What the raw API does better [#what-the-raw-api-does-better]
An honest list:
* **The API is small enough that a library is arguably overhead.** Eleven endpoints, one `coin` parameter, form-encoded bodies. For a single-purpose script — poll a price, write it to a database — thirty lines of `requests` is smaller and easier to audit than a dependency covering 104 exchanges.
* **Per-endpoint rate limits are published, and CCXT flattens them.** BtcBox documents two calls per second on `trade_add` and one on `trade_list`; CCXT applies a single 1000 ms pacing value across the venue. If you want to run right at the documented ceiling on a specific route, hand-rolled pacing gets you closer.
* **BtcBox's own demo script shows the exact signing sequence.** `btcbox/python3-demo` is short and readable, and it is the authoritative illustration of the MD5-then-HMAC step. Worth reading whichever route you take.
* **No WebSocket on either side, so CCXT Pro's usual advantage does not apply.** BtcBox publishes no streaming API and CCXT implements no `watch*` methods for it. If live data is what you need, neither option saves you the polling loop.
* **Full fidelity to the payloads.** Fields CCXT does not model reach you unchanged. CCXT keeps the raw response under `info`, but the top-level structure is unified rather than literal.
If BtcBox is your only venue and your integration is small, hand-rolling it is a perfectly reasonable engineering decision.
## Migrating from the raw BtcBox API to CCXT [#migrating-from-the-raw-btcbox-api-to-ccxt]
| What you are doing | BtcBox v1 | CCXT |
| ------------------ | ---------------------------- | ------------------------------------------------------------------------------ |
| Symbols | `coin=btc`, JPY implied | `'BTC/JPY'` |
| Markets | derived from `tickers` | `load_markets()` |
| Ticker | `GET /api/v1/ticker/` | `fetch_ticker()` |
| All tickers | `GET /api/v1/tickers/` | `fetch_tickers()` |
| Order book | `GET /api/v1/depth/` | `fetch_order_book()` |
| Public trades | `GET /api/v1/orders/` | `fetch_trades()` |
| New order | `POST /api/v1/trade_add/` | `create_order()` |
| Cancel order | `POST /api/v1/trade_cancel/` | `cancel_order()` |
| Order by id | `POST /api/v1/trade_view/` | `fetch_order()` |
| Orders | `POST /api/v1/trade_list/` | `fetch_orders()` / `fetch_open_orders()` |
| Balance | `POST /api/v1/balance/` | `fetch_balance()` |
| Deposit address | `POST /api/v1/wallet/` | the same endpoint as an [implicit method](/docs/exchanges/btcbox/implicit-api) |
## FAQ [#faq]
**Does BtcBox have an official SDK?**
No. BtcBox publishes API documentation and a small sample repository, [btcbox/python3-demo](https://github.com/btcbox/python3-demo), which its own docs describe as a request demo. There is no client library in any language, so CCXT or your own HTTP code are the realistic options.
**How does BtcBox sign API requests?**
Private endpoints are form-encoded POSTs including `key` and a `nonce`. The `signature` is an HMAC-SHA256 over the URL-encoded parameters, keyed with the **MD5 hex digest of your API secret** rather than the secret itself, and the parameter order in the signed string must match the order sent. CCXT builds this in `sign()` for every private endpoint including the implicit ones.
**Does CCXT support BtcBox WebSockets?**
No, and neither does BtcBox — the exchange publishes no WebSocket API. CCXT implements zero `watch*` methods for the venue, so live data means polling `fetch_ticker` or `fetch_order_book` on a timer.
**Which markets does CCXT support on BtcBox?**
The JPY spot pairs BtcBox lists, as unified symbols like `'BTC/JPY'`. CCXT maps the unified symbol onto BtcBox's `coin` parameter for you, so you never pass `coin=btc` yourself.
**Can I still call BtcBox-specific endpoints through CCXT?**
Yes — all 11 of them, as [implicit methods](/docs/exchanges/btcbox/implicit-api), with signing, nonce handling and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [btcbox unified API reference](/docs/exchanges/btcbox)
* [btcbox implicit API](/docs/exchanges/btcbox/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the BTC Markets API (/docs/comparisons/ccxt-vs-btcmarkets-api)
[BTC Markets](https://btcmarkets.net) is an Australian AUD-denominated spot exchange with a v3 REST API and a WebSocket feed. You can call it through one of the client repositories BTC Markets publishes on GitHub, or through [CCXT](/docs/manual), which speaks the same v3 API behind method names shared with 103 other venues.
The question that decides between them is narrower than usual here, because the official clients are small and mostly dormant: **do you want a single-file wrapper you will end up maintaining yourself, or a dependency someone else keeps current?**
## TL;DR [#tldr]
* **Pick an official BTC Markets client** if you want the smallest possible dependency for one language, you only need a handful of endpoints, and — importantly — you need the **WebSocket feed**, which CCXT does not implement for this exchange.
* **Pick CCXT** if you want maintained REST coverage, unified structures, a built-in rate limiter and typed errors, in any of eight languages, with the option to add a second exchange without a second integration.
* **The gap is streaming.** CCXT implements 20 unified capabilities and all 35 BTC Markets endpoints for REST, and **zero `watch*` methods** for `btcmarkets`. If live socket data is the requirement, this page will not talk you out of the vendor client.
## At a glance [#at-a-glance]
| | **CCXT** | **Official BTC Markets clients** |
| --------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| Exchanges covered | 104 (BTC Markets is one of them) | BTC Markets only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | separate repositories: Python, .NET, Rust, Node/TypeScript, Java, Go, Swift |
| Packages to install | **1** (`ccxt`) | clone a repository, or `npm install btcmarkets-node-sdk` |
| Unified market data + trading API | yes — same method names across every exchange | no — BTC Markets' own request/response shapes |
| Unified capabilities implemented | 20 for `btcmarkets` | varies per repository |
| WebSockets | **no** — 0 `watch*` methods for `btcmarkets` | yes in `btcmarkets-node-sdk` (`trade`, `tick`, `orderbook`, `heartbeat`, `orderChange`, `fundChange`) |
| Raw endpoint access | yes — 35 BTC Markets endpoints as implicit methods | whatever the repository wraps |
| Built-in rate limiter | yes, on by default (`rateLimit` 1000 ms) | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + BTC Markets error codes |
| Testnet / sandbox | none — BTC Markets publishes no sandbox | none |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | `btcmarkets-node-sdk` 2 stars · 101 npm installs/month; `api-v3-client-python` 5 stars; `api-v3-client-dotnet`, `api-v3-client-rust` 1 star each |
| Licence | MIT | `btcmarkets-node-sdk` MIT; the `api-v3-client-*` repositories carry no licence file |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues on each repository, BTC Markets support desk |
Figures verified September 2026 against CCXT v4.5.78, the `BTCMarkets` GitHub organisation's repository listing and READMEs, and npm install counts.
### What the official client estate actually looks like [#what-the-official-client-estate-actually-looks-like]
Read on the day this page was written, the `BTCMarkets` GitHub organisation holds fourteen repositories. The ones that are API clients, with their last push date:
| Repository | Language | Stars | Last pushed |
| ---------------------- | ---------- | ----- | -------------------------------------- |
| `api-v3-client-rust` | Rust | 1 | April 2026 |
| `api-v3-client-dotnet` | C# | 1 | January 2026 |
| `api-v3-client-python` | Python | 5 | May 2024 |
| `btcmarkets-node-sdk` | TypeScript | 2 | January 2023 — **archived, read-only** |
| `api-client-node` | JavaScript | 0 | May 2021 |
| `api-v3-client-java` | Java | 3 | February 2020 |
| `api-v3-client-go` | Go | 0 | October 2019 |
| `api-v3-client-swift` | Swift | 0 | October 2019 |
| `api-client-php` | PHP | 0 | July 2019 |
| `api-client-python` | Python | 15 | June 2018 |
Two details matter more than the dates. The Node SDK — the only one published to npm, and the only one with WebSocket support — is **archived**. And `api-v3-client-python`, the most recently touched Python option, is a four-commit demo: its client class defines `get_orders`, `place_sample_order`, `cancel_order`, `get_withdrawals` and a withdrawal helper, and **no market-data method at all**. It is not on PyPI.
That is a normal situation for a regional venue, and it is not a criticism of BTC Markets. It is just the thing to know before you plan around it.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
btcmarkets-node-sdk
```python
import ccxt
exchange = ccxt.btcmarkets()
ticker = exchange.fetch_ticker('BTC/AUD')
print(ticker['last'], ticker['baseVolume'])
```
```javascript
const BTCMarkets = require('btcmarkets-node-sdk');
const client = new BTCMarkets({ key: 'XXX', secret: 'XXX' });
const response = await client.markets.getTicker({ marketId: 'BTC-AUD' });
console.log(response.data);
```
The CCXT call returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, types and units you get from Kraken or Binance. The SDK returns BTC Markets' own payload (`bestBid`, `bestAsk`, `lastPrice`, `volume24h`, `price24h`, `low24h`, `high24h`), which you map yourself. In Python there is no official equivalent to map at all.
### Place a limit order [#place-a-limit-order]
CCXT
api-v3-client-python
```python
import ccxt
exchange = ccxt.btcmarkets({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/AUD', 'limit', 'buy', 0.001, 90000)
print(order['id'], order['status'])
```
```python
# the official Python repository is a demo application, not a package:
# clone it, then adapt its BTCMarketsClient, which signs
# method + path + timestamp (+ body) with HMAC-SHA512 over a
# base64-decoded secret and sends BM-AUTH-APIKEY / BM-AUTH-TIMESTAMP /
# BM-AUTH-SIGNATURE headers.
client = BTCMarketsClient(api_key, private_key)
client.place_sample_order()
```
CCXT implements exactly that signing scheme internally, so it is not code you write, review or keep in sync. `create_order` also accepts BTC Markets' trigger orders through unified params, and returns a [unified order structure](/docs/manual#order-structure) regardless.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures in all of them. BTC Markets publishes a *different repository* per language, written at different times by different people, with different coverage — the Go and Swift clients have not been pushed since 2019, the Rust one is from 2026.
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.btcmarkets()
ticker = exchange.fetch_ticker('BTC/AUD')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.btcmarkets ();
const ticker = await exchange.fetchTicker ('BTC/AUD');
```
```csharp
var exchange = new ccxt.btcmarkets();
var ticker = await exchange.FetchTicker("BTC/AUD");
```
```go
exchange := ccxt.NewBtcmarkets(nil)
ticker, err := exchange.FetchTicker("BTC/AUD")
```
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT ships a token-bucket throttler that is on by default (`enableRateLimit = true`, `rateLimit = 1000` ms for `btcmarkets`, chosen because BTC Markets caches market data for a second and trades for two). You call methods in a loop and the library paces them. None of the official client repositories document a rate limiter; pacing and back-off on a 429 are your code.
### One error hierarchy [#one-error-hierarchy]
CCXT maps BTC Markets' error responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once, and it still works on the next exchange.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` pulls BTC Markets' tick and step sizes, and CCXT exposes them through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities never drift through float rounding into a rejected order.
```python
amount = exchange.amount_to_precision('BTC/AUD', 0.0012345678)
price = exchange.price_to_precision('BTC/AUD', 91234.56789)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 20 unified capabilities, **all 35 BTC Markets endpoints are generated as callable implicit methods**, with signing, rate-limit accounting and error mapping applied:
```python
# any raw BTC Markets endpoint, camelCased from its path
response = exchange.private_get_reports_id({'id': '...'})
```
Browse them on the [btcmarkets implicit API page](/docs/exchanges/btcmarkets/implicit-api).
### Portability [#portability]
CCXT's `btcmarkets` is the same object shape as its `kraken`, `coinbase` and `binance` objects. If an AUD desk later adds an offshore venue for hedging, the exchange id becomes a variable rather than a second integration:
```python
for exchange_id in ['btcmarkets', 'kraken', 'coinbase']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/AUD')['last'])
```
## What the official BTC Markets clients do better [#what-the-official-btc-markets-clients-do-better]
An honest list, and the first item is decisive for some readers:
* **They have WebSockets. CCXT does not, for this venue.** `btcmarkets-node-sdk` subscribes to `trade`, `tick`, `orderbook`, `heartbeat`, `orderChange` and `fundChange` with a few lines. CCXT implements **zero** `watch*` methods for `btcmarkets`, so live socket data means the vendor SDK, another library, or your own client.
* **A much smaller dependency.** If all you need is three REST calls in Node, a single small wrapper is a smaller install and a smaller attack surface than a library covering 104 exchanges.
* **Payload names match the BTC Markets docs exactly.** `bestBid`, `volume24h`, `marketId` — when you are reading the vendor reference while debugging, a one-to-one mapping is one less hop than CCXT's deliberate abstraction.
* **A Swift client exists at all.** CCXT does not ship Swift, so for an iOS or macOS client `api-v3-client-swift` is the only first-party option — and `api-v3-client-rust` is first-party where CCXT's Rust crate is third-party by design.
If you are writing Node, need the WebSocket feed, and BTC Markets is the only venue you will ever touch, the archived Node SDK is still the more direct route — with the caveat that "archived" means you own it now.
## Migrating from a BTC Markets client to CCXT [#migrating-from-a-btc-markets-client-to-ccxt]
| What you are doing | BTC Markets client | CCXT |
| ------------------- | --------------------------------- | ---------------------------------------------------------------------------------- |
| Symbols | `marketId: 'BTC-AUD'` | `'BTC/AUD'` |
| Client | `new BTCMarkets({ key, secret })` | `ccxt.btcmarkets({'apiKey': ..., 'secret': ...})` |
| Markets | `GET /v3/markets` | `load_markets()` |
| Ticker | `markets.getTicker()` | `fetch_ticker()` |
| Order book | `GET /v3/markets/{id}/orderbook` | `fetch_order_book()` |
| Candles | `GET /v3/markets/{id}/candles` | `fetch_ohlcv()` |
| New order | `POST /v3/orders` | `create_order()` |
| Cancel order | `DELETE /v3/orders/{id}` | `cancel_order()` |
| Open orders | `GET /v3/orders?status=open` | `fetch_open_orders()` |
| Balance | `account.getBalances()` | `fetch_balance()` |
| Trade history | `GET /v3/trades` | `fetch_my_trades()` |
| Streams | `client.socket.subscribe(...)` | **not available in CCXT for `btcmarkets`** |
| Anything not listed | native call | the same endpoint as an [implicit method](/docs/exchanges/btcmarkets/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [btcmarkets unified API reference](/docs/exchanges/btcmarkets).
## FAQ [#faq]
**Does CCXT support BTC Markets WebSockets?**
No. `btcmarkets` has zero `watch*` methods in CCXT, so there is no `ccxt.pro.btcmarkets` streaming API. REST is fully covered — 20 unified capabilities and all 35 endpoints — but live socket subscriptions are not. BTC Markets' own WebSocket feed is documented and their archived Node SDK wraps it.
**Is there an official BTC Markets Python SDK?**
Not a packaged one. `BTCMarkets/api-v3-client-python` is a four-commit demo application, is not published to PyPI, and defines no market-data methods. CCXT's Python support for `btcmarkets` is a normal `pip install ccxt`.
**Does BTC Markets have a testnet I can use with CCXT?**
No. BTC Markets publishes no sandbox environment, so `set_sandbox_mode(True)` has nothing to point at for this exchange. Test against small live orders or against CCXT's offline static fixtures.
**Can I still call BTC Markets-specific endpoints through CCXT?**
Yes — all 35 of them, as [implicit methods](/docs/exchanges/btcmarkets/implicit-api), with HMAC-SHA512 signing, the `BM-AUTH-*` headers, rate limiting and error mapping applied automatically.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support for the 76 exchanges that have it.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [btcmarkets unified API reference](/docs/exchanges/btcmarkets)
* [btcmarkets implicit API](/docs/exchanges/btcmarkets/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the raw BTCTurk API (/docs/comparisons/ccxt-vs-btcturk-api)
[BTCTurk](https://www.btcturk.com) is Turkey's largest TRY-denominated spot exchange, running on BTCTrader's white-label platform. Its API is documented at [docs.btcturk.com](https://docs.btcturk.com/) and in the [BTCTrader/broker-api-docs](https://github.com/BTCTrader/broker-api-docs) repository.
What it does not have is a maintained client library. The `BTCTrader` GitHub organisation publishes `broker-api-csharp` (C#, MIT, 6 stars, last pushed November 2017), `broker-api-csharp-v2` (C#, 5 stars, last pushed September 2021) and `broker-api-objectivec` (7 stars, last pushed August 2015). There is no first-party Python, JavaScript, Go or Java client. The Python packages on PyPI — `btcturk-api` 1.8.1 (April 2021) and `btcturk` 0.0.5 (October 2018) — are community projects by individual authors.
So the real comparison is not CCXT against a vendor SDK. It is **CCXT against the HTTP client you were about to write**.
## TL;DR [#tldr]
* **Write it yourself** if you need two public endpoints, in a language CCXT does not target, or you specifically need BTCTurk's **WebSocket feed** — which CCXT does not implement for this exchange.
* **Pick CCXT** if you want signing, rate limiting, precision handling, pagination and typed errors already written and tested against a live venue, with 14 unified capabilities and all 16 BTCTurk endpoints exposed.
* **Hand-rolling BTCTurk is not hard — it is fiddly.** The signature is HMAC-SHA256 of `apiKey + nonce` over a **base64-decoded** secret, base64-encoded again; the public and private endpoints live on **different API versions**; and there is a third host for chart data. Each of those is a small thing that costs an afternoon the first time.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw BTCTurk REST API** |
| --------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| Exchanges covered | 104 (BTCTurk is one of them) | BTCTurk only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write it in |
| Packages to install | **1** (`ccxt`) | an HTTP client plus your own wrapper |
| First-party client library | n/a | C# (2021, 2017) and Objective-C (2015) only |
| Unified market data + trading API | yes — 14 capabilities on `btcturk` | no — raw JSON payloads |
| WebSockets | **no** — 0 `watch*` methods for `btcturk` | BTCTurk documents a WebSocket feed you would implement yourself |
| Raw endpoint access | yes — 16 endpoints as implicit methods | yes, it is all you have |
| Multiple base URLs | handled — public `v2`, private `v1`, graph host, one client | you juggle three hosts |
| Built-in rate limiter | yes, on by default (`rateLimit` 100 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + BTCTurk error strings |
| Testnet / sandbox | none — BTCTurk publishes no sandbox | none |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** | `broker-api-docs` 106 stars; `broker-api-csharp` 6 stars, `broker-api-csharp-v2` 5 |
| Licence | MIT | n/a (`broker-api-csharp` is MIT) |
| Support | Discord, Telegram, GitHub — usually same-day | BTCTurk support; the docs repository has 42 open issues |
Figures verified September 2026 against CCXT v4.5.78, the `BTCTrader` GitHub organisation's repository listing, the `broker-api-docs` README, and PyPI package metadata.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.btcturk()
ticker = exchange.fetch_ticker('BTC/TRY')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://api.btcturk.com/api/v2/ticker',
params={'pairSymbol': 'BTCTRY'})
data = r.json()['data'][0]
# 'pair', 'pairNormalized', 'last', 'bid', 'ask', 'high', 'low',
# 'volume', 'average', 'daily', 'dailyPercent', 'denominatorSymbol', ...
print(data['last'], data['volume'])
```
The raw call is short, which is why people write it. What it does not give you is a [unified ticker structure](/docs/manual#ticker-structure): consistent key names, milliseconds instead of seconds, base volume separated from quote volume, and the same shape on the next exchange.
### Place a limit order [#place-a-limit-order]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.btcturk({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/TRY', 'limit', 'buy', 0.001, 3000000)
print(order['id'], order['status'])
```
```python
import base64, hashlib, hmac, json, time, requests
nonce = str(int(time.time() * 1000))
secret = base64.b64decode(API_SECRET)
signature = base64.b64encode(
hmac.new(secret, (API_KEY + nonce).encode(), hashlib.sha256).digest()
).decode()
r = requests.post(
'https://api.btcturk.com/api/v1/order',
headers={'X-PCK': API_KEY, 'X-Stamp': nonce,
'X-Signature': signature, 'Content-Type': 'application/json'},
data=json.dumps({'pairSymbol': 'BTCTRY', 'orderType': 'buy',
'orderMethod': 'limit', 'price': '3000000',
'quantity': '0.001'}))
print(r.json())
```
Three details in that snippet are easy to get wrong and produce the same unhelpful 401: the secret is **base64-decoded before** it is used as the HMAC key, the signed payload is `apiKey + nonce` and nothing else, and the nonce must be milliseconds synchronised against BTCTurk's server clock. CCXT does all three, and does the same for the other 103 exchanges without you learning each one's variant.
Note also that the order endpoint is on `/api/v1` while the ticker is on `/api/v2`. CCXT models public, private and graph as three separate base URLs behind one client, so `fetch_ticker` and `create_order` are the same object.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
BTCTurk's documentation is explicit: *"/api/v2/ticker requests are limited to 10 requests per 100 miliseconds. Other requests are limited to 1 request per 100 miliseconds. If you make more than 50 consequent unauthorized requests, your IP address will be blocked."*
CCXT sets `rateLimit = 100` ms for `btcturk` and ships a token-bucket throttler that is on by default, with per-endpoint weights (the ticker endpoint is weighted at 0.1 of a normal call, which is exactly the 10× allowance above). You write a loop; the library paces it. Hand-rolled, pacing plus back-off is your code, and the failure mode is an IP block rather than a clean error.
### One error hierarchy [#one-error-hierarchy]
CCXT maps BTCTurk's responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. Matching on error strings in a Turkish-market API and hoping the wording never changes is the alternative.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads BTCTurk's `server/exchangeinfo` and exposes tick size, step size and minimum notional through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class. TRY prices run to seven figures, which is exactly where float rounding starts producing rejected orders.
```python
amount = exchange.amount_to_precision('BTC/TRY', 0.0012345678)
price = exchange.price_to_precision('BTC/TRY', 3123456.789)
```
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and structures. BTCTurk's only first-party clients are C# and Objective-C, so in every other language you are starting from zero.
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.btcturk()
ticker = exchange.fetch_ticker('BTC/TRY')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.btcturk ();
const ticker = await exchange.fetchTicker ('BTC/TRY');
```
```csharp
var exchange = new ccxt.btcturk();
var ticker = await exchange.FetchTicker("BTC/TRY");
```
```go
exchange := ccxt.NewBtcturk(nil)
ticker, err := exchange.FetchTicker("BTC/TRY")
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
BTCTurk's API is small: **16 endpoints**, and CCXT generates every one of them as a callable implicit method with signing, rate limiting and error mapping applied.
```python
# any raw BTCTurk endpoint, camelCased from its path
response = exchange.public_get_server_exchangeinfo()
```
Browse them on the [btcturk implicit API page](/docs/exchanges/btcturk/implicit-api).
### Portability [#portability]
TRY liquidity is one leg of a trade, not the whole of it. In CCXT the exchange id is a variable, so adding an offshore venue for the other leg is a configuration change rather than a second integration:
```python
for exchange_id in ['btcturk', 'binance', 'okx']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
## What hand-rolling the raw API does better [#what-hand-rolling-the-raw-api-does-better]
An honest list, because these are real:
* **BTCTurk's WebSocket feed.** CCXT implements **zero** `watch*` methods for `btcturk`. BTCTurk documents a WebSocket feed with its own authentication message (type `114`, carrying public key, timestamp, nonce and an HMAC-SHA256 signature). If you want live socket data from this venue, you are writing that client — CCXT will not do it for you.
* **A far smaller dependency.** Two `requests` calls against `/api/v2/ticker` are a few lines and no third-party library. For a dashboard that reads one price, CCXT is more than you need.
* **Field-for-field fidelity with the docs.** `pairSymbol`, `orderMethod`, `dailyPercent` — when you are reading BTCTurk's reference while debugging, raw JSON has no translation layer between you and it. CCXT's unified names are a deliberate abstraction and one more hop.
* **Endpoints CCXT does not model as unified methods.** BTCTurk's fiat and crypto transaction endpoints and the `graph-api` chart host are reachable from CCXT only as implicit methods, returning raw payloads. If those are the bulk of your integration, the unified layer is buying you less.
If BTCTurk is your only venue, you need streaming, and you are comfortable owning the signing code, writing it directly is a defensible choice.
## Migrating from a raw BTCTurk integration to CCXT [#migrating-from-a-raw-btcturk-integration-to-ccxt]
| What you are doing | Raw BTCTurk API | CCXT |
| ------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `pairSymbol: 'BTCTRY'` | `'BTC/TRY'` |
| Client | your own signed `requests` wrapper | `ccxt.btcturk({'apiKey': ..., 'secret': ...})` |
| Exchange info | `GET /api/v2/server/exchangeinfo` | `load_markets()` |
| Ticker | `GET /api/v2/ticker` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `GET /api/v2/orderbook` | `fetch_order_book()` |
| Trades | `GET /api/v2/trades` | `fetch_trades()` |
| Candles | `GET /api/v2/ohlc`, or `graph-api.btcturk.com/v1/klines/history` | `fetch_ohlcv()` |
| New order | `POST /api/v1/order` | `create_order()` |
| Cancel order | `DELETE /api/v1/order` | `cancel_order()` |
| Open orders | `GET /api/v1/openOrders` | `fetch_open_orders()` |
| Order history | `GET /api/v1/allOrders` | `fetch_orders()` |
| Balance | `GET /api/v1/users/balances` | `fetch_balance()` |
| My trades | `GET /api/v1/users/transactions/trade` | `fetch_my_trades()` |
| Streams | BTCTurk WebSocket feed, hand-written | **not available in CCXT for `btcturk`** |
| Anything not listed | native call | the same endpoint as an [implicit method](/docs/exchanges/btcturk/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [btcturk unified API reference](/docs/exchanges/btcturk).
## FAQ [#faq]
**Is there an official BTCTurk Python SDK?**
No. BTCTrader's only first-party clients are C# (`broker-api-csharp`, last pushed November 2017, and `broker-api-csharp-v2`, September 2021) and Objective-C (2015). The `btcturk-api` and `btcturk` packages on PyPI are community projects, last released in 2021 and 2018. CCXT's Python support for BTCTurk is a normal `pip install ccxt`.
**Does CCXT support BTCTurk WebSockets?**
No. `btcturk` has zero `watch*` methods, so there is no `ccxt.pro.btcturk`. REST is fully covered — 14 unified capabilities and all 16 endpoints — but BTCTurk's documented WebSocket feed is not implemented.
**How does CCXT sign BTCTurk requests?**
It sends `X-PCK` (your API key), `X-Stamp` (a millisecond nonce) and `X-Signature`, where the signature is HMAC-SHA256 of `apiKey + nonce` using the base64-decoded secret as the key, base64-encoded. You never write that code, and you never have to notice that the secret is decoded first.
**Does BTCTurk have a testnet?**
No sandbox environment is published, so `set_sandbox_mode(True)` has nothing to point at for `btcturk`. Test against CCXT's offline static fixtures and small live orders.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support for the 76 exchanges that have it.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [btcturk unified API reference](/docs/exchanges/btcturk)
* [btcturk implicit API](/docs/exchanges/btcturk/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the BTSE API and the official BTSE Python SDK (/docs/comparisons/ccxt-vs-btse-api)
[BTSE](https://www.btse.com) runs spot and perpetual-futures markets and documents both a REST and a WebSocket API at [btsecom.github.io/docs](https://btsecom.github.io/docs/). There are two realistic ways to integrate it: BTSE's own Python SDK, [btsecom/btse-sdk](https://github.com/btsecom/btse-sdk), or [CCXT](/docs/manual), which speaks BTSE natively behind an API shared with 103 other venues.
The deciding question here is unusually clear, because the two sides do not overlap completely: **do you need live streams, and are you writing Python?**
## TL;DR [#tldr]
* **Pick the official BTSE SDK** if you are in Python, BTSE is your only venue, and you need WebSocket data. CCXT implements **zero `watch*` methods for BTSE** — the vendor SDK is the only one of the two that streams.
* **Pick CCXT** if you want 59 unified capabilities (30 of them `fetch*`), all 128 BTSE endpoints as implicit methods, and the same code in TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java or Rust.
* **The two are not mutually exclusive.** Nothing stops you polling REST through CCXT and running a small vendor-SDK process for the private WebSocket feed. The REST surface is where portability pays; a single venue's socket is where it pays least.
## At a glance [#at-a-glance]
| | **CCXT** | **Official BTSE Python SDK** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------- |
| Exchanges covered | 104 (BTSE is one of them) | BTSE only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python |
| Distribution | `pip install ccxt`, `npm install ccxt`, NuGet, Go modules, Maven | not on PyPI — `git clone` then `pip install -e .` |
| BTSE products in one client | spot and futures from one `ccxt.btse` instance | `BTSESpotClient` and `BTSEFuturesClient` |
| Unified market data + trading API | yes — same method names across every exchange | no — BTSE's own payloads, with typed enums |
| BTSE capabilities implemented | 59 unified methods, 30 of them `fetch*` | REST for spot and futures, plus WebSocket |
| WebSockets | **no** — 0 `watch*` methods for BTSE | yes — order-book cache and private streams |
| Raw endpoint access | yes — 128 BTSE endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint costs, on by default | not documented |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus BTSE error codes |
| Testnet / sandbox | `exchange.set_sandbox_mode(True)` | `testnet=True` on the client |
| Popularity | 43.8k GitHub stars · 4.7M PyPI + 494k npm installs/month (one package, every venue) | 0 GitHub stars; not published to PyPI |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues, BTSE support |
Figures verified September 2026 against CCXT v4.5.78, the btsecom GitHub organisation, BTSE's published API documentation, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a price [#fetch-a-price]
CCXT
btse-sdk
```python
import ccxt
exchange = ccxt.btse()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from btse_sdk import BTSESpotClient
client = BTSESpotClient(
api_key="your_api_key",
api_secret="your_api_secret",
testnet=True
)
price = client.price("BTC-USD")
print(price)
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — last, bid, ask, high, low, volumes, a millisecond timestamp, the same keys on every venue. The SDK's `price()` returns BTSE's own payload for BTSE's own market id.
### Place a limit order [#place-a-limit-order]
CCXT
btse-sdk
```python
import ccxt
exchange = ccxt.btse({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from btse_sdk import BTSESpotClient, OrderSide, OrderType
client = BTSESpotClient(
api_key="your_api_key",
api_secret="your_api_secret",
testnet=True
)
order = client.create_order(
symbol="BTC-USD",
side=OrderSide.BUY,
order_type=OrderType.LIMIT,
size=0.001,
price=30000
)
```
Moving that order to perpetual futures means a different client class in the SDK (`BTSEFuturesClient`, symbol `BTC-PERP`). In CCXT it is a different unified symbol on the same instance:
```python
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.001, 60000)
```
## Where the differences actually bite [#where-the-differences-actually-bite]
### CCXT does not stream BTSE — be clear about that first [#ccxt-does-not-stream-btse--be-clear-about-that-first]
BTSE documents WebSocket feeds at `wss://ws.btse.com/ws/spot`, with a separate order-book feed at `wss://ws.btse.com/ws/oss/spot` and testnet equivalents on `testws.btse.io`. CCXT implements **none** of them: there is no `ccxt.pro.btse`, and `exchange.has['ws']` is `false`. Live data through CCXT means polling `fetch_order_book`, `fetch_trades` or `fetch_tickers` on a timer.
This is the one axis where the vendor SDK is straightforwardly ahead, and it is worth deciding on before anything else on this page.
### Eight languages, one API [#eight-languages-one-api]
The official SDK is Python. BTSE also publishes [btsecom/api-sample](https://github.com/btsecom/api-sample), which carries example connectors in Python, Node.js and C# plus a Postman collection — but those are samples, not a library you take a dependency on.
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures in all of them.
TypeScript
Python
C#
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.btse ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```python
import ccxt
exchange = ccxt.btse()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```csharp
var exchange = new ccxt.btse();
var ticker = await exchange.FetchTicker("BTC/USDT");
```
```go
exchange := ccxt.NewBtse(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
### Portability is the whole point [#portability-is-the-whole-point]
Adding a second exchange to a vendor-SDK integration means a second payload shape, a second symbol convention, a second auth scheme and a second error taxonomy — then a translation layer of your own. That translation layer is what CCXT already is:
```python
for exchange_id in ['btse', 'binance', 'bybit', 'okx']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
BTSE's documentation sets different ceilings per endpoint class: 15 requests per second per API key for query endpoints (30 per user), and 75 per second for order endpoints, with tiered blocking of 1 second, 5 minutes and 15 minutes and a `Retry-After` header on 429.
CCXT encodes that shape directly. The base `rateLimit` is `1000 / 75` ms — a 75-request-per-second budget — and each endpoint carries a cost against it: **1** for order placement and cancellation, **3** for the `public-api/market/v1` data endpoints, **5** for most spot and futures queries, **15** for wallet calls. The throttler is on by default, so a loop of `fetch_ohlcv` calls paces itself.
### Precision, rounding and string math [#precision-rounding-and-string-math]
BTSE markets are loaded in `TICK_SIZE` mode, so CCXT knows each market's price tick and amount step and applies them for you through `amount_to_precision` and `price_to_precision`, backed by the `Precise` string-arithmetic class — no float drift turning into a rejected order.
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps BTSE's error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `InvalidNonce`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You catch `ccxt.InsufficientFunds` once, and it keeps working on the next venue.
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.btse({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps in https://testapi.btse.io
```
One flag swaps the REST base URL to BTSE's testnet host. No constants to juggle.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
The 59 unified methods are not a ceiling. Every endpoint in BTSE's `api` block is generated as a callable implicit method, with the `request-api` / `request-nonce` / `request-sign` HMAC-SHA384 headers, rate-limit accounting and error mapping applied:
```python
# GET /spot/api/v3.3/invest/products
products = exchange.private_get_spot_api_v3_3_invest_products()
# GET /public-api/otc/v1/markets
otc = exchange.public_get_public_api_otc_v1_markets()
```
That covers the Earn, OTC, convert and sub-account routes CCXT does not model as unified methods. Browse all 128 on the [btse implicit API page](/docs/exchanges/btse/implicit-api).
## What the official BTSE SDK does better [#what-the-official-btse-sdk-does-better]
An honest list, and the first item is the big one:
* **It streams and CCXT does not.** `btse-sdk` ships WebSocket support with a built-in order-book cache that handles snapshot/delta merging for you, plus authenticated private streams for fills and order notifications. CCXT has no `watch*` method for BTSE at all. If live data is the requirement, this decides it.
* **One-to-one with BTSE's own documentation.** `OrderSide`, `OrderType` and the client method names mirror BTSE's API reference exactly, so debugging against the vendor docs is a single hop rather than two.
* **Products CCXT does not unify.** CCXT's BTSE integration has no unified `withdraw`, `transfer`, `fetchDepositAddress` or `createDepositAddress`. Those endpoints exist and are reachable as implicit methods, but the SDK and the official samples treat wallet, convert, transfer, OTC and Earn as first-class.
* **Official multi-language samples.** [btsecom/api-sample](https://github.com/btsecom/api-sample) covers spot v3.3, futures v2.3, OTC, wallet and streaming in Python, Node.js and C#, with a Postman collection kept alongside — a useful reference even if you end up on CCXT.
If you are writing Python, trade only BTSE, and need the WebSocket feeds, the official SDK is the better fit today.
## Migrating from the BTSE API to CCXT [#migrating-from-the-btse-api-to-ccxt]
| What you are doing | BTSE REST | CCXT |
| ------------------- | ------------------------------------------------- | ---------------------------------------------------------------------------- |
| Symbols | `BTC-USDT`, `BTC-PERP-USDT` | `'BTC/USDT'`, `'BTC/USDT:USDT'` |
| Markets | `GET /public-api/market/v1/markets` | `load_markets()` |
| Ticker | `GET /public-api/market/v1/ticker/24hr` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `GET /public-api/market/v1/orderbook` | `fetch_order_book()` |
| Candles | `GET /public-api/market/v1/klines` | `fetch_ohlcv()` |
| Public trades | `GET /public-api/market/v1/trades` | `fetch_trades()` |
| New order | `POST /spot/api/v4/trade/orders` | `create_order()` |
| Amend order | `PUT /spot/api/v4/trade/orders` | `edit_order()` |
| Cancel order | `DELETE /spot/api/v4/trade/orders` | `cancel_order()` |
| Cancel everything | `DELETE /spot/api/v4/trade/orders/all` | `cancel_all_orders()` |
| Dead-man switch | `POST /spot/api/v4/trade/orders/cancel_all_after` | `cancel_all_orders_after()` |
| Open orders | `GET /spot/api/v4/trade/orders` | `fetch_open_orders()` |
| Balance | `GET /public-api/wallet/v1/user/assets` | `fetch_balance()` |
| Positions | `GET /futures/api/v3/trade/positions` | `fetch_positions()` |
| Leverage | `POST /futures/api/v3/trade/leverage` | `set_leverage()` |
| My trades | `GET /spot/api/v4/trade/trade_history` | `fetch_my_trades()` |
| Funding rate | `GET /public-api/market/v1/recentFundingHistory` | `fetch_funding_rate()` |
| Streams | `wss://ws.btse.com/ws/spot` | not implemented — poll, or use the vendor SDK |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/btse/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [btse unified API reference](/docs/exchanges/btse).
## FAQ [#faq]
**Does CCXT support BTSE WebSockets?**
No. CCXT implements zero `watch*` methods for BTSE, so there is no `ccxt.pro.btse`. BTSE itself publishes WebSocket feeds and its own Python SDK consumes them; through CCXT, live data means polling `fetch_order_book` or `fetch_trades` on a timer.
**Does BTSE have an official SDK?**
Yes — [btsecom/btse-sdk](https://github.com/btsecom/btse-sdk), a Python SDK for spot and futures with WebSocket support, MIT-licensed. It is not published to PyPI: you clone the repository and `pip install -e .`. BTSE also maintains [btsecom/api-sample](https://github.com/btsecom/api-sample) with Python, Node.js and C# examples.
**Does CCXT cover BTSE futures as well as spot?**
Yes, from one `ccxt.btse` instance. Spot markets are `'BTC/USDT'`, perpetuals are `'BTC/USDT:USDT'`, and positions, leverage, margin mode, position mode, funding rates, open interest and leverage tiers are all unified methods.
**Can I test against BTSE's testnet through CCXT?**
Yes. `exchange.set_sandbox_mode(True)` swaps the REST base URL to `https://testapi.btse.io`, which is what BTSE's documentation gives as the testnet host.
**Can I still call BTSE-specific endpoints through CCXT?**
Yes — all 128 of them, as [implicit methods](/docs/exchanges/btse/implicit-api), with HMAC-SHA384 signing and rate limiting applied. Choosing CCXT does not cut you off from the OTC, Earn, convert or sub-account routes.
**Is CCXT free?**
Yes. MIT-licensed, with no paid tier.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [btse unified API reference](/docs/exchanges/btse)
* [btse implicit API](/docs/exchanges/btse/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the Bullish API (/docs/comparisons/ccxt-vs-bullish-api)
[Bullish](https://bullish.com/) is a regulated spot and perpetual-futures exchange with a REST, WebSocket and FIX API documented at [docs.exchange.bullish.com](https://docs.exchange.bullish.com/). [CCXT](/docs/manual) supports it as the exchange id `bullish`, with 51 unified capabilities, 7 `watch*` streaming methods and all 58 endpoints callable directly.
The thing that decides between them is not coverage. It is the **session model**: Bullish's private API does not take an API key on each request. You log in, receive a JWT, carry it as a bearer token, and re-log in before it expires — and every private call needs a `tradingAccountId` as well. Someone has to implement that. The question is whether it is you.
## TL;DR [#tldr]
* **Go direct to the API** if you want the authentication flow visible in your own code, you need FIX, or you are in a language CCXT does not target — Bullish's `api-examples` repository is a genuinely good starting point in Python and Java.
* **Pick CCXT** if you want the login-token lifecycle, the trading-account lookup, the nonce window, the sandbox switch and the order-book streaming already implemented and tested, in eight languages, under MIT.
* **Bullish has no packaged SDK to lose.** The `python-bullish-client` repository is a public archive, as are `python-signer`, `java-signer` and `cpp-signer`. What is maintained is `api-examples` (Python and Java scripts) and `js-signer`. There is no `bullish` package on PyPI.
## At a glance [#at-a-glance]
| | **CCXT** | **Bullish's own repositories** |
| --------------------------------- | --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| Exchanges covered | 104 (Bullish is one of them) | Bullish only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python and Java examples; a TypeScript signer |
| Packaged client library | **1** (`ccxt`), on npm and PyPI | none — `python-bullish-client` is archived, nothing published to PyPI |
| Unified market data + trading API | yes — 51 capabilities on `bullish` | no — raw payloads from the examples |
| Session/login handling | automatic — HMAC login, JWT cached and refreshed | `generate_jwt_hmac.py` / `generate_jwt_ecdsa.py`, then your own refresh logic |
| Trading account id | resolved and cached for you | you supply it on every private call |
| WebSockets | yes — 7 `watch*` methods | `multi_orderbook_web_socket.py` example |
| Raw endpoint access | yes — 58 Bullish endpoints as implicit methods | yes, it is all you have |
| Built-in rate limiter | yes, on by default (`rateLimit` 20 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + Bullish error bodies |
| Sandbox | `set_sandbox_mode(True)` → `api.simnext.bullish-test.com` | change the hostname in `.env` |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | `api-examples` 7 stars · `js-signer` 6 · `python-bullish-client` 3 (archived) |
| Licence | MIT | no licence file shown on `api-examples` |
| Support | Discord, Telegram, GitHub — usually same-day | Bullish support desk, GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `bullish-exchange` GitHub organisation's repository listing and READMEs, and the published Bullish WebSocket rate-limit documentation.
### What Bullish actually publishes [#what-bullish-actually-publishes]
Read on the day this page was written, the `bullish-exchange` GitHub organisation holds nine repositories:
| Repository | What it is | Language | Stars | Last updated | Status |
| ----------------------- | ---------------------------------- | ------------ | ----- | -------------- | ------------ |
| `api-examples` | example scripts | Python, Java | 7 | October 2025 | public |
| `api-docs` | offline API docs | HTML | 2 | September 2025 | public |
| `js-signer` | request signing helper | TypeScript | 6 | December 2024 | public |
| `ccxt-bullish-python` | "ccxt exchange module for Bullish" | Python | 2 | April 2024 | **archived** |
| `cpp-signer` | R1-key signing helper | C++ | 0 | January 2024 | **archived** |
| `python-signer` | signing helper | Python | 1 | November 2023 | **archived** |
| `python-bullish-client` | Python API wrapper | Python | 3 | November 2022 | **archived** |
| `java-signer` | signing helper | Java | 1 | September 2022 | **archived** |
Two things stand out. First, the only client wrapper Bullish ever published is archived, and the maintained artefacts are examples and signers — building blocks, not a library. Second, `ccxt-bullish-python` exists: Bullish's own answer to "how do I use this from Python" was, at one point, a CCXT exchange module. That module is archived because `bullish` now ships in CCXT itself.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.bullish()
ticker = exchange.fetch_ticker('BTC/USDC')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://api.exchange.bullish.com/trading-api/v1/markets/BTC-USDC/tick')
print(r.json())
```
Public market data is easy on either side. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure), which matters once a second venue is involved; the raw call returns Bullish's own tick payload, which does not.
### Place a limit order [#place-a-limit-order]
This is where the two sides stop looking alike.
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.bullish({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDC', 'limit', 'buy', 0.001, 90000)
print(order['id'], order['status'])
```
```python
# 1. sign a login request: HMAC-SHA256 over timestamp + nonce + "GET" + path,
# sent as BX-TIMESTAMP / BX-NONCE / BX-SIGNATURE with BX-PUBLIC-KEY
# 2. GET /trading-api/v1/users/hmac/login -> {"token": "...", "authorizer": "..."}
# 3. cache the token; it expires and must be refreshed
# 4. GET /trading-api/v1/accounts/trading-accounts -> pick a tradingAccountId
# 5. only now sign and send the order:
# for POST, the payload is hashed with SHA-256 first, and the *digest*
# is what gets HMAC'd -- not the payload
# 6. send Authorization: Bearer alongside the BX-* headers
```
Every one of those six steps is real, and step 5 is the one that costs an afternoon: on `POST` requests Bullish signs the SHA-256 **digest** of `timestamp + nonce + method + path + body`, not the string itself. Get it wrong and you get an authentication error that looks identical to a wrong key.
CCXT implements the whole flow. `signIn()` is exposed if you want to trigger it explicitly, but you do not need to — the client logs in on first private use, caches the token with its expiry, and re-logs in when it lapses. The trading account id is resolved once and reused, and can still be overridden per call:
```python
exchange = ccxt.bullish({'apiKey': '...', 'secret': '...'})
orders = exchange.fetch_open_orders('BTC/USDC', params={'tradingAccountId': '111054475936334'})
```
### Stream an order book [#stream-an-order-book]
Bullish is one of the 76 CCXT exchanges with WebSocket support. `bullish` has **7** `watch*` methods: `watchOrderBook`, `watchTicker`, `watchTrades`, `watchOrders`, `watchMyTrades`, `watchBalance` and `watchPositions`.
CCXT
api-examples
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bullish()
while True:
orderbook = await exchange.watch_order_book('BTC/USDC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
# multi_orderbook_web_socket.py in bullish-exchange/api-examples:
# open the socket, send a subscribe frame, then handle raw
# snapshot and delta messages yourself -- including re-seeding
# after a reconnect and keeping the local book bounded.
```
`watch_order_book` returns the same structure as `fetch_order_book`, already merged and depth-limited. Underneath, CCXT handles connection pooling per URL, ping/pong keep-alive, automatic reconnect and resubscribe, snapshot/delta sequencing and bounded caches. Bullish's documented connection limits — a maximum of 100 open unauthenticated connections per IP address and 10 authenticated connections per API key — are the reason connection reuse is worth having done for you rather than discovered in production.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Spot and perpetuals in one client [#spot-and-perpetuals-in-one-client]
`bullish` covers both spot and perpetual futures from one instance, selected by the symbol:
```python
spot = exchange.fetch_ticker('BTC/USDC') # BTC-USDC
perp = exchange.fetch_ticker('ETH/USDC:USDC') # ETH-USDC-PERP
positions = exchange.fetch_positions(['ETH/USDC:USDC'])
funding = exchange.fetch_funding_rate_history('ETH/USDC:USDC')
```
The `:USDC` suffix is CCXT's unified notation for a linear contract settled in USDC. The same convention identifies perpetuals on every other venue CCXT supports.
### Sandbox without a second code path [#sandbox-without-a-second-code-path]
Bullish runs a simnext test environment, and CCXT knows its hostname:
```python
exchange = ccxt.bullish({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # api.simnext.bullish-test.com
```
One flag swaps every REST and WebSocket URL. No forked configuration, no constant swapping, and the rest of your code does not change.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT ships a token-bucket throttler that is on by default, at `rateLimit = 20` ms for `bullish`. Bullish also uses a rate-limit token on some order endpoints; CCXT passes it through as `params['rateLimitToken']` and sets the `BX-RATE-LIMIT-TOKEN` header for you.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Bullish's error bodies onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. Notably, an expired session surfaces as `AuthenticationError` rather than as an opaque 401 you have to correlate with the token clock.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads Bullish's base, quote, quantity, price and cost precisions along with min and max limits, and exposes them through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class.
```python
amount = exchange.amount_to_precision('BTC/USDC', 0.0012345678)
price = exchange.price_to_precision('BTC/USDC', 91234.56789)
```
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures. Bullish's examples are Python and Java; its maintained signer is TypeScript. In Go, PHP or C# there is nothing first-party to start from.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 51 unified capabilities, **all 58 Bullish endpoints are generated as callable implicit methods**, with login, signing, rate limiting and error mapping applied:
```python
# any raw Bullish endpoint, camelCased from its path
response = exchange.public_get_v1_markets()
```
Browse them on the [bullish implicit API page](/docs/exchanges/bullish/implicit-api).
## What going direct to the Bullish API does better [#what-going-direct-to-the-bullish-api-does-better]
An honest list, because these are real:
* **FIX.** Bullish documents a FIX interface alongside REST and WebSocket. CCXT does not speak FIX, for Bullish or for anyone. If FIX order entry is the requirement, this comparison does not apply.
* **ECDSA (R1 key) authentication.** Bullish's `api-examples` includes `generate_jwt_ecdsa.py` and `create_order_ecdsa.py` alongside the HMAC variants, and the archived `cpp-signer` and `java-signer` exist specifically for R1 keys. CCXT's `bullish` implementation uses the HMAC login path. If your keys are R1, the vendor examples are the reference.
* **The examples are current and readable.** `api-examples` has 122 commits and was updated in October 2025. Reading `create_order_hmac.py` end to end teaches you exactly what the API expects, which is worth doing once even if you then use CCXT.
* **Nothing between you and new features.** Bullish's own docs and examples change the day the API does. A *unified* CCXT wrapper for a brand-new Bullish feature may lag, even though the implicit API reaches the endpoint immediately.
If you need FIX, or your credentials are ECDSA keys, going direct is not a compromise — it is the option that works.
## Migrating from a direct Bullish integration to CCXT [#migrating-from-a-direct-bullish-integration-to-ccxt]
| What you are doing | Raw Bullish API | CCXT |
| ------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `BTC-USDC`, `ETH-USDC-PERP` | `'BTC/USDC'`, `'ETH/USDC:USDC'` |
| Client | signed `requests` wrapper + JWT cache | `ccxt.bullish({'apiKey': ..., 'secret': ...})` |
| Login | `GET /v1/users/hmac/login`, cache token, refresh | automatic; `sign_in()` if you want it explicit |
| Trading account | `GET /v1/accounts/trading-accounts`, pass on every call | resolved and cached; `params['tradingAccountId']` to override |
| Markets | `GET /v1/markets` | `load_markets()` |
| Ticker | `GET /v1/markets/{symbol}/tick` | `fetch_ticker()` |
| Order book | `GET /v1/markets/{symbol}/orderbook/hybrid` | `fetch_order_book()` |
| Candles | `GET /v1/markets/{symbol}/candle` | `fetch_ohlcv()` |
| New order | `POST /v2/orders` with digest signing | `create_order()` |
| Cancel order | `POST /v2/command` | `cancel_order()` / `cancel_all_orders()` |
| Open orders | `GET /v2/orders` | `fetch_open_orders()` |
| Balance | `GET /v1/accounts/asset` | `fetch_balance()` |
| Positions | `GET /v1/derivatives-positions` | `fetch_positions()` |
| Streams | subscribe frames + your own book merge | `watch_*` on `ccxt.pro.bullish` |
| Sandbox | swap the hostname | `set_sandbox_mode(True)` |
| Anything not listed | native call | the same endpoint as an [implicit method](/docs/exchanges/bullish/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [bullish unified API reference](/docs/exchanges/bullish).
## FAQ [#faq]
**Is there an official Bullish Python SDK?**
Not a maintained one. `bullish-exchange/python-bullish-client` is a public archive last updated in November 2022, and nothing is published to PyPI under that name. What Bullish maintains is `api-examples`, a set of Python and Java scripts. CCXT's Python support for Bullish is a normal `pip install ccxt`.
**How does CCXT handle the Bullish login token?**
It performs the HMAC login for you, caches the returned JWT with its expiry, and re-authenticates automatically when it lapses. `sign_in()` is available if you want to force it. You never write the token-refresh loop.
**Do I have to pass a trading account id to every Bullish call in CCXT?**
No. CCXT looks it up once and reuses it. You can still override it per call with `params={'tradingAccountId': '...'}` if you trade several accounts from one key.
**Does CCXT support Bullish perpetual futures?**
Yes. Perpetuals appear as unified symbols like `'ETH/USDC:USDC'` from the same `ccxt.bullish` instance as spot, with `fetch_positions`, `fetch_funding_rate_history` and `fetch_open_interest` available.
**Can I use the Bullish sandbox from CCXT?**
Yes. `exchange.set_sandbox_mode(True)` points every REST and WebSocket URL at `api.simnext.bullish-test.com`.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.bullish` and call the 7 `watch*` methods.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bullish unified API reference](/docs/exchanges/bullish)
* [bullish implicit API](/docs/exchanges/bullish/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Bybit API and pybit (/docs/comparisons/ccxt-vs-bybit-api)
Bybit's V5 API is one of the tidier exchange APIs: a single `category` parameter (`spot`, `linear`, `inverse`, `option`) selects the product line, so one connector can cover all four. Bybit publishes official connectors for several languages, and there is an unusually good community Node SDK on top of that.
[CCXT](/docs/manual) speaks the same V5 API, but behind method names shared with 103 other venues. The question that decides between them is the usual one: **is Bybit the only venue your code will ever touch?**
## TL;DR [#tldr]
* **Pick an official Bybit connector** if Bybit is your only venue and you want `category`/`orderType`/`qty` to read exactly as they do in Bybit's own reference.
* **Pick CCXT** if you want one dependency and one mental model across Bybit spot, USDT/USDC perpetuals, inverse contracts and options — and across the next exchange you add.
* **The community Node SDK is genuinely strong.** If you are in TypeScript and Bybit-only, [`bybit-api`](https://github.com/tiagosiebler/bybit-api) is a serious option and this page says so below.
* **Choosing CCXT does not hide anything.** All 404 raw Bybit endpoints are callable as [implicit methods](/docs/exchanges/bybit/implicit-api).
## At a glance [#at-a-glance]
| | **CCXT** | **Bybit's own + community connectors** |
| --------------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Exchanges covered | 104 (Bybit is one of them) | Bybit only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, Go, Java, .NET, JS, PHP, Ruby, Rust — separate codebases, very uneven traction |
| Packages to install | **1** (`ccxt`) | one per language, plus a separate `bybit_p2p` package for P2P |
| Bybit products in one client | spot, linear, inverse, options | yes — V5's `category` parameter does this too |
| Unified market data + trading API | yes — same method names on every exchange | no — Bybit's own request/response shapes |
| WebSockets | yes — 25 `watch*` / `unWatch*` methods, plus `createOrderWs`, `editOrderWs`, `cancelOrderWs` | yes, per-connector stream clients |
| Raw endpoint access | yes — 404 Bybit endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 20 ms) | not documented in pybit's README |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + Bybit `retCode` |
| Testnet | `exchange.set_sandbox_mode(True)` | `HTTP(testnet=True)` |
| Demo trading | `exchange.enable_demo_trading(True)` | separate base URL |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | pybit 671 stars · 254k PyPI installs/month; community `bybit-api` (Node) 344 stars · 113k npm installs/month |
| Licence | MIT | pybit MIT; `bybit-api` MIT |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues, Bybit developer channels |
Figures verified September 2026 against CCXT v4.5.78, the `bybit-exchange` GitHub organisation's repository listing, the pybit and `bybit-api` repositories and package pages, and install counts from npm and PyPI.
### One connector per language is not one API in eight languages [#one-connector-per-language-is-not-one-api-in-eight-languages]
Bybit's V5 documentation names official SDKs for Python, Go, Java and .NET, and points at a community Node SDK. The organisation also publishes JavaScript, PHP, Ruby and Rust connectors. They are separate codebases with separate idioms, and their adoption is wildly uneven — read on the day this page was written, `pybit` had 671 stars, `bybit.go.api` 85, `bybit-java-api` 41, `bybit.net.api` 27, `bybit-rust-api` 3, and `bybit.js.api`, `bybit.php.api` and `bybit.ruby.api` had none.
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust. The method names, arguments and return structures are identical in all eight, so a Python research notebook and a Go execution service share a data model rather than agreeing to disagree about one.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
pybit
```python
import ccxt
exchange = ccxt.bybit()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from pybit.unified_trading import HTTP
session = HTTP(testnet=False)
print(session.get_tickers(category="linear", symbol="BTCUSDT"))
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — same keys, same types, same units, whether the venue is Bybit, Kraken or Hyperliquid. pybit returns Bybit's `retCode`/`retMsg`/`result` envelope, which you unwrap and parse yourself. The `category="linear"` argument disappears in CCXT because it is encoded in the symbol: `BTC/USDT` is spot, `BTC/USDT:USDT` is the linear perpetual, `BTC/USD:BTC` the inverse one.
### Place an order [#place-an-order]
CCXT
pybit
```python
import ccxt
exchange = ccxt.bybit({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT:USDT', 'market', 'buy', 0.001)
print(order['id'], order['status'])
```
```python
from pybit.unified_trading import HTTP
session = HTTP(testnet=False, api_key="...", api_secret="...")
print(session.place_order(
category="linear",
symbol="BTCUSDT",
side="Buy",
orderType="Market",
qty="0.001",
))
```
To place the same order on spot, in CCXT you change the symbol to `'BTC/USDT'`. In pybit you change `category` to `"spot"` — and then discover the fields that behave differently between categories, which is exactly the per-category detail CCXT's `create_order` already normalises.
### Stream an order book [#stream-an-order-book]
CCXT
pybit
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bybit()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT:USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from pybit.unified_trading import WebSocket
ws = WebSocket(testnet=True, channel_type="linear")
def handle_message(message):
print(message)
ws.orderbook_stream(50, "BTCUSDT", handle_message)
```
These are not doing the same thing. CCXT returns a **live, fully merged order book** with the same structure as `fetch_order_book`. The raw stream hands you **snapshot and delta messages** and leaves the merging, sequencing and re-sync to you:
| | CCXT | raw stream |
| ------------------------------------------------ | ------------ | ---------- |
| Apply deltas onto the snapshot in order | done for you | your code |
| Detect a sequence gap and re-seed the book | done for you | your code |
| Reconnect, re-subscribe and re-seed after a drop | done for you | your code |
| Keep a bounded, depth-limited cache | done for you | your code |
| Same structure as the REST call | yes | no |
None of those failure modes throw. A book that has quietly drifted looks fine until a fill surprises you.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Portability is the whole point [#portability-is-the-whole-point]
This is the difference that shows up six months in. A second venue means a second SDK, a second payload shape, a second symbol convention, a second error taxonomy and a second WebSocket dialect — then a translation layer of your own so the rest of the system can stay venue-agnostic. That translation layer is what CCXT already is, maintained across 104 venues.
```python
for exchange_id in ['bybit', 'binance', 'okx', 'kraken', 'coinbase']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
### WebSockets that look like REST [#websockets-that-look-like-rest]
CCXT Pro is bundled in the same `ccxt` package — no separate purchase — and gives Bybit **25 streaming methods**: `watchOrderBook`, `watchOrderBookForSymbols`, `watchTrades`, `watchTradesForSymbols`, `watchOHLCV`, `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchBalance`, `watchOrders`, `watchPositions`, `watchMyTrades`, `watchLiquidations` and their `unWatch*` counterparts. Order entry over the socket is there too: `createOrderWs`, `editOrderWs` and `cancelOrderWs`.
`watch_order_book` returns the same structure as `fetch_order_book`; `watch_orders` the same as `fetch_orders`. Swapping a polling loop for a stream is a one-word change and nothing downstream moves.
### Testnet and demo trading are different things, and CCXT models both [#testnet-and-demo-trading-are-different-things-and-ccxt-models-both]
Bybit has two non-production modes and they are not interchangeable: a **testnet** on separate hosts, and **demo trading**, which runs against `api-demo` with your live-account credentials. CCXT exposes them as two explicit switches:
```python
exchange = ccxt.bybit({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # testnet hosts
exchange = ccxt.bybit({'apiKey': '...', 'secret': '...'})
exchange.enable_demo_trading(True) # api-demo hosts
```
Turning both on at once raises `NotSupported` rather than silently sending demo orders at a testnet host. Every REST and WebSocket URL moves with the flag; there is no second configuration path in your code.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Bybit meters per endpoint and per account tier. CCXT encodes the weights in the exchange definition and ships a token-bucket throttler that is **on by default** — `rateLimit` is 20 ms for Bybit, with a 5-second rolling window configured for the endpoints that need one. You call methods in a loop; the library paces them. With a raw connector, respecting the limits and backing off on a 403 or `retCode` 10006 is application code you write and keep working.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Bybit's `retCode` values onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. `except ccxt.InsufficientFunds` keeps working when you add a second exchange; matching on `retCode == 110007` does not.
### Precision, rounding and string math [#precision-rounding-and-string-math]
Bybit rejects orders that violate tick size, qty step or minimum notional. CCXT loads Bybit's instrument metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities do not drift through float rounding.
```python
amount = exchange.amount_to_precision('BTC/USDT:USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT:USDT', 61234.56789)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
The usual objection to a unified library is that it must be a lowest common denominator. It is not. Alongside the **126 unified capabilities** CCXT implements for Bybit, **all 404 endpoints in Bybit's API are generated as callable implicit methods**, with signing, rate-limit accounting and error mapping still applied:
```python
# any raw Bybit endpoint, camelCased from its path
response = exchange.private_get_v5_account_info()
```
So the unified API covers what every venue shares, and the implicit API covers the Bybit-specific remainder — without dropping to raw HTTP or adding a second dependency. Browse them on the [Bybit implicit API page](/docs/exchanges/bybit/implicit-api).
## What pybit and bybit-api do better [#what-pybit-and-bybit-api-do-better]
An honest list, because these are real:
* **pybit is a thin, literal mirror of the V5 docs.** `category`, `orderType`, `qty`, `retCode` — the names in your code are the names on the documentation page you are reading. CCXT's unified names are a deliberate abstraction, which is one extra hop when you are debugging against Bybit's reference.
* **pybit's dependency surface is tiny.** It is Python-only and builds on `requests` and `websocket-client`. If Bybit is your only venue and you only need a handful of endpoints, that is a much smaller thing to install and audit than all of CCXT.
* **The community Node SDK is excellent, and better than most exchanges' official ones.** [`bybit-api`](https://github.com/tiagosiebler/bybit-api) is MIT, TypeScript-first, and its README documents thorough type declarations for most requests and responses including the WebSocket API, configurable heartbeats, and automatic reconnect-then-resubscribe. It shipped v4.7.5 on 1 September 2026 and pulls 113k npm installs a month — a release cadence and an install base comparable to a well-run official SDK. If you are Bybit-only in TypeScript, it is a defensible choice and we would not argue with it.
* **`bybit-api` also advertises venue-side perks CCXT users do not get.** Its README states that rate limits are raised to 400 requests per second for SDK users, and that orders can go as low as $1 notional against the usual $5 minimum. Those are agreements between that SDK and Bybit, not properties of the API — no third-party library can hand them to you.
* **New V5 endpoints land in a thin connector first.** A brand-new Bybit endpoint appears in a pass-through SDK the day it is documented; a *unified* CCXT method for it may lag. (CCXT's implicit API closes most of that gap immediately, but the unified wrapper can trail.)
If Bybit is your only venue, forever, and you value literal fidelity to their reference over portability, pybit in Python or `bybit-api` in TypeScript are both reasonable choices.
## Migrating from pybit to CCXT [#migrating-from-pybit-to-ccxt]
| What you are doing | pybit | CCXT |
| ------------------- | ---------------------------------------- | ----------------------------------------------------------------------------- |
| Symbols | `symbol="BTCUSDT"` + `category="linear"` | `'BTC/USDT'` spot, `'BTC/USDT:USDT'` linear, `'BTC/USD:BTC'` inverse |
| Client | `HTTP(api_key=..., api_secret=...)` | `ccxt.bybit({'apiKey': ..., 'secret': ...})` |
| Instruments | `get_instruments_info()` | `load_markets()` |
| Ticker | `get_tickers()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `get_orderbook()` | `fetch_order_book()` |
| Candles | `get_kline()` | `fetch_ohlcv()` |
| Public trades | `get_public_trade_history()` | `fetch_trades()` |
| New order | `place_order()` | `create_order()` |
| Cancel order | `cancel_order()` | `cancel_order()` |
| Open orders | `get_open_orders()` | `fetch_open_orders()` |
| Balance | `get_wallet_balance()` | `fetch_balance()` |
| Positions | `get_positions()` | `fetch_positions()` |
| Streams | `WebSocket(...).orderbook_stream(...)` | `watch_*` on `ccxt.pro.bybit` |
| Testnet | `HTTP(testnet=True)` | `set_sandbox_mode(True)` |
| Demo trading | separate base URL | `enable_demo_trading(True)` |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/bybit/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [bybit unified API reference](/docs/exchanges/bybit).
## FAQ [#faq]
**Is CCXT slower than calling the Bybit API directly?**
CCXT adds parsing and normalisation on top of the same HTTP and WebSocket calls, so there is a small constant overhead per message. For anything short of latency-sensitive market making, network round-trip time dominates it. If you are optimising microseconds you are writing custom code against a colocated endpoint anyway, which is not a comparison between two general-purpose libraries.
**Does CCXT support Bybit's unified account, inverse contracts and options?**
Yes. One `ccxt.bybit` instance covers spot, USDT and USDC linear perpetuals and futures, inverse contracts and options. The product is selected by the unified symbol — `BTC/USDT:USDT`, `BTC/USD:BTC`, `BTC/USDC:USDC-241227-55000-P` — with `options.defaultType` setting the default.
**Can I use Bybit demo trading through CCXT?**
Yes, with `exchange.enable_demo_trading(True)`, which swaps every REST and WebSocket URL to Bybit's `api-demo` hosts. That is separate from `set_sandbox_mode(True)`, which switches to testnet; enabling both at once raises `NotSupported`.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.bybit` and call `watch*` methods — 25 of them for Bybit, plus `createOrderWs`, `editOrderWs` and `cancelOrderWs` for order entry over the socket.
**Can I still call Bybit-specific endpoints?**
Yes — all 404 of them, as [implicit methods](/docs/exchanges/bybit/implicit-api), with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bybit unified API reference](/docs/exchanges/bybit)
* [bybit implicit API](/docs/exchanges/bybit/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Bybit EU API (/docs/comparisons/ccxt-vs-bybiteu-api)
`bybiteu` is a regional entity of Bybit — the MiCA-regulated European entity of Bybit, serving EEA users from a separate host.
Because it shares an API dialect with Bybit, CCXT implements it by extending its `bybit` class. Everything in the [CCXT vs the Bybit API](/docs/comparisons/ccxt-vs-bybit-api) comparison applies here — this page covers only what is specific to `bybiteu`.
## What is different [#what-is-different]
Separate registration and separate API host from bybit.com. Product coverage is narrower than the global venue, reflecting what the European entity is licensed to offer.
> Credentials are not shared with the global `bybit` class.
## What CCXT gives you here [#what-ccxt-gives-you-here]
| | `bybiteu` |
| --------------------------------- | ------------------------------------------------------------ |
| Unified capabilities | 123 (inherited from `bybit` plus its own overrides) |
| `fetch*` methods | 61 |
| WebSocket `watch*` methods | 25 |
| Raw endpoints as implicit methods | 404 |
| Testnet via `setSandboxMode` | yes |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust |
| Licence | MIT |
Figures verified September 2026 against CCXT v4.5.78, read from the source tree with `build/comparisons-facts.cjs`. Counts include everything inherited from `bybit`.
## Using it [#using-it]
The class name is the only thing that changes — every unified method behaves as it does everywhere else in CCXT:
Python
TypeScript
```python
import ccxt
exchange = ccxt.bybiteu({'apiKey': '...', 'secret': '...'})
markets = exchange.load_markets()
ticker = exchange.fetch_ticker(list(markets)[0])
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.bybiteu ({ apiKey: '...', secret: '...' });
const markets = await exchange.loadMarkets ();
const ticker = await exchange.fetchTicker (Object.keys (markets)[0]);
```
Because `bybiteu` lists a different market set from `bybit`, call `load_markets()` and pick symbols from it rather than assuming a pair exists.
Streaming works the same way:
```python
import ccxt.pro, asyncio
async def main():
exchange = ccxt.pro.bybiteu()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
## Should you use this class or the parent? [#should-you-use-this-class-or-the-parent]
Use `bybiteu` when you hold an account with Bybit EU specifically. Use [`bybit`](/docs/exchanges/bybit) when you hold an account with the global venue. They are different venues with separate credentials, so this is not a preference — it follows from where your account is.
## FAQ [#faq]
**Do my `bybit` API keys work with `bybiteu`?**
No. It is a separate legal entity with separate accounts; you need keys issued by Bybit EU.
**Does `bybiteu` support the full unified API?**
It inherits 123 unified capabilities from `bybit`. Where the venue does not offer a feature, the corresponding `has` flag is turned off, and the method raises `NotSupported` rather than failing quietly. Check `exchange.has` at runtime.
**Can I reach Bybit EU-specific endpoints?**
Yes — all 404 endpoints in this class's `api` block are generated as implicit methods, with signing, rate limiting and error mapping applied. The mechanism is documented on the [`bybit` implicit API page](/docs/exchanges/bybit/implicit-api); this venue's own endpoint list differs slightly from the parent's.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [CCXT vs the Bybit API](/docs/comparisons/ccxt-vs-bybit-api) — the full comparison
* [`bybit` API reference](/docs/exchanges/bybit) — `bybiteu` inherits it; it has no separate reference page
* [Install CCXT](/docs/install)
* [Manual](/docs/manual)
* [More comparisons](/docs/comparisons)
# CCXT vs the raw BYDFi API (/docs/comparisons/ccxt-vs-bydfi-api)
[BYDFi](https://bydfi.com/) documents a perpetual-futures trading API at [developers.bydfi.com](https://developers.bydfi.com/en/). What it does not publish is a client library.
That is not a guess. There is no `bydfi`, `bydfi-api` or `bydfi-sdk` package on npm, and none on PyPI. The `bydfi-official/api-docs` repository on GitHub contains documentation and configuration files only — no client code. A GitHub search for repositories matching "bydfi" returns referral pages, personal bots and scraping scripts, and no first-party wrapper in any language.
So the comparison here is not CCXT against a vendor SDK. It is **CCXT against the HTTP client you were about to write** — and against the derivatives plumbing that comes with it.
## TL;DR [#tldr]
* **Write it yourself** if you need three endpoints, you are in a language CCXT does not target, or you want the signing visible in your own repository.
* **Pick CCXT** if you want signing, streaming, leverage and margin-mode handling, position bookkeeping, precision and typed errors already implemented against the live venue — 60 unified capabilities, 10 `watch*` methods and all 45 endpoints.
* **The derivatives surface is what you would spend the time on.** Leverage, margin mode, hedge-vs-one-way position mode, reduce-only and trailing orders, sub-wallets and position history are all things CCXT already models with the same names it uses on Bybit, OKX and Binance futures.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw BYDFi REST API** |
| -------------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| Exchanges covered | 104 (BYDFi is one of them) | BYDFi only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write it in |
| Official client library | n/a | **none published** — no package on npm or PyPI, no client code on GitHub |
| Products covered | perpetual futures (linear swaps) | perpetual futures |
| Unified market data + trading API | yes — 60 capabilities on `bydfi` | no — raw JSON payloads |
| WebSockets | yes — 10 `watch*` methods | you implement the socket client |
| Raw endpoint access | yes — 45 BYDFi endpoints as implicit methods | yes, it is all you have |
| Built-in rate limiter | yes, on by default (`rateLimit` 50 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + BYDFi `code`/`message` bodies |
| Leverage / margin mode / position mode | `set_leverage`, `set_margin_mode`, `set_position_mode` and their `fetch_*` counterparts | separate endpoints, your own state handling |
| Testnet / sandbox | none — BYDFi publishes no sandbox | none |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** | `bydfi-official/api-docs` 0 stars, documentation only |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub — usually same-day | BYDFi support channels |
Figures verified September 2026 against CCXT v4.5.78, the `bydfi-official/api-docs` repository, a GitHub repository search for BYDFi client libraries, and npm and PyPI registry lookups.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.bydfi()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://api.bydfi.com/api/v1/fapi/market/ticker/24hr',
params={'symbol': 'BTC-USDT'})
print(r.json()['data'])
```
`'BTC/USDT:USDT'` is CCXT's unified notation for a USDT-settled linear perpetual — the same string identifies the equivalent contract on Bybit, OKX or Binance. `BTC-USDT` is BYDFi's own market id, which CCXT resolves for you through `load_markets()`.
The CCXT call returns a [unified ticker structure](/docs/manual#ticker-structure): consistent keys, milliseconds, base and quote volume separated. The raw call returns BYDFi's payload wrapped in a `{code, message, data}` envelope you unwrap yourself.
### Place a limit order [#place-a-limit-order]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.bydfi({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.001, 90000)
print(order['id'], order['status'])
```
```python
import hashlib, hmac, json, time, requests
timestamp = str(int(time.time() * 1000))
# parameters must be key-sorted before they are serialised
body = json.dumps({'price': '90000', 'quantity': '0.001',
'side': 'BUY', 'symbol': 'BTC-USDT',
'type': 'LIMIT', 'wallet': 'W001'}, sort_keys=True)
signature = hmac.new(API_SECRET.encode(),
(API_KEY + timestamp + body).encode(),
hashlib.sha256).hexdigest()
r = requests.post('https://api.bydfi.com/api/v1/fapi/trade/place_order',
headers={'Content-Type': 'application/json',
'X-API-KEY': API_KEY,
'X-API-TIMESTAMP': timestamp,
'X-API-SIGNATURE': signature},
data=body)
print(r.json())
```
The signed payload differs by HTTP method — `apiKey + timestamp + urlencoded_query` on `GET`, `apiKey + timestamp + json_body` on `POST` — and in both cases the parameters must be **key-sorted first** or the signature will not match. CCXT does that internally, and does the equivalent for the other 103 exchanges without you learning each variant.
### Stream an order book [#stream-an-order-book]
BYDFi is one of the 76 CCXT exchanges with WebSocket support. `bydfi` has **10** `watch*` methods: `watchOrderBook`, `watchOrderBookForSymbols`, `watchTicker`, `watchTickers`, `watchOHLCV`, `watchOHLCVForSymbols`, `watchOrders`, `watchOrdersForSymbols`, `watchPositions` and `watchBalance`.
CCXT
Raw WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.bydfi()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT:USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
# open the socket, send a subscribe frame, then:
# - fetch a REST snapshot and align it with the stream,
# buffering deltas that arrive while it is in flight
# - detect sequence gaps and re-sync
# - reconnect, resubscribe and re-seed after a drop
# - keep the local book bounded instead of growing forever
```
`watch_order_book` returns the same structure as `fetch_order_book`, already merged and depth-limited, so swapping a polling loop for a stream leaves the downstream code untouched. Every line in the right-hand column is a place a hand-rolled book goes quietly wrong — it does not throw, it drifts, and you find out from a fill you did not expect. `watch_positions` and `watch_balance` matter more on a derivatives venue than on spot: liquidation risk is a function of margin you want pushed to you, not polled.
## Where the differences actually bite [#where-the-differences-actually-bite]
### The derivatives surface is already modelled [#the-derivatives-surface-is-already-modelled]
This is the bulk of the work you would otherwise do yourself. CCXT implements, with the same names it uses on every other futures venue:
```python
exchange.set_leverage(10, 'BTC/USDT:USDT')
exchange.set_margin_mode('isolated', 'BTC/USDT:USDT')
exchange.set_position_mode(True) # hedge mode
positions = exchange.fetch_positions(['BTC/USDT:USDT'])
history = exchange.fetch_positions_history(['BTC/USDT:USDT'])
funding = exchange.fetch_funding_rate('BTC/USDT:USDT')
```
Order types too: stop-loss, take-profit, stop-limit, post-only, reduce-only and trailing-percent orders are unified params on `create_order`, not four separate request shapes. `create_orders` and `edit_orders` map onto BYDFi's batch endpoints, and `edit_order_with_client_order_id` lets you amend by your own id rather than the exchange's.
BYDFi also has sub-wallets — `W001` is the default contract wallet — and CCXT threads that through as `params['wallet']` on the methods that need it.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT ships a token-bucket throttler that is on by default, at `rateLimit = 50` ms for `bydfi`. BYDFi also exposes an endpoint that reports your own rate-limit configuration, which CCXT surfaces as an implicit method:
```python
limits = exchange.public_get_v1_public_api_limits()
```
Hand-rolled, pacing and back-off on a 429 are your code, and the endpoint above is one you have to remember exists.
### One error hierarchy [#one-error-hierarchy]
CCXT maps BYDFi's `{code, message}` envelopes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once instead of matching on numeric codes and hoping the wording never changes.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads BYDFi's contract metadata — tick size, step size, minimum and maximum quantity for both limit and market orders — and exposes it through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class.
```python
amount = exchange.amount_to_precision('BTC/USDT:USDT', 0.0012345678)
```
On a leveraged venue this is not cosmetic: a rejected order because a quantity drifted in the last decimal place is a position you did not open or did not close.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures. Since BYDFi publishes nothing first-party, every language starts from zero without it.
Python
C#
Go
```python
import ccxt
exchange = ccxt.bydfi()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
```
```csharp
var exchange = new ccxt.bydfi();
var ticker = await exchange.FetchTicker("BTC/USDT:USDT");
```
```go
exchange := ccxt.NewBydfi(nil)
ticker, err := exchange.FetchTicker("BTC/USDT:USDT")
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 60 unified capabilities, **all 45 BYDFi endpoints are generated as callable implicit methods**, with signing, rate limiting and error mapping applied — including the affiliate and agent endpoints that have no unified equivalent:
```python
# any raw BYDFi endpoint, camelCased from its path
response = exchange.private_get_v1_agent_affiliate_commission()
```
Browse them on the [bydfi implicit API page](/docs/exchanges/bydfi/implicit-api).
## What going direct to the BYDFi API does better [#what-going-direct-to-the-bydfi-api-does-better]
An honest list, because these are real:
* **A far smaller dependency.** One `requests` call is three lines. For a price display or a one-off backfill, all of CCXT is more than you need.
* **Field-for-field fidelity with the docs.** `positionSide`, `workingType`, `activatePrice`, `wallet` — reading BYDFi's reference while debugging is one hop shorter when there is no translation layer. CCXT's unified names are a deliberate abstraction.
* **Cancelling a single order.** CCXT reports `has['cancelOrder'] == False` for `bydfi`; what is implemented is `cancel_all_orders(symbol)`, matching BYDFi's complete-cancellation endpoint. If you need finer-grained cancellation than that, you reach for the raw endpoint either way.
* **New endpoints the day they ship.** BYDFi's documentation changes when the API does. A *unified* CCXT method for a brand-new feature can lag, even though the implicit API reaches the endpoint immediately.
* **Spot markets.** CCXT's `bydfi` models perpetual futures; `features.spot` is undefined and the unified market list is contracts only. Deposits, withdrawals and transfers are unified, but there are no unified spot trading pairs.
If BYDFi is your only venue and your integration is a handful of futures endpoints, writing it directly is a defensible choice.
## Migrating from a direct BYDFi integration to CCXT [#migrating-from-a-direct-bydfi-integration-to-ccxt]
| What you are doing | Raw BYDFi API | CCXT |
| ------------------------------------ | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| Symbols | `symbol: 'BTC-USDT'` | `'BTC/USDT:USDT'` |
| Client | your own signed `requests` wrapper | `ccxt.bydfi({'apiKey': ..., 'secret': ...})` |
| Contract list | `GET /v1/fapi/market/exchange_info` | `load_markets()` |
| Ticker | `GET /v1/fapi/market/ticker/24hr` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `GET /v1/fapi/market/depth` | `fetch_order_book()` |
| Trades | `GET /v1/fapi/market/trades` | `fetch_trades()` |
| Candles | `GET /v1/fapi/market/klines` | `fetch_ohlcv()` |
| Funding rate | `GET /v1/fapi/market/funding_rate` | `fetch_funding_rate()` / `fetch_funding_rate_history()` |
| New order | `POST /v1/fapi/trade/place_order` | `create_order()` |
| Batch orders | `POST /v1/fapi/trade/batch_place_order` | `create_orders()` |
| Amend order | `POST /v1/fapi/trade/edit_order` | `edit_order()` / `edit_order_with_client_order_id()` |
| Cancel | `POST /v1/fapi/trade/cancel_all_order` | `cancel_all_orders()` |
| Open orders | `GET /v1/fapi/trade/open_order` | `fetch_open_orders()` |
| Order history | `GET /v1/fapi/trade/history_order` | `fetch_canceled_and_closed_orders()` |
| Balance | `GET /v1/fapi/account/balance` | `fetch_balance()` |
| Positions | `GET /v1/fapi/trade/positions` | `fetch_positions()` / `fetch_positions_for_symbol()` |
| Leverage, margin mode, position mode | `POST /v1/fapi/trade/leverage`, `/user_data/margin_type`, `/user_data/position_side/dual` | `set_leverage()`, `set_margin_mode()`, `set_position_mode()` and their `fetch_*` counterparts |
| Transfers | `POST /v1/account/transfer` | `transfer()` / `fetch_transfers()` |
| Deposits, withdrawals | `GET /v1/spot/deposit_records`, `/withdraw_records` | `fetch_deposits()` / `fetch_withdrawals()` |
| Streams | your own socket client and book merge | `watch_*` on `ccxt.pro.bydfi` |
| Anything not listed | native call | the same endpoint as an [implicit method](/docs/exchanges/bydfi/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [bydfi unified API reference](/docs/exchanges/bydfi).
## FAQ [#faq]
**Is there an official BYDFi SDK?**
None was published as of September 2026. There is no `bydfi` package on npm or PyPI, and BYDFi's only GitHub repository, `bydfi-official/api-docs`, contains documentation rather than client code. CCXT is the maintained option in eight languages.
**Does CCXT support BYDFi WebSockets?**
Yes. `bydfi` has 10 `watch*` methods, including `watch_order_book`, `watch_ohlcv`, `watch_orders`, `watch_positions` and `watch_balance`, plus the `*ForSymbols` multi-symbol variants. Use `ccxt.pro.bydfi`.
**Does CCXT support BYDFi spot trading?**
CCXT's `bydfi` models the perpetual-futures API — the unified markets are linear swaps like `'BTC/USDT:USDT'`, and there is no unified spot market list. Account-side spot endpoints are still covered: `fetch_deposits`, `fetch_withdrawals`, `transfer` and `fetch_transfers` all work.
**How do I cancel one BYDFi order in CCXT?**
`has['cancelOrder']` is `false` for this venue; CCXT implements `cancel_all_orders(symbol)`, which maps to BYDFi's complete-cancellation endpoint. For finer control, call the raw endpoint as an implicit method.
**Does BYDFi have a testnet I can use with CCXT?**
No sandbox environment is published, so `set_sandbox_mode(True)` has nothing to point at for `bydfi`. Test against CCXT's offline static fixtures and small live orders.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [bydfi unified API reference](/docs/exchanges/bydfi)
* [bydfi implicit API](/docs/exchanges/bydfi/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs ccapi (/docs/comparisons/ccxt-vs-ccapi)
[ccapi](https://github.com/crypto-chassis/ccapi) is, in its own words, "a header-only C++ library for streaming market data and executing trades directly from cryptocurrency exchanges (i.e. the connections are between your server and the exchange server without anything in-between)". Its API "closely follows Bloomberg's API", and the README states it "is ultra fast thanks to very careful optimizations".
[CCXT](/docs/manual) covers the same ground — market data and order entry across many venues behind one API — but is designed for breadth and portability rather than for the microsecond. The question that decides between them is straightforward: **is latency the constraint on your system, or is coverage?**
## TL;DR [#tldr]
* **Pick ccapi** if you are writing a latency-sensitive execution system in C++, you trade a handful of major venues, and you are willing to build the library and its dependencies from source. Compiled C++ with no interpreter in the request path is a real advantage and no amount of library design closes it.
* **Pick CCXT** if you need 104 exchanges rather than about twenty, unified symbols and typed structures rather than the venue's own instrument ids and string maps, and a package install rather than a Boost-and-OpenSSL build.
* **Running both is reasonable.** ccapi on the hot path for the two or three venues that matter, CCXT for the long tail, reference data, account reconciliation and everything written in Python.
## At a glance [#at-a-glance]
| | **CCXT** | **ccapi** |
| ------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Primary language | TypeScript, transpiled | C++17, header-only |
| Other languages | JavaScript, Python, PHP, C#/.NET, Go, Java — published packages | "Bindings for other languages such as Python, Java, C#, Go, and Javascript" — built from source with SWIG and CMake |
| Exchanges — market data | 104, of which 76 have WebSocket | 30 entries in the README's list, spanning 21 distinct venues (binance, binance-usds-futures and binance-coin-futures are three of those entries) |
| Exchanges — order entry | 104 | 28 entries in the execution-management list |
| FIX | no | yes — binance, coinbase, gemini, via hffix |
| Symbols | unified: `BTC/USDT`, `BTC/USDT:USDT` | the venue's own instrument id: `BTCUSDT` on bybit, `BTC-USDT` on okx, `BTC-USD` on coinbase |
| Return shape | typed unified structures | `Event` → `Message` → `Element`, each a name-to-value string map |
| Programming model | `await` a method, get a value | register an `EventHandler` with a `Session`; events arrive in `processEvent` |
| Unified execution surface | 155 unified capabilities on binance | 8 request operations: `CREATE_ORDER`, `CANCEL_ORDER`, `GET_ORDER`, `GET_OPEN_ORDERS`, `CANCEL_OPEN_ORDERS`, `GET_ACCOUNTS`, `GET_ACCOUNT_BALANCES`, `GET_ACCOUNT_POSITIONS` |
| Raw endpoint access | implicit methods for every endpoint — 808 for binance | `GENERIC_PUBLIC_REQUEST` / `GENERIC_PRIVATE_REQUEST`, where you supply `HTTP_METHOD` and `HTTP_PATH` |
| Rate limiter | yes, per-endpoint weights, on by default | not documented in the README |
| Build prerequisites | `pip install ccxt` / `npm i ccxt` | C++17 and OpenSSL, plus Boost 1.87.0 and RapidJSON 1.1.0 headers, plus hffix 1.4.1 for FIX; SWIG and CMake for the bindings |
| Latest release | continuous, on npm, PyPI, NuGet, Packagist, Go modules, Maven Central | **v7.10.1**, 7 August 2026 |
| Last commit read | — | 4 August 2026 on `develop`, 6 August 2026 on `master` |
| Popularity | 43.8k GitHub stars · **4.68M PyPI + 494k npm installs/month** | 733 GitHub stars · 236 forks |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues | Discord, GitHub issues, email |
Figures verified September 2026 against CCXT v4.5.78, and against the ccapi GitHub repository, README, commit history and releases feed read on 3 September 2026. Install counts from the npm and PyPI APIs.
## The same job, written both ways [#the-same-job-written-both-ways]
ccapi's Python binding is used here, because that is where the two are most directly comparable. All ccapi snippets are from the examples in its repository.
### Get recent trades [#get-recent-trades]
CCXT
ccapi
```python
import ccxt
exchange = ccxt.coinbase()
trades = exchange.fetch_trades('BTC/USD', limit=1)
for t in trades:
print(t['symbol'], t['side'], t['amount'], t['price'])
```
```python
import time
from ccapi import EventHandler, SessionOptions, SessionConfigs, Session, Request, Event
class MyEventHandler(EventHandler):
def processEvent(self, event: Event, session: Session) -> None:
print(f"Received an event:\n{event.toPrettyString(2, 2)}")
eventHandler = MyEventHandler()
session = Session(SessionOptions(), SessionConfigs(), eventHandler)
request = Request(Request.Operation_GET_RECENT_TRADES, "coinbase", "BTC-USD")
request.appendParam({"LIMIT": "1"})
session.sendRequest(request)
time.sleep(10)
session.stop()
```
Two things differ beyond the line count. First, the instrument: `BTC/USD` is CCXT's unified symbol, resolved to whatever the venue calls it; `"BTC-USD"` is Coinbase's own id, and the same pair on bybit is `"BTCUSDT"` and on binance-us is `"BTCUSD"`. Second, the result: CCXT hands back a list of [trade structures](/docs/manual#trade-structure) with typed fields; ccapi hands back an `Event` whose `Message`s carry `Element`s, each a map of names to string values such as `LAST_PRICE`, `LAST_SIZE` and `TRADE_ID`.
### Place a limit order [#place-a-limit-order]
CCXT
ccapi
```python
import ccxt
exchange = ccxt.binanceus({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USD', 'limit', 'buy', 0.0005, 20000)
print(order['id'], order['status'])
```
```python
session = Session(SessionOptions(), SessionConfigs(), eventHandler)
request = Request(Request.Operation_CREATE_ORDER, "binance-us", "BTCUSD")
request.appendParam(
{
"SIDE": "BUY",
"QUANTITY": "0.0005",
"LIMIT_PRICE": "20000",
}
)
session.sendRequest(request)
```
ccapi reads credentials from environment variables such as `BINANCE_US_API_KEY` and `BINANCE_US_API_SECRET`, or from `SessionConfigs`. The order is a parameter map sent through the session; the response arrives later in `processEvent`, not as a return value — unless you opt into a blocking `Session::sendRequest`, which the README documents.
CCXT returns an [order structure](/docs/manual#order-structure) from the call, with `id`, `status`, `filled`, `remaining`, `average` and `fee` populated the same way on every venue.
### Stream an order book [#stream-an-order-book]
CCXT
ccapi
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.okx()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
class MyEventHandler(EventHandler):
def processEvent(self, event: Event, session: Session) -> None:
if event.getType() == Event.Type_SUBSCRIPTION_DATA:
for message in event.getMessageList():
print(f"Best bid and ask at {message.getTimeISO()} are:")
for element in message.getElementList():
for name, value in element.getNameValueMap().items():
print(f" {name} = {value}")
session = Session(SessionOptions(), SessionConfigs(), MyEventHandler())
subscription = Subscription("okx", "BTC-USDT", "MARKET_DEPTH")
session.subscribe(subscription)
```
Both maintain a real order book — ccapi emits depth snapshots by default and updates if you set `MARKET_DEPTH_RETURN_UPDATE=1`, and it can conflate to a fixed interval with `CONFLATE_INTERVAL_MILLISECONDS`. The difference is push versus pull. ccapi's callback fires on the library's thread; CCXT's `watch_order_book` returns to your coroutine, so the deciding and the sending live in the same function.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Coverage, and how to read ccapi's exchange list [#coverage-and-how-to-read-ccapis-exchange-list]
ccapi's market-data list has 30 entries, but several are product lines of the same venue: `binance`, `binance-usds-futures` and `binance-coin-futures` are three entries; so are `huobi`, `huobi-usdt-swap` and `huobi-coin-swap`; likewise `bitget`/`bitget-futures`, `gateio`/`gateio-perpetual-futures`, `kraken`/`kraken-futures`, `kucoin`/`kucoin-futures` and `mexc`/`mexc-futures`. Counted as venues, the list is 21. The execution-management list has 28 entries, and FIX covers three exchanges.
CCXT covers 104 venues with REST and 76 with WebSocket, plus 7 prediction-market venues in `ccxt.prediction`, and models product lines as options on one client rather than as separate exchange ids:
```python
exchange = ccxt.binance({'options': {'defaultType': 'future'}})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.001, 60000)
```
### Symbols and structures [#symbols-and-structures]
This is the part that shows up when you add the second venue. ccapi passes the exchange's own instrument id straight through, so your code carries a per-venue naming table, and its results are name-to-value string maps you parse and convert yourself. That is a deliberate design: it is the cheapest thing to do at runtime, and it is what you want if you are counting nanoseconds.
CCXT normalises both sides. `BTC/USDT` means the same pair everywhere, `BTC/USDT:USDT` is the linear perpetual, and `fetch_order_book` returns the same [structure](/docs/manual#order-book-structure) on every venue with numeric types already parsed. Market metadata — tick size, step size, minimum notional — comes from `load_markets()`, with `amount_to_precision` and `price_to_precision` built on string arithmetic so quantities do not drift through float rounding.
### Getting it built [#getting-it-built]
CCXT is `pip install ccxt`, `npm install ccxt`, `go get github.com/ccxt/ccxt/go/v4`, a NuGet package, a Composer package or a Maven artifact.
ccapi is a source build. For C++ you supply C++17 and OpenSSL (`libssl`, `libcrypto`), plus Boost 1.87.0 and RapidJSON 1.1.0 headers, plus hffix 1.4.1 if you want FIX, plus ZLIB for some huobi and bitmart paths and `ws2_32` on Windows. You then define enablement macros in the compiler command line — `CCAPI_ENABLE_SERVICE_MARKET_DATA`, `CCAPI_ENABLE_EXCHANGE_BYBIT` and so on — for exactly the services and exchanges you need. The README documents tested platforms as macOS with Clang, Linux with GCC and Windows with MinGW.
The bindings are a second build on top: SWIG and CMake, `cmake -DBUILD_PYTHON=ON -DBUILD_VERSION=1.0.0 ..`, then artifacts under `binding/build//packaging/`. Running them needs the shared library on the right path — `java.library.path` for Java, `LD_LIBRARY_PATH` for C#, `source export_compiler_options.sh` before `go build` for Go, node-gyp for JavaScript. That is all documented and it works; it is simply a different amount of setup from a package manager install.
### Eight languages as first-class targets [#eight-languages-as-first-class-targets]
CCXT's non-TypeScript builds are generated from the same source and published as native packages, with the same method names and return structures in each. ccapi's bindings are SWIG wrappers over the C++ library — the README says each "is nearly identical to C++ API and covers nearly all the functionalities from C++ API" — which means the API you learn is the C++ one, expressed in Python or Go, and the runtime is still the C++ library you compiled.
### The escape hatch, both ways [#the-escape-hatch-both-ways]
Neither library boxes you in. ccapi's is `GENERIC_PUBLIC_REQUEST` and `GENERIC_PRIVATE_REQUEST`: you pass `HTTP_METHOD`, `HTTP_PATH` and optionally `HTTP_QUERY_STRING` and `HTTP_BODY`, and the library signs and sends it. There is a `GENERIC_PUBLIC_SUBSCRIPTION` for raw WebSocket payloads too.
CCXT's is the [implicit API](/docs/exchanges/binance/implicit-api): every endpoint of every exchange is generated as a named, callable method — 808 for binance, 446 for okx, 404 for bybit — with signing, timestamping, rate-limit accounting and error mapping applied. The difference is discovery: you can list and autocomplete CCXT's implicit methods, whereas ccapi's generic request expects you to bring the path from the venue's documentation.
## What ccapi does better [#what-ccapi-does-better]
These are real, and the first one is not close:
* **Latency.** ccapi is compiled C++ in the request path — no interpreter, no garbage collector, no marshalling layer between your strategy and the socket. Because it is header-only, the whole library can be inlined into your binary, and the README's performance guidance is to turn on optimisation flags and link-time optimisation and to compile in only the services and exchanges you use. CCXT's Python, JavaScript, PHP, C#, Go and Java builds all add parsing and normalisation work in a managed or interpreted runtime. For most systems network round-trip time dominates that difference; for a market maker it does not, and that is exactly the case ccapi is built for. Neither project publishes a head-to-head benchmark, so treat the argument as architectural rather than measured.
* **FIX sessions.** ccapi implements FIX for binance, coinbase and gemini through hffix, with a subscription-based workflow over tag-value pairs. CCXT has no FIX support at all. If your venue relationship runs over FIX, this is decisive.
* **Receipt timestamps on every message.** Each `Message` carries both `time` — the exchange's reported timestamp — and `timeReceived`, the library's own receive time, reachable through `getTime`/`getTimeReceived` in C++ and `getTimeUnix`/`getTimeReceivedUnix` elsewhere. Venue latency becomes measurable without extra plumbing.
* **Conflation and batching as first-class options.** `CONFLATE_INTERVAL_MILLISECONDS` with a `CONFLATE_GRACE_PERIOD_MILLISECONDS` gives you fixed-interval snapshots instead of every tick, and events can be handled in "batching" mode rather than "immediate" mode when the consumer is an archiver rather than a strategy. CCXT has no equivalent built-in throttle on the delivery side.
* **Compile-time trimming.** Enabling only `CCAPI_ENABLE_SERVICE_MARKET_DATA` and the two exchanges you trade produces a binary containing only that code. CCXT ships every exchange in one package by design.
* **A Bloomberg-shaped API.** `Session`, `Request`, `Subscription`, `Event`, `Message`, `Element`, `correlationId` — if your team already writes against BLPAPI, none of that needs explaining.
If you are building a low-latency C++ trading system against a small set of major venues, ccapi is the better tool and this page is not arguing otherwise.
## Migrating from ccapi to CCXT [#migrating-from-ccapi-to-ccxt]
| What you are doing | ccapi | CCXT |
| ------------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------- |
| Instruments | the venue's id: `"BTCUSDT"`, `"BTC-USD"` | unified: `'BTC/USDT'`, `'BTC/USDT:USDT'` |
| Client | `Session(SessionOptions(), SessionConfigs(), handler)` | `ccxt.binance({'apiKey': '...', 'secret': '...'})` |
| Credentials | environment variables or `SessionConfigs` | constructor keys: `apiKey`, `secret`, `password`, … |
| Instrument metadata | `GET_INSTRUMENT` / `GET_INSTRUMENTS` | `load_markets()` |
| Best bid/ask | `GET_BBOS` | `fetch_ticker()` / `fetch_bids_asks()` |
| Recent trades | `GET_RECENT_TRADES` | `fetch_trades()` |
| Candles | `GET_RECENT_CANDLESTICKS` / `GET_HISTORICAL_CANDLESTICKS` | `fetch_ohlcv()` |
| New order | `Operation_CREATE_ORDER` + param map | `create_order(symbol, type, side, amount, price)` |
| Cancel order | `Operation_CANCEL_ORDER` | `cancel_order(id, symbol)` |
| Open orders | `Operation_GET_OPEN_ORDERS` | `fetch_open_orders()` |
| Balances | `Operation_GET_ACCOUNT_BALANCES` | `fetch_balance()` |
| Positions | `Operation_GET_ACCOUNT_POSITIONS` | `fetch_positions()` |
| Book stream | `Subscription(exchange, instrument, "MARKET_DEPTH")` | `watch_order_book()` on `ccxt.pro.` |
| Trade stream | `Subscription(exchange, instrument, "TRADE")` | `watch_trades()` |
| Order updates | `Subscription(..., "ORDER_UPDATE")` | `watch_orders()` |
| Anything not listed | `GENERIC_PUBLIC_REQUEST` / `GENERIC_PRIVATE_REQUEST` | the same endpoint as an [implicit method](/docs/exchanges/binance/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual).
## FAQ [#faq]
**Is CCXT slower than ccapi?**
In the request path, yes, and the reason is structural rather than fixable: ccapi is compiled C++ inlined into your binary, while CCXT parses and normalises in Python, JavaScript, PHP, C#, Go or Java. For strategies where the network round trip dominates — which is most of them — the difference is not what limits you. For latency-sensitive market making it is, and ccapi is built for that case. Neither project publishes a comparative benchmark.
**Does ccapi support as many exchanges as CCXT?**
No. ccapi's README lists 30 market-data entries spanning 21 distinct venues, and 28 execution-management entries. CCXT supports 104 exchanges with REST, 76 of them with WebSocket, plus 7 prediction-market venues.
**Can I use ccapi from Python without writing C++?**
Yes. It ships bindings for Python, Java, C#, Go and JavaScript, built from source with SWIG and CMake, and the README says each covers nearly all the C++ functionality. You build the binding yourself rather than installing a published package, and the compiled library has to be reachable at runtime through the appropriate library path.
**Does CCXT support FIX?**
No. CCXT speaks REST and WebSocket. ccapi implements FIX for binance, coinbase and gemini. If FIX is a requirement, that is a reason to use ccapi, or a venue-specific FIX engine, for that leg.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package under MIT. Use `ccxt.pro.` and the `watch*` methods.
**Can I run both?**
Yes, and it is a sensible split. ccapi handles the venues where latency decides the trade; CCXT handles breadth — the long tail of exchanges, market metadata, account reconciliation and anything written in Python or Go. Both are MIT, so nothing in the licensing complicates it.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — unified structures and conventions
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [Supported exchanges](/docs/exchange-markets)
* [More comparisons](/docs/comparisons)
# CCXT vs ccxws (/docs/comparisons/ccxt-vs-ccxws)
[ccxws](https://github.com/altangent/ccxws) — "A JavaScript library for connecting to realtime public APIs on all cryptocurrency exchanges" — was written to be used *with* [CCXT](/docs/manual), not instead of it. Its README says so directly: "CCXWS uses similar market structures to those generated by the CCXT library. This allows interoperability between the RESTful interfaces provided by CCXT and the realtime interfaces provided by CCXWS." For several years that pairing — CCXT for REST, ccxws for the socket — was the standard way to build a Node.js market-data pipeline.
The repository was archived by its owner on 9 September 2023 and is read-only. So the useful question is not which library wins; it is **what the same job looks like now, and what you lose by moving.**
## TL;DR [#tldr]
* **If you have a working ccxws integration**, it is MIT-licensed and still on npm at 0.47.0 (published 8 October 2021). Nothing stops it running; it will not receive fixes when a venue changes its stream format.
* **The replacement is CCXT Pro**, which is bundled in the `ccxt` package under the same MIT licence — no separate install, no paid tier. It streams from 76 exchanges, and the `watch*` methods return the same structures as the matching `fetch*` methods.
* **ccxws still does one thing CCXT does not**: level 3, order-by-order book streams. CCXT's unified order book is aggregated level 2. If you depend on L3, that is a real gap to plan around.
## At a glance [#at-a-glance]
| | **CCXT (with CCXT Pro)** | **ccxws** |
| --------------------------- | --------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| Status | actively released | archived by its owner on 9 September 2023, read-only |
| Latest release | continuous — v4.5.78 | npm 0.47.0, published 8 October 2021 |
| Most recent commit | continuous | 8 October 2021 |
| Scope | REST + WebSocket, public and private, market data and trading | public realtime streams only |
| Exchanges | 104 with REST, **76 with WebSocket** | 35 clients listed in the README table |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust | TypeScript / JavaScript |
| Packages to install | 1 (`ccxt`) | 1 (`ccxws`), usually alongside `ccxt` for markets |
| Programming model | `await exchange.watch_trades(symbol)` | `client.on('trade', handler)` + `client.subscribeTrades(market)` |
| Order books | merged, maintained, checksum-verified where the venue publishes one | `l2snapshot` / `l2update` events; prototype book helpers in `src/orderbooks` |
| Level 3 (order-by-order) | not a unified method | yes, on Coinbase Pro, Bitfinex, KuCoin, ErisX and LedgerX |
| Candles over the socket | `watch_ohlcv` | `candle` event |
| Private streams | `watch_orders`, `watch_balance`, `watch_my_trades`, `watch_positions` | not shipped; the FAQ lists private feeds as an intention |
| Order entry over the socket | `createOrderWs` on 23 exchanges | out of scope |
| Unsubscribe | `unWatch*` on 26 exchanges | `unsubscribe*` methods |
| Market identifiers | unified symbols after `load_markets()` | you supply `{ id, base, quote, type }` yourself |
| Popularity | 43.8k GitHub stars · 494k npm + 4.7M PyPI installs/month | 639 GitHub stars · 3.3k npm installs/month |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | repository is read-only; 52 open issues at archival |
Figures verified September 2026 against CCXT v4.5.78, the ccxws repository, its README and FAQ, its npm registry entry, and npm/PyPI download counts for the month ending 29 August 2026.
## The same job, written both ways [#the-same-job-written-both-ways]
ccxws is a public market-data library, so the comparable tasks are streams. Both snippets do the same thing.
### Stream trades [#stream-trades]
CCXT
ccxws
```javascript
import ccxt from 'ccxt';
const exchange = new ccxt.pro.binance ();
while (true) {
const trades = await exchange.watchTrades ('BTC/USDT');
for (const t of trades) {
console.log (t.symbol, t.side, t.amount, t.price);
}
}
```
```javascript
import { BinanceClient } from "ccxws";
const binance = new BinanceClient();
const market = { id: "BTCUSDT", base: "BTC", quote: "USDT", type: "spot" };
binance.on("error", err => console.error(err));
binance.on("trade", trade => console.log(trade));
binance.subscribeTrades(market);
```
Two differences matter beyond style. First, ccxws asks you for the market object — `id` is the venue's own identifier, so you either hard-code it, load it from your own database, or (as its FAQ suggests) load it from CCXT. CCXT resolves `'BTC/USDT'` against the venue's own market metadata for you. Second, ccxws is push-shaped and CCXT is pull-shaped: `await` returns a value, so streaming code composes with ordinary control flow and sits next to the REST code that backfills it.
### Keep a live order book [#keep-a-live-order-book]
CCXT
ccxws
```javascript
import ccxt from 'ccxt';
const exchange = new ccxt.pro.binance ();
while (true) {
const orderbook = await exchange.watchOrderBook ('BTC/USDT');
console.log (orderbook.bids[0], orderbook.asks[0]);
}
```
```javascript
import { BinanceClient } from "ccxws";
const binance = new BinanceClient();
const market = { id: "BTCUSDT", base: "BTC", quote: "USDT", type: "spot" };
binance.on("error", err => console.error(err));
binance.on("l2snapshot", snap => applySnapshot(snap)); // your book
binance.on("l2update", update => applyUpdate(update)); // your book
binance.subscribeLevel2Updates(market);
```
`applySnapshot` and `applyUpdate` are the part that is not in the snippet. ccxws delivers the venue's messages, normalised and reconnected; assembling them into a book is yours to write, and its own FAQ describes maintaining an L2 book as "a complex question \[that] varies by each exchange", with prototype book implementations for several exchanges in `src/orderbooks`.
`watchOrderBook` returns the merged book. Underneath it, CCXT handles per-venue sequencing: fetching the REST snapshot and aligning it with the stream, buffering deltas that arrive during the fetch, detecting update-id gaps and re-seeding, verifying the venue's checksum where one is published, and reconnecting and resubscribing after a drop. Those are the places a hand-rolled book goes quietly wrong — it does not throw, it drifts, and you find out from a fill you did not expect.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Coverage, and which venues are still there [#coverage-and-which-venues-are-still-there]
ccxws' README table lists 35 clients; the npm package describes itself as a "Websocket client for 37 cryptocurrency exchanges". Because the repository has been read-only since September 2023, that table is a snapshot of the market as it was — it still lists FTX, FTX US, Liquid, Bittrex, LedgerX, ErisX, Coinbase Pro and OKEx under those names.
CCXT ships WebSocket support for 76 exchanges today, including most of the venues on that list under their current names, and the long tail that came after it: perpetuals-first DEXes, regional venues, and 7 prediction markets in `ccxt.prediction`. Two ccxws clients have no CCXT streaming equivalent — bitFlyer and Digifinex are REST-only in CCXT.
### Public data was the whole scope [#public-data-was-the-whole-scope]
ccxws connects to "realtime public APIs". There are no account streams; its FAQ answers the question about private feeds with an intention rather than a shipped feature. If you were pairing it with CCXT REST, your fills and balances were coming from polling.
CCXT Pro streams the private side over the same connection model: `watch_orders`, `watch_my_trades`, `watch_balance`, `watch_positions`, and order entry over the socket — `createOrderWs` and `cancelOrderWs` on 23 exchanges each, `editOrderWs` and `cancelAllOrdersWs` on 21. Venue-specific plumbing that this requires — Binance's `listenKey` refresh, for instance — is handled inside the library rather than in your reconnect logic.
### One structure for REST and stream [#one-structure-for-rest-and-stream]
In CCXT, `watch_order_book` returns the same [structure](/docs/manual#order-book-structure) as `fetch_order_book`, and `watch_ohlcv` the same as `fetch_ohlcv`. Backfill history over REST, switch to the stream, and the code downstream cannot tell which produced the candle. Swapping a polling loop for a stream is a one-word change.
With CCXT plus ccxws you had two normalisation layers that were *similar* by design but not identical, and the seams — a `Trade` class on one side, a trade dictionary on the other — were yours to reconcile.
### Eight languages [#eight-languages]
ccxws is a TypeScript/JavaScript library, which was the right call for the Node.js pipelines it was built for. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with the same method names and return structures in each. A stream consumer prototyped in Python moves to a Go or C# service without a second data model.
## What ccxws does better [#what-ccxws-does-better]
Honest, specific, and some of it still true:
* **Level 3 order books.** ccxws exposes `l3snapshot` and `l3update` events for Coinbase Pro, Bitfinex, KuCoin, ErisX and LedgerX — raw order-by-order data you can aggregate yourself. CCXT's unified order book is level 2; there is no unified L3 method. For queue-position modelling or order-flow research, that is a capability CCXT does not replace.
* **An explicit connection lifecycle.** ccxws emits `connecting`, `connected`, `disconnected`, `reconnecting`, `closing` and `closed` as first-class events, with a documented state machine in the README and a configurable `watcherMs` inactivity timer. That is easy to wire into dashboards and alerting. CCXT reconnects for you, which is what most people want, and correspondingly gives you less to observe.
* **Bring your own markets.** A ccxws subscription needs nothing more than `{ id, base, quote, type }`, so you can subscribe to a venue without an HTTP round trip and without a market-loading step at boot. CCXT calls `load_markets()` first, by design — that is where the precision, limits and symbol mapping come from.
* **A very small dependency surface.** Six runtime dependencies, one job, no trading code anywhere near your API keys. If all you need is public trades from one venue in Node.js, that is a smaller thing to audit than a full trading library.
* **Per-exchange transparency.** One client class per venue with the venue's own quirks visible in it, rather than a shared abstraction. When you are debugging a specific exchange's stream, having a file that only does that exchange is genuinely easier to read.
If you have an L3-dependent research pipeline on the venues ccxws covers, it may still be the more direct fit — as an unmaintained dependency you have chosen deliberately, with the archival date understood.
## Migrating from ccxws to CCXT [#migrating-from-ccxws-to-ccxt]
The client classes map one-to-one for most venues. Everything below is in the `ccxt` package; there is nothing extra to install.
| ccxws client | CCXT Pro |
| ------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| `BinanceClient` | `ccxt.pro.binance` |
| `BinanceFuturesUsdtmClient` | `ccxt.pro.binanceusdm` |
| `BinanceFuturesCoinmClient` | `ccxt.pro.binancecoinm` |
| `BinanceUsClient` | `ccxt.pro.binanceus` |
| `CoinbaseProClient` | `ccxt.pro.coinbaseexchange` |
| `KrakenClient` | `ccxt.pro.kraken` |
| `KucoinClient` | `ccxt.pro.kucoin` |
| `OkexClient` | `ccxt.pro.okx` |
| `HuobiClient` | `ccxt.pro.htx` |
| `GateioClient` | `ccxt.pro.gate` |
| `BitfinexClient`, `BitmexClient`, `BitstampClient`, `BithumbClient` | `ccxt.pro.bitfinex`, `ccxt.pro.bitmex`, `ccxt.pro.bitstamp`, `ccxt.pro.bithumb` |
| `CexClient`, `CoinexClient`, `DeribitClient`, `GeminiClient` | `ccxt.pro.cex`, `ccxt.pro.coinex`, `ccxt.pro.deribit`, `ccxt.pro.gemini` |
| `HitBtcClient`, `PoloniexClient`, `UpbitClient` | `ccxt.pro.hitbtc`, `ccxt.pro.poloniex`, `ccxt.pro.upbit` |
| `BitflyerClient`, `DigifinexClient` | REST only in CCXT — `ccxt.bitflyer`, `ccxt.digifinex` |
And the events map to methods:
| What you are doing | ccxws | CCXT |
| ------------------ | ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| Identify a market | `{ id: 'BTCUSDT', base: 'BTC', quote: 'USDT', type: 'spot' }` | `'BTC/USDT'` after `load_markets()` |
| Ticker | `on('ticker')` + `subscribeTicker()` | `watch_ticker()` / `watch_tickers()` |
| Trades | `on('trade')` + `subscribeTrades()` | `watch_trades()` |
| Candles | `on('candle')` + `subscribeCandles()` | `watch_ohlcv()` |
| Order book | `on('l2snapshot')` / `on('l2update')` + your book | `watch_order_book()` — merged for you |
| Level 3 book | `on('l3snapshot')` / `on('l3update')` | no unified equivalent |
| Unsubscribe | `unsubscribeTrades()` and friends | `unWatch*` methods |
| Reconnection | `connecting` / `disconnected` / `reconnecting` events | automatic; failures raise typed exceptions |
| Errors | `on('error')` | `try` / `except ccxt.NetworkError` and 40 other typed classes |
| Account data | not in scope | `watch_orders()`, `watch_balance()`, `watch_my_trades()`, `watch_positions()` |
Start with [Install](/docs/install), then the [CCXT Pro manual](/docs/pro-manual).
## FAQ [#faq]
**Is ccxws still maintained?**
The repository was archived by its owner on 9 September 2023 and is read-only. Its last commit and its last npm release (0.47.0) are both dated 8 October 2021. The published package still installs and is still MIT-licensed.
**What replaced ccxws?**
For most users, CCXT Pro — the WebSocket half of CCXT, bundled in the same `ccxt` package under MIT. It covers 76 exchanges with `watch*` methods that return the same structures as the equivalent `fetch*` methods, and adds private streams and socket order entry that ccxws did not cover.
**Do I need a separate package or a paid licence for CCXT's WebSockets?**
No. CCXT Pro is in the `ccxt` package. Use `ccxt.pro.` in JavaScript, TypeScript and Python, and call `watch*` methods. There is no paid tier.
**Can I use ccxws and CCXT together, the way people used to?**
Technically yes — they are both MIT and ccxws was explicitly designed to consume CCXT's market objects. The reason to stop is maintenance: a venue that changes its stream format breaks the ccxws side and there is no upstream to fix it. Running both also means two normalisation layers to reconcile where one now suffices.
**Does CCXT support level 3 order books?**
Not as a unified method. CCXT's `watch_order_book` and `fetch_order_book` return aggregated level 2 books. ccxws exposed L3 events for five venues, and that is the one capability a migration does not carry over.
**Which exchanges did ccxws support that CCXT does not stream?**
Of the clients in its README table, bitFlyer and Digifinex are supported by CCXT over REST but not over WebSocket. Several other entries — FTX, FTX US, Liquid, Bittrex, LedgerX, ErisX — are venues that no longer operate under those names.
## Next steps [#next-steps]
* [Install CCXT](/docs/install)
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` and `unWatch*` methods
* [Manual](/docs/manual) — unified structures and conventions
* [Supported exchanges](/docs/exchange-markets)
* [More comparisons](/docs/comparisons)
# CCXT vs the CEX.IO API and cexio-spot-trading (/docs/comparisons/ccxt-vs-cex-api)
[CEX.IO](https://cex.io) publishes an official client for its Spot Trading API: [`@cex-io/cexio-spot-trading`](https://github.com/cex-io-exchange/cexio-spot-trading), a Node.js library covering both REST and WebSocket. [CCXT](/docs/manual) covers the same API as the exchange id `cex`, with 43 unified capabilities, 8 `watch*` streaming methods and all 28 endpoints.
They are aimed at different things, and the difference is visible in one line of code. The official client is a **passthrough**: `callPublic('get_ticker')` sends whatever you name and hands back whatever comes out. CCXT is a **translation layer**: `fetch_ticker('BTC/USDT')` returns the same structure it returns on every other exchange. The question is whether you want CEX.IO's payloads or a portable data model.
## TL;DR [#tldr]
* **Pick `cexio-spot-trading`** if you are in Node.js, CEX.IO is your only venue, and you would rather see the endpoint names in your own code than learn a unified vocabulary.
* **Pick CCXT** if you are not in Node.js, or you want unified structures, typed errors and precision handling, or you expect a second exchange — the same `fetch_ticker` call already works on 103 others.
* **CEX.IO's official client family is split by product.** `cexio-spot-trading`, `cexio-prime-liquidity` and `cexio-margin-trading` are three separate npm packages; `cexio-exchange-plus` is archived. CCXT's `cex` targets the Spot Trading API.
## At a glance [#at-a-glance]
| | **CCXT** | **`@cex-io/cexio-spot-trading`** |
| --------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (CEX.IO is one of them) | CEX.IO Spot Trading only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | **Node.js only** |
| Packages to install | **1** (`ccxt`) | one per CEX.IO product line |
| Unified market data + trading API | yes — 43 capabilities on `cex` | no — you name endpoints, you parse payloads |
| Programming model | `fetch_ticker('BTC/USDT')` | `callPublic('get_ticker')` / `callPrivate('do_my_new_order', {...})` |
| WebSockets | yes — 8 `watch*` methods | yes — `WebsocketClient`, connects and authenticates for you |
| Raw endpoint access | yes — 28 CEX.IO endpoints as implicit methods | yes, it is the whole design |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 300 ms) | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + CEX.IO error bodies |
| Testnet / sandbox | none — CEX.IO publishes no sandbox | none |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | 7 GitHub stars · **181 npm installs/month** (sibling packages: prime-liquidity 237, margin-trading 106) |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues, CEX.IO support |
Figures verified September 2026 against CCXT v4.5.78, the `cex-io-exchange` GitHub organisation's repository listing, the `cexio-spot-trading` README and npm metadata, and the CEX.IO Spot Trading API documentation at trade.cex.io/docs.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
cexio-spot-trading
```python
import ccxt
exchange = ccxt.cex()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```javascript
const { RestClient } = require('@cex-io/cexio-spot-trading');
const client = new RestClient();
const res = await client.callPublic('get_ticker');
console.log(res);
```
That is the whole difference in miniature. `callPublic('get_ticker')` is a string naming an endpoint, and the result is CEX.IO's payload — which you then map onto whatever your application uses. `fetch_ticker` returns a [unified ticker structure](/docs/manual#ticker-structure) with the same keys, types and units you get from Kraken, Binance or Coinbase, and it takes a unified symbol rather than CEX.IO's pair notation.
It also means typos are runtime failures on one side and method-not-found on the other, and that an IDE can complete `fetch_` but cannot complete the contents of a string.
### Place a limit order [#place-a-limit-order]
CCXT
cexio-spot-trading
```python
import ccxt
exchange = ccxt.cex({'apiKey': '...', 'secret': '...'})
# CEX.IO does not allow API trading from the main account,
# so a sub-account name is required:
exchange.options['createOrder'] = {'accountId': 'sub-account-name'}
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 90000)
print(order['id'], order['status'])
```
```javascript
const { RestClient } = require('@cex-io/cexio-spot-trading');
const client = new RestClient(apiKey, apiSecret);
const res = await client.callPrivate('do_my_new_order', {
clientOrderId: '...', accountId: 'sub-account-name',
currency1: 'BTC', currency2: 'USDT',
orderType: 'Limit', side: 'BUY', timeInForce: 'GTC',
amountCcy1: '0.001', price: '90000', timestamp: Date.now(),
});
console.log(res);
```
CEX.IO requires API trading to run from a sub-account rather than the main account, and CCXT raises `ArgumentsRequired` if you have not named one — a clearer failure than a rejected order.
Both sign the request for you — CEX.IO's scheme is HMAC-SHA256 over `action + timestamp + body`, sent as `X-AGGR-KEY`, `X-AGGR-TIMESTAMP` and `X-AGGR-SIGNATURE`, and CCXT implements exactly that. The difference is what comes back and what you had to know to send it: `do_my_new_order` with CEX.IO's field names on one side, `create_order` with the signature CCXT uses everywhere on the other, returning a [unified order structure](/docs/manual#order-structure).
### Stream an order book [#stream-an-order-book]
CEX.IO is one of the 76 CCXT exchanges with WebSocket support. `cex` has **8** `watch*` methods: `watchOrderBook`, `watchTicker`, `watchTickers`, `watchTrades`, `watchOHLCV`, `watchOrders`, `watchMyTrades` and `watchBalance`.
CCXT
cexio-spot-trading
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.cex()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```javascript
const { WebsocketClient } = require('@cex-io/cexio-spot-trading');
const ws = new WebsocketClient(apiKey, apiSecret);
// the client connects and authenticates, then you subscribe
// and handle raw channel messages yourself
```
CEX.IO's client does handle connecting and authenticating the socket, which is genuinely useful. What it hands you after that is channel messages. CCXT is **pull-shaped**: `watch_order_book` returns a merged, depth-limited book as a value, so the streaming code reads like the REST code beside it, and the snapshot alignment, delta buffering, reconnect-and-resubscribe and bounded caching are already done.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API [#eight-languages-one-api]
`cexio-spot-trading` is Node.js. If your service is in Python, Go, C# or PHP, there is no official CEX.IO client for it, and you are writing the signing and the payload mapping yourself.
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures:
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.cex()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.cex ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```csharp
var exchange = new ccxt.cex();
var ticker = await exchange.FetchTicker("BTC/USDT");
```
```go
exchange := ccxt.NewCex(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CEX.IO's documentation states a points budget: the public API allows **100 points per minute** by IP and the private API **200 points per minute** per API key, with most calls costing one point and a 429 when you exceed it.
CCXT sets `rateLimit = 300` ms for `cex` — exactly 200 requests per minute — and ships a token-bucket throttler that is **on by default**, with per-endpoint weights for the calls that cost more than one point (`get_processing_info` is weighted 10, `get_my_wallet_balance` and `get_my_orders` 5). You call methods in a loop; the library paces them. Neither pacing nor back-off is a documented feature of the official client.
### One error hierarchy [#one-error-hierarchy]
CCXT maps CEX.IO's error bodies onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write the handler once and it keeps working when you add a second exchange, instead of inspecting CEX.IO's error strings.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads CEX.IO's `get_pairs_info` and exposes tick size, step size and minimum notional through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities never drift through float rounding into a rejected order.
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 91234.56789)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
The passthrough model's real advantage is that nothing is off-limits. CCXT keeps that: alongside the 43 unified capabilities, **all 28 CEX.IO endpoints are generated as callable implicit methods**, with signing, rate-limit accounting and error mapping applied:
```python
# any raw CEX.IO endpoint, camelCased from its name
response = exchange.private_post_get_my_account_status_v3()
```
So you get the unified API for the 95% that every venue shares, and the same passthrough access for the CEX.IO-specific 5%. Browse them on the [cex implicit API page](/docs/exchanges/cex/implicit-api).
### Portability [#portability]
This is the difference that shows up six months in. Adding a second venue to a `cexio-spot-trading` integration means a second package, a second set of payload shapes and a second error convention — plus a translation layer of your own so the rest of your code stays venue-agnostic. That translation layer is what CCXT already is.
```python
for exchange_id in ['cex', 'kraken', 'binance', 'coinbase']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
## What cexio-spot-trading does better [#what-cexio-spot-trading-does-better]
An honest list, because these are real:
* **It is first-party and it tracks the API.** CEX.IO writes it, so the field names in the client are the field names in the CEX.IO documentation, with no abstraction in between. When you are reading `trade.cex.io/docs` while debugging, that is one less hop.
* **The passthrough model never lags.** A new CEX.IO endpoint is usable the moment it ships — `callPrivate('the_new_thing', {...})` — with no library release required. CCXT's implicit API closes most of this gap, but a *unified* wrapper for a new capability may still lag.
* **The WebSocket client authenticates itself.** `WebsocketClient` connects and performs the auth handshake on the server without you scripting it, which is a real convenience for private channels.
* **Sibling packages for the other CEX.IO products.** `cexio-prime-liquidity` and `cexio-margin-trading` cover the Prime Liquidity and Margin Trading APIs, which CCXT's `cex` does not model. If those are your products, the vendor packages are the option that exists.
* **A much smaller dependency.** For a Node service that calls three CEX.IO endpoints, one small package is a smaller install than a library covering 104 exchanges.
If you are on Node, trading only CEX.IO spot, and you prefer naming endpoints directly, `cexio-spot-trading` is a sensible choice.
## Migrating from cexio-spot-trading to CCXT [#migrating-from-cexio-spot-trading-to-ccxt]
| What you are doing | `cexio-spot-trading` | CCXT |
| ------------------- | -------------------------------------------------- | --------------------------------------------------------------------------- |
| Symbols | `pair: 'BTC-USDT'` | `'BTC/USDT'` |
| Client | `new RestClient(apiKey, apiSecret)` | `ccxt.cex({'apiKey': ..., 'secret': ...})` |
| Pairs | `callPublic('get_pairs_info')` | `load_markets()` |
| Ticker | `callPublic('get_ticker')` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `callPublic('get_order_book')` | `fetch_order_book()` |
| Candles | `callPublic('get_candles')` | `fetch_ohlcv()` |
| Trades | `callPublic('get_trade_history')` | `fetch_trades()` |
| New order | `callPrivate('do_my_new_order', {...})` | `create_order()` |
| Cancel order | `callPrivate('do_cancel_my_order', {...})` | `cancel_order()` |
| Cancel all | `callPrivate('do_cancel_all_orders', {...})` | `cancel_all_orders()` |
| Open orders | `callPrivate('get_my_orders', {...})` | `fetch_open_orders()` / `fetch_closed_orders()` |
| Balance | `callPrivate('get_my_wallet_balance')` | `fetch_balance()` |
| Trading fees | `callPrivate('get_my_current_fee')` | `fetch_trading_fees()` |
| Deposit address | `callPrivate('get_deposit_address', {...})` | `fetch_deposit_address()` |
| Internal transfer | `callPrivate('do_my_internal_transfer', {...})` | `transfer()` |
| Ledger | `callPrivate('get_my_transaction_history', {...})` | `fetch_ledger()` |
| Streams | `new WebsocketClient(...)` + channel handlers | `watch_*` on `ccxt.pro.cex` |
| Anything not listed | `callPrivate('endpoint_name', {...})` | the same endpoint as an [implicit method](/docs/exchanges/cex/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [cex unified API reference](/docs/exchanges/cex).
## FAQ [#faq]
**Which CEX.IO API does CCXT's `cex` exchange target?**
The Spot Trading API at `trade.cex.io` — public calls on `/api/spot/rest-public` and private calls on `/api/spot/rest`, the same API `@cex-io/cexio-spot-trading` wraps. CEX.IO's Prime Liquidity and Margin Trading APIs are separate products with their own packages, and are not modelled as CCXT exchange ids.
**Is there an official CEX.IO Python SDK?**
No. CEX.IO's official clients are Node.js. CCXT's Python support for CEX.IO is a normal `pip install ccxt`, and the same code works in six other languages.
**Does CCXT support CEX.IO WebSockets?**
Yes — 8 `watch*` methods on `ccxt.pro.cex`, covering the order book, tickers, trades, candles, orders, own trades and balance. `watch_order_book` returns the same structure as `fetch_order_book`.
**Does CEX.IO have a testnet I can use with CCXT?**
No sandbox environment is published, so `set_sandbox_mode(True)` has nothing to point at for `cex`. Test against CCXT's offline static fixtures and small live orders.
**Can I still call CEX.IO-specific endpoints through CCXT?**
Yes — all 28 of them, as [implicit methods](/docs/exchanges/cex/implicit-api), with signing, rate limiting and error mapping applied. The passthrough style you get from `callPrivate` is preserved.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.cex` and call `watch*` methods.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [cex unified API reference](/docs/exchanges/cex)
* [cex implicit API](/docs/exchanges/cex/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Coinbase APIs and coinbase-advanced-py (/docs/comparisons/ccxt-vs-coinbase-api)
There is no such thing as "the Coinbase API". Coinbase runs several separate trading products — Advanced Trade, the older Coinbase App API, Coinbase Exchange, Coinbase International Exchange, Prime, Commerce — each with its own base URL, its own authentication scheme and, mostly, its own SDK.
[CCXT](/docs/manual) models that estate as three exchange ids: `coinbase` (Advanced Trade plus the App v2 endpoints), `coinbaseexchange` and `coinbaseinternational`. The same unified method names work on all three. The question that decides between CCXT and Coinbase's own SDKs is therefore sharper than usual: **how many Coinbase products do you touch, and are any of them not Coinbase?**
## TL;DR [#tldr]
* **Pick `coinbase-advanced-py`** if Advanced Trade is the only Coinbase product you use, you are in Python, and you want a first-party client that Coinbase updates alongside the API.
* **Pick CCXT** if you touch more than one Coinbase product, or are not in Python, or expect to add a non-Coinbase venue — because in CCXT `fetch_ticker` is `fetch_ticker` on all three Coinbase ids and on the other 101 exchanges.
* **The fragmentation is the real cost.** Advanced Trade authenticates with CDP JWTs (ES256 or EdDSA); Exchange and International authenticate with HMAC plus a passphrase. CCXT hides that difference; three SDKs do not.
* **Choosing CCXT does not hide anything.** 91 raw Advanced Trade and App endpoints, 82 Exchange endpoints and 35 International endpoints are callable as [implicit methods](/docs/exchanges/coinbase/implicit-api).
## At a glance [#at-a-glance]
| | **CCXT** | **Coinbase's own SDKs** |
| --------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 | Coinbase products only |
| Coinbase products in one library | `coinbase` (Advanced Trade + App v2), `coinbaseexchange`, `coinbaseinternational` | one SDK per product, per language |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python (Advanced Trade), TypeScript, Java, Go — coverage differs per product |
| Packages to install | **1** (`ccxt`) | one per product line you use |
| Unified market data + trading API | yes — same method names across every exchange and every Coinbase product | no — each product's own shapes |
| WebSockets | yes — 12 `watch*` on `coinbase`, 10 on `coinbaseexchange`, 7 on `coinbaseinternational` | yes in `coinbase-advanced-py`; the sample TypeScript SDK documents REST only |
| Raw endpoint access | yes — 91 + 82 + 35 endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + Coinbase error bodies |
| Sandbox | `set_sandbox_mode(True)` on `coinbaseexchange` and `coinbaseinternational` | per-product base URLs; Advanced Trade has no sandbox |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | `coinbase-advanced-py` 357 stars · 264k PyPI installs/month; `advanced-sdk-ts` 51 stars, `advanced-sdk-java` 50, `advanced-trade-sdk-go` 37, `exchange-sdk-go` 9, `intx-sdk-go` 6 |
| Licence | MIT | `coinbase-advanced-py` Apache-2.0 |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues, Coinbase developer channels |
Figures verified September 2026 against CCXT v4.5.78, the `coinbase` and `coinbase-samples` GitHub organisations' repository listings, the `coinbase-advanced-py` repository and PyPI page, and install counts from npm and PyPI.
### What the SDK estate actually looks like [#what-the-sdk-estate-actually-looks-like]
Read on the day this page was written, Coinbase's first-party client libraries are split by product **and** by language, and most of them are labelled samples:
* **Advanced Trade** — `coinbase/coinbase-advanced-py` (Apache-2.0, v1.8.4 released 19 June 2026, REST + WebSocket), plus `coinbase-samples/advanced-sdk-ts` (51 stars, "Sample TypeScript SDK", REST endpoints only), `advanced-sdk-java` (50 stars) and `advanced-trade-sdk-go` (37 stars).
* **Coinbase Exchange** — `coinbase-samples/exchange-sdk-go` (9 stars). Go only.
* **Coinbase International (INTX)** — `coinbase-samples/intx-sdk-go` (6 stars). Go only.
* **Prime** — five sample SDKs, of which the Go, Java, TypeScript and Python ones are archived; the .NET one is not.
So a Python service that trades Advanced Trade and reads Coinbase Exchange has a first-party client for one of those two and not the other. In CCXT it is `ccxt.coinbase()` and `ccxt.coinbaseexchange()`, and the calling code is the same.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
coinbase-advanced-py
```python
import ccxt
exchange = ccxt.coinbase()
ticker = exchange.fetch_ticker('BTC/USDC')
print(ticker['last'], ticker['baseVolume'])
```
```python
from coinbase.rest import RESTClient
client = RESTClient() # reads CDP key/secret from the environment
product = client.get_product("BTC-USD")
print(product.price)
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, types and units on `coinbase`, `coinbaseexchange`, `coinbaseinternational` and every other venue. The SDK returns an Advanced Trade product object, which is a different shape from what the Exchange API returns for the same instrument.
### Place an order [#place-an-order]
CCXT
coinbase-advanced-py
```python
import ccxt
exchange = ccxt.coinbase({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDC', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from coinbase.rest import RESTClient
client = RESTClient(api_key="...", api_secret="...")
order = client.market_order_buy(
client_order_id="clientOrderId",
product_id="BTC-USD",
quote_size="1",
)
```
The SDK's helpers (`market_order_buy`, and its limit and stop siblings) encode Advanced Trade's `order_configuration` shapes for you, which is genuinely convenient. They are also Advanced-Trade-shaped: the same intent against Coinbase Exchange is a different call in a different package. CCXT's `create_order` has one signature across all three Coinbase ids and the other 101 exchanges, with venue-specific extras passed through `params`.
### Stream an order book [#stream-an-order-book]
CCXT
coinbase-advanced-py
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.coinbase()
while True:
orderbook = await exchange.watch_order_book('BTC/USDC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from coinbase.websocket import WSClient
def on_message(msg):
print(msg)
client = WSClient(api_key=api_key, api_secret=api_secret, on_message=on_message)
client.open()
client.subscribe(product_ids=["BTC-USD"], channels=["ticker"])
```
CCXT is **pull-shaped**: you `await` a method and get a merged, depth-limited order book back, so the streaming code reads like the REST code next to it. The SDK is **push-shaped**: you register a callback and parse raw channel messages, including the level-2 snapshot-and-delta bookkeeping if what you want is a book rather than a message feed.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Three products, three auth schemes, one client [#three-products-three-auth-schemes-one-client]
This is the Coinbase-specific one. The three APIs do not authenticate the same way, and CCXT normalises the difference into `requiredCredentials`:
```python
adv = ccxt.coinbase({'apiKey': '...', 'secret': '...'}) # CDP JWT
exch = ccxt.coinbaseexchange({'apiKey': '...', 'secret': '...', 'password': '...'})
intx = ccxt.coinbaseinternational({'apiKey': '...', 'secret': '...', 'password': '...'})
```
Under the hood `coinbase` signs with a JWT (ES256 for ECDSA keys, EdDSA for Ed25519 ones), while `coinbaseexchange` and `coinbaseinternational` sign with HMAC-SHA256 and send `CB-ACCESS-PASSPHRASE`. Above the hood, all three answer to `fetch_ticker`, `fetch_order_book`, `fetch_ohlcv`, `create_order`, `cancel_order`, `fetch_open_orders` and `fetch_balance`.
### The `coinbase` id is not only Advanced Trade [#the-coinbase-id-is-not-only-advanced-trade]
CCXT's `coinbase` covers both API generations behind one client: the Advanced Trade v3 brokerage endpoints **and** the older Coinbase App v2 endpoints — accounts, addresses, transactions, buys, sells, deposits, withdrawals and payment methods. That is what most of the 91 implicit endpoints are. `coinbase-advanced-py` targets Advanced Trade; the App API is a separate integration.
It also covers more than spot: Coinbase's dated futures and perpetual instruments appear as unified symbols like `BTC/USD:USD-240426` and `ADA/USDC:USDC` alongside spot `BTC/USDC`.
### Sandbox where a sandbox exists [#sandbox-where-a-sandbox-exists]
Coinbase Exchange and Coinbase International have sandbox environments; Advanced Trade does not. CCXT reflects that honestly rather than pretending otherwise:
```python
exchange = ccxt.coinbaseexchange({'apiKey': '...', 'secret': '...', 'password': '...'})
exchange.set_sandbox_mode(True) # api-public.sandbox.exchange.coinbase.com
```
Calling `set_sandbox_mode(True)` on `ccxt.coinbase()` raises `NotSupported`, because there is nothing to point it at.
### WebSockets that look like REST [#websockets-that-look-like-rest]
CCXT Pro is bundled in the same `ccxt` package — no separate purchase — and gives `coinbase` 12 streaming methods (`watchOrderBook`, `watchOrderBookForSymbols`, `watchTrades`, `watchTradesForSymbols`, `watchTicker`, `watchTickers`, `watchOrders` and their `unWatch*` counterparts), `coinbaseexchange` 10 including `watchMyTrades`, and `coinbaseinternational` 7 including `watchOHLCV` and `watchFundingRates`.
`watch_order_book` returns the same structure as `fetch_order_book`. Underneath, CCXT handles connection pooling per URL, ping/pong keep-alive, automatic reconnect and resubscribe, order-book sequencing and bounded caches — the parts that are tedious rather than hard, and quietly wrong when you get them slightly off.
### One error hierarchy [#one-error-hierarchy]
Three Coinbase products means three error-body conventions. CCXT maps all of them onto a single [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write the handler once.
### Precision, rounding and string math [#precision-rounding-and-string-math]
CCXT loads each product's market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding into a rejected order.
```python
amount = exchange.amount_to_precision('BTC/USDC', 0.0012345678)
price = exchange.price_to_precision('BTC/USDC', 61234.56789)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the **69 unified capabilities** CCXT implements for `coinbase` (42 for `coinbaseexchange`, 48 for `coinbaseinternational`), every endpoint is generated as a callable implicit method, with signing, rate limiting and error mapping applied:
```python
# any raw Advanced Trade endpoint, camelCased from its path
response = exchange.v3_public_get_brokerage_market_products()
```
Browse them on the [coinbase implicit API page](/docs/exchanges/coinbase/implicit-api).
## What Coinbase's own SDKs do better [#what-coinbases-own-sdks-do-better]
An honest list, because these are real:
* **`coinbase-advanced-py` handles CDP key formats natively and first.** It supports both Ed25519 and ECDSA keys and builds the JWT for you, and it is the reference implementation Coinbase updates when Advanced Trade changes. When key formats or auth requirements move, they move there first.
* **Order helpers that mirror Advanced Trade's own model.** `market_order_buy`, `limit_order_gtc` and their siblings encode Coinbase's `order_configuration` structures directly, and the response objects use dot-notation access on Advanced-Trade-shaped fields. If you are reading Coinbase's reference while you write, the mapping is one-to-one.
* **First-party starting points in Go, Java and TypeScript.** `advanced-trade-sdk-go`, `advanced-sdk-java` and `advanced-sdk-ts` are Coinbase-authored, and the Exchange and INTX Go SDKs are the only first-party clients for those products at all.
* **CCXT does not cover every Coinbase product.** There is no CCXT id for Coinbase Prime or Coinbase Commerce. If your integration is a Prime custody workflow or a Commerce payment flow, Coinbase's own SDKs are not merely better — they are the option that exists.
* **The SDK's WebSocket client reconnects with exponential backoff.** That is documented behaviour in the README, not something you have to add.
If Advanced Trade in Python is the whole of your Coinbase integration and you have no plans for a second venue, `coinbase-advanced-py` is a sensible choice.
## Migrating from coinbase-advanced-py to CCXT [#migrating-from-coinbase-advanced-py-to-ccxt]
| What you are doing | coinbase-advanced-py | CCXT |
| ---------------------- | ------------------------------------------ | -------------------------------------------------------------------------------- |
| Symbols | `product_id="BTC-USD"` | `'BTC/USDC'` spot, `'ADA/USDC:USDC'` perpetual |
| Client | `RESTClient(api_key=..., api_secret=...)` | `ccxt.coinbase({'apiKey': ..., 'secret': ...})` |
| Products | `get_products()` | `load_markets()` |
| Ticker | `get_product()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `get_product_book()` | `fetch_order_book()` |
| Candles | `get_candles()` | `fetch_ohlcv()` |
| New order | `market_order_buy()` / `limit_order_gtc()` | `create_order()` |
| Cancel order | `cancel_orders()` | `cancel_order()` |
| Open orders | `list_orders()` | `fetch_open_orders()` |
| Balance | `get_accounts()` | `fetch_balance()` |
| Streams | `WSClient(...).subscribe(...)` | `watch_*` on `ccxt.pro.coinbase` |
| Coinbase Exchange | a different SDK | `ccxt.coinbaseexchange()`, same method names |
| Coinbase International | a different SDK | `ccxt.coinbaseinternational()`, same method names |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/coinbase/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [coinbase unified API reference](/docs/exchanges/coinbase).
## FAQ [#faq]
**Which CCXT exchange id is "Coinbase"?**
Three of them, because Coinbase runs three trading APIs. `coinbase` is Advanced Trade plus the older Coinbase App v2 endpoints. `coinbaseexchange` is the Coinbase Exchange API (the platform previously known as Coinbase Pro). `coinbaseinternational` is Coinbase International Exchange. All three expose the same unified methods.
**Does CCXT support Coinbase Advanced Trade CDP keys?**
Yes. `ccxt.coinbase` signs Advanced Trade requests with a JWT, using ES256 for ECDSA keys and EdDSA for Ed25519 keys. Pass the CDP key name as `apiKey` and the private key as `secret`.
**Is there a Coinbase sandbox in CCXT?**
For Coinbase Exchange and Coinbase International, yes — `set_sandbox_mode(True)` swaps in their sandbox hosts. Advanced Trade has no sandbox, so calling it on `ccxt.coinbase()` raises `NotSupported` rather than silently doing nothing.
**Does CCXT support Coinbase Prime or Coinbase Commerce?**
No. Those are separate Coinbase products with no CCXT id. Use Coinbase's own SDKs for them.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.coinbase` (or `ccxt.pro.coinbaseexchange` / `ccxt.pro.coinbaseinternational`) and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [coinbase unified API reference](/docs/exchanges/coinbase)
* [coinbase implicit API](/docs/exchanges/coinbase/implicit-api) — every raw endpoint
* [coinbaseexchange unified API reference](/docs/exchanges/coinbaseexchange)
* [coinbaseinternational unified API reference](/docs/exchanges/coinbaseinternational)
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Coinbase Exchange API (/docs/comparisons/ccxt-vs-coinbaseexchange-api)
Coinbase Exchange is the institutional order-book venue whose API Coinbase Pro used to expose. It authenticates with an HMAC key, secret and passphrase, and it is a completely separate product from Coinbase Advanced Trade — different base URL, different auth, different SDKs. [CCXT vs the Coinbase APIs](/docs/comparisons/ccxt-vs-coinbase-api) covers that fragmentation across the estate; **this page is about Coinbase Exchange specifically**, where `ccxt.coinbaseexchange` implements 42 unified capabilities, 10 `watch*` streaming methods and all 82 endpoints.
The question that decides between CCXT and Coinbase's own tooling here is unusually concrete: **which language are you in, and do you need WebSockets?** Because Coinbase's first-party Exchange clients answer "Go or TypeScript" and "no".
## TL;DR [#tldr]
* **Pick `exchange-sdk-go`** if you are in Go, you only need REST, and you want a first-party client whose field names match Coinbase's reference exactly.
* **Pick CCXT** if you are in Python, Java, PHP, C# — where Coinbase publishes no Exchange REST client at all — or if you need streaming, which neither first-party Exchange SDK provides.
* **Coinbase labels these libraries samples.** Both `exchange-sdk-go` and `exchange-sdk-ts` state in their READMEs that they are a "sample library" and that "the application and code are only available for demonstration purposes."
## At a glance [#at-a-glance]
| | **CCXT** | **Coinbase's own Exchange clients** |
| --------------------------------- | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Coinbase Exchange is one of them) | Coinbase Exchange only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Go and TypeScript REST SDKs; Python scripts for FIX |
| Packages to install | **1** (`ccxt`) | `exchange-sdk-go`, or `@coinbase-sample/exchange-sdk-ts` |
| Positioning | production library | "sample library … only available for demonstration purposes" (both READMEs) |
| Unified market data + trading API | yes — 42 capabilities on `coinbaseexchange` | no — Coinbase Exchange's own shapes |
| WebSockets | yes — **10** `watch*` methods | **not mentioned in either SDK README** |
| Raw endpoint access | yes — 82 Exchange endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 100 ms) | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + Coinbase error bodies |
| Sandbox | `set_sandbox_mode(True)` → `api-public.sandbox.exchange.coinbase.com` | change the base URL yourself |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | `exchange-sdk-go` 9 stars; `exchange-sdk-ts` 3 stars · **47 npm installs/month**; `exchange-scripts-py` 23 stars |
| Licence | MIT | Apache-2.0 |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues, Coinbase developer channels |
Figures verified September 2026 against CCXT v4.5.78, the `coinbase-samples` GitHub organisation's repository listing and the `exchange-sdk-go` and `exchange-sdk-ts` READMEs, Coinbase's Exchange REST and WebSocket documentation, and npm install counts.
### What Coinbase publishes for Exchange [#what-coinbase-publishes-for-exchange]
Read on the day this page was written, the `coinbase-samples` organisation's Exchange-related repositories are:
| Repository | What it is | Language | Stars | Last updated |
| --------------------- | ----------------------- | ---------- | ----- | -------------- |
| `exchange-sdk-go` | REST SDK | Go | 9 | July 2026 |
| `exchange-cli` | CLI built on the Go SDK | Go | 6 | July 2026 |
| `exchange-sdk-ts` | REST SDK | TypeScript | 3 | February 2026 |
| `exchange-scripts-py` | FIX API sample scripts | Python | 23 | September 2024 |
There is no first-party Coinbase Exchange REST client for Python, Java, PHP or C#. The most-starred Exchange repository is a set of **FIX** sample scripts. The only maintained JavaScript client covering Coinbase Exchange with WebSockets is the third-party [`coinbase-api`](https://github.com/tiagosiebler/coinbase-api) (MIT, 24 stars, 18,380 npm installs/month) — good software, but not Coinbase's.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
exchange-sdk-go
```python
import ccxt
exchange = ccxt.coinbaseexchange()
ticker = exchange.fetch_ticker('BTC/USD')
print(ticker['last'], ticker['baseVolume'])
```
```go
credentials, err := credentials.ReadEnvCredentials("EXCHANGE_CREDENTIALS")
httpClient, err := core.DefaultHttpClient()
client := client.NewRestClient(credentials, httpClient)
// then instantiate the service you want and pass it a request struct
```
The Go SDK reads its credentials from an `EXCHANGE_CREDENTIALS` environment variable holding a JSON object with `apiKey`, `passphrase` and `signingKey`, then builds one service object per endpoint family. CCXT takes the same three credentials as constructor fields and returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, types and units as `ccxt.coinbase`, `ccxt.coinbaseinternational` and every other venue.
### Place a limit order [#place-a-limit-order]
CCXT
exchange-sdk-ts
```python
import ccxt
exchange = ccxt.coinbaseexchange({
'apiKey': '...', 'secret': '...', 'password': '...', # the passphrase
})
order = exchange.create_order('BTC/USD', 'limit', 'buy', 0.001, 90000)
print(order['id'], order['status'])
```
```typescript
// @coinbase-sample/exchange-sdk-ts:
// parse credentials from the environment, construct a
// CoinbaseExchangeCredentials with AccessKey / SecretKey / Passphrase,
// then a CoinbaseExchangeClient, then call the orders service with a
// request naming the portfolio id, product BTC-USD, side, type and size.
```
CCXT signs with HMAC-SHA256 over `timestamp + method + requestPath + body` and sends the `CB-ACCESS-KEY`, `CB-ACCESS-SIGN`, `CB-ACCESS-TIMESTAMP` and `CB-ACCESS-PASSPHRASE` headers, which is the scheme Coinbase documents. Above that, `create_order` has one signature across all three Coinbase ids and the other 101 exchanges, returning a [unified order structure](/docs/manual#order-structure).
Trigger orders are unified params rather than a different request shape: `coinbaseexchange` reports `createStopOrder`, `createStopLimitOrder` and `createStopMarketOrder` as supported capabilities.
### Stream an order book [#stream-an-order-book]
This is the gap. `coinbaseexchange` has **10** `watch*` methods in CCXT — `watchOrderBook`, `watchOrderBookForSymbols`, `watchTicker`, `watchTickers`, `watchTrades`, `watchTradesForSymbols`, `watchOrders`, `watchOrdersForSymbols`, `watchMyTrades` and `watchMyTradesForSymbols`. Neither first-party Exchange SDK mentions WebSocket support in its README.
CCXT
Raw WebSocket feed
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.coinbaseexchange()
while True:
orderbook = await exchange.watch_order_book('BTC/USD')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
# connect to ws-feed, subscribe to the level2 channel, then:
# - align the snapshot with the delta stream
# - track per-product sequence numbers
# - detect gaps and out-of-order messages and re-sync
# - reconnect, resubscribe and re-seed after a drop
# - keep the local book bounded instead of growing forever
```
That right-hand column is not a straw man. Coinbase's own WebSocket documentation says it plainly: *"Even though a WebSocket connection is over TCP, the WebSocket servers receive market data in a manner that can result in dropped messages"*, and *"Your feed consumer should be designed to handle sequence gaps and out of order messages."*
`watch_order_book` returns the same structure as `fetch_order_book`, already merged and depth-limited, with the sequencing, reconnect and re-seed handled. It is the same method call on the next exchange, whose sequencing rules are different.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API [#eight-languages-one-api]
Coinbase publishes Exchange REST clients in two languages. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures:
Python
C#
Go
```python
import ccxt
exchange = ccxt.coinbaseexchange()
ticker = exchange.fetch_ticker('BTC/USD')
```
```csharp
var exchange = new ccxt.coinbaseexchange();
var ticker = await exchange.FetchTicker("BTC/USD");
```
```go
exchange := ccxt.NewCoinbaseexchange(nil)
ticker, err := exchange.FetchTicker("BTC/USD")
```
A strategy prototyped in a Python notebook ports to a Go or C# execution service without redesigning the data model.
### Sandbox without a second code path [#sandbox-without-a-second-code-path]
Coinbase Exchange has a sandbox, and CCXT knows its hostname:
```python
exchange = ccxt.coinbaseexchange({'apiKey': '...', 'secret': '...', 'password': '...'})
exchange.set_sandbox_mode(True) # api-public.sandbox.exchange.coinbase.com
```
One flag swaps every REST and WebSocket URL. With the SDKs it is a base-URL constant you thread through your own configuration — and it is worth noting that `ccxt.coinbase` (Advanced Trade) has no sandbox at all, so CCXT raises `NotSupported` there rather than pretending.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Coinbase documents a lazy-fill token bucket for Exchange: **3 requests per second on public endpoints** (bursting to 6, throttled by IP) and **5 per second on private endpoints** (bursting to 10, throttled by profile id), returning 429 when exceeded.
CCXT ships a token-bucket throttler that is on by default, with `rateLimit = 100` ms for `coinbaseexchange` and a per-instance override if you want to sit further inside the sustained budget:
```python
exchange = ccxt.coinbaseexchange({'enableRateLimit': True, 'rateLimit': 200})
```
The point is that pacing exists and is configurable, rather than being application code you write and maintain.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Coinbase Exchange's error bodies onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. Since Advanced Trade, Exchange and International each have their own error-body convention, this is worth more here than usual: you write one handler for all three Coinbase ids.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads Coinbase Exchange's product metadata and exposes tick size, step size and minimum notional through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding into a rejected order.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 42 unified capabilities, **all 82 Coinbase Exchange endpoints are generated as callable implicit methods**, with signing, rate limiting and error mapping applied — including the margin, loans, conversions and profile endpoints that have no unified equivalent:
```python
# any raw Coinbase Exchange endpoint, camelCased from its path
response = exchange.private_get_users_self_exchange_limits()
```
Browse them on the [coinbaseexchange implicit API page](/docs/exchanges/coinbaseexchange/implicit-api).
### One client for three Coinbase products [#one-client-for-three-coinbase-products]
CCXT models Coinbase's estate as three exchange ids — `coinbase` (Advanced Trade plus the App v2 endpoints, signed with a CDP JWT), `coinbaseexchange` and `coinbaseinternational` (both HMAC plus passphrase) — and the same unified method names work on all three. Separate SDKs in separate languages do not compose like that. See [CCXT vs the Coinbase APIs](/docs/comparisons/ccxt-vs-coinbase-api) for the full picture and [CCXT vs the Coinbase International API](/docs/comparisons/ccxt-vs-coinbaseinternational-api) for the derivatives venue.
## What Coinbase's own Exchange SDKs do better [#what-coinbases-own-exchange-sdks-do-better]
An honest list, because these are real:
* **They are first-party and match the reference exactly.** `exchange-sdk-go` and `exchange-sdk-ts` use Coinbase's own request and response type names. When you are reading Coinbase's Exchange reference while writing code, the mapping is one-to-one; CCXT's unified names are a deliberate abstraction and one more hop.
* **Typed request and response structs per endpoint.** The Go and TypeScript SDKs give you Coinbase-shaped typed models with per-service organisation. CCXT gives typed *unified* structures — better for portability, less literal about Coinbase Exchange's payloads.
* **`exchange-cli` is genuinely handy.** Coinbase ships a CLI built on the Go SDK for poking REST endpoints during development. CCXT has its own CLI, but a vendor tool that speaks the vendor's exact vocabulary is a good debugging companion.
* **FIX.** `exchange-scripts-py` covers Coinbase Exchange's FIX API, and FIX is the lower-latency order-entry path for this venue. CCXT does not speak FIX for any exchange.
* **A smaller dependency for one language.** If you are a Go service calling five Exchange endpoints, `exchange-sdk-go` alone is a smaller install than a library covering 104 exchanges.
If you are in Go, need only REST, and Coinbase Exchange is your only venue, the first-party SDK is a defensible choice — bearing in mind its own README calls it a sample.
## Migrating from a Coinbase Exchange SDK to CCXT [#migrating-from-a-coinbase-exchange-sdk-to-ccxt]
| What you are doing | Coinbase Exchange SDK / API | CCXT |
| -------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------- |
| Symbols | `product_id: 'BTC-USD'` | `'BTC/USD'` |
| Client | `NewRestClient(credentials, httpClient)` | `ccxt.coinbaseexchange({'apiKey': ..., 'secret': ..., 'password': ...})` |
| Credentials | `EXCHANGE_CREDENTIALS` JSON env var | `apiKey`, `secret`, `password` (the passphrase) |
| Products | `GET /products` | `load_markets()` |
| Ticker | `GET /products/{id}/ticker` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `GET /products/{id}/book` | `fetch_order_book()` |
| Candles | `GET /products/{id}/candles` | `fetch_ohlcv()` |
| Trades | `GET /products/{id}/trades` | `fetch_trades()` |
| New order | `POST /orders` | `create_order()` |
| Cancel | `DELETE /orders/{id}` or `DELETE /orders` | `cancel_order()` / `cancel_all_orders()` |
| Open orders | `GET /orders` | `fetch_open_orders()` / `fetch_closed_orders()` |
| Fills | `GET /fills` | `fetch_my_trades()` |
| Accounts | `GET /accounts` | `fetch_balance()` / `fetch_accounts()` |
| Ledger and transfers | `GET /accounts/{id}/ledger`, `GET /transfers` | `fetch_ledger()`, `fetch_deposits()`, `fetch_withdrawals()` |
| Fees | `GET /fees` | `fetch_trading_fees()` |
| Streams | `ws-feed`, hand-written level2 handling | `watch_*` on `ccxt.pro.coinbaseexchange` |
| Sandbox | swap the base URL | `set_sandbox_mode(True)` |
| Anything not listed | native call | the same endpoint as an [implicit method](/docs/exchanges/coinbaseexchange/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [coinbaseexchange unified API reference](/docs/exchanges/coinbaseexchange).
## FAQ [#faq]
**What is the difference between `coinbase` and `coinbaseexchange` in CCXT?**
They are different Coinbase products. `coinbase` is Advanced Trade plus the older Coinbase App v2 endpoints, authenticated with CDP JWTs. `coinbaseexchange` is the Coinbase Exchange API — the institutional order-book venue Coinbase Pro used to expose — authenticated with an HMAC key, secret and passphrase, which CCXT takes as `apiKey`, `secret` and `password`. `coinbaseinternational` is a third product again. All three answer to the same unified method names.
**Is there an official Coinbase Exchange Python SDK?**
Not for REST. Coinbase's first-party Exchange clients are `exchange-sdk-go` (Go) and `exchange-sdk-ts` (TypeScript); the Python repository, `exchange-scripts-py`, covers the FIX API. CCXT's Python support for Coinbase Exchange is a normal `pip install ccxt`.
**Do the official Coinbase Exchange SDKs support WebSockets?**
Neither `exchange-sdk-go` nor `exchange-sdk-ts` mentions WebSocket support in its README; both are REST clients. CCXT implements 10 `watch*` methods for `coinbaseexchange`, including the order book, trades, tickers, orders and own trades.
**Can I use the Coinbase Exchange sandbox with CCXT?**
Yes. `exchange.set_sandbox_mode(True)` points every REST and WebSocket URL at `api-public.sandbox.exchange.coinbase.com`. Note that Advanced Trade has no sandbox, so the same call on `ccxt.coinbase()` raises `NotSupported`.
**Can I still call Coinbase Exchange-specific endpoints through CCXT?**
Yes — all 82 of them, as [implicit methods](/docs/exchanges/coinbaseexchange/implicit-api), including margin, loans, conversions, profiles and reports, with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [coinbaseexchange unified API reference](/docs/exchanges/coinbaseexchange)
* [coinbaseexchange implicit API](/docs/exchanges/coinbaseexchange/implicit-api) — every raw endpoint
* [CCXT vs the Coinbase APIs](/docs/comparisons/ccxt-vs-coinbase-api) — the whole Coinbase estate
* [CCXT vs the Coinbase International API](/docs/comparisons/ccxt-vs-coinbaseinternational-api)
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Coinbase International Exchange API (/docs/comparisons/ccxt-vs-coinbaseinternational-api)
Coinbase International Exchange (INTX) is Coinbase's non-US perpetual-futures and spot venue. It is a separate product from Advanced Trade and from Coinbase Exchange — its own base URL, its own portfolio model, its own SDKs. [CCXT vs the Coinbase APIs](/docs/comparisons/ccxt-vs-coinbase-api) covers that fragmentation across the estate; **this page is about INTX specifically**, where `ccxt.coinbaseinternational` implements 47 unified capabilities, 7 `watch*` streaming methods and all 35 endpoints.
Coinbase publishes more first-party SDKs for INTX than for any of its other trading products — five, in Python, Go, Java, TypeScript and .NET. Every one of them describes itself as a sample, none of them documents WebSocket support, and between them they see fewer than thirty package installs a month. **So the question is not which library has better coverage. It is whether "sample SDK, REST only, in one language" is what your service needs.**
## TL;DR [#tldr]
* **Pick an INTX sample SDK** if you want Coinbase's own request and response types in Go, Java or .NET, you only need REST, and you are comfortable with a library its own README calls demonstration code.
* **Pick CCXT** if you need WebSockets — none of the five INTX SDKs provide them — or you are in PHP, or you want the same method names on Coinbase Exchange, Advanced Trade and 101 other venues.
* **The portfolio model is the fiddly part, and CCXT hides it.** Every private INTX endpoint is scoped to a portfolio. CCXT resolves your default portfolio once and threads it through, while still letting you name one per call.
## At a glance [#at-a-glance]
| | **CCXT** | **Coinbase's own INTX SDKs** |
| --------------------------------- | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Coinbase International is one of them) | Coinbase INTX only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, Go, Java, TypeScript, .NET — five separate codebases |
| Packages to install | **1** (`ccxt`) | one per language, plus one per other Coinbase product you touch |
| Positioning | production library | "a sample library that demonstrates the usage of the API … only available for demonstration purposes" |
| Unified market data + trading API | yes — 47 capabilities on `coinbaseinternational` | no — INTX's own shapes |
| Products | spot **and** perpetual futures from one client | spot and perpetuals, per SDK |
| WebSockets | yes — **7** `watch*` methods | **not documented in the SDK READMEs** |
| Portfolio scoping | resolved and cached; `params['portfolio']` to override | you pass a portfolio id on every call |
| Raw endpoint access | yes — 35 INTX endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 100 ms) | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + Coinbase error bodies |
| Sandbox | `set_sandbox_mode(True)` → `api-n5e1.coinbase.com` | change the base URL yourself |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | `intx-sdk-java` 9 stars · `intx-sdk-py` 8 stars, **13 PyPI installs/month** · `intx-sdk-dotnet` 7 · `intx-sdk-go` 6 · `intx-sdk-ts` 3, **15 npm installs/month** |
| Licence | MIT | Apache-2.0 |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues, Coinbase developer channels |
Figures verified September 2026 against CCXT v4.5.78, the `coinbase-samples` GitHub organisation's repository listing and the `intx-sdk-py` README, Coinbase's INTX sandbox and authentication documentation, and install counts from npm and PyPI.
### What Coinbase publishes for INTX [#what-coinbase-publishes-for-intx]
| Repository | What it is | Language | Stars | Last updated |
| ----------------- | ----------------------------------------- | ---------- | ----- | ------------- |
| `intx-sdk-java` | REST SDK | Java | 9 | March 2026 |
| `intx-sdk-py` | REST SDK (`pip install intx-sdk-py`) | Python | 8 | December 2025 |
| `intx-cli` | CLI for testing REST endpoints | Go | 8 | March 2024 |
| `intx-sdk-dotnet` | REST SDK | C# | 7 | August 2024 |
| `intx-sdk-go` | REST SDK | Go | 6 | July 2026 |
| `intx-scripts-py` | FIX and REST sample scripts | Python | 6 | March 2026 |
| `intx-sdk-ts` | REST SDK (`@coinbase-sample/intx-sdk-ts`) | TypeScript | 3 | February 2026 |
Seven repositories, all first-party, all labelled samples. That is more attention than Coinbase gives its Exchange API — and still no PHP client, no WebSocket client, and 13 PyPI plus 15 npm installs a month across the two packaged ones.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
intx-sdk-py
```python
import ccxt
exchange = ccxt.coinbaseinternational()
ticker = exchange.fetch_ticker('BTC/USDC:USDC')
print(ticker['last'], ticker['baseVolume'])
```
```python
from intx_sdk import IntxServicesClient
from intx_sdk.services.portfolios import ListPortfoliosRequest
client = IntxServicesClient.from_env()
request = ListPortfoliosRequest()
response = client.portfolios.list_portfolios(request)
print(response)
```
The SDK's shape is one service object per endpoint family and one request class per call. It is consistent and readable, and it is INTX-shaped: the same intent against Coinbase Exchange is a different call in a different package.
`'BTC/USDC:USDC'` is CCXT's unified notation for a USDC-settled linear perpetual; spot is plain `'BTC/USDC'`. The returned [unified ticker structure](/docs/manual#ticker-structure) is the same on `coinbase`, `coinbaseexchange`, `coinbaseinternational` and every other venue.
### Place a limit order [#place-a-limit-order]
CCXT
intx-sdk-py
```python
import ccxt
exchange = ccxt.coinbaseinternational({
'apiKey': '...', 'secret': '...', 'password': '...', # the passphrase
})
order = exchange.create_order('BTC/USDC:USDC', 'limit', 'buy', 0.001, 90000)
print(order['id'], order['status'])
```
```python
from intx_sdk import IntxServicesClient
from intx_sdk.credentials import Credentials
credentials = Credentials(
access_key="...", passphrase="...", signing_key="...")
client = IntxServicesClient(credentials)
# then build the order request for the orders service, naming
# the portfolio id, the instrument, side, type, size and price
```
Both sides sign with HMAC-SHA256 over `timestamp + method + requestPath + body`, base64-encoded, sent as `CB-ACCESS-KEY`, `CB-ACCESS-SIGN`, `CB-ACCESS-TIMESTAMP` and `CB-ACCESS-PASSPHRASE` — and Coinbase requires the timestamp to be within 30 seconds of server time. CCXT implements that, so a clock-skew failure surfaces as a typed `AuthenticationError` rather than as an unexplained rejection.
The visible difference is the **portfolio**. Every private INTX endpoint is scoped to one, and the SDK expects you to supply the id. CCXT looks it up once and caches it:
```python
# CCXT resolves your default portfolio automatically; override per call when needed
positions = exchange.fetch_positions(params={'portfolio': 'your-portfolio-id'})
# or set it once
exchange.options['portfolio'] = 'your-portfolio-id'
```
If you have not set one and CCXT cannot resolve one, it raises `ArgumentsRequired` naming the parameter — not a 400 you have to decode.
### Stream an order book [#stream-an-order-book]
This is the gap. `coinbaseinternational` has **7** `watch*` methods in CCXT — `watchOrderBook`, `watchOrderBookForSymbols`, `watchTicker`, `watchTickers`, `watchTrades`, `watchTradesForSymbols` and `watchOHLCV`. None of the five INTX SDKs documents WebSocket support.
CCXT
Raw WebSocket feed
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.coinbaseinternational()
while True:
orderbook = await exchange.watch_order_book('BTC/USDC:USDC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
# connect and authenticate, subscribe to the level2 channel, then:
# - align the snapshot with the delta stream
# - track sequencing and detect gaps
# - reconnect, resubscribe and re-seed after a drop
# - keep the local book bounded instead of growing forever
```
`watch_order_book` returns the same structure as `fetch_order_book`, already merged and depth-limited, so swapping a polling loop for a stream leaves the downstream code untouched. CCXT handles connection pooling per URL, ping/pong keep-alive, automatic reconnect and resubscribe, and bounded caches — the parts that are tedious rather than hard, and quietly wrong when you get them slightly off.
One honest limit: CCXT's INTX streaming methods are market-data only. There are no `watchOrders`, `watchPositions` or `watchBalance` methods for this venue, so private state is polled through the REST methods.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Spot and perpetuals in one client [#spot-and-perpetuals-in-one-client]
INTX lists both, and CCXT selects between them with the symbol:
```python
spot = exchange.fetch_ticker('ETH/USDC') # instrument type SPOT
perp = exchange.fetch_ticker('ETH/USDC:USDC') # instrument type PERP
positions = exchange.fetch_positions(['ETH/USDC:USDC'])
funding = exchange.fetch_funding_rate_history('ETH/USDC:USDC')
history = exchange.fetch_funding_history('ETH/USDC:USDC')
```
`fetch_position`, `fetch_positions`, `set_margin`, `fetch_transfers` and `transfer()` between portfolios all carry the names CCXT uses on Bybit, OKX and Binance futures.
### Sandbox without a second code path [#sandbox-without-a-second-code-path]
INTX has a real sandbox, and CCXT knows its hostname:
```python
exchange = ccxt.coinbaseinternational({'apiKey': '...', 'secret': '...', 'password': '...'})
exchange.set_sandbox_mode(True) # api-n5e1.coinbase.com
```
Coinbase's documentation describes it as a USDC-funded environment with transfers, deposits and withdrawals disabled, reachable after onboarding through your Coinbase account team. One flag swaps every REST and WebSocket URL — no forked configuration.
### One error hierarchy [#one-error-hierarchy]
CCXT maps INTX's error bodies onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. Since Advanced Trade, Exchange and International each have their own error convention, one handler covering all three is worth more here than on a single-product venue.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` reads INTX's instrument metadata — `base_increment`, `quote_increment`, `min_notional_value`, `position_limit_qty` and the initial-margin factor — and exposes it through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding into a rejected order.
### Eight languages, one API [#eight-languages-one-api]
Coinbase's five INTX SDKs are five separate codebases with five release cadences, and none of them is PHP. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures — `exchange.fetch_ticker('BTC/USDC:USDC')` in Python is `exchange.FetchTicker("BTC/USDC:USDC")` in C# and `exchange.FetchTicker("BTC/USDC:USDC")` in Go, against the same data model.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 47 unified capabilities, **all 35 INTX endpoints are generated as callable implicit methods**, with signing, portfolio scoping, rate limiting and error mapping applied:
```python
# any raw INTX endpoint, camelCased from its path
response = exchange.v1_public_get_instruments()
```
Browse them on the [coinbaseinternational implicit API page](/docs/exchanges/coinbaseinternational/implicit-api).
### One client for three Coinbase products [#one-client-for-three-coinbase-products]
`ccxt.coinbase()`, `ccxt.coinbaseexchange()` and `ccxt.coinbaseinternational()` differ only in the credentials they take — CDP JWT for the first, HMAC plus passphrase for the other two — and answer to the same unified method names. Five INTX SDKs plus separate Exchange and Advanced Trade SDKs do not compose like that. See [CCXT vs the Coinbase Exchange API](/docs/comparisons/ccxt-vs-coinbaseexchange-api) for the sibling venue.
## What Coinbase's own INTX SDKs do better [#what-coinbases-own-intx-sdks-do-better]
An honest list, because these are real:
* **Five first-party languages, including .NET and Java.** `intx-sdk-java`, `intx-sdk-dotnet` and `intx-sdk-go` are Coinbase-authored, with Coinbase-shaped typed request and response models. If you value literal fidelity to the INTX reference over portability, that is a genuine advantage.
* **FIX.** `intx-scripts-py` covers INTX's FIX order-entry, market-data and drop-copy sessions, which the sandbox also supports. CCXT does not speak FIX for any exchange, so for latency-sensitive institutional flow this is not a comparison CCXT enters.
* **`intx-cli` for poking endpoints.** A Go CLI built on the SDK that speaks Coinbase's exact vocabulary is a good debugging companion while you are learning the API.
* **New INTX features land there first.** Coinbase updates its own SDKs when the API changes. A *unified* CCXT method for a brand-new INTX capability may lag, even though the implicit API reaches the endpoint immediately.
* **Explicit portfolio handling.** CCXT's automatic portfolio resolution is a convenience; if you run many portfolios and want every call to state which one it targets, the SDK's requirement that you name it is arguably the safer default.
If you are an institutional desk on FIX, or a .NET or Java shop trading only INTX, Coinbase's own SDKs are the sensible starting point.
## Migrating from an INTX SDK to CCXT [#migrating-from-an-intx-sdk-to-ccxt]
| What you are doing | INTX SDK / API | CCXT |
| ------------------- | ----------------------------------------- | --------------------------------------------------------------------------------------------- |
| Symbols | `instrument: 'BTC-PERP'` | `'BTC/USDC:USDC'` perpetual, `'BTC/USDC'` spot |
| Client | `IntxServicesClient(credentials)` | `ccxt.coinbaseinternational({'apiKey': ..., 'secret': ..., 'password': ...})` |
| Credentials | `access_key`, `passphrase`, `signing_key` | `apiKey`, `password`, `secret` |
| Portfolio | passed on every request | resolved and cached; `params['portfolio']` to override |
| Instruments | `GET /v1/instruments` | `load_markets()` |
| Ticker | `GET /v1/instruments/{id}/quote` | `fetch_ticker()` / `fetch_tickers()` |
| Candles | `GET /v1/instruments/{id}/candles` | `fetch_ohlcv()` |
| Funding | `GET /v1/instruments/{id}/funding` | `fetch_funding_rate_history()` / `fetch_funding_history()` |
| New order | `POST /v1/orders` | `create_order()` |
| Amend order | `PUT /v1/orders/{id}` | `edit_order()` |
| Cancel order | `DELETE /v1/orders/{id}` | `cancel_order()` |
| Cancel all | `DELETE /v1/orders` | `cancel_all_orders()` |
| Open orders | `GET /v1/orders` | `fetch_open_orders()` |
| Balances | `GET /v1/portfolios/{p}/balances` | `fetch_balance()` |
| Positions | `GET /v1/portfolios/{p}/positions` | `fetch_positions()` / `fetch_position()` |
| Fills | `GET /v1/portfolios/fills` | `fetch_my_trades()` |
| Transfers | `POST /v1/portfolios/transfer` | `transfer()` / `fetch_transfers()` |
| Streams | not in the SDKs — hand-written | `watch_*` on `ccxt.pro.coinbaseinternational` |
| Sandbox | swap the base URL | `set_sandbox_mode(True)` |
| Anything not listed | native call | the same endpoint as an [implicit method](/docs/exchanges/coinbaseinternational/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [coinbaseinternational unified API reference](/docs/exchanges/coinbaseinternational).
## FAQ [#faq]
**What is Coinbase International Exchange in CCXT?**
It is the exchange id `coinbaseinternational`, covering Coinbase's non-US INTX venue — spot instruments and USDC-settled perpetual futures. It is a different product from `coinbase` (Advanced Trade plus the Coinbase App v2 endpoints) and `coinbaseexchange` (the institutional Exchange API), and all three answer to the same unified method names.
**Do the official Coinbase INTX SDKs support WebSockets?**
None of the five READMEs documents WebSocket support; they are REST clients. CCXT implements 7 `watch*` methods for `coinbaseinternational`, covering the order book, trades, tickers and candles. Private streams — orders, positions, balance — are not implemented for this venue, so poll those over REST.
**How does CCXT handle INTX portfolios?**
Every private INTX endpoint is portfolio-scoped. CCXT resolves your default portfolio the first time it needs one and caches it, so you do not pass it on every call. Override it per call with `params={'portfolio': '...'}`, or set `exchange.options['portfolio']` once. If none can be resolved, CCXT raises `ArgumentsRequired`.
**Can I use the INTX sandbox with CCXT?**
Yes. `exchange.set_sandbox_mode(True)` points every URL at `api-n5e1.coinbase.com`. Coinbase's documentation describes it as a USDC-funded environment with transfers, deposits and withdrawals disabled; onboarding goes through your Coinbase account team.
**Does CCXT support INTX perpetual futures?**
Yes. Perpetuals appear as unified symbols like `'BTC/USDC:USDC'` from the same client as spot, with `fetch_positions`, `fetch_funding_rate_history`, `fetch_funding_history` and `set_margin` available.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [coinbaseinternational unified API reference](/docs/exchanges/coinbaseinternational)
* [coinbaseinternational implicit API](/docs/exchanges/coinbaseinternational/implicit-api) — every raw endpoint
* [CCXT vs the Coinbase APIs](/docs/comparisons/ccxt-vs-coinbase-api) — the whole Coinbase estate
* [CCXT vs the Coinbase Exchange API](/docs/comparisons/ccxt-vs-coinbaseexchange-api)
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Coincheck API and the coincheckjp libraries (/docs/comparisons/ccxt-vs-coincheck-api)
[Coincheck](https://coincheck.com) is a Japanese JPY-denominated exchange with a REST API and a WebSocket feed, documented at [coincheck.com/documents/exchange/api](https://coincheck.com/documents/exchange/api). It publishes official client libraries under the [`coincheckjp`](https://github.com/coincheckjp) GitHub organisation in eight languages.
[CCXT](/docs/manual) covers the same API as the exchange id `coincheck`, with 16 unified capabilities, 2 `watch*` streaming methods and all 32 endpoints. The two are close enough in scope that the honest deciding question is about upkeep: **which of these has been touched this year, in your language?**
## TL;DR [#tldr]
* **Pick a `coincheckjp` library** if you are in Ruby — where the official client is actively maintained — or if you need Coincheck markets or private WebSocket channels that CCXT does not model.
* **Pick CCXT** if you are in Python, Go, Node, PHP, C#, Java or TypeScript, where the official Coincheck library for your language was last pushed between 2017 and 2023, or if you want unified structures, a rate limiter and typed errors.
* **Read the coverage caveat before deciding.** CCXT ships a hard-coded market list for `coincheck` — `BTC/JPY`, `ETC/JPY`, `FCT/JPY`, `MONA/JPY` and `ETC/BTC` — while Coincheck's documentation lists 26 JPY pairs. And `fetch_ticker` raises `BadSymbol` for anything but `BTC/JPY`.
## At a glance [#at-a-glance]
| | **CCXT** | **`coincheckjp` libraries** |
| --------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Coincheck is one of them) | Coincheck only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Ruby, Node, Go, PHP, Python, Java, C# — seven separate repositories |
| Most recent update per language | one library, released continuously | Ruby July 2026; Node December 2023; Go November 2023; PHP June 2020; Python May 2019; Java August 2017; C# March 2017 |
| Unified market data + trading API | yes — 16 capabilities on `coincheck` | no — Coincheck's own payloads |
| Unified markets exposed | 5 (`BTC/JPY`, `ETC/JPY`, `FCT/JPY`, `MONA/JPY`, `ETC/BTC`) | whatever the API accepts |
| WebSockets | yes — 2 `watch*` methods (`watchOrderBook`, `watchTrades`) | not documented in the libraries |
| Raw endpoint access | yes — 32 Coincheck endpoints as implicit methods | varies per library |
| Built-in rate limiter | yes, on by default (`rateLimit` 1500 ms) | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + Coincheck `success`/`error` bodies |
| Testnet / sandbox | none — Coincheck publishes no sandbox | none |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | `coincheck-python` 47 stars · `ruby_coincheck_client` 42 · `coincheck-node` 29 · `coincheck-php` 20 · `coincheck-go` 15 · `coincheck-java` 8 · `coincheck-cs` 4 |
| Licence | MIT | `coincheck-python` MIT |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues, Coincheck support |
Figures verified September 2026 against CCXT v4.5.78, the `coincheckjp` GitHub organisation's repository listing and the `coincheck-python` README, and Coincheck's published Exchange API documentation.
### What Coincheck publishes [#what-coincheck-publishes]
Seven official client libraries, one per language, with the date each was last pushed:
| Repository | Language | Stars | Last updated |
| ----------------------- | ---------- | ----- | ------------- |
| `ruby_coincheck_client` | Ruby | 42 | July 2026 |
| `coincheck-node` | JavaScript | 29 | December 2023 |
| `coincheck-go` | Go | 15 | November 2023 |
| `coincheck-php` | PHP | 20 | June 2020 |
| `coincheck-python` | Python | 47 | May 2019 |
| `coincheck-java` | Java | 8 | August 2017 |
| `coincheck-cs` | C# | 4 | March 2017 |
The most-starred one is the Python library, last pushed in 2019. The most recently maintained one is the Ruby client. That is a common shape for a regional exchange and it is not a criticism — it is the fact that decides which side of this page you land on, and it depends entirely on your language.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
coincheck-python
```python
import ccxt
exchange = ccxt.coincheck()
ticker = exchange.fetch_ticker('BTC/JPY')
print(ticker['last'], ticker['baseVolume'])
```
```python
from coincheck.coincheck import CoinCheck
coinCheck = CoinCheck('ACCESS_KEY', 'API_SECRET')
res = coinCheck.ticker.all()
print(res)
```
The official Python library is a thin, readable wrapper — and it was last pushed in May 2019. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) with the same keys, types and units as every other venue, and its Python support is a normal `pip install ccxt` on a package released continuously.
### Place a limit order [#place-a-limit-order]
CCXT
coincheck-python
```python
import ccxt
exchange = ccxt.coincheck({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/JPY', 'limit', 'buy', 0.005, 15000000)
print(order['id'], order['status'])
```
```python
from coincheck.coincheck import CoinCheck
coinCheck = CoinCheck('ACCESS_KEY', 'API_SECRET')
params = {
'rate': 2850,
'amount': 0.00508771,
'order_type': 'buy',
'pair': 'btc_jpy',
}
res = coinCheck.order.create(params)
```
Both sign with Coincheck's scheme — `ACCESS-KEY`, `ACCESS-NONCE` and an `ACCESS-SIGNATURE` that is HMAC-SHA256 over `nonce + url + body`. The differences are the argument order, the return shape, and that CCXT's `create_order` has the same signature on 103 other exchanges and returns a [unified order structure](/docs/manual#order-structure).
### Stream an order book [#stream-an-order-book]
Coincheck is one of the 76 CCXT exchanges with WebSocket support, though a narrow one: `coincheck` has **2** `watch*` methods, `watchOrderBook` and `watchTrades`, mapping to Coincheck's two public channels.
CCXT
Raw WebSocket feed
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.coincheck()
while True:
orderbook = await exchange.watch_order_book('BTC/JPY')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
# open the socket, subscribe to the orderbook channel, then:
# - merge snapshot and delta messages into a local book
# - reconnect, resubscribe and re-seed after a drop
# - keep the book bounded instead of growing forever
```
None of the `coincheckjp` libraries documents WebSocket support, so the raw column is what you would otherwise write. `watch_order_book` returns the same structure as `fetch_order_book`, already merged, with reconnect and resubscribe handled.
Coincheck also documents **private** WebSocket channels for order events and execution events. CCXT does not implement those for this venue — private state is polled over REST.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight maintained languages, one API [#eight-maintained-languages-one-api]
This is the crux. Coincheck's libraries are seven independent repositories written at different times; CCXT is one library transpiled from a single TypeScript source into eight languages, with identical method names and structures and a continuous release cadence.
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.coincheck()
ticker = exchange.fetch_ticker('BTC/JPY')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.coincheck ();
const ticker = await exchange.fetchTicker ('BTC/JPY');
```
```csharp
var exchange = new ccxt.coincheck();
var ticker = await exchange.FetchTicker("BTC/JPY");
```
```go
exchange := ccxt.NewCoincheck(nil)
ticker, err := exchange.FetchTicker("BTC/JPY")
```
If you are writing C#, the choice is between a library last pushed in March 2017 and one that ships every week.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Coincheck's documentation states that order placement is limited to **up to 4 requests per second**, and that order-detail queries are limited to **at most once per second**, with 429s when you exceed them.
CCXT sets `rateLimit = 1500` ms for `coincheck` and ships a token-bucket throttler that is on by default, so a polling loop paces itself rather than tripping the limit. None of the official libraries documents a rate limiter.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Coincheck's `{"success": false, "error": "..."}` bodies onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once instead of matching on an error string that is not part of any contract.
### Precision, rounding and string math [#precision-rounding-and-string-math]
CCXT exposes `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class. JPY prices run to eight figures on BTC, which is precisely where float rounding starts producing rejected orders.
```python
amount = exchange.amount_to_precision('BTC/JPY', 0.0012345678)
price = exchange.price_to_precision('BTC/JPY', 15234567.89)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 16 unified capabilities, **all 32 Coincheck endpoints are generated as callable implicit methods**, with signing, rate limiting and error mapping applied. That includes the leverage, lending and bank-account endpoints CCXT does not model as unified methods, and — importantly given the market-coverage caveat — the raw quote and rate endpoints for pairs outside CCXT's built-in market list:
```python
# any raw Coincheck endpoint, camelCased from its path
rate = exchange.public_get_rate_pair({'pair': 'eth_jpy'})
positions = exchange.private_get_exchange_leverage_positions()
```
Browse them on the [coincheck implicit API page](/docs/exchanges/coincheck/implicit-api).
### Portability [#portability]
Japanese venues are usually one leg of a book, not the whole of it. In CCXT the exchange id is a variable, so adding an offshore venue is a configuration change rather than a second integration:
```python
for exchange_id in ['coincheck', 'bitflyer', 'binance']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/JPY')['last'])
```
## What the coincheckjp libraries do better [#what-the-coincheckjp-libraries-do-better]
An honest list, and the first two are real limitations of CCXT on this venue:
* **Market coverage.** Coincheck's API documentation lists 26 JPY pairs — `eth_jpy`, `xrp_jpy`, `sol_jpy`, `doge_jpy`, `sui_jpy` and more. CCXT's `coincheck` ships a hard-coded market list of five: `BTC/JPY`, `ETC/JPY`, `FCT/JPY`, `MONA/JPY` and `ETC/BTC`. If you trade the rest, the official libraries pass the pair straight through, and in CCXT you reach for the implicit API.
* **`fetch_ticker` is BTC/JPY only.** CCXT raises `BadSymbol` for any other symbol on that method, because Coincheck's ticker endpoint is oriented around its main pair. The vendor libraries impose no such restriction.
* **Private WebSocket channels.** Coincheck documents order-event and execution-event channels. CCXT implements only the two public ones (`watch_order_book`, `watch_trades`).
* **Ruby.** `ruby_coincheck_client` was updated in July 2026 and CCXT does not target Ruby at all. If your service is Ruby, this is not a comparison — it is the only option.
* **Smaller dependency, exact field names.** For a script that calls `ticker.all()` and one order endpoint, a thin wrapper is a smaller install, and `pair`, `order_type` and `rate` map one-to-one onto Coincheck's reference with no abstraction in between.
If you trade Coincheck pairs outside `BTC/JPY`, need private streams, or are in Ruby, the official libraries — or the raw API — are the better fit.
## Migrating from a coincheckjp library to CCXT [#migrating-from-a-coincheckjp-library-to-ccxt]
| What you are doing | `coincheck-python` / raw API | CCXT |
| -------------------------------- | --------------------------------------------------- | --------------------------------------------------------------------------------- |
| Symbols | `pair: 'btc_jpy'` | `'BTC/JPY'` |
| Client | `CoinCheck(ACCESS_KEY, API_SECRET)` | `ccxt.coincheck({'apiKey': ..., 'secret': ...})` |
| Ticker | `ticker.all()` — `GET /api/ticker` | `fetch_ticker()` |
| Order book | `GET /api/order_books` | `fetch_order_book()` |
| Trades | `GET /api/trades` | `fetch_trades()` |
| Status | `GET /api/exchange_status` | `fetch_status()` |
| New order | `order.create({...})` — `POST /api/exchange/orders` | `create_order()` |
| Cancel order | `DELETE /api/exchange/orders/{id}` | `cancel_order()` |
| Open orders | `GET /api/exchange/orders/opens` | `fetch_open_orders()` |
| Executions | `GET /api/exchange/orders/transactions` | `fetch_my_trades()` |
| Balance | `GET /api/accounts/balance` | `fetch_balance()` |
| Fees | `GET /api/accounts` | `fetch_trading_fees()` |
| Deposits | `GET /api/deposit_money` | `fetch_deposits()` |
| Withdrawals | `GET /api/withdraws` | `fetch_withdrawals()` |
| Streams | Coincheck WebSocket feed, hand-written | `watch_order_book()` / `watch_trades()` on `ccxt.pro.coincheck` |
| Pairs outside CCXT's market list | native call | the same endpoint as an [implicit method](/docs/exchanges/coincheck/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [coincheck unified API reference](/docs/exchanges/coincheck).
## FAQ [#faq]
**Which Coincheck markets does CCXT support?**
Five, as unified markets: `BTC/JPY`, `ETC/JPY`, `FCT/JPY`, `MONA/JPY` and `ETC/BTC`. Coincheck's own documentation lists 26 JPY pairs. For pairs outside CCXT's list, use the [implicit API](/docs/exchanges/coincheck/implicit-api) — for example `public_get_rate_pair({'pair': 'eth_jpy'})` — which still goes through CCXT's signing, rate limiting and error mapping.
**Why does `fetch_ticker` only work for BTC/JPY on Coincheck?**
CCXT raises `BadSymbol` for other symbols on that method, because Coincheck's ticker endpoint is oriented around its main pair. `fetch_order_book`, `fetch_trades` and the order methods are not restricted that way.
**Is the official Coincheck Python library maintained?**
`coincheckjp/coincheck-python` was last pushed in May 2019. The most recently maintained official Coincheck library is the Ruby one, `ruby_coincheck_client`, updated in July 2026. CCXT ships releases continuously across eight languages.
**Does CCXT support Coincheck WebSockets?**
Partially. `coincheck` has 2 `watch*` methods — `watch_order_book` and `watch_trades` — covering Coincheck's public channels. The documented private order-event and execution-event channels are not implemented, so poll those over REST.
**Does Coincheck have a testnet I can use with CCXT?**
No. No sandbox environment is published, so `set_sandbox_mode(True)` has nothing to point at for `coincheck`.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [coincheck unified API reference](/docs/exchanges/coincheck)
* [coincheck implicit API](/docs/exchanges/coincheck/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the CoinEx API (/docs/comparisons/ccxt-vs-coinex-api)
CoinEx documents a v2 REST and WebSocket API at [docs.coinex.com](https://docs.coinex.com/api/v2/) and publishes [`coinex_api_demo`](https://github.com/coinexcom/coinex_api_demo) — sample code in C#, Go, Node.js, Python and Rust. What it does not publish is an installable client library: the demo repository is reference code you copy, and its README points back at the documentation.
So the choice here is not "CCXT or the vendor SDK". It is **CCXT or your own HTTP client**, and the question that decides it is how much of the signing, throttling and order-book plumbing you want to own.
## TL;DR [#tldr]
* **Write against the raw API** if you need one or two endpoints, want zero dependencies, and are comfortable implementing HMAC-SHA256 signing and a rate limiter yourself.
* **Pick CCXT** if you want CoinEx spot, margin and futures behind one client that already handles signing, per-endpoint throttling, gzip-framed WebSocket frames and order-book resync — and that speaks the same API on 103 other venues.
* **Choosing CCXT does not hide anything.** All 251 CoinEx endpoints are generated as [implicit methods](/docs/exchanges/coinex/implicit-api), so nothing in the raw API is out of reach.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw CoinEx API** |
| --------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| Exchanges covered | 104 (CoinEx is one of them) | CoinEx only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | any; sample code in C#, Go, Node.js, Python, Rust |
| Installable client library | yes — `ccxt` | none published; `coinex_api_demo` is copy-paste sample code |
| Unified market data + trading API | yes — 72 unified capabilities, 35 `fetch*` methods | CoinEx's own request/response shapes |
| WebSockets | yes — 10 `watch*` methods, gzip frames decoded for you | yes — `wss://socket.coinex.com/v2/spot` and `/v2/futures`, raw |
| Raw endpoint access | yes — 251 endpoints as implicit methods | it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 2.5ms) | you model 400 req/s per IP plus per-account limits |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus CoinEx `code` values |
| Testnet / sandbox | not available for CoinEx | none documented |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `coinex_api_demo` 22 stars; `coinex_exchange_api` docs repo 196 stars |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub issues — usually same-day | CoinEx support ticket, docs site |
Figures verified September 2026 against CCXT v4.5.78, the CoinEx v2 API documentation, and the repositories published by the `coinexcom` GitHub organisation.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw CoinEx API
```python
import ccxt
exchange = ccxt.coinex()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://api.coinex.com/v2/spot/ticker',
params={'market': 'BTCUSDT'})
data = r.json()['data'][0]
print(data['last'], data['value'])
```
The raw call is short because public market data is unsigned. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — same keys, same types, same units as on every other venue — and you did not have to know that CoinEx wraps its payload in `data` and calls quote volume `value`.
### Place a limit order [#place-a-limit-order]
CCXT
Raw CoinEx API
```python
import ccxt
exchange = ccxt.coinex({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import hashlib, hmac, json, time
import requests
ACCESS_ID, SECRET = '...', '...'
path = '/v2/spot/order'
body = json.dumps({
'market': 'BTCUSDT', 'market_type': 'SPOT', 'side': 'buy',
'type': 'limit', 'amount': '0.001', 'price': '60000',
})
ts = str(int(time.time() * 1000))
prepared = 'POST' + path + body + ts
sign = hmac.new(SECRET.encode(), prepared.encode(), hashlib.sha256).hexdigest().lower()
r = requests.post('https://api.coinex.com' + path, data=body, headers={
'X-COINEX-KEY': ACCESS_ID,
'X-COINEX-SIGN': sign,
'X-COINEX-TIMESTAMP': ts,
'Content-Type': 'application/json',
})
print(r.json())
```
CoinEx signs `method + request_path + body + timestamp` with HMAC-SHA256 and expects the digest as lowercase hex in `X-COINEX-SIGN`. That is not hard, but it is exactly the kind of code that breaks silently: get the body serialisation wrong by one character and every private call fails authentication. CCXT implements it once, per venue, and it is tested on every release.
Switching that same order to futures is one option change, not a new signing path:
```python
exchange = ccxt.coinex({'apiKey': '...', 'secret': '...',
'options': {'defaultType': 'swap'}})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.001, 60000)
```
### Stream an order book [#stream-an-order-book]
CCXT
Raw CoinEx WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.coinex()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import gzip, json, asyncio, websockets
async def main():
async with websockets.connect('wss://socket.coinex.com/v2/spot') as ws:
await ws.send(json.dumps({
'method': 'depth.subscribe',
'params': {'market_list': [['BTCUSDT', 10, '0', True]]},
'id': 1,
}))
async for frame in ws:
message = json.loads(gzip.decompress(frame))
print(message) # raw depth update, not a merged book
asyncio.run(main())
```
These two snippets are not doing the same job. CCXT returns a **live, merged order book**; the raw socket returns update messages that you must decompress, apply to a local snapshot in the right order, and re-seed after a gap or a reconnect.
| | CCXT | raw stream |
| -------------------------------------------------- | ------------ | ---------- |
| Decompress the gzip-framed messages | done for you | your code |
| Merge depth updates into a full book | done for you | your code |
| Detect gaps and re-subscribe from a fresh snapshot | done for you | your code |
| Keep the connection alive (`server.ping`) | done for you | your code |
| Reconnect and re-subscribe after a drop | done for you | your code |
| Bounded caches instead of unbounded growth | done for you | your code |
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CoinEx applies a **400 requests per second limit per IP** on top of per-account short-cycle limits that differ by endpoint group — 30 r/s to place or edit spot orders, 60 r/s to cancel, 50 r/s to query orders, but only 10 r/s for spot order history, and 20 r/s to place or edit futures orders. Batch requests consume quota per sub-request, and there are additional long-cycle windows measured over 1, 4, 8 and 24 hours.
CCXT encodes per-endpoint weights in the exchange definition and ships a throttler that is on by default (`enableRateLimit = true`, `rateLimit = 2.5`ms). You call methods in a loop; the library paces them.
### One error hierarchy [#one-error-hierarchy]
CoinEx returns a numeric `code` in the response body. CCXT maps those onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError` and 35 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once, and it keeps working when you add a second exchange.
### Precision and string math [#precision-and-string-math]
CoinEx rejects orders that violate tick size, step size or minimum notional. CCXT loads market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities never drift through float rounding.
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### Portability is the whole point [#portability-is-the-whole-point]
Adding a second venue to a hand-rolled CoinEx integration means a second signing scheme, a second symbol convention, a second error taxonomy and a second WebSocket dialect. That translation layer is what CCXT already is, across 104 venues:
```python
for exchange_id in ['coinex', 'binance', 'okx', 'bybit', 'kucoin']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 72 unified capabilities CCXT implements for CoinEx, **all 251 endpoints in its API block are generated as callable implicit methods**, with signing, rate-limit accounting and error mapping applied:
```python
response = exchange.v2PublicGetSpotTicker({'market': 'BTCUSDT'})
```
Browse the full list on the [CoinEx implicit API page](/docs/exchanges/coinex/implicit-api).
## What the raw CoinEx API does better [#what-the-raw-coinex-api-does-better]
Honest advantages of going direct:
* **Zero dependencies and a smaller footprint.** A single signed `requests` call has no library between you and the venue. If your service reads one endpoint on a schedule, CCXT is more machinery than the job needs.
* **The demo repository covers five languages CoinEx tested itself.** `coinex_api_demo` has working signing examples in C#, Go, Node.js, Python and Rust — useful if you are porting the signer into a runtime CCXT does not target, or want to see CoinEx's own reference implementation of it.
* **New endpoints are usable the day they ship.** A brand-new CoinEx endpoint is callable by URL immediately; a *unified* CCXT wrapper for it may follow later. (CCXT's implicit API closes most of this gap, but only after the endpoint is added to the exchange's API block.)
* **Field-for-field fidelity with the docs.** Reading the CoinEx reference and calling the endpoint directly means what you see in the docs is what you get back. CCXT's unified names are a deliberate abstraction, which is one extra hop when debugging.
If CoinEx is your only venue, you need a couple of endpoints, and you would rather own 60 lines of signing code than add a dependency, going direct is a defensible choice.
## Migrating from the raw CoinEx API to CCXT [#migrating-from-the-raw-coinex-api-to-ccxt]
| What you are doing | Raw CoinEx API | CCXT |
| ------------------- | ------------------------------------- | ------------------------------------------------------------------------------ |
| Symbols | `'BTCUSDT'` | `'BTC/USDT'` (spot), `'BTC/USDT:USDT'` (futures) |
| Product selection | different path prefix and market type | `options.defaultType` = `spot` / `margin` / `swap` |
| Market list | `GET /v2/spot/market` | `load_markets()` |
| Ticker | `GET /v2/spot/ticker` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `GET /v2/spot/depth` | `fetch_order_book()` |
| Candles | `GET /v2/spot/kline` | `fetch_ohlcv()` |
| New order | `POST /v2/spot/order` | `create_order()` |
| Cancel order | `POST /v2/spot/cancel-order` | `cancel_order()` |
| Open orders | `GET /v2/spot/pending-order` | `fetch_open_orders()` |
| Balance | `GET /v2/assets/spot/balance` | `fetch_balance()` |
| Streams | `wss://socket.coinex.com/v2/spot` | `watch_*` on `ccxt.pro.coinex` |
| Anything not listed | the endpoint URL | the same endpoint as an [implicit method](/docs/exchanges/coinex/implicit-api) |
## FAQ [#faq]
**Does CoinEx have an official Python SDK?**
Not an installable one. CoinEx publishes [`coinex_api_demo`](https://github.com/coinexcom/coinex_api_demo), a repository of sample scripts in C#, Go, Node.js, Python and Rust, and points developers at [docs.coinex.com](https://docs.coinex.com/api/v2/). If you want a maintained client library for CoinEx, CCXT is the practical option.
**Does CCXT support CoinEx futures and margin?**
Yes. Spot, margin and futures are all served by one `ccxt.coinex` instance, selected with `options.defaultType` and unified params. CCXT implements 72 unified capabilities for CoinEx, including positions, leverage, funding rates, leverage tiers and margin adjustment history.
**Does CCXT stream CoinEx over WebSocket?**
Yes — 10 `watch*` methods: `watchOrderBook`, `watchOrderBookForSymbols`, `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchTrades`, `watchTradesForSymbols`, `watchOrders`, `watchMyTrades` and `watchBalance`. CCXT decompresses the gzip-framed messages and maintains the merged order book for you.
**Is there a CoinEx testnet I can use with `setSandboxMode`?**
No. CCXT's CoinEx class does not declare a sandbox, because CoinEx does not publish testnet base URLs. Test against small live orders or against static fixtures instead.
**Can I still call CoinEx-specific endpoints through CCXT?**
Yes — all 251 of them, as [implicit methods](/docs/exchanges/coinex/implicit-api), with signing, throttling and error mapping applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [coinex unified API reference](/docs/exchanges/coinex)
* [coinex implicit API](/docs/exchanges/coinex/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Coinmate API (/docs/comparisons/ccxt-vs-coinmate-api)
[Coinmate](https://coinmate.io) is a Czech exchange trading crypto against CZK and EUR. It publishes [`coinmate-api-examples`](https://github.com/coinmate-io/coinmate-api-examples) — API clients in Java 21, TypeScript 5.x, Python 3.11+ and PHP 8.2+, covering what the repository describes as 55+ endpoints, under MIT.
The catch is distribution. Those clients are not published to Maven Central, npm, PyPI or Packagist; the README's install step is `cd python && pip install -r requirements.txt`. You copy the code into your project and own it from there.
So the deciding question is: **do you want a vendored client you maintain, or a dependency someone else maintains?**
## TL;DR [#tldr]
* **Use Coinmate's official clients** if you want code written against Coinmate's own field names by Coinmate, you are happy vendoring a few files, and Coinmate is the only venue you will ever call.
* **Pick CCXT** if you want `pip install ccxt` (or npm, Composer, NuGet, Go modules, Maven), a unified API that already runs against 103 other venues, and someone else tracking API changes.
* **Neither choice hides the API.** CCXT generates all 64 Coinmate endpoints as [implicit methods](/docs/exchanges/coinmate/implicit-api), so the unified layer is never a ceiling.
## At a glance [#at-a-glance]
| | **CCXT** | **Coinmate's official clients** |
| --------------------------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| Exchanges covered | 104 (Coinmate is one of them) | Coinmate only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Java 21, TypeScript 5.x, Python 3.11+, PHP 8.2+ — four separate codebases |
| Distribution | published packages (`ccxt` on npm, PyPI, Packagist, NuGet, Maven, Go modules) | copy the source into your project; not published to any package registry |
| Unified market data + trading API | yes — 18 unified capabilities, 13 `fetch*` methods | no — Coinmate's own request/response shapes |
| Endpoint coverage | 64 endpoints as implicit methods | "55+ endpoints" per the repository README |
| WebSockets | none for Coinmate — poll the `fetch*` methods | none documented |
| Built-in rate limiter | yes, on by default (`rateLimit` 600ms) | not described in the repository |
| Unified error types | yes — 41 typed exceptions in one hierarchy | per-client error handling |
| Testnet / sandbox | not available for Coinmate | none documented |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month | `coinmate-api-examples`: 1 star, 1 fork |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues on the examples repository, Coinmate support |
Figures verified September 2026 against CCXT v4.5.78 and the `coinmate-io/coinmate-api-examples` repository and its per-language READMEs.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Coinmate's Python client
```python
import ccxt
exchange = ccxt.coinmate()
ticker = exchange.fetch_ticker('BTC/EUR')
print(ticker['last'], ticker['baseVolume'])
```
```python
# after copying the `python/` folder into your project
async with CoinmateClient(config) as client:
response = await client.get_ticker('BTC_EUR')
if not response.error:
print(response.data.last)
```
Two things differ. The symbol: `'BTC/EUR'` is CCXT's unified form and means the same thing on every venue, while `BTC_EUR` is Coinmate's market id. And the result: CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) with the same keys and units you get from Kraken or Bitstamp, so downstream code does not branch on which exchange produced it.
### Place a limit order [#place-a-limit-order]
CCXT
Coinmate's Python client
```python
import ccxt
exchange = ccxt.coinmate({
'apiKey': '...', # publicKey
'secret': '...', # privateKey
'uid': '...', # clientId
})
order = exchange.create_order('BTC/EUR', 'limit', 'buy', 0.001, 55000)
print(order['id'], order['status'])
```
```python
# credentials go in a .env file read by the client's config
async with CoinmateClient(config) as client:
response = await client.buy_limit(
currency_pair='BTC_EUR', amount='0.001', price='55000')
print(response.data)
```
Coinmate needs three credentials rather than the usual two — `clientId`, `publicKey` and `privateKey` — and signs requests with HMAC-SHA256 over an incrementing nonce. CCXT's `coinmate` class declares all three in `requiredCredentials` and maps them to `uid`, `apiKey` and `secret`, so the constructor tells you what is missing instead of the exchange returning an opaque authentication error.
## Where the differences actually bite [#where-the-differences-actually-bite]
### A dependency versus vendored code [#a-dependency-versus-vendored-code]
This is the practical difference. `pip install ccxt` (or `composer require ccxt/ccxt`, or `go get`) gives you a versioned dependency: when Coinmate changes a field, you bump a version. Vendored example code gives you a fork the moment you paste it — Coinmate's later fixes reach you only if you notice them and re-merge by hand.
Coinmate maintains four separate client implementations, one per language. CCXT is written once in TypeScript and transpiled to eight languages with identical method names and return structures:
Python
TypeScript
PHP
Go
```python
import ccxt
exchange = ccxt.coinmate()
ticker = exchange.fetch_ticker('BTC/EUR')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.coinmate ();
const ticker = await exchange.fetchTicker ('BTC/EUR');
```
```php
$exchange = new \ccxt\coinmate();
$ticker = $exchange->fetch_ticker('BTC/EUR');
```
```go
exchange := ccxt.NewCoinmate(nil)
ticker, err := exchange.FetchTicker("BTC/EUR")
```
### Fiat pairs without special cases [#fiat-pairs-without-special-cases]
Coinmate quotes in CZK and EUR. In CCXT those are ordinary unified symbols — `'BTC/CZK'`, `'BTC/EUR'`, `'ETH/CZK'` — parsed through the same `safe_symbol` machinery as `'BTC/USDT'`, with the same precision and limits metadata loaded from `load_markets()`. Code that already handles one venue's fiat pairs handles Coinmate's.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Coinmate's error responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded`, `NetworkError` and 35 more, all descending from `BaseError`. The `except` clauses you write for Coinmate keep working when you add another exchange.
### Precision and string math [#precision-and-string-math]
CCXT loads Coinmate's market metadata and exposes `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so order sizes never drift through float rounding:
```python
amount = exchange.amount_to_precision('BTC/EUR', 0.0012345678)
price = exchange.price_to_precision('BTC/EUR', 55123.456789)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 18 unified capabilities, **all 64 endpoints in CCXT's Coinmate API block are generated as callable implicit methods**, with signing and rate limiting applied:
```python
response = exchange.publicGetTickerAll()
```
Browse them on the [Coinmate implicit API page](/docs/exchanges/coinmate/implicit-api).
## What Coinmate's official clients do better [#what-coinmates-official-clients-do-better]
Real advantages, and they matter for some projects:
* **Written by the venue, against the venue's own field names.** When you are reading Coinmate's API reference, the official client's method and field names line up with it directly. CCXT's unified names are a deliberate abstraction, which is one extra hop when debugging against the vendor docs.
* **They cover endpoints CCXT does not model as unified methods.** The repository claims 55+ endpoints implemented; CCXT's unified layer implements 18 capabilities and, notably, has no `fetchOHLCV` for Coinmate — candles are only reachable through the implicit API, if at all. If you need a Coinmate-specific endpoint with typed models around it, the official client has already shaped it.
* **Typed request/response models per language.** Java 21 and TypeScript 5.x models built for Coinmate's payloads are more literal about that payload than CCXT's typed *unified* structures, which are optimised for portability instead.
* **No dependency at all.** Vendored code means your build has nothing extra to resolve, audit or pin. For a small internal tool touching one venue, that is a genuine simplification.
If Coinmate is your only venue and you value literal fidelity to their docs over portability and dependency management, their official clients are a defensible choice.
## Migrating from Coinmate's clients to CCXT [#migrating-from-coinmates-clients-to-ccxt]
| What you are doing | Coinmate client | CCXT |
| ------------------- | ------------------------------------- | -------------------------------------------------------------------------------- |
| Credentials | `clientId`, `publicKey`, `privateKey` | `uid`, `apiKey`, `secret` |
| Symbols | `'BTC_EUR'` | `'BTC/EUR'` |
| Markets | `get_trading_pairs()` | `load_markets()` |
| Ticker | `get_ticker()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `get_order_book()` | `fetch_order_book()` |
| Trading fees | `get_trading_fees()` | `fetch_trading_fee()` |
| New order | `buy_limit()` / `sell_limit()` | `create_order()` |
| Cancel order | `cancel_order()` | `cancel_order()` |
| Cancel everything | `cancel_all_open_orders()` | `cancel_order()` per id |
| Open orders | `get_open_orders()` | `fetch_open_orders()` |
| Balance | `get_balances()` | `fetch_balance()` |
| Anything not listed | the endpoint URL | the same endpoint as an [implicit method](/docs/exchanges/coinmate/implicit-api) |
## FAQ [#faq]
**Does Coinmate have an official SDK on PyPI or npm?**
No. Coinmate publishes [`coinmate-api-examples`](https://github.com/coinmate-io/coinmate-api-examples) with client implementations in Java, TypeScript, Python and PHP, but they are not published to any package registry — the install step is copying the source and installing its requirements. CCXT is the installable option.
**Does CCXT support Coinmate over WebSocket?**
No. CCXT implements no `watch*` methods for Coinmate, and Coinmate's own examples repository documents no WebSocket API either. Use the `fetch*` methods and poll.
**Can I trade Coinmate's CZK and EUR pairs through CCXT?**
Yes. They are ordinary unified symbols — `'BTC/CZK'`, `'BTC/EUR'` — with precision and limits loaded from `load_markets()`, exactly like a crypto-to-crypto pair.
**Why does CCXT's Coinmate constructor need three credentials?**
Because Coinmate's private API signs with `clientId`, `publicKey` and `privateKey`. CCXT maps them to `uid`, `apiKey` and `secret` and declares all three in `requiredCredentials`, so a missing one raises immediately instead of failing at the exchange.
**Can I still call Coinmate-specific endpoints through CCXT?**
Yes — all 64 endpoints in the class's API block are generated as [implicit methods](/docs/exchanges/coinmate/implicit-api), with signing, throttling and error mapping applied.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [coinmate unified API reference](/docs/exchanges/coinmate)
* [coinmate implicit API](/docs/exchanges/coinmate/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the Coinone API (/docs/comparisons/ccxt-vs-coinone-api)
[Coinone](https://coinone.co.kr) is a Korean exchange trading mostly against KRW. Its developer centre at [docs.coinone.co.kr](https://docs.coinone.co.kr/) documents a public REST API, a private REST API in two generations (v2.0 and v2.1), and a public WebSocket. What it does not publish is a client library in any language.
That makes the comparison here **CCXT against your own HTTP client**, and the question that decides it is whether you want to implement Coinone's signing, nonce and payload rules yourself.
## TL;DR [#tldr]
* **Write against the raw API** if you need a couple of endpoints, want no dependencies, and are comfortable with base64-encoded signed payloads and Coinone's IP allowlist.
* **Pick CCXT** if you want Coinone behind an installable client that already handles signing, market metadata, throttling and order-book maintenance — and that speaks the same API on 103 other venues.
* **The unified layer is not a ceiling.** All 63 Coinone endpoints CCXT knows about are generated as [implicit methods](/docs/exchanges/coinone/implicit-api), including the v2.0 endpoints the newer generation has not replaced.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw Coinone API** |
| --------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| Exchanges covered | 104 (Coinone is one of them) | Coinone only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | any language you write the signer in |
| Installable client library | yes — `ccxt` | none published by Coinone |
| Unified market data + trading API | yes — 18 unified capabilities, 11 `fetch*` methods | Coinone's own request/response shapes |
| WebSockets | yes — 3 `watch*` methods (ticker, order book, trades) | `wss://public-ws-api.coinone.co.kr` — 6 public channels plus private streams |
| Raw endpoint access | yes — 63 endpoints as implicit methods | it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 50ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Coinone `errorCode` values |
| Testnet / sandbox | not available for Coinone | none documented |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month | n/a — no published package |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub issues — usually same-day | Coinone developer centre |
Figures verified September 2026 against CCXT v4.5.78 and the Coinone developer centre documentation at docs.coinone.co.kr.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw Coinone API
```python
import ccxt
exchange = ccxt.coinone()
ticker = exchange.fetch_ticker('BTC/KRW')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://api.coinone.co.kr/public/v2/ticker_new/KRW/BTC')
data = r.json()['tickers'][0]
print(data['last'], data['target_volume'])
```
Public market data is unsigned, so the raw call is short. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure), and — more usefully — `'BTC/KRW'` is a portable symbol rather than a path segment pair you have to assemble as `KRW/BTC` in the venue's own order.
### Place a limit order [#place-a-limit-order]
CCXT
Raw Coinone API
```python
import ccxt
exchange = ccxt.coinone({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/KRW', 'limit', 'buy', 0.001, 90000000)
print(order['id'], order['status'])
```
```python
import base64, hashlib, hmac, json, time
import requests
ACCESS_TOKEN, SECRET = '...', '...'
payload_json = json.dumps({
'access_token': ACCESS_TOKEN,
'nonce': str(int(time.time() * 1000)), # must always increase
'currency': 'btc', 'price': 90000000, 'qty': 0.001,
})
payload = base64.b64encode(payload_json.encode()).decode()
signature = hmac.new(SECRET.upper().encode(), payload.encode(),
hashlib.sha512).hexdigest()
r = requests.post('https://api.coinone.co.kr/order/limit_buy',
data=payload, headers={
'Content-Type': 'application/json',
'X-COINONE-PAYLOAD': payload,
'X-COINONE-SIGNATURE': signature,
})
print(r.json())
```
Coinone's private API is a stack of easy-to-miss rules: the request body **is** the base64 string, the same string goes in `X-COINONE-PAYLOAD`, the signature is HMAC-SHA512 over that base64 rather than over the JSON, and the secret is uppercased before it is used as the key. Get any one of them wrong and you get an authentication failure with nothing to distinguish which. CCXT implements it once and tests it on every release.
One caveat worth knowing up front: CCXT's `coinone` class accepts limit orders only and raises `ExchangeError` for any other type.
### Stream an order book [#stream-an-order-book]
CCXT
Raw Coinone WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.coinone()
while True:
orderbook = await exchange.watch_order_book('BTC/KRW')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import json, asyncio, websockets
async def main():
async with websockets.connect('wss://public-ws-api.coinone.co.kr') as ws:
await ws.send(json.dumps({
'request_type': 'SUBSCRIBE',
'channel': 'ORDERBOOK',
'topic': {'quote_currency': 'KRW', 'target_currency': 'BTC'},
}))
async for frame in ws:
print(json.loads(frame)) # raw channel message
asyncio.run(main())
```
CCXT gives you a merged, depth-limited book that stays correct across reconnects. The raw socket gives you channel messages plus the responsibility for keeping the local book in step, answering the `PING` channel, and re-subscribing after a drop.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Two API generations, one client [#two-api-generations-one-client]
Coinone's private API exists in two generations with different conventions: v2.1 uses `snake_case` throughout and a UUID v4 nonce, while v2.0 uses `snake_case` requests with `camelCase` responses and a millisecond-timestamp nonce that must always increase. CCXT's `coinone` class routes each unified method to the right generation and normalises both response shapes, so your code never sees the split. Both generations remain reachable as implicit methods if you need a v2.0-only endpoint.
### Portability is the whole point [#portability-is-the-whole-point]
Korean venues have their own conventions — KRW quoting, `quote_currency`/`target_currency` path pairs, per-key IP allowlists of up to five IPv4 addresses. Adding Coinone to a portfolio that also touches global venues means reconciling all of that with everything else. In CCXT the venue is a variable:
```python
for exchange_id in ['coinone', 'upbit', 'bithumb', 'binance']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/KRW' if exchange_id != 'binance' else 'BTC/USDT')['last'])
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Coinone's numeric error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded`, `NetworkError` and 35 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once instead of matching on a code string that may change.
### Precision and string math [#precision-and-string-math]
KRW prices are large integers and BTC amounts are small decimals, which is exactly the combination that goes wrong under float arithmetic. CCXT loads Coinone's market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class:
```python
amount = exchange.amount_to_precision('BTC/KRW', 0.0012345678)
price = exchange.price_to_precision('BTC/KRW', 90123456.789)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 18 unified capabilities, **all 63 endpoints in CCXT's Coinone API block are generated as callable implicit methods**, with signing and rate limiting applied:
```python
response = exchange.v2PublicGetChartQuoteCurrencyTargetCurrency({
'quote_currency': 'KRW', 'target_currency': 'BTC', 'interval': '1h',
})
```
Browse them on the [Coinone implicit API page](/docs/exchanges/coinone/implicit-api).
## What the raw Coinone API does better [#what-the-raw-coinone-api-does-better]
Honest advantages of going direct:
* **The WebSocket surface is wider than CCXT's.** Coinone documents six public channels — `TICKER`, `CANDLE`, `ORDERBOOK`, `ORDERBOOK_V2`, `TRADE` and `BOOKTICKER` — plus private WebSocket support. CCXT implements three `watch*` methods for Coinone: order book, ticker and trades. Streaming candles, book-ticker or private order updates means the raw socket.
* **Market orders are not available through CCXT here.** `ccxt.coinone.create_order()` accepts `'limit'` only and raises for anything else. If you need a different order type Coinone supports, you are calling the endpoint directly either way.
* **Candles are not a unified method here.** CCXT's Coinone class does not implement `fetchOHLCV`; the chart endpoint is reachable only through the implicit API, without unified OHLCV parsing. If your workload is candle-heavy, calling the endpoint directly is less indirect.
* **The documentation is the source of truth, in Korean.** Coinone's developer centre is written against the raw fields. Debugging a direct call means reading one document; debugging through CCXT means mapping unified names back to it first.
* **Zero dependencies.** A signed `requests` call is about twenty lines. For a single-venue script that reads a price and places an order, that may genuinely be all you need.
If Coinone is your only venue and you need its streaming channels or chart endpoint more than you need portability, going direct is a reasonable choice.
## Migrating from the raw Coinone API to CCXT [#migrating-from-the-raw-coinone-api-to-ccxt]
| What you are doing | Raw Coinone API | CCXT |
| ------------------- | --------------------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `quote_currency` + `target_currency` | `'BTC/KRW'` |
| Markets | `GET /public/v2/markets/{quote_currency}` | `load_markets()` |
| Ticker | `GET /public/v2/ticker_new/{quote}/{target}` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `GET /public/v2/orderbook/{quote}/{target}` | `fetch_order_book()` |
| Recent trades | `GET /public/v2/trades/{quote}/{target}` | `fetch_trades()` |
| Currencies | `GET /public/v2/currencies` | `fetch_currencies()` |
| New order | `POST /order/limit_buy` or `POST /v2.1/order/limit` | `create_order()` (limit only) |
| Cancel order | `POST /v2.1/order/cancel` | `cancel_order()` |
| Open orders | `POST /v2.1/order/open_orders` | `fetch_open_orders()` |
| Balance | `POST /v2.1/account/balance/all` | `fetch_balance()` |
| Deposit address | `POST /v2/account/deposit_address` | `fetch_deposit_addresses()` |
| Streams | `wss://public-ws-api.coinone.co.kr` | `watch_*` on `ccxt.pro.coinone` |
| Anything not listed | the endpoint URL | the same endpoint as an [implicit method](/docs/exchanges/coinone/implicit-api) |
## FAQ [#faq]
**Does Coinone have an official Python or Node SDK?**
Not one it publishes. The Coinone developer centre at [docs.coinone.co.kr](https://docs.coinone.co.kr/) documents the REST and WebSocket APIs directly and does not point to a client library in any language. If you want a maintained client, CCXT is the practical option.
**Does CCXT support Coinone over WebSocket?**
Partly. CCXT implements three `watch*` methods for Coinone — `watchOrderBook`, `watchTicker` and `watchTrades`. Coinone's own public socket also carries candle, book-ticker and private channels, which CCXT does not wrap; reach those with the raw socket if you need them.
**How does Coinone's private API authenticate?**
It signs a base64-encoded JSON payload. The payload is sent both as the request body and in the `X-COINONE-PAYLOAD` header, and `X-COINONE-SIGNATURE` is an HMAC-SHA512 of that base64 string. The nonce is a UUID v4 on v2.1 and an increasing millisecond timestamp on v2.0. Keys are also bound to an IP allowlist of up to five IPv4 addresses. CCXT implements all of this in its `coinone` signer.
**Is there a Coinone testnet I can use with `setSandboxMode`?**
No. CCXT's Coinone class declares no sandbox because Coinone does not publish testnet base URLs.
**Can I still call Coinone-specific endpoints through CCXT?**
Yes — all 63 endpoints in the class's API block, across the legacy, v2.0 and v2.1 groups, are generated as [implicit methods](/docs/exchanges/coinone/implicit-api) with signing and throttling applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [coinone unified API reference](/docs/exchanges/coinone)
* [coinone implicit API](/docs/exchanges/coinone/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Coins.ph API and its official connectors (/docs/comparisons/ccxt-vs-coinsph-api)
[Coins.ph](https://coins.ph/) runs a Philippine exchange whose REST API is documented at [docs.coins.ph/rest-api](https://docs.coins.ph/rest-api/). That documentation lists four official connectors — [Python](https://github.com/coins-docs/coins-connector-python), [Java](https://github.com/coins-docs/coins-java-api), [JavaScript](https://github.com/coins-docs/coins-js-api) and [Go](https://github.com/coins-docs/coins-go-api) — plus a [Postman collection](https://github.com/coins-docs/coins-api-postman).
They are real, and they are separate codebases with different maturity: the JavaScript one is on npm as `coins-js-api`, the Python one is installed by cloning the repository, and each covers a different slice of the product.
The question that decides between them and [CCXT](/docs/manual) is whether you are integrating **Coins.ph the product** — which includes Convert, Fiat, P2P transfer and invoice payment — or **Coins.ph the exchange**, alongside other exchanges.
## TL;DR [#tldr]
* **Use the official connectors** if you need Coins.ph's non-trading product lines (Convert, Fiat, P2P transfer, invoice payment), or if you want streaming and are working in Python.
* **Pick CCXT** if you want spot trading and market data behind an API shared with 103 other venues, installable from one package in eight languages, with unified structures and a built-in rate limiter.
* **Know the gap up front:** CCXT has **no WebSocket support for Coins.ph** — zero `watch*` methods. Coins.ph documents WebSocket streams and the official Python connector wraps them. If you need live streams here, that is the connector's job, not CCXT's.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Coins.ph connectors** |
| --------------------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Coins.ph is one of them) | Coins.ph only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, Java, JavaScript/TypeScript, Go — four separate codebases |
| Packages to install | 1 (`ccxt`) | one per language; `coins-js-api` is on npm, the Python connector is installed by cloning the repo |
| Unified market data + trading API | yes — 30 unified capabilities, 20 `fetch*` methods | no — Coins.ph's own request/response shapes |
| Product lines covered | spot trading, market data, deposits and withdrawals | spot trading, wallet, convert, fiat, P2P transfer, invoice payment |
| WebSockets | **no** — CCXT implements no `watch*` methods for this venue | documented streams; wrapped by the Python connector |
| Raw endpoint access | yes — 78 endpoints as implicit methods | the connector's own method surface |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 50ms) | you respect 120 req/min per IP and 180 req/min per UID yourself |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus Coins.ph error codes |
| Testnet / sandbox | not available for Coins.ph | none documented |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `coins-connector-python` 4 stars; `coins-java-api` 3 stars; `coins-js-api` 1 star, 17 npm installs/month; `coins-go-api` 0 stars |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues on each connector |
Figures verified September 2026 against CCXT v4.5.78, the Coins.ph REST API documentation, the four `coins-docs` connector repositories, and npm install counts.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
coins-connector-python
```python
import ccxt
exchange = ccxt.coinsph()
ticker = exchange.fetch_ticker('BTC/PHP')
print(ticker['last'], ticker['baseVolume'])
```
```python
# installed by cloning the repository, not from PyPI
from coins.spot import Client
client = Client()
response = client.time()
print(response)
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) keyed by a portable symbol. The connector returns the payload Coins.ph sends, addressed by the venue's market id (`BTCPHP`), which is fine until the same code has to read a price from a second exchange.
### Place a limit order [#place-a-limit-order]
CCXT
coins-js-api
```python
import ccxt
exchange = ccxt.coinsph({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/PHP', 'limit', 'buy', 0.001, 3500000)
print(order['id'], order['status'])
```
```javascript
const client = new CoinsApiClient(config);
const order = await client.spotTrading().newOrder({
symbol: 'BTCUSDT',
side: 'BUY',
type: 'LIMIT',
quantity: '0.001',
price: '50000',
});
```
Both are readable. The difference shows when you add a second venue: `create_order('BTC/PHP', 'limit', 'buy', 0.001, 3500000)` is the same call on Binance, Kraken and 101 others, while `newOrder({symbol, side, type, quantity, price})` is Coins.ph's shape and stops at Coins.ph.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Coins.ph enforces two independent budgets over all `/openapi/*` endpoints: **120 requests per minute per IP** and **180 requests per minute per UID**. Individual endpoints carry weights, so heavy calls consume more than one unit. Exceeding a limit returns HTTP 429 with a `Retry-After` header, and repeated violations escalate to HTTP 418 IP bans lasting from two minutes to three days.
CCXT encodes those per-endpoint weights in the exchange definition — including the conditional ones, such as the 24-hour ticker endpoint costing 1 for a single symbol and 40 when called with no symbol at all — and ships a throttler that is on by default (`enableRateLimit = true`, `rateLimit = 50`ms). You call methods in a loop; the library paces them.
### Signing, timestamps and clock skew [#signing-timestamps-and-clock-skew]
Signed endpoints take an `X-COINS-APIKEY` header and an HMAC-SHA256 signature over the full query string, plus a millisecond `timestamp` and an optional `recvWindow` (default 5000ms, maximum 60000ms). The server rejects a request whose timestamp falls outside that window, which turns a drifting clock into an intermittent authentication failure. CCXT computes the signature, manages the timestamp and exposes `options.recvWindow` if you need to widen it.
### Eight languages, one API [#eight-languages-one-api]
Coins.ph maintains four connectors as four codebases. CCXT is written once in TypeScript and transpiled to eight languages with identical method names and return structures:
Python
TypeScript
Go
C#
```python
import ccxt
exchange = ccxt.coinsph()
ticker = exchange.fetch_ticker('BTC/PHP')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.coinsph ();
const ticker = await exchange.fetchTicker ('BTC/PHP');
```
```go
exchange := ccxt.NewCoinsph(nil)
ticker, err := exchange.FetchTicker("BTC/PHP")
```
```csharp
var exchange = new ccxt.coinsph();
var ticker = await exchange.FetchTicker("BTC/PHP");
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Coins.ph's error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded`, `DDoSProtection`, `NetworkError` and 34 more, all descending from `BaseError`. The 418 ban case surfaces as a rate-limit exception rather than an unhelpful HTTP status.
### Precision and string math [#precision-and-string-math]
PHP-quoted pairs mean large prices and small amounts in the same order. CCXT loads Coins.ph market metadata and exposes `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class:
```python
amount = exchange.amount_to_precision('BTC/PHP', 0.0012345678)
price = exchange.price_to_precision('BTC/PHP', 3512345.6789)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 30 unified capabilities, **all 78 endpoints in CCXT's Coins.ph API block are generated as callable implicit methods**, with signing, timestamping and throttling applied:
```python
response = exchange.publicGetOpenapiQuoteV1TickerBookTicker({'symbol': 'BTCPHP'})
```
Browse them on the [Coins.ph implicit API page](/docs/exchanges/coinsph/implicit-api).
## What the official connectors do better [#what-the-official-connectors-do-better]
Real advantages, and one of them is decisive for some workloads:
* **Streaming.** CCXT has no WebSocket implementation for Coins.ph at all — zero `watch*` methods. The official Python connector wraps Coins.ph's documented WebSocket streams and user data stream. If you need live order-book or order updates from this venue, the connector does it and CCXT does not.
* **They cover product lines CCXT does not model.** `coins-js-api` describes itself as covering Spot Trading, Wallet, Convert, Fiat, P2P Transfer and Invoice Payment. CCXT is a trading API: convert quotes, fiat rails, peer-to-peer transfer and invoice payment are outside its unified surface entirely.
* **One-to-one mapping with the Coins.ph docs.** Field and method names line up with the reference you are reading. CCXT's unified names are a deliberate abstraction, which is an extra hop when debugging against vendor docs.
* **TypeScript models built for Coins.ph payloads.** `coins-js-api` ships type definitions for the venue's own request and response shapes. CCXT gives you typed *unified* structures instead — better for portability, less literal about this venue.
If you are building a Philippine payments or P2P product on Coins.ph rather than a multi-venue trading system, the official connectors are the right starting point.
## Migrating from a Coins.ph connector to CCXT [#migrating-from-a-coinsph-connector-to-ccxt]
| What you are doing | Coins.ph connector | CCXT |
| ------------------- | ----------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `'BTCPHP'` | `'BTC/PHP'` |
| Exchange info | `GET /openapi/v1/exchangeInfo` | `load_markets()` |
| 24h ticker | `GET /openapi/quote/v1/ticker/24hr` | `fetch_ticker()` / `fetch_tickers()` |
| Depth | `GET /openapi/quote/v1/depth` | `fetch_order_book()` |
| Klines | `GET /openapi/quote/v1/klines` | `fetch_ohlcv()` |
| New order | `POST /openapi/v1/order` | `create_order()` |
| Cancel order | `DELETE /openapi/v1/order` | `cancel_order()` |
| Open orders | `GET /openapi/v1/openOrders` | `fetch_open_orders()` |
| My trades | `GET /openapi/v1/myTrades` | `fetch_my_trades()` |
| Account | `GET /openapi/v1/account` | `fetch_balance()` |
| Deposit address | wallet endpoints | `fetch_deposit_address()` |
| Streams | connector WebSocket client | not available in CCXT for this venue |
| Anything not listed | the endpoint URL | the same endpoint as an [implicit method](/docs/exchanges/coinsph/implicit-api) |
## FAQ [#faq]
**Does CCXT support Coins.ph over WebSocket?**
No. CCXT implements zero `watch*` methods for `coinsph`, so there is no CCXT WebSocket support for this venue — use `fetch*` methods and poll, or use Coins.ph's own connector for streams. CCXT does have WebSocket support for 76 of the 104 exchanges it covers; Coins.ph is not one of them today.
**Does Coins.ph have an official Python SDK on PyPI?**
There is an official Python connector at [coins-docs/coins-connector-python](https://github.com/coins-docs/coins-connector-python), MIT-licensed, but it is not published to PyPI — the documented install path is cloning the repository and installing its requirements. The JavaScript connector is on npm as `coins-js-api`.
**What are Coins.ph's rate limits?**
120 requests per minute per IP and 180 requests per minute per UID, across all `/openapi/*` endpoints, with per-endpoint weights. HTTP 429 responses carry a `Retry-After` header, and repeated violations escalate to HTTP 418 bans of two minutes to three days. CCXT's throttler is on by default and models the weights, including conditional ones.
**Can I trade PHP fiat pairs through CCXT?**
Yes. Coins.ph's PHP-quoted markets appear as ordinary unified symbols — a market whose id is `BTCPHP` becomes `'BTC/PHP'` — with precision and limits loaded from `load_markets()`. Call `load_markets()` and pick symbols from what it returns rather than assuming a particular pair is listed; Coins.ph also runs USDT-quoted markets such as `'BTC/USDT'`.
**Can I still call Coins.ph-specific endpoints through CCXT?**
Yes — all 78 endpoints in the class's API block are generated as [implicit methods](/docs/exchanges/coinsph/implicit-api), with signing, timestamping and throttling applied.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [coinsph unified API reference](/docs/exchanges/coinsph)
* [coinsph implicit API](/docs/exchanges/coinsph/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the CoinSpot API (/docs/comparisons/ccxt-vs-coinspot-api)
[CoinSpot](https://www.coinspot.com.au) is an Australian exchange quoting everything against AUD. Its [API documentation](https://www.coinspot.com.au/api) says: "We currently have a node.js SDK, if you are interested in getting an SDK in another language Contact us." That SDK is [`coinspot-api`](https://www.npmjs.com/package/coinspot-api) on npm — MIT, version 0.1.20, last published in June 2014, and predating the [v2 API](https://www.coinspot.com.au/v2/api) that CoinSpot now recommends.
In practice that leaves two options: write against the raw v2 REST API, or use [CCXT](/docs/manual). The question that decides between them is whether AUD spot on CoinSpot is the whole job or one venue among several.
## TL;DR [#tldr]
* **Write against the raw API** if you need CoinSpot's instant buy/sell/swap quotes, order editing, bulk cancels or withdrawal endpoints — CCXT does not model those as unified methods, though it can call them.
* **Pick CCXT** if you want CoinSpot behind the same API you use for every other exchange, with signing, throttling and unified structures handled, in any of eight languages.
* **CCXT's CoinSpot surface is small on purpose** — 9 unified capabilities — but all 69 v1 and v2 endpoints are reachable as [implicit methods](/docs/exchanges/coinspot/implicit-api).
## At a glance [#at-a-glance]
| | **CCXT** | **Raw CoinSpot API** |
| --------------------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------- |
| Exchanges covered | 104 (CoinSpot is one of them) | CoinSpot only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | any; official SDK is Node only, last published June 2014 |
| Installable client library | yes — `ccxt` | `coinspot-api` on npm, v0.1.20, targets the v1 API |
| Unified market data + trading API | yes — 9 unified capabilities, 6 `fetch*` methods | CoinSpot's own request/response shapes |
| Endpoint coverage | 69 v1 and v2 endpoints as implicit methods | it is the whole product |
| WebSockets | none for CoinSpot — poll the `fetch*` methods | none documented |
| Built-in rate limiter | yes, on by default (`rateLimit` 1000ms) | you pace yourself under 1000 requests/minute |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus CoinSpot's `status` field |
| Testnet / sandbox | not available for CoinSpot | none documented |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `coinspot-api` 101 npm installs/month |
| Licence | MIT | MIT (the Node SDK) |
| Support | Discord, Telegram, GitHub issues — usually same-day | CoinSpot support |
Figures verified September 2026 against CCXT v4.5.78, CoinSpot's v1 and v2 API documentation, and npm registry metadata for `coinspot-api`.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw CoinSpot API
```python
import ccxt
exchange = ccxt.coinspot()
ticker = exchange.fetch_ticker('BTC/AUD')
print(ticker['bid'], ticker['ask'], ticker['last'])
```
```python
import requests
r = requests.get('https://www.coinspot.com.au/pubapi/v2/latest/btc')
print(r.json()['prices']) # {'bid': ..., 'ask': ..., 'last': ...}
```
The raw public call is short — CoinSpot's public API is GET-only and unsigned. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) with the full key set and a portable `'BTC/AUD'` symbol instead of the `btc` coin type in a path segment.
### Place an order [#place-an-order]
CCXT
Raw CoinSpot API
```python
import ccxt
exchange = ccxt.coinspot({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/AUD', 'limit', 'buy', 0.001, 90000)
print(order['id'])
```
```python
import hashlib, hmac, json, time
import requests
KEY, SECRET = '...', '...'
body = json.dumps({
'nonce': int(time.time() * 1000), # must always increase
'cointype': 'btc', 'amount': 0.001, 'rate': 90000,
})
sign = hmac.new(SECRET.encode(), body.encode(), hashlib.sha512).hexdigest()
r = requests.post('https://www.coinspot.com.au/api/my/buy',
data=body, headers={
'Content-Type': 'application/json',
'key': KEY,
'sign': sign,
})
print(r.json())
```
Every authenticated CoinSpot call is a POST whose JSON body contains an always-increasing `nonce`, signed with HMAC-SHA512 and sent as the `sign` header alongside `key`. The nonce is the part that bites: two processes sharing one API key will race each other into authentication failures. CCXT implements the signer once and gives each exchange instance its own nonce sequence.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CoinSpot documents a flat **1000 requests per minute**. CCXT's throttler is on by default with `rateLimit = 1000`ms for this venue, so a naive loop paces itself instead of walking into a block. You do not have to write a limiter, and the same `enableRateLimit` switch behaves identically on every other exchange in your codebase.
### One error hierarchy [#one-error-hierarchy]
CoinSpot returns a `status` field in the response body rather than signalling failures purely through HTTP codes. CCXT maps those onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `AuthenticationError`, `RateLimitExceeded`, `NetworkError` and 36 more, all descending from `BaseError` — so failure handling looks the same here as it does on Binance.
### Precision and string math [#precision-and-string-math]
CCXT exposes `amount_to_precision`, `price_to_precision` and `cost_to_precision` backed by the `Precise` string-arithmetic class, so AUD amounts and small crypto quantities do not drift through float rounding:
```python
amount = exchange.amount_to_precision('BTC/AUD', 0.0012345678)
price = exchange.price_to_precision('BTC/AUD', 90123.456789)
```
### Portability is the whole point [#portability-is-the-whole-point]
CoinSpot's request shape is unusual — POST-only private calls, a body-embedded nonce, coin types instead of pairs. Every one of those becomes a special case in code that also talks to other venues. In CCXT the venue is a variable:
```python
for exchange_id in ['coinspot', 'btcmarkets', 'independentreserve', 'kraken']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/AUD')['last'])
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
CCXT implements 9 unified capabilities for CoinSpot, but **all 69 endpoints in its API block are generated as callable implicit methods** — both the v1 group and the full v2 group, including the read-only (`ro/`) endpoints CoinSpot exposes for read-only API keys:
```python
response = exchange.v2PrivatePostRoMyBalances()
```
Browse them on the [CoinSpot implicit API page](/docs/exchanges/coinspot/implicit-api).
## What the raw CoinSpot API does better [#what-the-raw-coinspot-api-does-better]
Honest advantages, and here they are substantial:
* **The unified surface is genuinely small.** CCXT implements 9 capabilities for CoinSpot: `fetchTicker`, `fetchTickers`, `fetchOrderBook`, `fetchTrades`, `fetchMyTrades`, `fetchBalance`, `createOrder` and `cancelOrder`. There is no `fetchOHLCV`, no `fetchOrder`, no `fetchOpenOrders`, no unified deposit or withdrawal methods, and `create_order()` accepts limit orders only. Calling the endpoint directly is less indirect for anything on that list.
* **Instant buy/sell/swap and order editing have no unified equivalent.** CoinSpot's v2 API exposes `quote/buy/now`, `quote/sell/now`, `quote/swap/now`, `my/buy/edit`, `my/sell/edit` and bulk cancel endpoints. CCXT can call them as implicit methods, but there is no unified wrapper — no parsed order structure, no cross-venue behaviour.
* **CCXT's CoinSpot market list is a static table.** The class hardcodes its AUD markets rather than fetching them, so a newly listed coin is not tradeable through the unified API until CCXT is updated. Calling `/pubapi/v2/latest` directly always reflects what CoinSpot actually lists today.
* **Zero dependencies.** The raw signer is about fifteen lines. For a single-venue script that reads a price and places an order, that may be the whole integration.
If CoinSpot is your only venue and you need its instant-order or withdrawal endpoints, going direct is the sensible choice.
## Migrating from the raw CoinSpot API to CCXT [#migrating-from-the-raw-coinspot-api-to-ccxt]
| What you are doing | Raw CoinSpot API | CCXT |
| ----------------------- | --------------------------------------------- | -------------------------------------------------------------------------------- |
| Symbols | `cointype` such as `'btc'` | `'BTC/AUD'` |
| Latest prices | `GET /pubapi/v2/latest` | `fetch_tickers()` |
| One coin's price | `GET /pubapi/v2/latest/{cointype}` | `fetch_ticker()` |
| Open orders on the book | `GET /pubapi/v2/orders/open/{cointype}` | `fetch_order_book()` |
| Completed public trades | `GET /pubapi/v2/orders/completed/{cointype}` | `fetch_trades()` |
| Balances | `POST /api/v2/ro/my/balances` | `fetch_balance()` |
| New order | `POST /api/my/buy` or `my/sell` | `create_order()` (limit only) |
| Cancel order | `POST /api/my/buy/cancel` or `my/sell/cancel` | `cancel_order()` |
| My transactions | `POST /api/ro/my/transactions` | `fetch_my_trades()` |
| Streams | none — CoinSpot documents no WebSocket | none — poll `fetch*` |
| Anything not listed | the endpoint URL | the same endpoint as an [implicit method](/docs/exchanges/coinspot/implicit-api) |
## FAQ [#faq]
**Does CoinSpot have an official Python SDK?**
No. CoinSpot's documentation points to one SDK, for Node.js — the `coinspot-api` npm package, whose latest version 0.1.20 was published in June 2014, before CoinSpot's v2 API existed. For Python, PHP, Go, C# or Java, CCXT is the maintained option.
**Does CCXT support CoinSpot over WebSocket?**
No. CCXT implements zero `watch*` methods for `coinspot`, and CoinSpot's own documentation describes no WebSocket API — every documented call is HTTP. Use `fetch*` methods and poll.
**How does CoinSpot authenticate API requests?**
Private endpoints are POST-only. The JSON body carries an always-increasing `nonce`, and the whole body is signed with HMAC-SHA512 using your secret; the digest goes in the `sign` header alongside `key`. CoinSpot also offers read-only API keys, whose endpoints live under the `ro/` prefix. CCXT implements the signer and includes the read-only endpoints in its API block.
**Which CoinSpot markets can I trade through CCXT?**
CCXT's `coinspot` class carries a static list of AUD-quoted markets — `'BTC/AUD'`, `'ETH/AUD'`, `'USDT/AUD'`, `'XRP/AUD'` and others. Call `load_markets()` and read the keys rather than assuming a pair exists; a very recently listed coin may not be in the table yet.
**Can I still call CoinSpot-specific endpoints through CCXT?**
Yes — all 69 endpoints across the v1 and v2 groups are generated as [implicit methods](/docs/exchanges/coinspot/implicit-api), with signing and throttling applied. That includes instant buy/sell/swap quotes and the read-only endpoints.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [coinspot unified API reference](/docs/exchanges/coinspot)
* [coinspot implicit API](/docs/exchanges/coinspot/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the Crypto.com Exchange API (/docs/comparisons/ccxt-vs-cryptocom-api)
The [Crypto.com Exchange](https://crypto.com/exchange) v1 API covers spot, margin, perpetual swaps, futures and options over REST and WebSocket. What it does not come with is a client library: the [`crypto-com/crypto-exchange`](https://github.com/crypto-com/crypto-exchange) repository was archived in November 2021 and now contains only a pointer to the documentation, and the API reference itself lists no official SDK — it provides reference code samples in JavaScript, Python, C# and Java for you to adapt.
Crypto.com does publish [`cdcx-cli`](https://github.com/crypto-com/cdcx-cli): a Rust CLI, MCP server and terminal dashboard, dual-licensed MIT/Apache-2.0, covering 95 REST endpoints generated from the exchange's OpenAPI specification plus WebSocket streaming. It is a genuinely useful tool — but it is a binary you run, not a library you import.
So the real comparison is **CCXT against your own client**, and the question is how much of the signing, throttling and stream plumbing you want to own.
## TL;DR [#tldr]
* **Write against the raw API** if you want field-for-field fidelity with Crypto.com's documentation, or if `cdcx-cli` already does what you need from a terminal or an AI agent.
* **Pick CCXT** if you want spot, margin, swaps, futures and options behind one client that handles the signature scheme, per-endpoint rate limits, order-book maintenance and the UAT sandbox — in eight languages, with the same API on 103 other venues.
* **Choosing CCXT does not hide anything.** All 129 Crypto.com endpoints are generated as [implicit methods](/docs/exchanges/cryptocom/implicit-api).
## At a glance [#at-a-glance]
| | **CCXT** | **Raw Crypto.com Exchange API** |
| --------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| Exchanges covered | 104 (Crypto.com is one of them) | Crypto.com only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | any; docs give reference samples in JavaScript, Python, C#, Java |
| Official client library | `ccxt` — installable from every major package registry | none; `cdcx-cli` is a Rust CLI/MCP server/TUI, not a library |
| Products in one client | spot, margin, swap, future, option | one API, but you model each product yourself |
| Unified market data + trading API | yes — 58 unified capabilities, 26 `fetch*` methods | Crypto.com's own request/response shapes |
| WebSockets | yes — 12 `watch*` methods plus `unWatch*`, and order entry over the socket | yes — `wss://stream.crypto.com/exchange/v1/user` and `/market`, raw |
| Raw endpoint access | yes — 129 endpoints as implicit methods | it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 10ms) | you model 15 req/100ms on order entry, 1 req/s on history, and more |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus Crypto.com `code` values |
| Testnet / sandbox | `exchange.set_sandbox_mode(True)` swaps in the UAT hosts | swap `uat-api.3ona.co` and `uat-stream.3ona.co` in by hand |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `cdcx-cli` 25 stars; community `cryptocom-exchange` Python library 71 stars |
| Licence | MIT | `cdcx-cli` is MIT/Apache-2.0 |
| Support | Discord, Telegram, GitHub issues — usually same-day | Crypto.com developer documentation and support |
Figures verified September 2026 against CCXT v4.5.78, the Crypto.com Exchange v1 API reference, and the `crypto-com` GitHub organisation's published repositories.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw Crypto.com API
```python
import ccxt
exchange = ccxt.cryptocom()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['bid'], ticker['ask'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://api.crypto.com/exchange/v1/public/get-tickers',
params={'instrument_name': 'BTC_USDT'})
data = r.json()['result']['data'][0]
print(data['a'], data['b'], data['k'], data['v'])
```
Crypto.com's ticker payload uses single-letter keys: `i` instrument, `a` last, `b` bid, `k` ask, `h` high, `l` low, `v` base volume, `vv` quote volume, `c` change, `oi` open interest, `t` timestamp. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) with the same names and units you get everywhere else, so nothing downstream needs a Crypto.com-specific decoder ring.
### Place a limit order [#place-a-limit-order]
CCXT
Raw Crypto.com API
```python
import ccxt
exchange = ccxt.cryptocom({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import hashlib, hmac, json, time
import requests
API_KEY, SECRET = '...', '...'
def params_to_str(obj):
out = ''
for key in sorted(obj):
value = obj[key]
if isinstance(value, dict):
out += key + params_to_str(value)
elif isinstance(value, list):
out += key + ''.join(
params_to_str(v) if isinstance(v, dict) else str(v) for v in value)
else:
out += key + ('' if value is None else str(value))
return out
request = {
'id': 1,
'method': 'private/create-order',
'api_key': API_KEY,
'params': {
'instrument_name': 'BTC_USDT', 'side': 'BUY', 'type': 'LIMIT',
'price': '60000', 'quantity': '0.001', # numbers must be strings
},
'nonce': int(time.time() * 1000),
}
payload = (request['method'] + str(request['id']) + request['api_key']
+ params_to_str(request['params']) + str(request['nonce']))
request['sig'] = hmac.new(SECRET.encode(), payload.encode(),
hashlib.sha256).hexdigest()
r = requests.post('https://api.crypto.com/exchange/v1/private/create-order',
json=request)
print(r.json())
```
Crypto.com's signature is the most intricate in this batch. You sort the parameter keys in ascending order, concatenate them as `key` + `value` with no delimiter, then hash `method` + `id` + `api_key` + that parameter string + `nonce` with HMAC-SHA256 and hex-encode the result. Nested objects and arrays have to be flattened recursively by the same rule — Crypto.com's own reference sample uses recursive helpers for exactly this — and every number in the request must be sent as a quoted string, or the digest the server computes will not match yours.
CCXT implements that once, and switching the same order to a perpetual is a symbol change:
```python
order = exchange.create_order('BTC/USD:USD', 'limit', 'buy', 0.001, 60000)
```
### Stream an order book [#stream-an-order-book]
CCXT
Raw Crypto.com WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.cryptocom()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import json, asyncio, websockets
async def main():
url = 'wss://stream.crypto.com/exchange/v1/market'
async with websockets.connect(url) as ws:
await ws.send(json.dumps({
'method': 'subscribe',
'params': {'channels': ['book.BTC_USDT.50']},
'nonce': 1,
}))
async for frame in ws:
message = json.loads(frame)
if message.get('method') == 'public/heartbeat':
await ws.send(json.dumps({
'id': message['id'], 'method': 'public/respond-heartbeat',
}))
continue
print(message) # raw book update, not a merged book
asyncio.run(main())
```
The raw socket sends a `public/heartbeat` message that you must answer with `public/respond-heartbeat` or the connection is dropped — that is the `if` in the middle of the loop, and forgetting it is the classic first bug. Past that, the messages are book updates, not a book.
| | CCXT | raw stream |
| ------------------------------------------------------- | ------------ | ---------- |
| Answer `public/heartbeat` on time | done for you | your code |
| Merge updates into a full order book | done for you | your code |
| Detect gaps and re-seed from a fresh snapshot | done for you | your code |
| Reconnect, re-subscribe and keep bounded caches | done for you | your code |
| Authenticate the user stream and route private messages | done for you | your code |
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Crypto.com's limits are per endpoint and not uniform: `private/create-order`, `private/cancel-order` and `private/cancel-all-orders` allow 15 requests per 100ms each, `private/get-order-detail` allows 30 per 100ms, everything else allows 3 per 100ms — but `private/get-trades` and `private/get-order-history` allow **1 request per second**. On the socket, the User API accepts 150 requests per second and Market Data 100.
That last one is the trap: a backfill loop written against the general limit will be rejected on history endpoints. CCXT encodes per-endpoint weights in the exchange definition and ships a throttler that is on by default (`enableRateLimit = true`, `rateLimit = 10`ms). You call methods in a loop; the library paces them.
### Five product lines, one client [#five-product-lines-one-client]
Spot, margin, perpetual swaps, futures and options are all served by one `ccxt.cryptocom` instance. Unified symbols carry the distinction — `'BTC/USDT'` for spot, `'BTC/USD:USD'` for the USD-settled perpetual — and the method names do not change. Positions, funding rates, funding-rate history, settlement history, leverage and `closePosition` are unified methods, not per-product code paths.
### Order entry over the socket [#order-entry-over-the-socket]
CCXT Pro implements 12 `watch*` methods for Crypto.com — `watchOrderBook`, `watchOrderBookForSymbols`, `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchTrades`, `watchTradesForSymbols`, `watchOHLCV`, `watchOrders`, `watchMyTrades`, `watchBalance` and `watchPositions` — plus their `unWatch*` counterparts for tearing a subscription down without dropping the connection.
It also implements **order entry over the same socket**: `create_order_ws`, `edit_order_ws`, `cancel_order_ws` and `cancel_all_orders_ws`. Sending an order on the connection you are already streaming on avoids a second TCP and TLS handshake per request.
```python
exchange = ccxt.pro.cryptocom({'apiKey': '...', 'secret': '...'})
order = await exchange.create_order_ws('BTC/USDT', 'limit', 'buy', 0.001, 60000)
```
### Testnet without a second code path [#testnet-without-a-second-code-path]
Crypto.com runs a UAT environment on different hosts — `uat-api.3ona.co` for REST and `uat-stream.3ona.co` for both WebSocket endpoints. Written directly, that is a base-URL constant threaded through every module, plus a matching swap for the socket URLs.
```python
exchange = ccxt.cryptocom({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps in the UAT REST and WebSocket hosts
```
One flag, every URL.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Crypto.com's numeric `code` values onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`.
### Precision and string math [#precision-and-string-math]
CCXT loads Crypto.com's market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class. That matters more here than usual: the API requires numeric fields to be sent as strings, so float formatting is not cosmetic — the same value also feeds the signature.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 58 unified capabilities, **all 129 endpoints in CCXT's Crypto.com API block are generated as callable implicit methods**, with the full signature scheme, nonce handling, throttling and error mapping applied:
```python
response = exchange.v1PublicGetPublicGetTickers({'instrument_name': 'BTC_USDT'})
```
Browse them on the [Crypto.com implicit API page](/docs/exchanges/cryptocom/implicit-api).
## What the raw API and `cdcx-cli` do better [#what-the-raw-api-and-cdcx-cli-do-better]
Honest advantages:
* **`cdcx-cli` is a different kind of tool, and a good one.** A single \~11MB Rust binary with no runtime dependencies, a full-screen TUI dashboard, a paper-trading engine that needs no credentials, and an MCP server so an AI agent can drive the exchange with safety tiers. CCXT is a library; none of that is in scope for it.
* **It is generated from the OpenAPI specification.** `cdcx-cli` exposes 95 REST endpoints derived directly from Crypto.com's spec, so its surface tracks the published contract mechanically rather than through hand-written wrappers.
* **Field-for-field fidelity with the docs, and new endpoints on day one.** Calling `public/get-tickers` directly means what the reference says is what you get, and a newly shipped endpoint is callable by URL immediately — a *unified* CCXT method for it may follow later. CCXT's unified names are a deliberate abstraction, which is one extra hop when debugging against vendor documentation.
* **A focused community Python library exists.** [`cryptocom-exchange`](https://github.com/goincrypto/cryptocom-exchange) is an MIT, async-native Python client for the v1 API built on httpx and websockets. If you want one venue, in Python, with a small dependency, it is a real option.
If Crypto.com is your only venue, or you want a terminal dashboard and an MCP endpoint rather than a library, the raw API and `cdcx-cli` are the better fit.
## Migrating from the raw Crypto.com API to CCXT [#migrating-from-the-raw-cryptocom-api-to-ccxt]
| What you are doing | Raw Crypto.com API | CCXT |
| ----------------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| Symbols | `'BTC_USDT'`, `'BTCUSD-PERP'` | `'BTC/USDT'`, `'BTC/USD:USD'` |
| Instruments | `public/get-instruments` | `load_markets()` |
| Ticker / book / candles | `public/get-tickers`, `public/get-book`, `public/get-candlestick` | `fetch_ticker()`, `fetch_order_book()`, `fetch_ohlcv()` |
| New order | `private/create-order` | `create_order()` |
| Cancel / amend order | `private/cancel-order`, `private/amend-order` | `cancel_order()`, `edit_order()` |
| Open orders | `private/get-open-orders` | `fetch_open_orders()` |
| Balance / positions | `private/user-balance`, `private/get-positions` | `fetch_balance()`, `fetch_positions()` |
| Streams | `wss://stream.crypto.com/exchange/v1/market` and `/user` | `watch_*` on `ccxt.pro.cryptocom` |
| Sandbox | `uat-api.3ona.co` + `uat-stream.3ona.co` | `set_sandbox_mode(True)` |
| Anything not listed | the endpoint URL | the same endpoint as an [implicit method](/docs/exchanges/cryptocom/implicit-api) |
## FAQ [#faq]
**Does Crypto.com Exchange have an official Python SDK?**
No. The `crypto-com/crypto-exchange` repository was archived in 2021 and now only links to the documentation, and the API reference lists no client library — it gives reference code samples in JavaScript, Python, C# and Java. Crypto.com's own current tool is `cdcx-cli`, a Rust CLI, MCP server and TUI. For a Python, PHP, Go, C# or Java *library*, CCXT is the maintained option, alongside the community `cryptocom-exchange` package.
**Does CCXT support Crypto.com derivatives?**
Yes. Spot, margin, perpetual swaps, futures and options are served by one `ccxt.cryptocom` instance, across 58 unified capabilities including positions, funding rates, settlement history and `closePosition`.
**Can I use the Crypto.com sandbox through CCXT?**
Yes. `exchange.set_sandbox_mode(True)` swaps in the UAT hosts — `uat-api.3ona.co` for REST and `uat-stream.3ona.co` for the market and user WebSocket endpoints — with no other change to your code.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.cryptocom` and call `watch*` methods — 12 of them here — plus `create_order_ws`, `edit_order_ws`, `cancel_order_ws` and `cancel_all_orders_ws` for order entry over the same socket.
**Why do my hand-signed Crypto.com requests fail authentication?**
Usually one of three rules: parameter keys must be sorted ascending and concatenated as `key` + `value` with no separator, nested objects and arrays must be flattened by the same rule recursively, and every numeric field must be sent as a quoted string. The signed payload is `method` + `id` + `api_key` + parameter string + `nonce`, hashed with HMAC-SHA256 and hex-encoded. CCXT implements all of it — and applies it to all 129 endpoints exposed as [implicit methods](/docs/exchanges/cryptocom/implicit-api).
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [cryptocom unified API reference](/docs/exchanges/cryptocom)
* [cryptocom implicit API](/docs/exchanges/cryptocom/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs Cryptofeed (/docs/comparisons/ccxt-vs-cryptofeed)
[Cryptofeed](https://github.com/bmoscon/cryptofeed) and [CCXT](/docs/manual) overlap in one place: both connect to many exchanges and hand you normalised market data instead of raw venue payloads. Past that they are built for different jobs, and the honest answer is that plenty of teams run both.
## TL;DR [#tldr]
* **Cryptofeed** is a Python **market-data feed handler**: subscribe to channels across venues and pipe normalised messages into Redis, Kafka, Postgres, InfluxDB or QuestDB. It is very good at that specific shape of work.
* **CCXT** is a **unified trading API**: market data *and* order entry, account management, funding, positions and transfers, across 104 venues, in eight languages, under MIT.
* **If you need to place orders, CCXT is the one that does it.** If you need a tick recorder that writes to a time-series database out of the box, Cryptofeed gets you there with less code.
* **Licensing is the decision-maker for many teams**: Cryptofeed is AGPL-3.0, CCXT is MIT.
## At a glance [#at-a-glance]
| | **CCXT** | **Cryptofeed** |
| ------------------------------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------- |
| Primary purpose | unified trading + market data API | market-data feed handler |
| Exchanges | 104 REST, 76 with WebSocket | roughly two dozen venues |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust | Python only (3.12+) |
| Place / cancel / edit orders | yes — unified across every venue | not a unified, supported capability |
| Balances, positions, funding, transfers, deposits | yes | no |
| Historical REST queries (OHLCV, trades, orders) | yes, unified | limited |
| Real-time streaming | yes — `watch*` methods | yes — the core feature |
| Storage backends included | none — you write the sink | Redis, Kafka, Postgres, InfluxDB, MongoDB, QuestDB, ZeroMQ, TCP/UDP/Unix sockets |
| Programming model | `await` a method, get a value back | register async callbacks with a `FeedHandler` |
| Raw exchange endpoints | yes — implicit methods for every endpoint | no |
| Licence | **MIT** | **AGPL-3.0** |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** | 2.9k GitHub stars · 34k PyPI installs/month |
| Support channels | Discord, Telegram, GitHub — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78 and Cryptofeed's repository, with install counts from npm and PyPI.
## Two different programming models [#two-different-programming-models]
This is the real difference, and it is worth seeing before the feature tables.
CCXT
Cryptofeed
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.binance()
while True:
trades = await exchange.watch_trades('BTC/USDT')
for t in trades:
print(t['symbol'], t['side'], t['amount'], t['price'])
asyncio.run(main())
```
```python
from cryptofeed import FeedHandler
from cryptofeed.defines import TRADES
from cryptofeed.exchanges import Binance
async def trade(t, receipt_timestamp):
print(t.exchange, t.symbol, t.side, t.amount, t.price)
fh = FeedHandler()
fh.add_feed(Binance(symbols=['BTC-USDT'], channels=[TRADES],
callbacks={TRADES: trade}))
fh.run()
```
CCXT is **pull-shaped**: you `await` a method and get a value, so streaming code reads like the REST code next to it and composes with ordinary control flow. Cryptofeed is **push-shaped**: you declare feeds and callbacks and hand control to a `FeedHandler` that runs the loop.
Neither is better in the abstract. Push suits a long-lived recorder fanning many venues into storage. Pull suits a strategy that reads a book, decides, and sends an order — because the deciding and the sending are in the same function.
## Where CCXT is the right tool [#where-ccxt-is-the-right-tool]
### It trades [#it-trades]
Cryptofeed's job ends at delivering normalised data. A few of its exchange classes expose some REST calls, but there is no unified, tested order-entry API across venues — placing orders is not what the project is for.
CCXT implements order entry as a first-class unified API on every supported exchange, including the parts that are easy to underestimate:
```python
exchange = ccxt.binance({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
open_ = exchange.fetch_open_orders('BTC/USDT')
exchange.cancel_order(order['id'], 'BTC/USDT')
balance = exchange.fetch_balance()
trades = exchange.fetch_my_trades('BTC/USDT')
```
Plus trigger, stop-loss, take-profit, trailing, post-only and reduce-only orders, leverage and margin mode, positions, funding rates, transfers and deposit addresses — all unified, all with the same names on the next exchange. If your system decides *and acts*, this is the difference between one dependency and two.
### The licence [#the-licence]
Cryptofeed is **AGPL-3.0**. The network clause means that if you run modified Cryptofeed as part of a service users interact with over a network, you may be obliged to offer them your corresponding source. For a lot of proprietary trading and SaaS work that is disqualifying, and it is usually a legal review rather than an engineering decision.
CCXT is **MIT** — use it, modify it, ship it closed-source, no reciprocity.
### Coverage [#coverage]
104 exchanges versus roughly two dozen, and CCXT's WebSocket support spans 76 of them. For long-tail venues, regional exchanges, perpetuals-first DEXes and prediction markets, CCXT is frequently the only maintained normalised implementation.
### Eight languages [#eight-languages]
Cryptofeed is Python-only. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with identical method names and return structures. Research in Python, execute in Go or C#, without a second data model.
### REST and WebSocket in one API [#rest-and-websocket-in-one-api]
CCXT gives you `fetch_order_book` and `watch_order_book` returning the same [structure](/docs/manual#order-book-structure). Backfill history with `fetch_ohlcv`, then stream live with `watch_ohlcv`, and the downstream code does not know which produced the candle. Cryptofeed is websocket-first with REST as a fallback where a socket is not offered; historical querying is not its focus.
### The raw endpoint escape hatch [#the-raw-endpoint-escape-hatch]
Every endpoint in every exchange's API is generated as a callable [implicit method](/docs/exchanges/binance/implicit-api) — 792 for Binance alone — with signing, rate limiting and error mapping applied. Normalisation never becomes a ceiling.
## Where Cryptofeed is the right tool [#where-cryptofeed-is-the-right-tool]
Genuinely, and these are not small:
* **Storage backends are built in.** Redis, Kafka, Postgres, InfluxDB, MongoDB, QuestDB, ZeroMQ and raw sockets ship as configurable sinks. Standing up a tick recorder is a few lines. CCXT deliberately has no persistence layer — you write the sink yourself.
* **The feed-handler model scales to many feeds cleanly.** Running dozens of venue/channel subscriptions in one process, with backpressure and per-message receipt timestamps, is exactly what it was designed for.
* **Receipt timestamps on every message.** Cryptofeed passes the time it received each message alongside the exchange timestamp, which makes venue latency measurable without extra plumbing.
* **Data-capture-specific channels.** Some research-oriented channel types and book-delta handling are more directly exposed than in a general-purpose trading library.
If you are building a pure market-data recorder in Python, do not need to trade, and AGPL is acceptable, Cryptofeed will get you there faster.
## Using both [#using-both]
They compose well, and it is a common setup:
* **Cryptofeed for capture** — long-running collectors writing normalised ticks into Kafka or QuestDB for research and backtesting.
* **CCXT for execution** — the live strategy reading books and sending orders, in whichever language the trading service is written in.
The overlap is small enough that running both costs little, and each does the thing it is best at.
## FAQ [#faq]
**Can Cryptofeed place orders?**
Not as a unified, supported capability. A few exchange classes expose REST calls, but order entry across venues is not what the project provides. CCXT does.
**Does CCXT stream as many messages per second?**
For normal strategy and dashboard workloads, both are comfortably fast enough and the bottleneck is your consumer. For very high-volume multi-venue capture, Cryptofeed's push model and built-in sinks are purpose-built for exactly that pipeline.
**Is CCXT's WebSocket support a paid add-on?**
No. CCXT Pro is bundled in the `ccxt` package under MIT. Use `ccxt.pro.` and the `watch*` methods.
**Which has more exchanges?**
CCXT — 104 with REST, 76 of them with WebSocket, versus roughly two dozen in Cryptofeed.
**Can I use Cryptofeed in a closed-source commercial product?**
That is an AGPL-3.0 question for your lawyers, and the network clause is the part to read carefully. CCXT's MIT licence does not raise the question at all.
## Next steps [#next-steps]
* [Install CCXT](/docs/install)
* [Manual](/docs/manual) — unified structures and conventions
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [Supported exchanges](/docs/exchange-markets)
* [More comparisons](/docs/comparisons)
# CCXT vs the Cryptomus API (/docs/comparisons/ccxt-vs-cryptomus-api)
[Cryptomus](https://cryptomus.com) is primarily a crypto payment platform. Its [documentation](https://doc.cryptomus.com/) covers merchant payments and invoices, static wallets, payouts and personal wallets — and, alongside those, a spot exchange with market data, order placement and WebSocket streams.
That split matters, because the official SDK follows the payments half. [`CryptomusCom/api-php-sdk`](https://github.com/CryptomusCom/api-php-sdk) — `cryptomus/api-php-sdk` on Packagist, MIT, version 1.0.0 released in July 2022, around 265,000 total and 10,900 monthly installs — exposes payments, payouts, balances and wallet management. It contains no order-placement methods at all.
So if you want to *trade* on Cryptomus, there is no official client library, and the question is whether you write one or use [CCXT](/docs/manual).
## TL;DR [#tldr]
* **Use the official PHP SDK** if your job is accepting crypto payments, issuing invoices or sending payouts. That is what it does, that is what Cryptomus is mostly for, and CCXT does not cover any of it.
* **Pick CCXT** if your job is spot trading on the Cryptomus exchange — order placement, balances, order books and trades — behind the same API you use on 103 other venues.
* **Know the limits up front.** CCXT's Cryptomus class is small: 13 unified capabilities, 16 raw endpoints, and **no WebSocket support** even though Cryptomus documents one.
## At a glance [#at-a-glance]
| | **CCXT** | **Cryptomus's own tooling** |
| --------------------------------- | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| What it covers | the spot exchange: markets, order book, trades, orders, balance | payments, invoices, static wallets, payouts, personal wallets — plus a documented exchange API |
| Official library | `ccxt`, installable in eight languages | `cryptomus/api-php-sdk` (PHP), payments and payouts only |
| Exchanges covered | 104 (Cryptomus is one of them) | Cryptomus only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | PHP for the SDK; any language against the raw API |
| Unified market data + trading API | yes — 13 unified capabilities, 10 `fetch*` methods | Cryptomus's own request/response shapes |
| Raw endpoint access | yes — 16 endpoints as implicit methods, including the payment and payout service listings | it is the whole product |
| WebSockets | **no** — CCXT implements no `watch*` methods for this venue | yes — token-authenticated socket with 7 stream types |
| Built-in rate limiter | yes, on by default (`rateLimit` 100ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus Cryptomus error payloads |
| Testnet / sandbox | not available for Cryptomus | none documented |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `cryptomus/api-php-sdk`: 8 GitHub stars · \~10.9k Packagist installs/month |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | Cryptomus documentation and support |
Figures verified September 2026 against CCXT v4.5.78, the Cryptomus API documentation, the `CryptomusCom/api-php-sdk` repository and Packagist install counts.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch market prices [#fetch-market-prices]
CCXT
Raw Cryptomus API
```python
import ccxt
exchange = ccxt.cryptomus()
tickers = exchange.fetch_tickers()
print(tickers['BTC/USDT']['last'])
```
```python
import requests
r = requests.get('https://api.cryptomus.com/v1/exchange/market/tickers')
print(r.json())
```
Note the CCXT call: this venue has `fetchTickers` but not `fetchTicker`, so you fetch the set and index it. That is the unified API reporting what the venue actually offers rather than papering over it — `exchange.has['fetchTicker']` is falsy, and calling it raises `NotSupported` instead of failing quietly.
### Place a limit order [#place-a-limit-order]
CCXT
Raw Cryptomus API
```python
import ccxt
exchange = ccxt.cryptomus({'uid': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import base64, hashlib, json
import requests
USER_ID, API_KEY = '...', '...'
body = json.dumps({
'market': 'BTC_USDT', 'direction': 'buy',
'quantity': '0.001', 'price': '60000',
})
sign = hashlib.md5(
(base64.b64encode(body.encode()).decode() + API_KEY).encode()).hexdigest()
r = requests.post('https://api.cryptomus.com/v2/user-api/exchange/orders',
data=body, headers={
'Content-Type': 'application/json',
'userId': USER_ID,
'sign': sign,
})
print(r.json())
```
Cryptomus signs by base64-encoding the JSON body, appending the API key, and MD5-hashing the result into a `sign` header alongside `userId`. It is short, but it is also unlike every other venue's scheme — which is the point: in CCXT it is `create_order(...)` here and `create_order(...)` on Binance, and the signer is somebody else's problem.
## Where the differences actually bite [#where-the-differences-actually-bite]
### The exchange is one half of a payments product [#the-exchange-is-one-half-of-a-payments-product]
Cryptomus's documented API spans merchant payments, invoices, static wallets, payouts, personal wallets *and* the exchange. CCXT models the exchange half — markets, currencies, order book, trades, orders, balance and trading fees. It does not model payments or payouts as unified methods, and it never will: those are not part of a trading API.
What CCXT does give you is reach. Its Cryptomus API block includes the payment-services, payout-services and transaction-list endpoints, so they are callable as implicit methods with signing applied even though no unified wrapper exists:
```python
services = exchange.privateGetV2UserApiPaymentServices()
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Cryptomus's error responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded`, `NetworkError` and 35 more, all descending from `BaseError`. The `except` clauses you write here are the ones you already wrote for every other exchange.
### Precision and string math [#precision-and-string-math]
CCXT loads Cryptomus market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities do not drift through float rounding before they reach the signature:
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### Portability is the whole point [#portability-is-the-whole-point]
Cryptomus is unlikely to be the only venue in a trading system. Every venue-specific detail — MD5 over a base64 body, a `userId` header, `BTC_USDT` market ids, an order book addressed by currency pair in the path — becomes a special case in code that also talks elsewhere. In CCXT the venue is a variable:
```python
for exchange_id in ['cryptomus', 'binance', 'kucoin', 'gate']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_tickers()['BTC/USDT']['last'])
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
CCXT implements 13 unified capabilities for Cryptomus, and **all 16 endpoints in its API block are generated as callable implicit methods**, with the `userId`/`sign` scheme and throttling applied:
```python
book = exchange.publicGetV1ExchangeMarketOrderBookCurrencyPair({
'currencyPair': 'BTC_USDT',
})
```
Browse them on the [Cryptomus implicit API page](/docs/exchanges/cryptomus/implicit-api).
## What Cryptomus's own API and SDK do better [#what-cryptomuss-own-api-and-sdk-do-better]
Honest, and here the concessions are large:
* **Payments and payouts are the product, and CCXT does not touch them.** Invoices, static wallets, payment status callbacks, merchant payouts and personal wallet transfers all live in the official PHP SDK and the raw API. If that is your integration, CCXT is the wrong tool entirely.
* **The WebSocket is real, and CCXT has none for this venue.** Cryptomus documents a token-authenticated socket at `wss://api-ws.cryptomus.com/ws` carrying last price, depth, ticker, trades, orders, balances and deals — public *and* private streams. You fetch a one-time token that is valid for five minutes or until first connection, then ping every 50 seconds because the server closes idle connections after 60. CCXT implements zero `watch*` methods for Cryptomus, so live streaming means the raw socket.
* **The unified surface here is the smallest in this batch.** 13 capabilities and 16 endpoints, with no `fetchTicker` (only `fetchTickers`), no `fetchOHLCV`, and no unified deposit or withdrawal methods. Candles and transfer history mean calling the API directly.
* **The PHP SDK is genuinely widely used.** Around 265,000 total Packagist installs for a venue-specific package is real adoption, and it is maintained by Cryptomus itself.
If you are integrating Cryptomus as a payment processor, or you need its live streams, its own tooling is the right answer — and nothing stops you from using the PHP SDK for payments and CCXT for the trading side of the same account.
## Migrating from the raw Cryptomus exchange API to CCXT [#migrating-from-the-raw-cryptomus-exchange-api-to-ccxt]
| What you are doing | Raw Cryptomus API | CCXT |
| -------------------- | --------------------------------------------------- | --------------------------------------- |
| Credentials | `userId` header + API key in the signature | `uid` and `secret` |
| Symbols | `'BTC_USDT'` | `'BTC/USDT'` |
| Markets | `GET /v2/user-api/exchange/markets` | `load_markets()` |
| Assets | `GET /v1/exchange/market/assets` | `fetch_currencies()` |
| Prices | `GET /v1/exchange/market/tickers` | `fetch_tickers()` |
| Order book | `GET /v1/exchange/market/order-book/{currencyPair}` | `fetch_order_book()` |
| Recent trades | `GET /v1/exchange/market/trades/{currencyPair}` | `fetch_trades()` |
| Limit order | `POST /v2/user-api/exchange/orders` | `create_order()` |
| Market order | `POST /v2/user-api/exchange/orders/market` | `create_order()` with type `'market'` |
| Cancel order | `DELETE /v2/user-api/exchange/orders/{orderId}` | `cancel_order()` |
| Active orders | `GET /v2/user-api/exchange/orders` | `fetch_open_orders()` |
| Order history | `GET /v2/user-api/exchange/orders/history` | `fetch_canceled_and_closed_orders()` |
| Balance | `GET /v2/user-api/exchange/account/balance` | `fetch_balance()` |
| Trading fees | `GET /v2/user-api/exchange/account/tariffs` | `fetch_trading_fees()` |
| Streams | `wss://api-ws.cryptomus.com/ws?token=...` | not available in CCXT for this venue |
| Payments and payouts | payment and payout endpoints | out of scope — use the official PHP SDK |
## FAQ [#faq]
**Does Cryptomus have an official trading SDK?**
No. Cryptomus's official SDK is [`cryptomus/api-php-sdk`](https://github.com/CryptomusCom/api-php-sdk), and it covers merchant payments and payouts — creating payments and payouts, checking status, retrieving balances, managing wallets. It has no order-placement methods. For the exchange side, CCXT is the maintained client.
**Does CCXT support Cryptomus over WebSocket?**
No. CCXT implements zero `watch*` methods for `cryptomus`. Cryptomus itself documents a WebSocket at `wss://api-ws.cryptomus.com/ws` with public and private streams, authenticated by a single-use token that is valid for five minutes or until first connection, and requiring a ping roughly every 50 seconds. If you need those streams, use the socket directly.
**Can I use CCXT for Cryptomus payments or invoices?**
No. CCXT is a trading API — markets, orders, balances, transfers between exchange accounts. Merchant payments, invoices and payouts are a different product and are not modelled by any unified CCXT method. The payment-service and payout-service listing endpoints are reachable as implicit methods, but nothing more.
**Why does the CCXT Cryptomus constructor take `uid` instead of `apiKey`?**
Because Cryptomus identifies the account with a user id sent in the `userId` header and uses the API key only inside the signature. CCXT's class declares `uid` and `secret` as its required credentials to match.
**Why is there no `fetch_ticker` for Cryptomus?**
The venue exposes a tickers endpoint rather than a single-symbol one, so CCXT implements `fetchTickers` and leaves `fetchTicker` off. Check `exchange.has['fetchTicker']` at runtime — CCXT's `has` map reports what each venue actually supports rather than pretending.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [cryptomus unified API reference](/docs/exchanges/cryptomus)
* [cryptomus implicit API](/docs/exchanges/cryptomus/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the DeepCoin API (/docs/comparisons/ccxt-vs-deepcoin-api)
[DeepCoin](https://www.deepcoin.com/) is a Singapore-registered venue running spot, margin and perpetual swap markets, documented at [deepcoin.com/docs](https://www.deepcoin.com/docs/authentication). Its GitHub organisation publishes two repositories — [`openapi_python_example`](https://github.com/Deepcoin-exchange/openapi_python_example) and `openapi_golang_example` — and both are exactly what the names say: example scripts showing how to sign a request and open a socket, not installable packages.
There is one maintained third-party library, [`DeepCoin.Net`](https://github.com/JKorf/DeepCoin.Net) by JKorf: a strongly-typed C#/.NET client on NuGet covering REST and WebSocket for spot and futures, MIT-licensed, most recently released as v4.4.0 in August 2026.
Everywhere else, the comparison is **CCXT against your own client**.
## TL;DR [#tldr]
* **Write against the raw API** if you need DeepCoin's stream-resume feature, copy-trading endpoints or step-margin data, and you are happy owning the signer and the socket.
* **Use `DeepCoin.Net`** if you are on .NET only and want models shaped exactly like DeepCoin's payloads.
* **Pick CCXT** if you want spot, margin and swaps behind one client in eight languages, with signing, per-endpoint rate limits, order-book maintenance and reconnects handled — and the same API on 103 other venues.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw DeepCoin API** | **DeepCoin.Net** |
| ------------------------- | ------------------------------------------------------------ | -------------------------------------------------------- | ----------------------------- |
| Maintainer | CCXT | DeepCoin (docs and examples) | JKorf (third party) |
| Exchanges covered | 104 | DeepCoin only | DeepCoin only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust | any; examples in Python, Go, Java | C#/.NET |
| Installable package | yes — `ccxt` | no — example scripts only | yes — `DeepCoin.Net` on NuGet |
| Unified API across venues | yes — 64 unified capabilities, 28 `fetch*` methods | no | no |
| Products | spot, margin, swap | spot, margin, swap | spot, futures |
| WebSockets | yes — 11 `watch*` and `unWatch*` methods | yes — separate spot and swap URLs, plus a private stream | yes, with auto-reconnect |
| Raw endpoint access | yes — 53 endpoints as implicit methods | it is the whole product | the library's own surface |
| Built-in rate limiter | yes, on by default (`rateLimit` 200ms) | your code | yes, client-side |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus DeepCoin codes | .NET result types |
| Testnet / sandbox | not available for DeepCoin | none documented | none documented |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month | `openapi_python_example` 3 stars | 8 GitHub stars |
| Licence | MIT | n/a | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | docs site, Telegram API group | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the DeepCoin API documentation, the `Deepcoin-exchange` GitHub organisation and the `JKorf/DeepCoin.Net` repository.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw DeepCoin API
DeepCoin.Net
```python
import ccxt
exchange = ccxt.deepcoin()
tickers = exchange.fetch_tickers(['BTC/USDT'])
print(tickers['BTC/USDT']['last'])
```
```python
import requests
r = requests.get('https://api.deepcoin.com/deepcoin/market/tickers',
params={'instType': 'SPOT'})
print(r.json()['data'][0])
```
```csharp
var restClient = new DeepCoinRestClient();
var tickerResult = await restClient.ExchangeApi.ExchangeData
.GetTickersAsync(SymbolType.Spot);
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) keyed by portable symbols. DeepCoin's own payload uses abbreviated field names — `bidPx`, `bidSz`, `askPx`, `askSz` — that you parse yourself, or that `DeepCoin.Net` maps into .NET models shaped for this venue.
### Place a limit order [#place-a-limit-order]
CCXT
Raw DeepCoin API
```python
import ccxt
exchange = ccxt.deepcoin({
'apiKey': '...', 'secret': '...', 'password': '...', # passphrase
})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import base64, hashlib, hmac, json
from datetime import datetime, timezone
import requests
KEY, SECRET, PASSPHRASE = '...', '...', '...'
path = '/deepcoin/trade/order'
body = json.dumps({
'instId': 'BTC-USDT', 'tdMode': 'cross', 'side': 'buy',
'ordType': 'limit', 'sz': '0.001', 'px': '60000',
})
timestamp = datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.') \
+ f'{datetime.now(timezone.utc).microsecond // 1000:03d}Z'
prehash = timestamp + 'POST' + path + body
sign = base64.b64encode(
hmac.new(SECRET.encode(), prehash.encode(), hashlib.sha256).digest()).decode()
r = requests.post('https://api.deepcoin.com' + path, data=body, headers={
'Content-Type': 'application/json',
'DC-ACCESS-KEY': KEY,
'DC-ACCESS-SIGN': sign,
'DC-ACCESS-TIMESTAMP': timestamp,
'DC-ACCESS-PASSPHRASE': PASSPHRASE,
})
print(r.json())
```
DeepCoin needs three credentials, not two: an API key, a secret and a passphrase. The signature is HMAC-SHA256 over `timestamp + method + requestPath + body`, base64-encoded, and the timestamp must be an ISO-8601 UTC string with milliseconds — not a Unix epoch. Query parameters count as part of `requestPath` on GET requests, so the string you sign has to be assembled after the query string, not before. CCXT declares all three credentials in `requiredCredentials` and implements the signer once.
### Stream an order book [#stream-an-order-book]
CCXT
Raw DeepCoin WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.deepcoin()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT:USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import json, asyncio, websockets
async def main():
url = 'wss://stream.deepcoin.com/streamlet/trade/public/swap?platform=api'
async with websockets.connect(url) as ws:
await ws.send(json.dumps({
'sendTopicAction': {
'Action': '1', # 1 = subscribe
'FilterValue': 'DeepCoin_BTCUSDT',
'LocalNo': 1,
'ResumeNo': -1, # -1 = latest position
'TopicID': '2',
},
}))
async for frame in ws:
print(json.loads(frame)) # you also owe a ping every <20 seconds
asyncio.run(main())
```
DeepCoin's socket has its own vocabulary — `Action`, `FilterValue`, `LocalNo`, `ResumeNo`, `TopicID` — and spot and swap live on **different URLs** (`.../public/spot` and `.../public/swap`), so a client watching both maintains two connections. The server disconnects after 20 seconds without a ping, and one IP is limited to 10 concurrent connections.
| | CCXT | raw stream |
| ----------------------------------------------------- | -------------- | ---------- |
| Pick the right spot or swap URL per symbol | done for you | your code |
| Keep the 20-second ping alive | done for you | your code |
| Merge updates into a full order book | done for you | your code |
| Reconnect and re-subscribe after a drop | done for you | your code |
| Acquire and extend the listen key for private streams | done for you | your code |
| Stay under 10 connections per IP | pooled per URL | your code |
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
DeepCoin meters public endpoints by IP and private and trading endpoints by UID, with limits that differ sharply per endpoint: most trading endpoints allow 15 requests per second and 450 per minute, batch operations allow 5 per second and 150 per minute (with a maximum of five orders per batch request), candle data allows 50 per second and 600 per minute, most other market endpoints allow 10 per second and 600 per minute — and the step-margin endpoint allows **1 request per second**. Different HTTP methods on the same endpoint share one rule, so you cannot get more headroom by switching verbs.
CCXT encodes per-endpoint weights and ships a throttler that is on by default (`enableRateLimit = true`, `rateLimit = 200`ms). You call methods in a loop; the library paces them.
### Derivatives as unified methods [#derivatives-as-unified-methods]
CCXT implements 64 unified capabilities for DeepCoin, and the derivatives-specific ones are the reason to care: `fetchPositions`, `fetchPosition`, `fetchPositionsForSymbol`, `fetchPositionsHistory`, `closePosition`, `setLeverage`, `fetchFundingRate`, `fetchFundingRates`, `fetchFundingRateHistory`, `fetchMarkOHLCV`, `fetchIndexOHLCV`, plus `createTriggerOrder`, `createReduceOnlyOrder`, `createPostOnlyOrder` and `createOrderWithTakeProfitAndStopLoss`. Those are the same method names on Bybit, OKX and Binance — so a position-management module written once runs against all of them.
Unified symbols carry the product: `'BTC/USDT'` for spot, `'BTC/USDT:USDT'` for the linear perpetual.
### One error hierarchy [#one-error-hierarchy]
CCXT maps DeepCoin's error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`.
### Precision and string math [#precision-and-string-math]
CCXT loads DeepCoin's instrument metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so contract sizes and prices do not drift through float rounding:
```python
amount = exchange.amount_to_precision('BTC/USDT:USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT:USDT', 61234.56789)
```
### Eight languages, one API [#eight-languages-one-api]
`DeepCoin.Net` covers .NET; DeepCoin's own examples cover Python, Go and Java as sample code. CCXT is written once in TypeScript and transpiled to eight languages with identical method names and return structures, so a strategy prototyped in Python ports to a Go or C# execution service without a second data model.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 64 unified capabilities, **all 53 endpoints in CCXT's DeepCoin API block are generated as callable implicit methods** — including the copy-trading, agent-rebate, internal-transfer and step-margin endpoints that have no unified equivalent:
```python
response = exchange.publicGetDeepcoinMarketStepMargin({'instId': 'BTC-USDT'})
```
Browse them on the [DeepCoin implicit API page](/docs/exchanges/deepcoin/implicit-api).
## What DeepCoin's own API and DeepCoin.Net do better [#what-deepcoins-own-api-and-deepcoinnet-do-better]
Honest advantages:
* **The socket can resume from a position.** DeepCoin's subscribe message carries `ResumeNo`, which lets you reconnect and replay from a specific server-side point rather than from the latest message. CCXT's unified `watch*` API does not expose that — it re-seeds instead. For a recorder that must not drop a message, calling the socket directly is the way to use it.
* **`DeepCoin.Net` is a real, actively released .NET library.** MIT, on NuGet, latest release v4.4.0 in August 2026, with strongly-typed models, client-side rate limiting, an order-book implementation and automatic WebSocket reconnection. If your stack is .NET only, it is a legitimate alternative to CCXT's C# build.
* **Official examples cover the signing recipe in three languages.** DeepCoin's docs give reference code in Python, Go and Java, and the `Deepcoin-exchange` organisation publishes runnable Python and Go examples. That is a fast path if you are porting the signer into a runtime CCXT does not target.
* **Copy trading and agent rebates have no unified equivalent.** DeepCoin exposes leader positions, follower ranks, estimated profit, rebate configuration and agent user lists. CCXT can call them as implicit methods, but there is no parsed unified structure behind them.
* **Field-for-field fidelity with the docs.** Reading the DeepCoin reference and calling the endpoint directly means what the docs say is what you get back; CCXT's unified names are one hop away from that.
If DeepCoin is your only venue, you are on .NET, or you need stream resume or the copy-trading endpoints, going direct or using `DeepCoin.Net` is a reasonable choice.
## Migrating from the raw DeepCoin API to CCXT [#migrating-from-the-raw-deepcoin-api-to-ccxt]
| What you are doing | Raw DeepCoin API | CCXT |
| -------------------- | -------------------------------------------------- | -------------------------------------------------------------------------------- |
| Credentials | `DC-ACCESS-KEY`, secret, `DC-ACCESS-PASSPHRASE` | `apiKey`, `secret`, `password` |
| Symbols | `'BTC-USDT'` with `instType` | `'BTC/USDT'`, `'BTC/USDT:USDT'` |
| Instruments | `GET /deepcoin/market/instruments` | `load_markets()` |
| Tickers | `GET /deepcoin/market/tickers` | `fetch_tickers()` |
| Order book | `GET /deepcoin/market/books` | `fetch_order_book()` |
| Candles | `GET /deepcoin/market/candles` | `fetch_ohlcv()` |
| Mark / index candles | `mark-price-candles`, `index-candles` | `fetch_mark_ohlcv()`, `fetch_index_ohlcv()` |
| New order | `POST /deepcoin/trade/order` | `create_order()` |
| Amend order | `POST /deepcoin/trade/replace-order` | `edit_order()` |
| Cancel order | `POST /deepcoin/trade/cancel-order` | `cancel_order()` |
| Batch cancel | `POST /deepcoin/trade/batch-cancel-order` | `cancel_orders()` |
| Open orders | `GET /deepcoin/trade/v2/orders-pending` | `fetch_open_orders()` |
| Fills | `GET /deepcoin/trade/fills` | `fetch_my_trades()` |
| Balance | `GET /deepcoin/account/balances` | `fetch_balance()` |
| Positions | `GET /deepcoin/account/positions` | `fetch_positions()` |
| Leverage | `POST /deepcoin/account/set-leverage` | `set_leverage()` |
| Funding rate | `GET /deepcoin/trade/funding-rate` | `fetch_funding_rate()` |
| Streams | spot and swap socket URLs, plus the private stream | `watch_*` on `ccxt.pro.deepcoin` |
| Anything not listed | the endpoint URL | the same endpoint as an [implicit method](/docs/exchanges/deepcoin/implicit-api) |
## FAQ [#faq]
**Does DeepCoin have an official SDK?**
Not an installable one. The `Deepcoin-exchange` GitHub organisation publishes `openapi_python_example` and `openapi_golang_example` — runnable example scripts — and the documentation gives reference code in Python, Go and Java. The only maintained third-party library is [`DeepCoin.Net`](https://github.com/JKorf/DeepCoin.Net) for C#/.NET. CCXT is the option that covers the other six languages.
**Does CCXT support DeepCoin swaps and positions?**
Yes. Spot, margin and perpetual swaps are served by one `ccxt.deepcoin` instance, with unified `fetchPositions`, `closePosition`, `setLeverage`, funding-rate methods and trigger, reduce-only and take-profit/stop-loss order types among its 64 capabilities.
**Does CCXT stream DeepCoin over WebSocket?**
Yes — 11 `watch*` and `unWatch*` methods, covering the order book, ticker, trades, candles, orders, my trades and positions. CCXT picks the right spot or swap socket URL per symbol, keeps the 20-second ping alive, and handles the listen-key acquisition and extension needed for private streams.
**How does DeepCoin authenticate requests?**
With four headers: `DC-ACCESS-KEY`, `DC-ACCESS-SIGN`, `DC-ACCESS-TIMESTAMP` and `DC-ACCESS-PASSPHRASE`. The signature is a base64-encoded HMAC-SHA256 of `timestamp + method + requestPath + body`, and the timestamp is an ISO-8601 UTC string with milliseconds. Query parameters are part of `requestPath`. CCXT's `deepcoin` class requires `apiKey`, `secret` and `password` and implements this signer.
**Is there a DeepCoin testnet I can use with `setSandboxMode`?**
No. CCXT's DeepCoin class declares no sandbox because DeepCoin does not publish testnet base URLs.
**Can I still call DeepCoin-specific endpoints through CCXT?**
Yes — all 53 endpoints in the class's API block, including copy-trading, agent-rebate, internal-transfer and step-margin, are generated as [implicit methods](/docs/exchanges/deepcoin/implicit-api) with signing and throttling applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [deepcoin unified API reference](/docs/exchanges/deepcoin)
* [deepcoin implicit API](/docs/exchanges/deepcoin/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Delta Exchange API and delta-rest-client (/docs/comparisons/ccxt-vs-delta-api)
[Delta Exchange](https://www.delta.exchange) runs perpetuals, futures and options on BTC, ETH and a long tail of altcoins, with separate India and global deployments. Two realistic ways to integrate: the official [`delta-exchange/python-rest-client`](https://github.com/delta-exchange/python-rest-client) (published as `delta-rest-client` on PyPI), or [CCXT](/docs/manual), which speaks Delta's v2 API behind the same interface it uses for 103 other venues.
The question that decides it: **is Delta the only venue you will trade, in Python?**
## TL;DR [#tldr]
* **Pick `delta-rest-client`** if Delta is your only venue, you work in Python, and you want method arguments that match Delta's docs literally — numeric `product_id`, integer contract `size`, and an explicit `base_url` for India versus global.
* **Pick CCXT** if you want unified symbols and one `create_order` that means the same thing on Delta, Binance and Deribit — in eight languages, with rate limiting, precision handling and typed errors already written.
* **Neither side streams.** CCXT implements **no `watch*` methods for Delta**, and the official Python client is REST-only. If you need Delta's WebSocket feed today, you write it against the raw socket either way. That is the honest state of both projects.
## At a glance [#at-a-glance]
| | **CCXT** | **delta-rest-client** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| Venues covered | 104 (Delta is one of them) | Delta Exchange only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python |
| Packages to install | 1 (`ccxt`) | 1 (`delta-rest-client`) |
| Unified market data + trading API | yes — 43 unified capabilities, 30 `fetch*` methods | no — Delta's own request and response shapes |
| Products | spot, perpetuals, futures, options from one client | all of them, addressed by numeric `product_id` |
| Instrument addressing | unified symbols: `'BTC/USDT'`, `'BTC/USDT:USDT'`, `'BTC/USDT:USDT-260905-78200-C'` | integer `product_id`, or Delta's own `symbol` strings |
| WebSockets | **no** — 0 `watch*` methods for this venue | no — REST only |
| Raw endpoint access | yes — 52 Delta endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 300 ms) | no |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus Delta's error payload |
| Testnet | `exchange.set_sandbox_mode(True)` — swaps in `testnet-api.delta.exchange` | `base_url` constructor argument, India or global, prod or testnet |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 27 GitHub stars · 26.0k PyPI installs/month |
| Latest release | continuous | 1.0.14, uploaded April 2026 |
| Licence | MIT | see repository |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `delta-exchange/python-rest-client` repository and its source, the `delta-rest-client` PyPI metadata, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
delta-rest-client
```python
import ccxt
exchange = ccxt.delta()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from delta_rest_client import DeltaRestClient
client = DeltaRestClient(base_url='https://api.delta.exchange')
ticker = client.get_ticker('BTCUSDT')
print(ticker)
```
`get_ticker` returns Delta's payload as-is. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — same keys, same types, same units as the ticker you get from Binance or Kraken — and its symbols carry the market type, so a perpetual is `'BTC/USDT:USDT'`, spot is `'BTC/USDT'`, and an option is `'BTC/USDT:USDT-260905-78200-C'` with expiry, strike and type parsed out into `market['expiry']`, `market['strike']` and `market['optionType']`.
### Place a limit order [#place-a-limit-order]
CCXT
delta-rest-client
```python
import ccxt
exchange = ccxt.delta({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 1, 60000)
print(order['id'], order['status'])
exchange.cancel_order(order['id'], 'BTC/USDT:USDT')
```
```python
from delta_rest_client import DeltaRestClient, OrderType
client = DeltaRestClient(
base_url='https://api.delta.exchange',
api_key='...',
api_secret='...',
)
product_id = 139 # BTCUSDT — you look this up first
order = client.place_order(
product_id=product_id,
size=1,
side='buy',
limit_price='60000',
order_type=OrderType.LIMIT,
)
client.cancel_order(product_id, order['id'])
```
The visible difference is `product_id`. Delta's API addresses instruments by an integer that you resolve first — from `get_product()` or `get_assets()` — and carry through every subsequent call, including cancellation. CCXT resolves it for you at `load_markets()` time and keeps the numeric id on `market['numericId']` if you want it. The return value is a [unified order structure](/docs/manual#order-structure), so `order['status']`, `order['filled']` and `order['average']` sit where they sit on every other exchange.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Symbols, contract size and precision [#symbols-contract-size-and-precision]
Delta quotes derivatives in **contracts**, not base units, and every product has its own `contract_value` and `tick_size`. CCXT loads that with the markets, so `market['contractSize']` and the precision helpers are there before you send anything:
```python
exchange = ccxt.delta()
exchange.load_markets()
market = exchange.market('BTC/USDT:USDT')
print(market['contractSize'], market['precision']['price'], market['limits']['amount']['min'])
amount = exchange.amount_to_precision('BTC/USDT:USDT', 3.0000001)
price = exchange.price_to_precision('BTC/USDT:USDT', 60123.456789)
```
The rounding is backed by the `Precise` string-arithmetic class, so quantities never drift through float representation — the failure mode where a price that looks fine in Python is rejected as off-tick.
### Options, positions and margin are unified [#options-positions-and-margin-are-unified]
Delta's option and derivatives surface is covered by named methods rather than raw payloads: `fetchOption`, `fetchGreeks`, `fetchSettlementHistory`, `fetchOpenInterest`, `fetchFundingRate`, `fetchFundingRates`, `fetchPosition`, `fetchPositions`, `fetchPositionsADLRank`, `setLeverage`, `setMarginMode`, `fetchMarginMode`, `fetchLeverage`, `addMargin`, `reduceMargin` and `closeAllPositions`. Forty-three unified capabilities in total, thirty of them `fetch*` methods.
```python
greeks = exchange.fetch_greeks('BTC/USDT:USDT-260905-78200-C')
positions = exchange.fetch_positions()
exchange.set_leverage(10, 'BTC/USDT:USDT')
```
The same method names do the same thing on Deribit, OKX and Bybit, which is the point.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT ships a token-bucket throttler that is **on by default** (`enableRateLimit = true`, base `rateLimit` 300 ms for Delta) with per-endpoint weights in the exchange definition. You call methods in a loop; the library paces them. With a thin REST wrapper, backing off correctly is application code you write and maintain.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Delta's error payloads onto its [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError` and 35 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once and it keeps working when you add a second venue that words the same condition differently.
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.delta({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps in testnet-api.delta.exchange
```
One flag. Note the scope honestly: CCXT ships Delta's **global** hosts, `api.delta.exchange` and `testnet-api.delta.exchange`. Delta also runs a separate India deployment on `api.india.delta.exchange` with its own accounts, keys and product ids; the official client makes that a constructor argument, and in CCXT you would override `exchange.urls['api']` yourself.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures.
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.delta ();
const ticker = await exchange.fetchTicker ('BTC/USDT:USDT');
```
```python
import ccxt
exchange = ccxt.delta()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
```
```go
exchange := ccxt.NewDelta(nil)
ticker, err := exchange.FetchTicker("BTC/USDT:USDT")
```
The official client is Python. Delta's organisation also publishes a `node-client` repository, last updated December 2022.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the unified methods, **all 52 Delta endpoints are generated as callable implicit methods**, with signing, rate-limit accounting and error mapping applied:
```python
response = exchange.public_get_products()
```
Browse them all on the [Delta implicit API page](/docs/exchanges/delta/implicit-api).
## What delta-rest-client does better [#what-delta-rest-client-does-better]
Real advantages, not padding:
* **Batch order entry.** The client exposes `batch_create`, `batch_cancel` and `batch_edit`, which submit up to five orders on a product in one request. CCXT's Delta integration has `createOrder`, `editOrder`, `cancelOrder` and `cancelAllOrders`, but no unified batch order-entry methods for this venue — you would reach for the implicit endpoint.
* **India and global as a first-class choice.** `DeltaRestClient(base_url=...)` documents all four environments — India production, India testnet, global production, global testnet — and treats switching between them as normal. CCXT ships the global pair and expects you to override the URLs for India.
* **One-to-one with Delta's docs.** `product_id`, `size` in contracts, `stop_order_type`, `trail_amount`, `post_only`, `reduce_only` — the arguments are Delta's arguments. Debugging against the vendor reference is one hop instead of two.
* **New endpoints land there first.** Whatever Delta ships appears in their own client before a *unified* CCXT method models it, though CCXT's implicit API closes most of that gap on day one.
* **Smaller dependency.** For a Delta-only Python bot, `delta-rest-client` is a much smaller install than all of CCXT.
If Delta is your only venue and you are writing Python, the official client is a defensible choice — particularly if you batch orders.
## Migrating from delta-rest-client to CCXT [#migrating-from-delta-rest-client-to-ccxt]
| What you are doing | delta-rest-client | CCXT |
| ------------------- | ------------------------------------------ | ----------------------------------------------------------------------------- |
| Instruments | `get_product(product_id)` / `get_assets()` | `load_markets()` |
| Addressing | integer `product_id` | `'BTC/USDT:USDT'`, `'BTC/USDT'`, dated option symbols |
| Ticker | `get_ticker(symbol)` | `fetch_ticker()` |
| Order book | `get_l2_orderbook(product_id)` | `fetch_order_book()` |
| Candles | history endpoints | `fetch_ohlcv()` |
| New order | `place_order(...)` / `create_order(order)` | `create_order()` |
| Stop order | `place_stop_order(...)` | `create_order()` with `params['triggerPrice']` |
| Cancel | `cancel_order(product_id, order_id)` | `cancel_order()` |
| Open orders | `get_live_orders()` | `fetch_open_orders()` |
| Fills | `fills(query, page_size)` | `fetch_my_trades()` |
| Balance | `get_balances(asset_id)` | `fetch_balance()` |
| Position | `get_position(product_id)` | `fetch_position()` / `fetch_positions()` |
| Leverage | `set_leverage(product_id, leverage)` | `set_leverage()` |
| Anything not listed | the raw path | the same endpoint as an [implicit method](/docs/exchanges/delta/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [delta unified API reference](/docs/exchanges/delta).
## FAQ [#faq]
**Does CCXT support Delta Exchange WebSockets?**
No. CCXT implements zero `watch*` methods for Delta, so streaming is not available through CCXT for this venue. The official Python client does not stream either. Delta documents a WebSocket feed, and today you would consume it directly.
**Does CCXT support Delta options?**
Yes. Options load as unified symbols carrying expiry, strike and type — `'BTC/USDT:USDT-260905-78200-C'` — and `fetchOption`, `fetchGreeks`, `fetchSettlementHistory` and `fetchOpenInterest` are implemented for the venue.
**Can CCXT talk to Delta Exchange India?**
CCXT ships the global hosts (`api.delta.exchange` and, in sandbox mode, `testnet-api.delta.exchange`). The India deployment runs on its own host with its own keys and product ids; you would override `exchange.urls['api']` to point at it. The official client makes that a constructor argument.
**Is CCXT slower than delta-rest-client?**
CCXT adds parsing and normalisation on top of the same HTTP calls, so there is a small constant overhead per response. Network round-trip time dominates it for anything short of latency-critical market making.
**Can I still call Delta-specific endpoints from CCXT?**
Yes — all 52 of them, as [implicit methods](/docs/exchanges/delta/implicit-api), with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, no paid tier.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [delta unified API reference](/docs/exchanges/delta)
* [delta implicit API](/docs/exchanges/delta/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the raw Deribit API (/docs/comparisons/ccxt-vs-deribit-api)
[Deribit](https://www.deribit.com) is an options-first derivatives venue, and its API is unusually well specified: one JSON-RPC 2.0 surface exposed three ways — over WebSocket ("recommended for most use cases"), over HTTP, and over FIX — covering futures, perpetuals, spot, options and combos.
What it does not have is a client library. The `deribit` GitHub organisation lists **no public repositories**, and the current documentation links no SDK in any language. The one package that carries Deribit's name on PyPI, `deribit_api`, has a most recent release — 1.1.1 — uploaded in **September 2017**, and the repository it points at is no longer public. So the real choice is not "CCXT or the vendor SDK". It is **CCXT or the JSON-RPC client you write yourself**.
## TL;DR [#tldr]
* **Write it yourself** if you need something CCXT does not model — the FIX interface, combo (multi-leg) instruments as first-class objects, or order entry over the same socket you read from.
* **Pick CCXT** if you want Deribit's options, futures, perpetuals and spot behind one typed API, with the `deri-hmac-sha256` signing, the credit-based rate limiter, order-book maintenance and reconnects already written — in eight languages.
* **Choosing CCXT does not hide the API.** All 122 Deribit endpoints are generated as [implicit methods](/docs/exchanges/deribit/implicit-api), signed and rate-limited, so anything the unified layer does not cover is still one call away.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw Deribit API** |
| --------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| Venues covered | 104 (Deribit is one of them) | Deribit only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write it in |
| Official client library | n/a | none published; `deribit_api` on PyPI last released 1.1.1 in September 2017 |
| Unified market data + trading API | yes — 64 unified capabilities, 33 `fetch*` methods | no — Deribit's own JSON-RPC method names and payloads |
| Products in one client | spot, futures, perpetuals, options | all of them, as `kind` values you handle yourself |
| Options-specific methods | `fetchOption`, `fetchOptionChain`, `fetchGreeks`, `fetchVolatilityHistory` | `public/get_instruments`, `public/get_book_summary_by_currency`, etc. |
| WebSockets | yes — 12 `watch*` methods, same shapes as `fetch*` | yes — `public/subscribe` over JSON-RPC |
| Raw endpoint access | yes — 122 endpoints as implicit methods | yes, it is all you have |
| Authentication | signed per request (`deri-hmac-sha256`); WS uses `grant_type=client_signature` | `public/auth` plus access-token and refresh-token lifecycle |
| Built-in rate limiter | yes, on by default (`rateLimit` 50 ms), per-endpoint weights | you model the credit pools |
| Unified error types | yes — 41 typed exceptions in one hierarchy | JSON-RPC error codes |
| Testnet | `exchange.set_sandbox_mode(True)` — swaps in `test.deribit.com` | change the host yourself |
| FIX interface | no | yes |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | n/a |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub issues — usually same-day | Deribit support and the API console |
Figures verified September 2026 against CCXT v4.5.78, Deribit's published API documentation and rate-limit article, the `deribit` GitHub organisation page, the `deribit_api` PyPI metadata, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw JSON-RPC
```python
import ccxt
exchange = ccxt.deribit()
ticker = exchange.fetch_ticker('BTC/USD:BTC')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
response = requests.post('https://www.deribit.com/api/v2/public/ticker', json={
'jsonrpc': '2.0',
'id': 1,
'method': 'public/ticker',
'params': {'instrument_name': 'BTC-PERPETUAL'},
})
result = response.json()['result']
print(result['last_price'], result['stats']['volume'])
```
The instrument name is the first thing you inherit. Deribit speaks `BTC-PERPETUAL`, `BTC_USDC-PERPETUAL`, `BTC-26MAR27` and `BTC-26MAR27-100000-C`. CCXT maps those onto unified symbols — `'BTC/USD:BTC'` for the inverse perpetual, `'BTC/USDC:USDC'` for the USDC-margined one, `'BTC/USD:BTC-270326-100000-C'` for the option — and returns a [unified ticker structure](/docs/manual#ticker-structure) whose keys, types and units match every other exchange.
### Place a limit order [#place-a-limit-order]
CCXT
Raw JSON-RPC
```python
import ccxt
exchange = ccxt.deribit({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USD:BTC', 'limit', 'buy', 10, 60000)
print(order['id'], order['status'])
exchange.cancel_order(order['id'], 'BTC/USD:BTC')
```
```python
import hashlib
import hmac
import time
import requests
client_id, client_secret = '...', '...'
timestamp = str(int(time.time() * 1000))
nonce = timestamp
uri = '/api/v2/private/buy?instrument_name=BTC-PERPETUAL&amount=10&price=60000&type=limit'
request_data = 'GET' + '\n' + uri + '\n' + '' + '\n'
string_to_sign = timestamp + '\n' + nonce + '\n' + request_data
signature = hmac.new(client_secret.encode(), string_to_sign.encode(), hashlib.sha256).hexdigest()
response = requests.get('https://www.deribit.com' + uri, headers={
'Authorization': f'deri-hmac-sha256 id={client_id},ts={timestamp},sig={signature},nonce={nonce}',
})
print(response.json()['result']['order']['order_id'])
```
Deribit documents three grant types — `client_credentials`, `client_signature` and `refresh_token` — and the token path means minting an access token, tracking its `expires_in`, and refreshing before it lapses. CCXT uses the per-request signature scheme above, so there is no token to store, refresh or lose; the signed string, the newline placement, the 60-second timestamp window and the lowercase hex are all inside the library. What comes back is a [unified order structure](/docs/manual#order-structure) with `id`, `status`, `filled` and `average` in the same places as on Binance or Bybit.
### Stream an order book [#stream-an-order-book]
CCXT
Raw JSON-RPC
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.deribit()
while True:
orderbook = await exchange.watch_order_book('BTC/USD:BTC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import asyncio
import json
import websockets
async def main():
async with websockets.connect('wss://www.deribit.com/ws/api/v2') as ws:
await ws.send(json.dumps({
'jsonrpc': '2.0', 'id': 1, 'method': 'public/subscribe',
'params': {'channels': ['book.BTC-PERPETUAL.100ms']},
}))
while True:
message = json.loads(await ws.recv())
print(message)
asyncio.run(main())
```
These two do not do the same thing. The second prints whatever Deribit sends — a snapshot, then a stream of `change` messages carrying `change_id` and `prev_change_id`. Turning that into a book you can read a top-of-book price off is the work:
| | CCXT | raw stream |
| ----------------------------------------------------------------------------- | ------------ | ---------- |
| Apply the snapshot, then the deltas, in order | done for you | your code |
| Check `prev_change_id` against the last `change_id` and re-subscribe on a gap | done for you | your code |
| Reconnect, re-subscribe and re-seed after a drop | done for you | your code |
| Keep a depth-bounded book instead of a dictionary that grows | done for you | your code |
| Ping/pong keep-alive and stale-connection detection | done for you | your code |
| Authenticate first if you want the `raw` (uncoalesced) interval | done for you | your code |
CCXT's `watch_order_book` returns the same structure as `fetch_order_book`, so a polling loop becomes a streaming loop by changing one word. The twelve streaming methods are `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchTrades`, `watchTradesForSymbols`, `watchOHLCV`, `watchOHLCVForSymbols`, `watchOrderBook`, `watchOrderBookForSymbols`, `watchOrders`, `watchMyTrades` and `watchBalance`; the private ones authenticate with `grant_type=client_signature` on your behalf.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Credit-based rate limits, modelled for you [#credit-based-rate-limits-modelled-for-you]
Deribit does not meter in requests per second. It meters in **credits**, from a pool per sub-account, and the shape differs by request type:
* Non-matching-engine requests (market data, account queries) cost **500 credits** against a **50,000** maximum, refilled at **10,000 credits/second** — 20 requests per second sustained, roughly 100 in a burst.
* Matching-engine requests (placing and cancelling orders) are **tier-based on trailing 7-day volume**, from 30 requests/second at Tier 1 down to 5 at Tier 4, with bursts of 100 down to 20.
* Some methods have their own pools: `public/get_instruments` costs 10,000 credits against a 500,000 maximum (about 1 request/second), `public/subscribe` 3,000 against 30,000, `private/get_transaction_log` 10,000 against 80,000, and `private/move_positions` 100,000 against 600,000 plus a cap of 100 uses per 168 hours.
Run out and you get error 10028, `too_many_requests`, and your session is terminated. CCXT ships a token-bucket throttler that is **on by default** (`enableRateLimit = true`, base `rateLimit` 50 ms) with per-endpoint weights in the exchange definition. You call methods in a loop; the library paces them.
### Options are a first-class part of the unified API [#options-are-a-first-class-part-of-the-unified-api]
This is what most people come to Deribit for, and it is where a generic HTTP wrapper stops being enough. CCXT models the option surface directly:
```python
exchange = ccxt.deribit()
chain = exchange.fetch_option_chain('BTC') # every listed BTC option
option = exchange.fetch_option('BTC/USD:BTC-270326-100000-C') # one contract
greeks = exchange.fetch_greeks('BTC/USD:BTC-270326-100000-C') # delta, gamma, vega, theta, rho
vol = exchange.fetch_volatility_history('BTC') # historical volatility
```
Unified option symbols carry the expiry, strike and type — `BASE/QUOTE:SETTLE-YYMMDD-STRIKE-C|P` — so the same parsing code works on Deribit, Delta Exchange and OKX options. Alongside those, `fetchOpenInterest`, `fetchFundingRate`, `fetchFundingRateHistory`, `fetchLiquidations` and `fetchMyLiquidations` cover the derivative side.
### Precision, tick size and string math [#precision-tick-size-and-string-math]
Deribit rejects orders that violate an instrument's tick size or minimum amount, and contract sizes differ across instruments. CCXT loads that metadata with the markets and gives you rounding helpers backed by the `Precise` string-arithmetic class, so sizes never drift through float rounding:
```python
amount = exchange.amount_to_precision('BTC/USD:BTC', 10.0000000001)
price = exchange.price_to_precision('BTC/USD:BTC', 60123.456789)
```
### One error hierarchy [#one-error-hierarchy]
Deribit returns JSON-RPC errors with numeric codes and short names — `not_enough_funds`, `price_too_high`, `order_not_found`, `too_many_requests`. CCXT maps them onto its [typed exception tree](/docs/manual#error-handling): `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError` and 36 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once and it keeps working on the next venue, instead of matching on integers that only mean something to Deribit.
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.deribit({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps in test.deribit.com for REST and WebSocket
```
One flag, both transports. No constant swapping and no forked configuration.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures. A hand-written Deribit client is written once per language, by you.
TypeScript
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.deribit ();
const ticker = await exchange.fetchTicker ('BTC/USD:BTC');
```
```go
exchange := ccxt.NewDeribit(nil)
ticker, err := exchange.FetchTicker("BTC/USD:BTC")
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 64 unified capabilities, **all 122 Deribit endpoints are generated as callable implicit methods**, camelCased from their JSON-RPC paths, with signing, rate-limit accounting and error mapping applied:
```python
response = exchange.public_get_get_instruments({'currency': 'BTC', 'kind': 'option'})
```
Browse them all on the [Deribit implicit API page](/docs/exchanges/deribit/implicit-api).
## What the raw Deribit API does better [#what-the-raw-deribit-api-does-better]
Real advantages of writing it yourself, not padding:
* **FIX.** Deribit publishes a FIX interface alongside JSON-RPC. CCXT does not speak FIX at all. If your OMS is FIX-native, that is the integration and CCXT is not in the running.
* **Order entry over the same socket you read from.** Deribit's WebSocket carries the whole JSON-RPC surface, so `private/buy` and `private/cancel` can go down the connection you are already streaming on. CCXT's Deribit implementation streams over WebSocket but sends orders over REST — there are no `createOrderWs` / `cancelOrderWs` methods for this venue.
* **Combos as first-class instruments.** `future_combo` and `option_combo` let you execute a multi-leg strategy as one trade. CCXT recognises combo instruments when loading markets, but the unified order API is built around single-leg orders, so combo execution and the block-trade endpoints are better reached raw.
* **Market-maker plumbing.** Mass quoting, cancel-on-disconnect, `private/move_positions` and the per-method rate-limit introspection in `private/get_account_summary` are exposed directly by the API and are not part of a unified abstraction.
* **New endpoints on day one.** Whatever Deribit ships is callable the moment it exists. A *unified* CCXT wrapper for it may follow later — though the [implicit API](/docs/exchanges/deribit/implicit-api) closes most of that gap immediately.
If you are a market maker on Deribit alone, quoting options over FIX or over a single authenticated socket, hand-written is the honest recommendation.
## Migrating from raw Deribit calls to CCXT [#migrating-from-raw-deribit-calls-to-ccxt]
| What you are doing | Deribit JSON-RPC | CCXT |
| ------------------- | --------------------------------------- | ------------------------------------------------------------------------------- |
| Instruments | `public/get_instruments` | `load_markets()` |
| Symbols | `BTC-PERPETUAL`, `BTC-26MAR27-100000-C` | `'BTC/USD:BTC'`, `'BTC/USD:BTC-270326-100000-C'` |
| Ticker | `public/ticker` | `fetch_ticker()` |
| Order book | `public/get_order_book` | `fetch_order_book()` |
| Candles | `public/get_tradingview_chart_data` | `fetch_ohlcv()` |
| New order | `private/buy` / `private/sell` | `create_order()` |
| Cancel | `private/cancel` | `cancel_order()` |
| Open orders | `private/get_open_orders_by_currency` | `fetch_open_orders()` |
| Balance | `private/get_account_summary` | `fetch_balance()` |
| Positions | `private/get_positions` | `fetch_positions()` |
| Option chain | `public/get_book_summary_by_currency` | `fetch_option_chain()` |
| Greeks | fields on the instrument payload | `fetch_greeks()` |
| Streams | `public/subscribe` channels | `watch_*` on `ccxt.pro.deribit` |
| Anything not listed | the JSON-RPC method | the same endpoint as an [implicit method](/docs/exchanges/deribit/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [deribit unified API reference](/docs/exchanges/deribit).
## FAQ [#faq]
**Does Deribit have an official Python or JavaScript SDK?**
Not a maintained one. The `deribit` GitHub organisation shows no public repositories, and the current documentation links no client library. The `deribit_api` package on PyPI names Deribit as its author, but its most recent release, 1.1.1, was uploaded in September 2017 and predates the v2 API. Everything else on npm and PyPI is community-maintained.
**Does CCXT support Deribit options?**
Yes. Options, futures, perpetuals and spot come from the same `ccxt.deribit` instance. Option symbols carry expiry, strike and type, and `fetchOption`, `fetchOptionChain`, `fetchGreeks` and `fetchVolatilityHistory` are implemented for the venue.
**Can I place orders over the WebSocket with CCXT on Deribit?**
No. CCXT Pro streams Deribit data over WebSocket — 12 `watch*` methods, including private orders, fills and balance — but order entry goes over REST. If sending orders down the streaming socket matters to you, that is a reason to write against `private/buy` directly.
**How does CCXT handle Deribit's credit-based rate limits?**
It ships a throttler that is on by default, with per-endpoint weights encoded in the exchange definition and a base `rateLimit` of 50 ms. You call methods in a loop and the library paces them, rather than modelling the credit pools and the tier your 7-day volume puts you in.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.deribit` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, WebSocket support included, no paid tier.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [deribit unified API reference](/docs/exchanges/deribit)
* [deribit implicit API](/docs/exchanges/deribit/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Derive API and the official Derive SDKs (/docs/comparisons/ccxt-vs-derive-api)
[Derive](https://www.derive.xyz) (formerly Lyra) is a self-custodial options and perpetuals exchange: an off-chain order book whose state changes are settled on-chain, which means every order, transfer and withdrawal is a **signed action** rather than an authenticated HTTP request. You hold a wallet, you register a session key, and the exchange only settles what that key signed.
Two ways to talk to it: the official [`derive-py`](https://github.com/derivexyz/derive-py) (with siblings [`derive-ts`](https://github.com/derivexyz/derive-ts) and [`derive-rs`](https://github.com/derivexyz/derive-rs)), or [CCXT](/docs/manual), which performs the same action signing and exposes Derive behind the API it uses for 103 other venues.
The question that decides it: **do you need Derive's whole product surface — RFQs, vaults, session-key management — or the trading subset, portable across venues?**
## TL;DR [#tldr]
* **Pick `derive-py`** if Derive is your venue and you need the full protocol: RFQ maker and taker flows, vault operations, session-key lifecycle, on-chain deposits that create subaccounts, market-maker protection, and a `drv` command-line tool. It is generated from Derive's published OpenAPI and AsyncAPI specs, so its coverage is the whole RPC surface.
* **Pick CCXT** if you want Derive's perps, spot and options behind the same `create_order` you already use on Binance, Deribit and Hyperliquid — in eight languages, with the action hashing and secp256k1 signing done inside the library.
* **Signing is not the thing you give up.** CCXT takes `walletAddress` and `privateKey` as first-class credentials, builds the trade-module action hash and signs it itself, in Python, Go, C#, PHP, Java, JavaScript and TypeScript alike.
## At a glance [#at-a-glance]
| | **CCXT** | **derive-py / derive-ts / derive-rs** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| Venues covered | 104 (Derive is one of them) | Derive only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, TypeScript, Rust — separate codebases |
| Packages to install | 1 (`ccxt`) | 1 per language |
| Unified market data + trading API | yes — 32 unified capabilities, 19 `fetch*` methods | no — Derive's own RPC method names and payloads |
| Instrument addressing | unified symbols: `'BTC/USD:USDC'`, `'LBTC/USDC'`, `'BTC/USDC:USDC-261030-180000-C'` | `instrument_name`: `ETH-PERP`, `BTC-20261030-180000-C` |
| On-chain action signing | done for you from `walletAddress` + `privateKey` | done for you, from a session key |
| Session-key management | not modelled | yes — register, scope, edit, retire |
| RFQ maker/taker flows | not modelled | yes |
| Vaults | not modelled | yes |
| WebSockets | yes — 5 `watch*` methods, same shapes as `fetch*` | yes — callback subscriptions on `WebSocketClient` |
| Raw endpoint access | yes — 113 Derive endpoints as implicit methods | yes — `public_api` / `private_api`, generated from the specs |
| Built-in rate limiter | yes, on by default (`rateLimit` 50 ms) | `system.rate_limits` reports your current limits |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Derive's numeric error codes |
| Command-line tool | `ccxt` CLI across all venues | `drv`, Derive-specific |
| Testnet | `exchange.set_sandbox_mode(True)` — swaps the host *and* the trade-module address | `DERIVE_ETH_CHAIN=SEPOLIA` |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `derivexyz/derive-py` repository and its README and examples, and the `derivexyz` GitHub organisation listing.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
derive-py
```python
import ccxt
exchange = ccxt.derive()
ticker = exchange.fetch_ticker('ETH/USD:USDC')
print(ticker['last'], ticker['baseVolume'])
```
```python
from derive_py import HTTPClient
client = HTTPClient.from_env()
ticker = client.markets.get_ticker(instrument_name="ETH-PERP")
print(ticker)
```
Derive names instruments `ETH-PERP`, `BTC-20261030-180000-C` and plain ERC-20 tickers for spot. CCXT maps those onto unified symbols — `'ETH/USD:USDC'` for the perpetual, `'BTC/USDC:USDC-261030-180000-C'` for the option, `'LBTC/USDC'` for spot — and returns a [unified ticker structure](/docs/manual#ticker-structure) with the same keys and units as every other venue.
### Place a limit order [#place-a-limit-order]
CCXT
derive-py
```python
import ccxt
exchange = ccxt.derive({
'walletAddress': '0x...', # the signer
'privateKey': '0x...', # session key or owner key
'options': {'deriveWalletAddress': '0x...'},
})
order = exchange.create_order('ETH/USD:USDC', 'limit', 'buy', 0.1, 1000, {
'subaccount_id': 130837,
'max_fee': 100,
})
print(order['id'], order['status'])
```
```python
from derive_py import HTTPClient
from derive_py.data_types import D, Direction, OrderType
client = HTTPClient.from_env()
client.connect()
order = client.orders.create(
instrument_name="ETH-PERP",
amount=D("0.1"),
limit_price=D("1000"),
direction=Direction.buy,
order_type=OrderType.limit,
)
```
Both sign. `derive-py` reads `DERIVE_WALLET`, `DERIVE_SESSION_KEY` and `DERIVE_SUBACCOUNT_ID` from the environment and signs with the session key; CCXT takes the same two keys as constructor fields and asks for `subaccount_id` and `max_fee` in `params`, because Derive's trade module signs the maximum fee you accept as part of the action.
Underneath, CCXT ABI-encodes the trade-module data (asset address, sub-id, price, amount, max fee, subaccount, direction), keccak-hashes it, combines it with the action type hash, nonce, trade-module address and signature expiry, and produces the secp256k1 signature — then sends it with `X-LyraWallet`, `X-LyraTimestamp` and `X-LyraSignature` headers. None of that is your code, and it is the same code path in all eight CCXT languages.
### Stream an order book [#stream-an-order-book]
CCXT
derive-py
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.derive()
while True:
orderbook = await exchange.watch_order_book('ETH/USD:USDC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import asyncio
from derive_py import WebSocketClient
from derive_py.data_types.channel_models import OrderbookSnapshot
async def main():
client = WebSocketClient.from_env()
await client.connect()
def on_book(book: OrderbookSnapshot):
print(book.bids[0], book.asks[0])
await client.public_channels.orderbook_group_depth_by_instrument_name(
instrument_name="ETH-PERP", group=1, depth=10, callback=on_book)
await asyncio.sleep(60)
await client.disconnect()
asyncio.run(main())
```
Both reconnect and resubscribe. They differ in shape: `derive-py` is callback-driven, and its own documentation is explicit that a reconnect leaves a hole — the subscriptions come back, the messages sent during the outage do not, and you have to re-read anything you assembled from the stream. CCXT is `await`-shaped: `watch_order_book` returns the same structure as `fetch_order_book`, and the library maintains the book across the drop, so a polling loop becomes a streaming loop by changing one word.
CCXT's five streaming methods for Derive are `watchTicker`, `watchTrades`, `watchOrderBook`, `watchOrders` and `watchMyTrades`, plus `unWatchTrades` and `unWatchOrderBook` to drop a subscription.
## Where the differences actually bite [#where-the-differences-actually-bite]
### One API for perp DEXes and CEXes [#one-api-for-perp-dexes-and-cexes]
Derive signs actions with a session key. Hyperliquid signs EIP-712 typed data. dYdX signs a Cosmos transaction. Binance signs an HMAC over a query string. Coinbase issues a JWT. Their symbols, order payloads, error codes and stream dialects have nothing in common. CCXT already absorbed that:
```python
for exchange_id, symbol in [('derive', 'BTC/USD:USDC'), ('hyperliquid', 'BTC/USDC:USDC'),
('deribit', 'BTC/USD:BTC'), ('binance', 'BTC/USDT:USDT')]:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker(symbol)['last'])
```
Cross-venue options basis, DEX-versus-CEX hedges and volatility surfaces stitched from several exchanges stop being several integrations with a translation layer between them.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names, arguments and return structures — including the signing.
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.derive ({ walletAddress: '0x...', privateKey: '0x...' });
const ticker = await exchange.fetchTicker ('ETH/USD:USDC');
```
```python
import ccxt
exchange = ccxt.derive({'walletAddress': '0x...', 'privateKey': '0x...'})
ticker = exchange.fetch_ticker('ETH/USD:USDC')
```
```go
exchange := ccxt.NewDerive(map[string]interface{}{
"walletAddress": "0x...",
"privateKey": "0x...",
})
ticker, err := exchange.FetchTicker("ETH/USD:USDC")
```
Derive publishes Python, TypeScript and Rust. CCXT covers all three plus Go, C#, PHP and Java from one source, so language is no longer what decides this one.
### Options and perpetuals in one symbol scheme [#options-and-perpetuals-in-one-symbol-scheme]
Derive lists perpetuals, dated options and ERC-20 spot. CCXT parses all three into unified symbols carrying expiry, strike and type, with `market['strike']`, `market['optionType']` and `market['expiry']` filled in, so the same option-chain code works on Derive, Deribit and Delta Exchange. On the trading side the venue's derivative surface is covered by `fetchPositions`, `fetchFundingRate`, `fetchFundingRateHistory`, `fetchFundingHistory`, `fetchLedger`, `fetchOrderTrades`, `fetchCanceledOrders` and `editOrder`.
### Testnet swaps more than the host [#testnet-swaps-more-than-the-host]
```python
exchange = ccxt.derive({'walletAddress': '0x...', 'privateKey': '0x...'})
exchange.set_sandbox_mode(True)
```
That points REST at `api-demo.lyra.finance` **and** switches the trade-module contract address that goes inside the signed action. Changing only the host by hand produces a signature the demo environment rejects, which is the kind of bug that costs an afternoon.
### One error hierarchy [#one-error-hierarchy]
Derive answers with numeric error codes. CCXT maps them onto its [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `BadRequest` and 35 more, all descending from `BaseError`. You write `except ccxt.InvalidOrder` once and the same handler keeps working on the next venue.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the unified methods, **all 113 Derive endpoints are generated as callable implicit methods**, with the wallet headers, signing and rate limiting applied:
```python
response = exchange.public_post_get_instruments({'currency': 'ETH', 'instrument_type': 'option'})
```
Browse them on the [Derive implicit API page](/docs/exchanges/derive/implicit-api). This is where you reach for the parts the unified layer does not model.
## What the official Derive SDKs do better [#what-the-official-derive-sdks-do-better]
An honest list, and it is a long one for this venue:
* **RFQ flows.** `derive-py` has taker and maker RFQ modules — request quotes for a multi-leg package, execute the best one, run a bounded quoting loop. CCXT has no unified RFQ concept, so on Derive you would drive those endpoints raw.
* **Vaults.** Browsing vaults, queueing deposits, cancelling them and curator operations are first-class in the SDK. CCXT does not model vaults.
* **Session-key lifecycle.** Registering a scoped, expiring session key, editing its scopes and retiring it are SDK operations with worked examples. CCXT expects you to already hold a key that can sign.
* **Deposits that create the account.** On Derive the first deposit is what brings a subaccount into existence, and the SDK has `plan_deposit_to_new_subaccount` plus an L1 RPC path for it. CCXT starts from an account that already exists.
* **Generated from the published specs.** The client is regenerated from Derive's `openapi.json` and AsyncAPI documents, and anything not hand-wrapped is still reachable through `client.public_api` and `client.private_api` with typed models. Coverage tracks the protocol automatically.
* **A native Rust client and a CLI.** `derive-rs` is written as Rust rather than generated into it, and `drv` gives you `drv market ticker ETH-PERP` without writing code at all. CCXT ships neither a CLI for this venue nor a hand-written Rust API.
* **Market-maker protection.** MMP configuration and reset are exposed directly.
If you are building a Derive-native market maker, running vault strategies, or quoting RFQs, the official SDK is the better tool and it is not close.
## Migrating from derive-py to CCXT [#migrating-from-derive-py-to-ccxt]
| What you are doing | derive-py | CCXT |
| ------------------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Instruments | the `markets` module | `load_markets()` |
| Symbols | `ETH-PERP`, `BTC-20261030-180000-C` | `'ETH/USD:USDC'`, `'BTC/USDC:USDC-261030-180000-C'` |
| Credentials | `DERIVE_WALLET` + `DERIVE_SESSION_KEY` in the environment | `{'walletAddress': ..., 'privateKey': ...}` |
| Ticker | `client.markets.get_ticker(...)` | `fetch_ticker()` |
| Order book | the `orderbook` channel or the equivalent RPC | `fetch_order_book()` |
| New order | `client.orders.create(...)` | `create_order()` |
| Replace | the `orders` module's replace operation | `edit_order()` |
| Cancel | `client.orders.cancel(...)` | `cancel_order()` / `cancel_all_orders()` |
| Open orders | `client.orders` list-open | `fetch_open_orders()` |
| Positions | `client.positions` list | `fetch_positions()` |
| Balance / collateral | `client.collateral` get | `fetch_balance()` |
| Trade history | the `history` module | `fetch_my_trades()` |
| Streams | `client.public_channels.*(callback=...)` | `watch_*` on `ccxt.pro.derive` |
| RFQ, vaults, session keys | `client.rfq`, `client.vaults`, `client.account` | not unified — call the [implicit endpoints](/docs/exchanges/derive/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [derive unified API reference](/docs/exchanges/derive).
## FAQ [#faq]
**Does CCXT sign Derive orders itself, or do I need a separate signer?**
CCXT signs them itself. You pass `walletAddress` and `privateKey` to the constructor; the library ABI-encodes the trade-module data, hashes it, builds the action hash with the nonce, trade-module address and signature expiry, and produces the secp256k1 signature. The same path exists in all eight CCXT languages.
**Can I use a Derive session key with CCXT?**
Yes. Pass the session key as `privateKey` and the signer address as `walletAddress`, and set `options['deriveWalletAddress']` to the Derive wallet the subaccount belongs to. Orders also take `subaccount_id` and `max_fee` in `params`.
**Does CCXT support Derive options?**
Options load as unified symbols with expiry, strike and type parsed out, and the unified trading methods work on them. What CCXT does not model is the RFQ machinery around multi-leg option packages — for that, use `derive-py` or the implicit endpoints.
**Does CCXT support Derive vaults or RFQs?**
Not as unified methods. Both are reachable through the [implicit API](/docs/exchanges/derive/implicit-api), where you construct the payload yourself. `derive-py` wraps them properly.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.derive` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, WebSocket support included, no paid tier.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [derive unified API reference](/docs/exchanges/derive)
* [derive implicit API](/docs/exchanges/derive/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [More comparisons](/docs/comparisons)
# CCXT vs the raw DigiFinex REST API (/docs/comparisons/ccxt-vs-digifinex-api)
[DigiFinex](https://www.digifinex.com) documents two separate product lines — spot (v3 REST, v1 WebSocket) and swap (v2 REST, v2 WebSocket) — with signed requests, a weight budget and escalating bans when you exceed it.
What it does not publish is a client library. The [`DigiFinex/api`](https://github.com/DigiFinex/api) repository on GitHub contains three markdown files and no code; its README is stamped `Version:1.5.20, Update: 2019-05-20` and documents an older MD5 signing scheme than the HMAC-SHA256 one the current v3 docs describe. There is no `digifinex` package on PyPI, and nothing official on npm. The docs offer sample snippets in PHP, JavaScript, Python and Go, and that is the extent of it.
So the choice is **CCXT or the HTTP client you write yourself**.
## TL;DR [#tldr]
* **Write it yourself** if you need DigiFinex's WebSocket feeds, which CCXT does not cover for this venue, or if you want the response fields exactly as DigiFinex names them.
* **Pick CCXT** if you want spot, margin and swap behind one typed API with the signing, weight budget, precision handling and error mapping already written — in eight languages, and identical to how you already call Binance or OKX.
* **Nothing is hidden.** All 88 DigiFinex endpoints are generated as [implicit methods](/docs/exchanges/digifinex/implicit-api), signed and rate-limited, so the unified layer is never a ceiling.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw DigiFinex API** |
| --------------------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| Venues covered | 104 (DigiFinex is one of them) | DigiFinex only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write it in |
| Official client library | n/a | none — `DigiFinex/api` is documentation only; nothing on npm or PyPI |
| Unified market data + trading API | yes — 48 unified capabilities, 32 `fetch*` methods | no — DigiFinex's own field names and shapes |
| Products in one client | spot, margin, swap | two documented API surfaces at different versions and paths |
| Instrument addressing | unified symbols: `'BTC/USDT'`, `'BTC/USDT:USDT'` | `btc_usdt` for spot, `BTCUSDTPERP` for swap |
| WebSockets | **no** — 0 `watch*` methods for this venue | yes — spot v1 and swap v2 feeds |
| Raw endpoint access | yes — 88 endpoints as implicit methods | yes, it is all you have |
| Authentication | signed for you: `ACCESS-KEY` / `ACCESS-TIMESTAMP` / `ACCESS-SIGN` | HMAC-SHA256 over URL-encoded, ASCII-sorted params |
| Built-in rate limiter | yes, on by default (`rateLimit` 900 ms; 300 ms for posts) | you model the 1200-weight budget |
| Unified error types | yes — 41 typed exceptions in one hierarchy | numeric `code` field per response |
| Testnet / sandbox | not available for this venue | not documented |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | n/a |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub issues — usually same-day | DigiFinex support and the API Telegram group |
Figures verified September 2026 against CCXT v4.5.78, DigiFinex's published spot v3 REST documentation, the `DigiFinex/api` repository, live responses from `openapi.digifinex.com`, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.digifinex()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'], ticker['quoteVolume'])
```
```python
import requests
response = requests.get('https://openapi.digifinex.com/v3/ticker',
params={'symbol': 'btc_usdt'})
ticker = response.json()['ticker'][0]
print(ticker['last'], ticker['vol'], ticker['base_vol'])
```
Look at the last line. In DigiFinex's spot ticker, `vol` is the **base**-denominated 24h volume and `base_vol` is the **quote**-denominated one — the opposite of what the names suggest. CCXT maps `vol` to `baseVolume` and `base_vol` to `quoteVolume` and hands you a [unified ticker structure](/docs/manual#ticker-structure), so nothing downstream has to remember that. Multiply it across `buy`/`bid`, `sell`/`ask`, `change`, `date` in seconds versus `timestamp` in milliseconds, and per-field translation is most of what a hand-written client is.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.digifinex({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
exchange.cancel_order(order['id'], 'BTC/USDT')
```
```python
import hashlib
import hmac
import time
import urllib.parse
import requests
api_key, secret = '...', '...'
params = {'market': 'spot', 'symbol': 'btc_usdt',
'type': 'buy', 'amount': '0.001', 'price': '60000'}
body = urllib.parse.urlencode(sorted(params.items()))
signature = hmac.new(secret.encode(), body.encode(), hashlib.sha256).hexdigest()
response = requests.post('https://openapi.digifinex.com/v3/spot/order/new',
data=body,
headers={
'ACCESS-KEY': api_key,
'ACCESS-TIMESTAMP': str(int(time.time())),
'ACCESS-SIGN': signature,
'Content-Type': 'application/x-www-form-urlencoded',
})
print(response.json())
```
The signature is the part that eats an afternoon: parameters URL-encoded, sorted by ASCII, HMAC-SHA256 with the secret, and a timestamp that the server rejects if it is more than five seconds behind (tunable with an `ACCESS-RECV-WINDOW` header). CCXT does all of it, and the return value is a [unified order structure](/docs/manual#order-structure) with `id`, `status`, `filled` and `average` in the same places as every other venue.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Two product lines, one client [#two-product-lines-one-client]
DigiFinex documents spot and swap as separate APIs, at different versions, with different paths, different instrument-id conventions (`btc_usdt` versus `BTCUSDTPERP`) and different response shapes. CCXT loads both into one market list and selects between them by symbol:
```python
exchange = ccxt.digifinex()
exchange.fetch_ticker('BTC/USDT') # spot
exchange.fetch_ticker('BTC/USDT:USDT') # USDT-margined perpetual
exchange.fetch_funding_rate('BTC/USDT:USDT')
exchange.fetch_positions()
```
Margin is in the same instance: `fetchCrossBorrowRate`, `fetchCrossBorrowRates`, `fetchBorrowInterest`, `fetchLeverageTiers`, `fetchMarketLeverageTiers`, `setLeverage`, `setMarginMode`, `addMargin` and `reduceMargin` are all unified capabilities for this venue, alongside `transfer`, `fetchTransfers`, `fetchLedger`, `fetchDepositWithdrawFees` and `withdraw`.
### The weight budget you do not have to model [#the-weight-budget-you-do-not-have-to-model]
DigiFinex meters by weight, and the documented rule is blunt: the summed weight for any IP, API key or user must not exceed **1200**, and exceeding it bans you for **2 minutes** the first three times in 24 hours, **10 minutes** after that, and longer on repeat. There is no gentle 429-and-retry.
CCXT ships a token-bucket throttler that is **on by default** (`enableRateLimit = true`, `rateLimit` 900 ms, 300 ms for posts) with per-endpoint weights in the exchange definition. You call methods in a loop; the library paces them, and the pacing is the same code you already trust on other venues.
### Precision, step size and string math [#precision-step-size-and-string-math]
Every exchange rejects orders that violate its tick size, step size or minimum notional. CCXT loads DigiFinex's market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding:
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
Note that DigiFinex answers with `code: 0` on success and a non-zero code on failure — including on HTTP 200. A hand-written client has to check the body of every response, not the status line.
### One error hierarchy [#one-error-hierarchy]
DigiFinex's documented codes include `10005` (request frequency exceeds the limit), `10008` (timestamp invalid), `20007` (price precision error), `20008` (amount precision error) and `20011` (insufficient balance). CCXT maps them onto its [typed exception tree](/docs/manual#error-handling): `DDoSProtection`, `InvalidNonce`, `InvalidOrder`, `InsufficientFunds` and 37 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once and it keeps working on the next exchange, instead of matching on `20011`.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures. A hand-written DigiFinex client is written once per language, by you — and DigiFinex's own sample snippets cover four.
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.digifinex ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```python
import ccxt
exchange = ccxt.digifinex()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```go
exchange := ccxt.NewDigifinex(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 48 unified capabilities, **all 88 DigiFinex endpoints are generated as callable implicit methods**, with signing, rate-limit accounting and error mapping applied:
```python
response = exchange.public_spot_get_markets()
```
Browse them all on the [DigiFinex implicit API page](/docs/exchanges/digifinex/implicit-api).
## What the raw DigiFinex API does better [#what-the-raw-digifinex-api-does-better]
Real advantages of writing it yourself:
* **WebSockets.** CCXT implements **no `watch*` methods for DigiFinex**. DigiFinex documents a spot v1 and a swap v2 WebSocket feed, and if you need live order books or trade streams from this venue, that is a raw integration regardless of what else you use CCXT for.
* **Exact field fidelity.** If you are reading DigiFinex's reference while debugging, the raw response matches it one-for-one. CCXT's unified names are a deliberate abstraction, which is an extra hop.
* **New endpoints on day one.** Anything DigiFinex ships is callable the moment it exists. A *unified* CCXT method may follow later — though the implicit API closes most of that gap immediately.
* **No dependency, no version to track.** For a script that hits two endpoints, `requests` plus twenty lines of signing is smaller than all of CCXT and never needs upgrading when an unrelated exchange changes.
* **Endpoints outside the trading surface.** Loan, sub-account and OTC-style endpoints that no unified abstraction models are simply HTTP calls when you write the client yourself.
If you need DigiFinex's streaming feeds, or you are writing a single-purpose script against two endpoints, hand-written is the honest recommendation.
## Migrating from raw DigiFinex calls to CCXT [#migrating-from-raw-digifinex-calls-to-ccxt]
| What you are doing | DigiFinex REST | CCXT |
| ------------------- | --------------------------------------------- | --------------------------------------------------------------------------------- |
| Markets | `GET /v3/markets`, swap `/public/instruments` | `load_markets()` |
| Symbols | `btc_usdt`, `BTCUSDTPERP` | `'BTC/USDT'`, `'BTC/USDT:USDT'` |
| Ticker | `GET /v3/ticker` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `GET /v3/order_book` | `fetch_order_book()` |
| Candles | `GET /v3/kline` | `fetch_ohlcv()` |
| New order | `POST /v3/spot/order/new` | `create_order()` |
| Batch orders | the batch endpoint | `create_orders()` |
| Cancel | `POST /v3/spot/order/cancel` | `cancel_order()` / `cancel_orders()` |
| Open orders | `GET /v3/spot/order/current` | `fetch_open_orders()` |
| Balance | `GET /v3/spot/assets` | `fetch_balance()` |
| Positions | swap position endpoints | `fetch_positions()` |
| Funding rate | swap funding endpoints | `fetch_funding_rate()` / `fetch_funding_rate_history()` |
| Transfers | `POST /v3/transfer` | `transfer()` / `fetch_transfers()` |
| Anything not listed | the raw path | the same endpoint as an [implicit method](/docs/exchanges/digifinex/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [digifinex unified API reference](/docs/exchanges/digifinex).
## FAQ [#faq]
**Does DigiFinex have an official Python or JavaScript SDK?**
Not one that is published. The `DigiFinex/api` repository on GitHub contains only markdown documentation — a README, a v2 API document and a WebSocket document — and there is no `digifinex` package on PyPI or an official one on npm. The current docs give sample snippets in PHP, JavaScript, Python and Go, which you copy and maintain yourself.
**Does CCXT support DigiFinex WebSockets?**
No. CCXT implements zero `watch*` methods for DigiFinex, so streaming is not available through CCXT for this venue. DigiFinex documents spot and swap WebSocket feeds you would consume directly.
**Does CCXT support DigiFinex swap and margin, or only spot?**
All three. Spot, margin and swap load into one `ccxt.digifinex` instance, selected by symbol, with 48 unified capabilities covering positions, funding rates, leverage tiers, borrow rates and transfers.
**Does DigiFinex have a testnet CCXT can use?**
`setSandboxMode` is not available for this venue in CCXT — no test URLs are declared. Test against small live orders, or against static fixtures.
**Can I still call DigiFinex-specific endpoints from CCXT?**
Yes — all 88 of them, as [implicit methods](/docs/exchanges/digifinex/implicit-api), with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, no paid tier.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [digifinex unified API reference](/docs/exchanges/digifinex)
* [digifinex implicit API](/docs/exchanges/digifinex/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the dYdX v4 clients (/docs/comparisons/ccxt-vs-dydx-api)
[dYdX](https://www.dydx.xyz) v4 is not a normal exchange API. It is a sovereign Cosmos SDK chain: orders are protobuf-encoded messages inside a signed transaction, broadcast to a validator, while reads come from a separate **indexer** service over ordinary HTTP and WebSocket. There is no API key. Your account is a chain address, your credential is a key, and every order carries a client-generated id, an order flag saying whether it is short-term or long-term, and a good-til-block or good-til-time.
Two ways to talk to it: the official [`dydxprotocol/v4-clients`](https://github.com/dydxprotocol/v4-clients) monorepo, or [CCXT](/docs/manual), which builds, signs and broadcasts the same transactions behind the API it uses for 103 other venues.
The question that decides it: **do you need the chain, or the exchange?**
## TL;DR [#tldr]
* **Pick the official clients** if you need dYdX as a *chain* — transfers, staking, governance messages, transaction simulation, the testnet faucet, short-term versus long-term order semantics spelled out — or if you work in C++.
* **Pick CCXT** if you want dYdX as an *exchange*: `create_order`, `fetch_positions`, `fetch_balance` meaning the same thing here as on Binance, Bybit and Hyperliquid, in eight languages, with the protobuf encoding and secp256k1 signing already written.
* **Signing is not the thing you give up.** CCXT encodes the order message, looks up your account number and sequence, signs the transaction and broadcasts it over the node RPC — no separate Cosmos library in your code.
## At a glance [#at-a-glance]
| | **CCXT** | **dYdX v4-clients** |
| --------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Venues covered | 104 (dYdX is one of them) | dYdX only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | TypeScript (`v4-client-js`, `dydxjs`), Python and Rust (maintained by Nethermind), C++ (third-party, Linux only) |
| Packages to install | 1 (`ccxt`) | 1 per language, plus proto dependencies |
| Unified market data + trading API | yes — 29 unified capabilities, 19 `fetch*` methods | no — chain messages and indexer payloads |
| Clients to wire up | one `ccxt.dydx` instance | a node client *and* an indexer client, separately |
| Instrument addressing | unified symbols: `'BTC/USDC:USDC'` | `"BTC-USD"` ticker plus a `Market` helper for quantums and subticks |
| Transaction signing | done for you — protobuf encode, account/sequence lookup, secp256k1, broadcast | done for you, from a `Wallet` you build from a mnemonic |
| WebSockets | yes — 3 `watch*` methods (`watchOrderBook`, `watchTrades`, `watchOHLCV`) plus `unWatch*` | yes — `IndexerSocket` with per-channel handlers, including subaccount channels |
| Raw endpoint access | yes — 54 endpoints as implicit methods across indexer, node REST and node RPC | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 100 ms) | manual |
| Unified error types | yes — 41 typed exceptions in one hierarchy | chain and indexer error codes |
| Testnet | `exchange.set_sandbox_mode(True)` — swaps indexer, node RPC and node REST together | `TESTNET` network constant, plus a faucet client |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 120 GitHub stars · 246k npm installs/month (`@dydxprotocol/v4-client-js`) · 5.5k PyPI installs/month (`dydx-v4-client`) |
| Licence | MIT | see the repository `LICENSE`: MIT-style permissions conditioned on compliance with applicable law and dYdX's v4 Terms of Use (the README badge shows AGPL v3) |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues, dYdX developer channels |
Figures verified September 2026 against CCXT v4.5.78, the `dydxprotocol/v4-clients` repository, its README, LICENSE and Python client documentation, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Read a market and its book [#read-a-market-and-its-book]
CCXT
v4-client-py-v2
```python
import ccxt
exchange = ccxt.dydx()
orderbook = exchange.fetch_order_book('BTC/USDC:USDC')
print(orderbook['bids'][0], orderbook['asks'][0])
```
```python
import asyncio
from dydx_v4_client.indexer.rest.indexer_client import IndexerClient
from dydx_v4_client.network import TESTNET
async def main():
client = IndexerClient(TESTNET.rest_indexer)
response = await client.markets.get_perpetual_markets(market="BTC-USD")
print(response["markets"]["BTC-USD"])
asyncio.run(main())
```
The indexer returns dYdX's own market and order-book objects. CCXT returns a [unified order book structure](/docs/manual#order-book-structure) — sorted `bids` and `asks` as `[price, amount]` pairs, with a timestamp — the same shape as on every other venue, and its symbols are unified: `'BTC/USDC:USDC'` rather than `"BTC-USD"`. Note one gap honestly: CCXT does not implement `fetchTicker` or `fetchTickers` for dYdX, so top-of-book comes from `fetch_order_book` or from the raw market payload via an implicit method.
### Place a limit order [#place-a-limit-order]
CCXT
v4-client-py-v2
```python
import ccxt
exchange = ccxt.dydx({
'walletAddress': 'dydx1...', # your dYdX chain address
'privateKey': '0x...',
})
order = exchange.create_order('BTC/USDC:USDC', 'limit', 'sell', 0.01, 40000)
print(order['id'])
exchange.cancel_order(order['id'], 'BTC/USDC:USDC')
```
```python
import asyncio, random
from v4_proto.dydxprotocol.clob.order_pb2 import Order
from dydx_v4_client import MAX_CLIENT_ID, OrderFlags
from dydx_v4_client.indexer.rest.constants import OrderType
from dydx_v4_client.indexer.rest.indexer_client import IndexerClient
from dydx_v4_client.network import TESTNET
from dydx_v4_client.node.client import NodeClient
from dydx_v4_client.node.market import Market, since_now
from dydx_v4_client.wallet import Wallet
async def main():
node = await NodeClient.connect(TESTNET.node)
indexer = IndexerClient(TESTNET.rest_indexer)
market = Market((await indexer.markets.get_perpetual_markets("BTC-USD"))["markets"]["BTC-USD"])
wallet = await Wallet.from_mnemonic(node, MNEMONIC, ADDRESS)
order_id = market.order_id(ADDRESS, 0, random.randint(0, MAX_CLIENT_ID), OrderFlags.LONG_TERM)
await node.place_order(wallet, market.order(
order_id, OrderType.LIMIT, Order.Side.SIDE_SELL,
size=0.01, price=40000,
time_in_force=Order.TIME_IN_FORCE_UNSPECIFIED,
reduce_only=False, good_til_block_time=since_now(seconds=60)))
wallet.sequence += 1
asyncio.run(main())
```
That second snippet is not padded — it is close to the official example, and every line is load-bearing. You connect to a node *and* an indexer, build a `Market` helper so sizes and prices can be converted into the chain's quantums and subticks, construct a `Wallet` from a mnemonic, generate an order id with a random client id and an order flag, choose between `good_til_block` and `good_til_block_time`, and increment the wallet's sequence number yourself after broadcasting.
CCXT does all of that inside `create_order`. It fetches your account number and sequence from the chain, fetches the latest block height, encodes the order message, signs the transaction with secp256k1 and broadcasts it — and hands back a [unified order structure](/docs/manual#order-structure).
### Stream an order book [#stream-an-order-book]
CCXT
v4-client-py-v2
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.dydx()
while True:
orderbook = await exchange.watch_order_book('BTC/USDC:USDC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import asyncio
from dydx_v4_client.indexer.socket.websocket import IndexerSocket
from dydx_v4_client.network import TESTNET
def handle_message(ws: IndexerSocket, message: dict):
print("Received message:", message)
async def main():
async with IndexerSocket(TESTNET.websocket_indexer, on_message=handle_message) as ws:
await ws.order_book.subscribe("BTC-USD")
while True:
await asyncio.sleep(1)
asyncio.run(main())
```
CCXT's `watch_order_book` returns the same structure as `fetch_order_book` — snapshot applied, deltas merged, book depth-bounded, reconnect and resubscribe handled — so a polling loop becomes a streaming loop by changing one word. CCXT covers three streams for dYdX: `watchOrderBook`, `watchTrades` and `watchOHLCV`, each with an `unWatch*` counterpart. Private streams (subaccount orders and fills) are **not** implemented for this venue in CCXT; the indexer socket exposes them, and that is a real gap on CCXT's side.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Signing a Cosmos transaction is most of the integration [#signing-a-cosmos-transaction-is-most-of-the-integration]
A dYdX order is not an HTTP body with a signature header. It is a protobuf `MsgPlaceOrder` inside a `TxBody`, with an `AuthInfo` carrying your public key, sequence number and fee, signed over a `SignDoc` bound to the chain id, then broadcast to a validator. Get the sequence wrong and the transaction is rejected; get the encoding wrong and it does not decode.
CCXT implements the whole path — `encodeDydxTxForSigning`, the secp256k1 signature, `encodeDydxTxRaw`, and the broadcast — and it exists in TypeScript, JavaScript, Python, PHP, C# and Go from the same source. It also handles **onboarding**: if you do not supply a dYdX chain key, CCXT signs the onboarding action with your Ethereum key and derives the chain credentials from that signature, the same derivation the official clients perform.
```python
exchange = ccxt.dydx({'walletAddress': 'dydx1...', 'privateKey': '0x...'})
```
One caveat, stated plainly: in Python the transaction encoding needs two extra packages — `pip install "protobuf==5.29.5" pycryptodome==3.18.0` — and CCXT raises `NotSupported` with that message if they are missing.
### One API for a chain-based DEX and everything else [#one-api-for-a-chain-based-dex-and-everything-else]
dYdX signs a Cosmos transaction. Hyperliquid signs EIP-712 typed data. Derive signs an on-chain action with a session key. Binance signs an HMAC over a query string. CCXT already absorbed the differences:
```python
for exchange_id, symbol in [('dydx', 'BTC/USDC:USDC'), ('hyperliquid', 'BTC/USDC:USDC'),
('binance', 'BTC/USDT:USDT'), ('bybit', 'BTC/USDT:USDT')]:
exchange = getattr(ccxt, exchange_id)()
book = exchange.fetch_order_book(symbol)
print(exchange_id, book['bids'][0], book['asks'][0])
```
Basis trades, DEX-versus-CEX hedges and cross-venue liquidation monitors stop being two integrations with a translation layer between them.
### One instance instead of two clients and three hosts [#one-instance-instead-of-two-clients-and-three-hosts]
dYdX v4 is served from three places: the indexer (reads), the node RPC (broadcast) and the node REST (account state). The official Python client gives you a `NodeClient` and an `IndexerClient` and expects you to know which one answers which question. CCXT wires all three into one exchange instance and routes each unified method to the right host — including in sandbox mode, where `set_sandbox_mode(True)` swaps all three at once.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names, arguments and return structures — the transaction signing included.
TypeScript
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.dydx ({ walletAddress: 'dydx1...', privateKey: '0x...' });
const book = await exchange.fetchOrderBook ('BTC/USDC:USDC');
```
```go
exchange := ccxt.NewDydx(map[string]interface{}{
"walletAddress": "dydx1...",
"privateKey": "0x...",
})
book, err := exchange.FetchOrderBook("BTC/USDC:USDC")
```
The official clients cover TypeScript, Python and Rust, plus a third-party C++ client. CCXT covers all three of those languages and Go, C#, PHP and Java besides, so the split here is chain access versus exchange coverage rather than language.
### One error hierarchy [#one-error-hierarchy]
dYdX returns numeric error codes from the chain — `1011`, `2005`, `4008` and dozens more. CCXT maps them onto its [typed exception tree](/docs/manual#error-handling): `InvalidOrder`, `InsufficientFunds`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded` and 36 more, all descending from `BaseError`. You write `except ccxt.InvalidOrder` once and it keeps working when the next venue words the same rejection differently.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the unified methods, **all 54 dYdX endpoints across the indexer, node REST and node RPC are generated as callable implicit methods**:
```python
response = exchange.indexer_get_candles_perpetual_markets_market({'market': 'BTC-USD', 'resolution': '1MIN'})
```
Browse them on the [dYdX implicit API page](/docs/exchanges/dydx/implicit-api).
## What the official dYdX clients do better [#what-the-official-dydx-clients-do-better]
Real advantages, not padding:
* **The chain, not just the exchange.** `NodeClient` is a Cosmos client: it can query and send arbitrary chain messages, simulate transactions before broadcasting, and reach the parts of dYdX that are not order entry. CCXT models the exchange surface.
* **C++, and a natively written Rust client.** The third-party `v4-client-cpp` covers a language CCXT does not ship at all, and `v4-client-rs` (maintained by Nethermind) is Rust written as Rust rather than generated into it.
* **Short-term versus long-term orders, spelled out.** `OrderFlags.SHORT_TERM` and `OrderFlags.LONG_TERM`, `good_til_block` versus `good_til_block_time`, and the client-generated order id are first-class arguments. dYdX's order lifecycle genuinely differs between the two, and the official client makes you choose deliberately.
* **A faucet client.** The Python package ships a faucet module for funding a testnet account, which is a small thing that saves a real detour.
* **Private indexer channels.** Subaccount order and fill streams are available through `IndexerSocket`. CCXT's dYdX implementation streams only order books, trades and candles.
* **`dydxjs` for low-level composition.** If you want to build and broadcast Cosmos and dYdX messages yourself with the proto and amino encoding handled, that is what it is for.
If you are building on dYdX as a chain — vaults, transfers, governance, anything beyond trading — the official clients are the better tool.
## Migrating from v4-client-py-v2 to CCXT [#migrating-from-v4-client-py-v2-to-ccxt]
| What you are doing | v4-client-py-v2 | CCXT |
| ------------------- | ----------------------------------------------- | ---------------------------------------------------------------------------- |
| Clients | `NodeClient` + `IndexerClient` | one `ccxt.dydx` instance |
| Symbols | `"BTC-USD"` | `'BTC/USDC:USDC'` |
| Credentials | `Wallet.from_mnemonic(node, mnemonic, address)` | `{'walletAddress': 'dydx1...', 'privateKey': '0x...'}` |
| Markets | `indexer.markets.get_perpetual_markets()` | `load_markets()` |
| Order book | indexer order-book endpoint | `fetch_order_book()` |
| Ticker | indexer market payload | not unified — use `fetch_order_book()` or an implicit method |
| Candles | indexer candles endpoint | `fetch_ohlcv()` |
| New order | `node.place_order(wallet, market.order(...))` | `create_order()` |
| Cancel | `node.cancel_order(wallet, order_id, ...)` | `cancel_order()` / `cancel_orders()` |
| Open orders | indexer subaccount orders | `fetch_open_orders()` |
| Positions | indexer perpetual positions | `fetch_position()` / `fetch_positions()` |
| Balance | indexer subaccount / asset positions | `fetch_balance()` |
| Transfers | chain transfer message | `transfer()` / `fetch_transfers()` |
| Streams | `IndexerSocket` channels | `watch_order_book` / `watch_trades` / `watch_ohlcv` on `ccxt.pro.dydx` |
| Anything not listed | the raw endpoint or chain message | the same endpoint as an [implicit method](/docs/exchanges/dydx/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [dydx unified API reference](/docs/exchanges/dydx).
## FAQ [#faq]
**Does CCXT sign dYdX v4 transactions itself, or do I need a Cosmos library?**
CCXT signs them itself. It protobuf-encodes the order message, looks up your account number and sequence, produces the secp256k1 signature over the sign doc and broadcasts the raw transaction to the node RPC. In Python it needs `protobuf` and `pycryptodome` installed for the encoding step; the other languages have it built in.
**What credentials does CCXT need for dYdX?**
`walletAddress` set to your dYdX chain address — the `dydx1...` one, not an Ethereum address — and a private key. If you pass an Ethereum key instead of a chain key, CCXT signs the onboarding action and derives the chain credentials from that signature, the same derivation the official clients use.
**Does CCXT stream dYdX private data (orders, fills)?**
No. CCXT implements three streaming methods for dYdX — order book, trades and candles — plus their `unWatch*` counterparts. Subaccount order and fill channels exist on dYdX's indexer socket but are not wrapped by CCXT; use `fetch_open_orders` and `fetch_my_trades`, or the indexer socket directly.
**Is the dYdX Python client MIT-licensed?**
The Python client's README says MIT, the repository badge says AGPL v3, and the actual `LICENSE` file in `dydxprotocol/v4-clients` grants MIT-style permissions conditioned on compliance with applicable law and dYdX's v4 Terms of Use. Read the file, and if it matters commercially, have counsel read it. CCXT is plain MIT.
**Does CCXT support dYdX testnet?**
Yes. `exchange.set_sandbox_mode(True)` swaps the indexer, node RPC and node REST hosts together.
**Is CCXT free?**
Yes. MIT-licensed, WebSocket support included, no paid tier.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [dydx unified API reference](/docs/exchanges/dydx)
* [dydx implicit API](/docs/exchanges/dydx/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Extended (x10) Python SDK (/docs/comparisons/ccxt-vs-extended-api)
[Extended](https://app.extended.exchange) is a perpetuals exchange settled on StarkNet. Its API takes an ordinary `X-Api-Key` header for authentication, but that is not what makes an order valid: every order, transfer and withdrawal carries a **settlement** signed with a Stark private key over a Poseidon hash, and the exchange settles what that key signed.
Two ways to talk to it: the official [`x10xchange/python_sdk`](https://github.com/x10xchange/python_sdk), published as `x10-python-trading-starknet`, or [CCXT](/docs/manual), which computes the same message hashes and Stark signatures and exposes Extended behind the API it uses for 103 other venues.
The question that decides it: **is Extended your only venue, in Python?**
## TL;DR [#tldr]
* **Pick the official SDK** if Extended is your only venue and you work in Python. Its Rust-backed Stark signing, its onboarding flow that derives a Stark key pair from an Ethereum account, and its vault and builder-code modules have no CCXT equivalent.
* **Pick CCXT** if you want `create_order` to mean the same thing on Extended, Hyperliquid, Binance and Bybit, in any of eight languages, with the Poseidon hashing, Stark signing and account lookup already written.
* **Signing is not the thing you give up.** CCXT takes `apiKey` and `privateKey` as credentials, fetches your L2 vault and Stark key from the account endpoint, builds the settlement and signs it — the same path in Python, Go, C#, PHP, Java, JavaScript and TypeScript.
## At a glance [#at-a-glance]
| | **CCXT** | **x10-python-trading-starknet** |
| ----------------------------------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| Venues covered | 104 (Extended is one of them) | Extended only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python 3.10+ |
| Packages to install | 1 (`ccxt`) | the SDK plus a compiled Rust Stark-crypto wrapper |
| Unified market data + trading API | yes — 53 unified capabilities, 31 `fetch*` methods | no — Extended's own request and response models |
| Instrument addressing | unified symbols: `'BTC/USDC:USDC'` | market names: `BTC-USD` |
| Stark signing | done for you from `apiKey` + `privateKey` | done for you, from a `StarkPerpetualAccount` |
| Credentials needed | `apiKey`, `privateKey` — the L2 vault and Stark public key are fetched | `api_key`, `public_key`, `private_key`, `vault` |
| Onboarding from an Ethereum account | not modelled | yes — EIP-712 signature, Stark key derivation |
| WebSockets | yes — 10 `watch*` methods, same shapes as `fetch*` | yes — a stream client per topic, plus a multiplexed RPC stream client |
| Raw endpoint access | yes — 51 endpoints as implicit methods | yes, and the OpenAPI specs ship in the repo |
| Built-in rate limiter | yes, on by default (`rateLimit` 600 ms, CCXT's setting for Extended's default request tier) | manual |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Extended's numeric error codes |
| Testnet | `exchange.set_sandbox_mode(True)` — swaps in `api.starknet.sepolia.extended.exchange` | `TESTNET_CONFIG` |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 39 GitHub stars |
| Latest release | continuous | 2.6.0, uploaded August 2026 |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues, Discord |
Figures verified September 2026 against CCXT v4.5.78, the `x10xchange/python_sdk` repository, its README and examples, the `x10-python-trading-starknet` PyPI metadata, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
x10 Python SDK
```python
import ccxt
exchange = ccxt.extended()
ticker = exchange.fetch_ticker('BTC/USDC:USDC')
print(ticker['last'], ticker['baseVolume'])
```
```python
import asyncio
from x10.core.stark_account import StarkPerpetualAccount
from x10.config import TESTNET_CONFIG
from x10.clients.rest import RestApiClient
async def main():
rest_client = RestApiClient(TESTNET_CONFIG)
markets = await rest_client.markets_info.get_markets_dict()
market = markets["BTC-USD"]
print(market.market_stats.bid_price, market.market_stats.ask_price)
asyncio.run(main())
```
The SDK gives you Extended-shaped typed models — `market.trading_config.min_order_size`, `market.market_stats.bid_price`, `market.trading_config.round_price(...)`. CCXT gives you a [unified ticker structure](/docs/manual#ticker-structure) and a [unified market structure](/docs/manual#market-structure), with the same keys, types and units as on every other exchange, and unified symbols: `'BTC/USDC:USDC'` rather than `BTC-USD`.
### Place a limit order [#place-a-limit-order]
CCXT
x10 Python SDK
```python
import ccxt
exchange = ccxt.extended({'apiKey': '...', 'privateKey': '0x...'})
order = exchange.create_order('BTC/USDC:USDC', 'limit', 'buy', 0.001, 60000, {
'postOnly': True,
})
print(order['id'], order['status'])
exchange.cancel_order(order['id'], 'BTC/USDC:USDC')
```
```python
from x10.models.order import OrderSide, TimeInForce
from x10.signing.order_object import create_order_object
markets_dict = await rest_client.markets_info.get_markets_dict()
market = markets_dict["BTC-USD"]
new_order = create_order_object(
account=rest_client.stark_account,
starknet_domain=rest_client.config.signing.starknet_domain,
market=market,
side=OrderSide.BUY,
amount_of_synthetic=market.trading_config.min_order_size,
price=market.trading_config.round_price(60000),
time_in_force=TimeInForce.GTT,
reduce_only=False,
post_only=True,
)
placed_order = await rest_client.orders.place_order(order=new_order)
```
Both sign. The SDK builds the order object first — passing the account, the StarkNet signing domain and the market so the settlement can be constructed — then posts it. CCXT does the same work inside `create_order`: it fetches your account's `l2Key` and `l2Vault`, converts amount and price into Stark-resolution integers, assembles the settlement (`baseAssetId`, `baseAmount`, `quoteAssetId`, `quoteAmount`, `feeAssetId`, `feeAmount`, expiration, salt), computes the SNIP-12 Poseidon message hash and produces the Stark signature — then returns a [unified order structure](/docs/manual#order-structure).
The practical difference is the credential surface: the SDK asks for four values (`api_key`, `public_key`, `private_key`, `vault`); CCXT asks for two and reads the rest from the account endpoint.
### Stream an order book [#stream-an-order-book]
CCXT
x10 Python SDK
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.extended()
while True:
orderbook = await exchange.watch_order_book('BTC/USDC:USDC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
async with stream_client.subscribe_to_orderbooks("BTC-USD") as orderbook_stream:
while True:
msg = await orderbook_stream.recv()
print(msg.type, msg.seq, msg.data.market)
```
Both are `await`-shaped and both are reasonable. The difference is what a stream returns: the SDK hands you the message it received, sequence number included, and the SDK's plain streaming client opens **one WebSocket connection per topic** (a separate RPC streaming client multiplexes several topics onto one socket). CCXT keeps one connection per URL, merges the book itself, and returns the same structure `fetch_order_book` returns, so a polling loop becomes a streaming loop by changing one word.
CCXT's ten streaming methods for Extended are `watchOrderBook`, `watchTrades`, `watchOHLCV`, `watchMarkPrice`, `watchIndexPrice`, `watchFundingRate`, `watchBalance`, `watchOrders`, `watchMyTrades` and `watchPositions`.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API — signing included [#eight-languages-one-api--signing-included]
This is the largest practical gap. The official SDK is Python, and its Stark signing is accelerated by a compiled Rust wrapper with per-platform wheels (Linux glibc and musl on x86 and arm64, macOS arm64, Windows x86; Windows arm64 is marked experimental). Porting that to Go or C# is not a translation exercise, it is a cryptography project.
CCXT implements `extendedStarknetSign`, the Poseidon hash and the selector derivation in its base class in every language it ships, so the same order-signing path exists in TypeScript, JavaScript, Python, PHP, C#, Go, Java and Rust.
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.extended ({ apiKey: '...', privateKey: '0x...' });
const ticker = await exchange.fetchTicker ('BTC/USDC:USDC');
```
```python
import ccxt
exchange = ccxt.extended({'apiKey': '...', 'privateKey': '0x...'})
ticker = exchange.fetch_ticker('BTC/USDC:USDC')
```
```go
exchange := ccxt.NewExtended(map[string]interface{}{
"apiKey": "...",
"privateKey": "0x...",
})
ticker, err := exchange.FetchTicker("BTC/USDC:USDC")
```
### One API for perp DEXes and CEXes [#one-api-for-perp-dexes-and-cexes]
Extended signs a Stark settlement. Hyperliquid signs EIP-712 typed data. dYdX signs a Cosmos transaction. Binance signs an HMAC over a query string. Their symbols, order payloads, error codes and stream dialects have nothing in common. CCXT already absorbed that:
```python
for exchange_id, symbol in [('extended', 'BTC/USDC:USDC'), ('hyperliquid', 'BTC/USDC:USDC'),
('binance', 'BTC/USDT:USDT'), ('bybit', 'BTC/USDT:USDT')]:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker(symbol)['last'])
```
### The derivatives surface is unified [#the-derivatives-surface-is-unified]
Fifty-three unified capabilities cover more than order entry: `fetchPositions`, `fetchPosition`, `fetchPositionsHistory`, `fetchFundingRateHistory`, `fetchFundingHistory`, `fetchOpenInterestHistory`, `fetchMarkOHLCV`, `fetchIndexOHLCV`, `fetchLeverage`, `setLeverage`, `fetchTradingFee`, `fetchTradingFees`, `fetchLedger`, `fetchTransfers`, `transfer` and `fetchAccounts`. Order management includes `editOrder`, `cancelOrders`, `cancelAllOrders` and `cancelAllOrdersAfter` — the dead-man's-switch that cancels everything if your process stops calling in.
```python
exchange.cancel_all_orders_after(30000) # cancel everything if I go quiet for 30s
```
### Rate limits and precision [#rate-limits-and-precision]
CCXT ships a throttler that is **on by default**, with `rateLimit` set to 600 ms for Extended's default request tier and per-endpoint weights in the exchange definition. Precision is handled by `amount_to_precision` and `price_to_precision`, backed by the `Precise` string-arithmetic class — which matters more than usual here, because the Stark settlement encodes amounts as integers at the instrument's resolution and a rounding error changes the hash you signed.
```python
amount = exchange.amount_to_precision('BTC/USDC:USDC', 0.0012345678)
price = exchange.price_to_precision('BTC/USDC:USDC', 61234.56789)
```
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.extended({'apiKey': '...', 'privateKey': '0x...'})
exchange.set_sandbox_mode(True) # api.starknet.sepolia.extended.exchange
```
One flag swaps the REST and WebSocket hosts. Extended's testnet accounts and keys are separate from mainnet, as they are with the SDK's `TESTNET_CONFIG`.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the unified methods, **all 51 Extended endpoints are generated as callable implicit methods**, with the API-key header, rate limiting and error mapping applied. Browse them on the [Extended implicit API page](/docs/exchanges/extended/implicit-api).
## What the official Extended SDK does better [#what-the-official-extended-sdk-does-better]
Real advantages, not padding:
* **Onboarding from an Ethereum account.** The SDK derives a Stark key pair from an Ethereum signature over an EIP-712 `AccountCreation` struct, and creates the account and API keys for you. CCXT starts from credentials you already hold.
* **Rust-accelerated Stark crypto.** Signing and hashing go through a compiled wrapper rather than pure Python, which matters when you are signing at quoting frequency.
* **Vaults and builder codes.** Vault public data and user vault token management, plus builder-specific data, are first-class modules. CCXT does not model either.
* **A multiplexed RPC streaming client.** Alongside the per-topic stream client, the SDK offers a single-connection client that carries many topics, and a blocking trading client for synchronous code.
* **The OpenAPI specs ship in the repository.** `specs/` gives you the machine-readable definition to generate against, which is useful whether or not you use the SDK.
* **An experimental MCP server.** `x10-mcp` exposes the SDK to Model Context Protocol clients, with the appropriate warnings about executing real transactions.
If Extended is your only venue and you are writing Python — especially if you are onboarding programmatically or running vault strategies — the official SDK is the better fit.
## Migrating from the x10 SDK to CCXT [#migrating-from-the-x10-sdk-to-ccxt]
| What you are doing | x10 Python SDK | CCXT |
| --------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| Markets | `rest_client.markets_info.get_markets_dict()` | `load_markets()` |
| Symbols | `BTC-USD` | `'BTC/USDC:USDC'` |
| Credentials | `StarkPerpetualAccount(api_key, public_key, private_key, vault)` | `{'apiKey': ..., 'privateKey': ...}` |
| Ticker | `market.market_stats` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | the order-book endpoint or stream | `fetch_order_book()` |
| Candles | the candles endpoint | `fetch_ohlcv()` |
| New order | `create_order_object(...)` then `orders.place_order(order=...)` | `create_order()` |
| Cancel | `orders` cancel | `cancel_order()` / `cancel_orders()` / `cancel_all_orders()` |
| Open orders | the account order endpoints | `fetch_open_orders()` |
| Positions | the account position endpoints | `fetch_positions()` / `fetch_positions_history()` |
| Balance | the account balance endpoint | `fetch_balance()` |
| Leverage | the account leverage endpoint | `set_leverage()` / `fetch_leverage()` |
| Streams | `stream_client.subscribe_to_*` | `watch_*` on `ccxt.pro.extended` |
| Vaults, builder codes, onboarding | `vault`, `builder`, `auth` modules | not unified — call the [implicit endpoints](/docs/exchanges/extended/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [extended unified API reference](/docs/exchanges/extended).
## FAQ [#faq]
**Does CCXT sign Extended orders itself, or do I need the x10 SDK?**
CCXT signs them itself. It builds the order settlement, computes the SNIP-12 Poseidon message hash and produces the Stark-curve signature in its base class — implemented natively in all eight CCXT languages, with no Rust wrapper to install.
**What credentials does CCXT need for Extended?**
`apiKey` and `privateKey`. Your L2 vault id and Stark public key are read from the account endpoint on first use, so you do not pass them in. The official SDK asks for all four up front.
**Can CCXT onboard a new Extended account from an Ethereum wallet?**
No. Account creation and the Ethereum-to-Stark key derivation are SDK features. Create the account and API key through Extended's interface or the SDK, then use CCXT with the resulting credentials.
**Does CCXT stream private Extended data?**
Yes — `watchBalance`, `watchOrders`, `watchMyTrades` and `watchPositions`, alongside `watchOrderBook`, `watchTrades`, `watchOHLCV`, `watchMarkPrice`, `watchIndexPrice` and `watchFundingRate`.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.extended` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, WebSocket support included, no paid tier.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [extended unified API reference](/docs/exchanges/extended)
* [extended implicit API](/docs/exchanges/extended/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [More comparisons](/docs/comparisons)
# CCXT vs the FMFW.io API (/docs/comparisons/ccxt-vs-fmfwio-api)
`fmfwio` is a white-label venue of HitBTC — an exchange running on the HitBTC engine, so its API is HitBTC-shaped.
Because it shares an API dialect with HitBTC, CCXT implements it by extending its `hitbtc` class. Everything in the [CCXT vs the HitBTC API](/docs/comparisons/ccxt-vs-hitbtc-api) comparison applies here — this page covers only what is specific to `fmfwio`.
## What is different [#what-is-different]
A distinct venue with its own accounts and listings, sharing the HitBTC request/response dialect. CCXT implements it by extending its HitBTC class.
> Credentials and markets are its own; only the API dialect is shared.
## What CCXT gives you here [#what-ccxt-gives-you-here]
| | `fmfwio` |
| --------------------------------- | ------------------------------------------------------------ |
| Unified capabilities | 54 (inherited from `hitbtc` plus its own overrides) |
| `fetch*` methods | 34 |
| WebSocket `watch*` methods | none — this venue has no CCXT WebSocket support |
| Raw endpoints as implicit methods | 111 |
| Testnet via `setSandboxMode` | no |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust |
| Licence | MIT |
Figures verified September 2026 against CCXT v4.5.78, read from the source tree with `build/comparisons-facts.cjs`. Counts include everything inherited from `hitbtc`.
## Using it [#using-it]
The class name is the only thing that changes — every unified method behaves as it does everywhere else in CCXT:
Python
TypeScript
```python
import ccxt
exchange = ccxt.fmfwio({'apiKey': '...', 'secret': '...'})
markets = exchange.load_markets()
ticker = exchange.fetch_ticker(list(markets)[0])
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.fmfwio ({ apiKey: '...', secret: '...' });
const markets = await exchange.loadMarkets ();
const ticker = await exchange.fetchTicker (Object.keys (markets)[0]);
```
Because `fmfwio` lists a different market set from `hitbtc`, call `load_markets()` and pick symbols from it rather than assuming a pair exists.
This venue has no WebSocket implementation in CCXT, so there are no `watch*` methods for `fmfwio` — use the `fetch*` methods and poll. `hitbtc` does have streaming if the global venue suits your use case.
## Should you use this class or the parent? [#should-you-use-this-class-or-the-parent]
Use `fmfwio` when you hold an account with FMFW\.io specifically. Use [`hitbtc`](/docs/exchanges/hitbtc) when you hold an account with the global venue. They are different venues with separate credentials, so this is not a preference — it follows from where your account is.
## FAQ [#faq]
**Do my `hitbtc` API keys work with `fmfwio`?**
No. It is a separate legal entity with separate accounts; you need keys issued by FMFW\.io.
**Does `fmfwio` support the full unified API?**
It inherits 54 unified capabilities from `hitbtc`. Where the venue does not offer a feature, the corresponding `has` flag is turned off, and the method raises `NotSupported` rather than failing quietly. Check `exchange.has` at runtime.
**Can I reach FMFW\.io-specific endpoints?**
Yes — all 111 endpoints in this class's `api` block are generated as implicit methods, with signing, rate limiting and error mapping applied. The mechanism is documented on the [`hitbtc` implicit API page](/docs/exchanges/hitbtc/implicit-api); this venue's own endpoint list differs slightly from the parent's.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [CCXT vs the HitBTC API](/docs/comparisons/ccxt-vs-hitbtc-api) — the full comparison
* [`hitbtc` API reference](/docs/exchanges/hitbtc) — `fmfwio` inherits it; it has no separate reference page
* [Install CCXT](/docs/install)
* [Manual](/docs/manual)
* [More comparisons](/docs/comparisons)
# CCXT vs the Foxbit API and the official Foxbit SDK (/docs/comparisons/ccxt-vs-foxbit-api)
[Foxbit](https://app.foxbit.com.br) is a Brazilian exchange, and the BRL pairs are the point: `BTC/BRL`, `ETH/BRL`, `USDT/BRL` and a long tail beside them. Its REST v3 API is signed with an HMAC over the timestamp, method, path, query string and body.
Two ways to integrate: the official SDK, [`@foxbit-group/rest-api`](https://www.npmjs.com/package/@foxbit-group/rest-api), which Foxbit recommends for new projects and which is available for JavaScript and TypeScript; or [CCXT](/docs/manual), which speaks the same REST v3 API behind the interface it uses for 103 other venues.
The question that decides it: **are you writing JavaScript, and is Foxbit your only venue?**
## TL;DR [#tldr]
* **Pick the official SDK** if you are in JavaScript or TypeScript, Foxbit is your only venue, and you want typed models that match Foxbit's own API surface one-for-one.
* **Pick CCXT** if you want unified symbols and structures, eight languages, a built-in rate limiter and typed errors — the same code shape you already use for Binance or Kraken.
* **Neither side streams.** CCXT implements **no `watch*` methods for Foxbit**, and the official SDK is REST-only — its name says so. Foxbit's WebSocket v2 has one sample, in JavaScript, in the samples repository. If you need live streams from Foxbit, that is a hand-written integration either way.
## At a glance [#at-a-glance]
| | **CCXT** | **@foxbit-group/rest-api** |
| --------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| Venues covered | 104 (Foxbit is one of them) | Foxbit only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | JavaScript and TypeScript |
| Packages to install | 1 (`ccxt`) | 1 (`@foxbit-group/rest-api`) |
| Unified market data + trading API | yes — 37 unified capabilities, 24 `fetch*` methods | no — Foxbit's own request and response models |
| Instrument addressing | unified symbols: `'BTC/BRL'`, `'BTC/USDT'` | market symbols: `btcbrl` |
| Products | spot | spot |
| WebSockets | **no** — 0 `watch*` methods for this venue | no — REST v3 only; a WebSocket v2 sample exists in JavaScript in the samples repository |
| Raw endpoint access | yes — 22 Foxbit endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 33.334 ms — 30 requests per second) | manual |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP errors plus Foxbit's error body |
| Precision helpers | `amount_to_precision`, `price_to_precision`, `Precise` string math | Foxbit's own precision fields |
| Testnet / sandbox | not available for this venue | not available |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 151 npm installs/month; the `foxbit-api-samples` repository has 4 stars |
| Latest release | continuous | 0.1.4 |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues on the samples repository |
Figures verified September 2026 against CCXT v4.5.78, the `foxbit-group/foxbit-api-samples` repository and its SDK and raw-REST examples, the `@foxbit-group/rest-api` npm registry metadata, live responses from `api.foxbit.com.br`, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw REST v3
```python
import ccxt
exchange = ccxt.foxbit()
ticker = exchange.fetch_ticker('BTC/BRL')
print(ticker['last'], ticker['baseVolume'], ticker['quoteVolume'])
```
```javascript
const axios = require('axios');
const response = await axios.get(
'https://api.foxbit.com.br/rest/v3/markets/btcbrl/ticker/24hr');
const t = response.data.data[0];
console.log(t.last_trade.price, t.rolling_24h.volume, t.rolling_24h.quote_volume);
```
Foxbit's ticker nests the interesting fields: `last_trade.price`, `rolling_24h.open/high/low/volume/quote_volume`, `best.ask.price` and `best.bid.price`. CCXT flattens that into a [unified ticker structure](/docs/manual#ticker-structure) — `last`, `open`, `high`, `low`, `bid`, `ask`, `baseVolume`, `quoteVolume`, `percentage`, `timestamp` in milliseconds — the same keys and units as every other exchange, and the symbol is `'BTC/BRL'` rather than `btcbrl`.
### Place a limit order [#place-a-limit-order]
CCXT
@foxbit-group/rest-api
```python
import ccxt
exchange = ccxt.foxbit({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/BRL', 'limit', 'buy', 0.0001, 500000)
print(order['id'], order['status'])
exchange.cancel_order(order['id'], 'BTC/BRL')
```
```javascript
const { Configuration, TradingApi } = require('@foxbit-group/rest-api');
const config = new Configuration({
apiKey: process.env.FOXBIT_API_KEY,
apiSecret: process.env.FOXBIT_API_SECRET,
});
const tradingApi = new TradingApi(config);
const orderResponse = await tradingApi.createOrder({
createOrderRequest: {
market_symbol: 'btcbrl',
side: 'BUY',
type: 'LIMIT',
price: '500000.0',
quantity: '0.0001',
},
});
await tradingApi.cancelOrders({
cancelOrdersRequest: { type: 'ID', id: orderResponse.data.id },
});
```
Both are readable, and both sign for you. The difference is portability, not verbosity: the SDK's `market_symbol`, `side: 'BUY'` and string `quantity` are Foxbit's own field names, so moving the strategy to a second venue means a second vocabulary. CCXT returns a [unified order structure](/docs/manual#order-structure), and the same `create_order` call works on 103 other exchanges.
If you write it yourself instead, the signing is:
```javascript
const preHash = `${timestamp}${method}${path}${queryString}${rawBody}`;
const signature = CryptoJS.HmacSHA256(preHash, process.env.FOXBIT_API_SECRET).toString();
// sent as X-FB-ACCESS-KEY, X-FB-ACCESS-TIMESTAMP, X-FB-ACCESS-SIGNATURE
```
CCXT builds that string and those headers internally, including the awkward part — the query string has to be reconstructed in the exact order it was sent.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, not two [#eight-languages-not-two]
This is the biggest practical difference. Foxbit's samples repository has raw REST v3 examples in twelve languages, but the **official SDK is JavaScript and TypeScript only**. If your service is Python, Go, C#, PHP or Java, the SDK is not available to you and the samples are starting points you finish yourself.
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures.
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.foxbit ();
const ticker = await exchange.fetchTicker ('BTC/BRL');
```
```python
import ccxt
exchange = ccxt.foxbit()
ticker = exchange.fetch_ticker('BTC/BRL')
```
```go
exchange := ccxt.NewFoxbit(nil)
ticker, err := exchange.FetchTicker("BTC/BRL")
```
### BRL alongside everything else [#brl-alongside-everything-else]
A Brazilian desk usually runs BRL pairs on a local venue and quotes against a global one. In CCXT that is a loop, not two integrations:
```python
import ccxt
foxbit = ccxt.foxbit()
binance = ccxt.binance()
local = foxbit.fetch_ticker('BTC/BRL')['last']
offshore = binance.fetch_ticker('BTC/USDT')['last']
print(local, offshore)
```
Both tickers are the same structure, so the spread calculation does not care which venue produced which number.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT's Foxbit definition sets `rateLimit` to 33.334 ms — 30 requests per second, expressed as milliseconds per request — with per-endpoint weights, and the throttler is **on by default** (`enableRateLimit = true`). You call methods in a loop; the library paces them.
### Precision and string math [#precision-and-string-math]
Foxbit publishes per-market price and quantity precision, and BRL prices run to six figures where the quantity runs to eight decimal places — exactly the range where float rounding starts producing rejected orders. CCXT loads the metadata with the markets and rounds through the `Precise` string-arithmetic class:
```python
amount = exchange.amount_to_precision('BTC/BRL', 0.000123456789)
price = exchange.price_to_precision('BTC/BRL', 396217.123456)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Foxbit's error responses onto its [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded`, `NetworkError` and 35 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once and it keeps working on the next exchange.
### Account plumbing is unified too [#account-plumbing-is-unified-too]
Beyond trading, the venue's unified capabilities include `fetchBalance`, `fetchLedger`, `fetchMyTrades`, `fetchOrders`, `fetchOpenOrders`, `fetchClosedOrders`, `fetchCanceledOrders`, `fetchDepositAddress`, `fetchDeposits`, `fetchWithdrawals`, `fetchTransactions`, `fetchTradingFees` and `fetchCurrencies` — 37 unified capabilities in total, 24 of them `fetch*` methods.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the unified methods, **all 22 Foxbit endpoints are generated as callable implicit methods**, with signing, rate limiting and error mapping applied:
```python
response = exchange.v3_public_get_markets()
```
Browse them on the [Foxbit implicit API page](/docs/exchanges/foxbit/implicit-api).
## What the official Foxbit SDK does better [#what-the-official-foxbit-sdk-does-better]
Real advantages, not padding:
* **Typed models that match Foxbit's API exactly.** Full TypeScript typing, built-in parameter validation and automatic error handling, against Foxbit's own request and response shapes. When you are reading Foxbit's reference while debugging, that is one hop instead of two.
* **Twelve languages of raw samples.** The `foxbit-api-samples` repository has REST v3 examples in JavaScript, TypeScript, Go, Python, Ruby, PHP, C#, Java, C++, Dart, Kotlin and Swift. Dart, Kotlin, Swift, Ruby and C++ are outside CCXT's eight languages entirely — if you are writing a Flutter or iOS app, that is where you start.
* **The WebSocket v2 sample.** Foxbit's samples repository has a JavaScript WebSocket example. CCXT has no streaming support for Foxbit at all, so live data means the raw socket regardless.
* **New endpoints on day one.** Whatever Foxbit ships appears in their own SDK and samples first; a *unified* CCXT method may follow later, though the implicit API closes most of that gap immediately.
* **A much smaller install.** For a Foxbit-only Node service, `@foxbit-group/rest-api` is a fraction of the size of all of CCXT.
If you are building a Foxbit-only application in JavaScript or TypeScript, the official SDK is the better fit — and if you need Foxbit's live feed, you will be writing WebSocket code yourself either way.
## Migrating from the Foxbit SDK to CCXT [#migrating-from-the-foxbit-sdk-to-ccxt]
| What you are doing | Foxbit REST v3 / SDK | CCXT |
| ---------------------- | --------------------------------------------- | ------------------------------------------------------------------------------ |
| Markets | `GET /rest/v3/markets` | `load_markets()` |
| Symbols | `btcbrl` | `'BTC/BRL'` |
| Ticker | `GET /rest/v3/markets/{market}/ticker/24hr` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | the order-book endpoint | `fetch_order_book()` / `fetch_l2_order_book()` |
| Candles | the candles endpoint | `fetch_ohlcv()` |
| New order | `tradingApi.createOrder({...})` | `create_order()` |
| Cancel | `tradingApi.cancelOrders({ type: 'ID', id })` | `cancel_order()` / `cancel_all_orders()` |
| Open orders | `tradingApi.listOrders({ state: 'ACTIVE' })` | `fetch_open_orders()` |
| Fills | the trades endpoint | `fetch_my_trades()` |
| Account | `memberApi.currentMember()` | `fetch_balance()` |
| Ledger | the ledger endpoint | `fetch_ledger()` |
| Deposits / withdrawals | the wallet endpoints | `fetch_deposits()` / `fetch_withdrawals()` |
| Anything not listed | the raw path | the same endpoint as an [implicit method](/docs/exchanges/foxbit/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [foxbit unified API reference](/docs/exchanges/foxbit).
## FAQ [#faq]
**Does Foxbit have an official Python SDK?**
No. The official SDK, `@foxbit-group/rest-api`, is published for JavaScript and TypeScript. Foxbit's samples repository has raw REST v3 examples in Python and eleven other languages, but they are examples rather than a maintained package. For Python, Go, C#, PHP or Java, CCXT is the maintained option.
**Does CCXT support Foxbit WebSockets?**
No. CCXT implements zero `watch*` methods for Foxbit, so streaming is not available through CCXT for this venue. Foxbit documents a WebSocket v2 API and ships one JavaScript sample for it.
**Does CCXT support Foxbit's BRL pairs?**
Yes — Foxbit is a spot venue and its BRL markets load as ordinary unified symbols: `'BTC/BRL'`, `'ETH/BRL'`, `'USDT/BRL'` and the rest, alongside `'BTC/USDT'`.
**Does Foxbit have a sandbox CCXT can use?**
`setSandboxMode` is not available for this venue in CCXT — no test URLs are declared. Test with small live orders, or against static fixtures.
**Can I still call Foxbit-specific endpoints from CCXT?**
Yes — all 22 of them, as [implicit methods](/docs/exchanges/foxbit/implicit-api), with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, no paid tier.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [foxbit unified API reference](/docs/exchanges/foxbit)
* [foxbit implicit API](/docs/exchanges/foxbit/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs Freqtrade (/docs/comparisons/ccxt-vs-freqtrade)
If you are comparing these two, the first thing to know is that they are not competitors: **Freqtrade uses CCXT for every exchange call it makes.** Its exchange-configuration documentation states that "Freqtrade is based on [CCXT library](https://github.com/ccxt/ccxt) that supports over 100 cryptocurrency exchange markets and trading APIs", and `ccxt>=4.5.76` is the first entry in its `pyproject.toml` dependency list.
[Freqtrade](https://github.com/freqtrade/freqtrade) is "a free and open source crypto trading bot written in Python … designed to support all major exchanges and be controlled via Telegram or webUI", with backtesting, plotting, money management and machine-learning strategy optimisation. [CCXT](/docs/manual) is the exchange layer underneath. So the real question is not which to pick. It is **which layer your problem lives at**.
## TL;DR [#tldr]
* **Pick Freqtrade** if your problem is a candle-based strategy that you want to backtest, hyperopt, dry-run and then operate from Telegram or a web UI. It supplies all of that, and you would be rebuilding it on top of CCXT otherwise.
* **Pick CCXT directly** if you are building your own system, need a venue or a unified method Freqtrade does not expose, or want the exchange layer in TypeScript, Go, C#, PHP or Java rather than Python.
* **Choosing Freqtrade is choosing CCXT.** It is already there, one import away, and the config file has documented hooks for passing options straight through to it.
## At a glance [#at-a-glance]
| | **CCXT** | **Freqtrade** |
| ---------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| What it is | exchange-access library | strategy runner and trading bot |
| Exchange access | its own | CCXT (`ccxt>=4.5.76`), sync and `ccxt.pro` |
| Exchanges | 104 REST, 76 with WebSocket | 15 ids in its `SUPPORTED_EXCHANGES` list; any other CCXT exchange that passes its capability check may be attempted |
| Spot venues named in the README | n/a — all 104 are supported the same way | Binance, BingX, Bitget, Bybit EU, Bybit, Gate EU, Gate, HTX, Hyperliquid, Kraken, MyOKX, OKX |
| Futures venues named in the README | n/a | Binance, Bitget, Bybit, Gate, Hyperliquid, Kraken, OKX |
| Community-tested venues | n/a | Bitvavo, KuCoin |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust | Python 3.11+ |
| Streaming | `watch*` on 76 exchanges — books, trades, tickers, OHLCV, orders, positions | through `ccxt.pro`, currently limited to OHLCV streams, with REST fallback |
| Strategy engine | none — you write the loop | `populate_indicators` / `populate_entry_trend` / `populate_exit_trend` on pandas dataframes |
| Backtesting | none | yes, plus `hyperopt` and FreqAI adaptive modelling |
| Control surface | none — it is a library | Telegram bot, FreqUI web UI, REST API, CLI |
| Persistence | none | SQLite |
| Raw endpoint access | yes — every endpoint as an implicit method (808 on Binance) | via the CCXT instance underneath |
| Unified error types | 41 typed exceptions in one hierarchy | maps CCXT exceptions onto its own `DDosProtection`, `TemporaryError`, `OperationalException` |
| Popularity | 43.8k GitHub stars · 4.7M PyPI + 494k npm installs/month | 54k GitHub stars, 11.2k forks · 73k PyPI installs/month |
| Licence | MIT | GPL-3.0 |
| Support | Discord, Telegram, GitHub issues | Discord, GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the Freqtrade repository on `develop` (README, `pyproject.toml`, `LICENSE`, `freqtrade/exchange/`), freqtrade.io documentation, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Buy when RSI crosses back above 30 [#buy-when-rsi-crosses-back-above-30]
CCXT
Freqtrade
```python
import ccxt
import pandas as pd
exchange = ccxt.binance({'apiKey': '...', 'secret': '...'})
candles = exchange.fetch_ohlcv('BTC/USDT', '5m', limit=500)
df = pd.DataFrame(candles, columns=['ts', 'open', 'high', 'low', 'close', 'volume'])
delta = df['close'].diff()
gain = delta.clip(lower=0).ewm(alpha=1 / 14).mean()
loss = -delta.clip(upper=0).ewm(alpha=1 / 14).mean()
df['rsi'] = 100 - 100 / (1 + gain / loss)
if df['rsi'].iloc[-2] < 30 <= df['rsi'].iloc[-1]:
exchange.create_order('BTC/USDT', 'market', 'buy', 0.001)
```
```python
class MyStrategy(IStrategy):
timeframe = '5m'
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe['rsi'] = ta.RSI(dataframe)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(qtpylib.crossed_above(dataframe['rsi'], 30)) & (dataframe['volume'] > 0),
'enter_long',
] = 1
return dataframe
```
The Freqtrade version is shorter because it is only the part that is actually about your strategy. The scheduling, the pair whitelist, the candle cache, the stake sizing, the order placement, the trade record and the Telegram notification are all supplied. The CCXT version is longer because none of that exists yet — but it is also the whole program, running wherever and however you want it to.
Note what does *not* change: the symbol is `'BTC/USDT'` on both sides, and the candles behind Freqtrade's dataframe came from `fetch_ohlcv` on a CCXT exchange object.
### Read the live order book [#read-the-live-order-book]
CCXT
Freqtrade
```python
import asyncio
import ccxt.pro
async def main():
exchange = ccxt.pro.binance()
while True:
book = await exchange.watch_order_book('BTC/USDT')
print(book['bids'][0], book['asks'][0])
asyncio.run(main())
```
```python
if self.dp.runmode.value in ('live', 'dry_run'):
ob = self.dp.orderbook(metadata['pair'], 1)
dataframe['best_bid'] = ob['bids'][0][0]
dataframe['best_ask'] = ob['asks'][0][0]
```
Freqtrade's data provider hands you a REST snapshot in CCXT's [order-book structure](/docs/manual#order-book-structure) — its own documentation links to the CCXT manual for the shape. That is enough for a strategy that decides once per candle. It is not a stream: Freqtrade's WebSocket support runs through `ccxt.pro` but, as its configuration docs state, "usage is limited to ohlcv data streams". If you need a live book, live trades or live order updates, that is `watch_order_book`, `watch_trades` and `watch_orders` on the CCXT instance — the same library, one layer down.
## Where the differences actually bite [#where-the-differences-actually-bite]
### The dependency runs one way [#the-dependency-runs-one-way]
Everything Freqtrade knows about an exchange, it learned from CCXT. `freqtrade/exchange/exchange.py` builds a sync `ccxt` client and an async `ccxt.pro` client on start-up and logs the CCXT version it is running. `exchange_has()` is a lookup into CCXT's `has` dictionary. `features()` reads CCXT's `features` block. Rounding uses CCXT's `decimal_to_precision`, `TICK_SIZE` and `ROUND_UP`/`ROUND_DOWN`. Demo trading calls CCXT's `enable_demo_trading()`.
Most of its 26 per-exchange classes are quirk tables rather than integrations. The Bitvavo one is 24 lines, and the payload is a single dictionary entry, `{"ohlcv_candle_limit": 1440}`. Kucoin's adds a stop-order parameter name, an order-book depth range and a time-in-force list. The actual talking to the exchange happens one layer down.
The consequence is practical. If a venue's behaviour changes, the fix usually lands in CCXT first and reaches you when Freqtrade's dependency floor moves. And a bug you hit inside Freqtrade is often reproducible in four lines of CCXT, which is a much better bug report.
### The venue lists are different sizes for a reason [#the-venue-lists-are-different-sizes-for-a-reason]
Freqtrade's `SUPPORTED_EXCHANGES` constant names 15 ids, and its README lists 12 spot venues, 7 futures venues and 2 community-tested ones. That is not a coverage ceiling — it is a *tested* list. `freqtrade list-exchanges` enumerates `ccxt.exchanges` and filters it by whether each venue reports the capabilities Freqtrade needs (`fetchOrder`, `fetchL2OrderBook`, `cancelOrder`, `createOrder`, `fetchBalance`, `fetchOHLCV`), which is why the README ends its spot list with "potentially many others" linking to the CCXT repository, followed by "(We cannot guarantee they will work)".
CCXT's 104 is a coverage number. Freqtrade's is a support commitment. Both are honest and they mean different things.
### Freqtrade sees the world as candles [#freqtrade-sees-the-world-as-candles]
The strategy interface is a pandas dataframe of OHLCV rows per pair, and everything else is arranged around that: pairlist handlers, the candle cache, backtesting, hyperopt. It fits trend and mean-reversion strategies extremely well.
It fits some things badly by construction. Order-book-driven execution, options, quoting both sides of a spread, or anything that has to react within a candle rather than at its close — those want the exchange layer directly. A bot is also configured with a single `exchange` block, so cross-venue work means running more than one of it. And CCXT's unified API covers ground the strategy interface does not surface at all: `fetch_liquidations`, transfers between account types, deposit addresses, and 7 prediction-market venues in `ccxt.prediction`.
### One language versus eight [#one-language-versus-eight]
Freqtrade is Python 3.11+. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with identical method names and return structures. If the trading service is in Go and the research is in Python, the exchange layer is the same library in both.
### Licence [#licence]
Freqtrade is **GPL-3.0**; CCXT is **MIT**. Running Freqtrade for yourself raises no question at all. Building a product that redistributes a modified Freqtrade is a conversation with your lawyers, and one that CCXT's licence does not start.
## What Freqtrade does better [#what-freqtrade-does-better]
* **Backtesting, and the tooling around it.** `backtesting`, `backtesting-analysis`, `plot-dataframe`, `plot-profit`, `lookahead-analysis` and `recursive-analysis` — the last two exist specifically to catch look-ahead bias and recursive-formula bugs in your own strategy. CCXT has no backtester and no opinion about one.
* **Hyperparameter optimisation.** `hyperopt`, `hyperopt-list` and `hyperopt-show` search strategy parameters against real exchange data, with pluggable loss functions. Writing that yourself is a project.
* **FreqAI.** An adaptive machine-learning layer that retrains models on a rolling window as the market moves, wired into the same strategy interface.
* **Operating a live bot.** Telegram control (`/status`, `/profit`, `/balance`, `/forceexit`, `/performance`), the FreqUI web interface, a REST API, SQLite persistence of every trade, and dry-run mode that runs the full loop without touching money. All of that is the unglamorous 80% of running a bot, and it is done.
* **Exchange quirks already absorbed.** Its 26 exchange classes encode stop-order parameter names, candle limits, time-in-force sets and order-book depth ranges per venue — knowledge you would otherwise rediscover the hard way.
* **The parts of a bot nobody enjoys writing.** Stoploss handling — including exchange-side stoploss on venues whose quirk table declares `stoploss_on_exchange` — `minimum_roi` exits, and dynamic whitelisting and blacklisting of pairs are all built in and tested.
If your problem is "I have a candle-based idea and I want it backtested, tuned and running by the weekend", Freqtrade is unambiguously the better choice, and reaching for CCXT directly would mean rebuilding most of the above.
## Using them together [#using-them-together]
Migration is the wrong frame here — Freqtrade *is* a CCXT application. The useful question is where the boundary sits and how to cross it.
**Reaching CCXT from inside Freqtrade.** The exchange config block has documented pass-throughs:
```json
"exchange": {
"name": "binance",
"api_key": "your_exchange_api_key",
"secret": "your_exchange_secret",
"ccxt_config": { "enableRateLimit": true },
"ccxt_sync_config": {},
"ccxt_async_config": { "rateLimit": 3100 }
}
```
`exchange.name` is the CCXT exchange id — it is passed to `getattr(ccxt, name.lower())`. `ccxt_config` goes to both clients, `ccxt_sync_config` and `ccxt_async_config` to one each, and Freqtrade's own docs point at the CCXT manual for what belongs in them. Proxy configuration, `options`, per-venue flags and rate-limit tuning all go through this hole.
Inside a strategy, several data-provider methods return CCXT structures unchanged: `self.dp.market(pair)` is the CCXT [market structure](/docs/manual#market-structure), `self.dp.ticker(pair)` the [ticker](/docs/manual#ticker-structure), `self.dp.orderbook(pair, n)` the [order book](/docs/manual#order-book-structure), and `self.dp.funding_rate(pair)` the funding-rate structure. The CCXT client objects themselves live on private attributes (`_api` for sync, `_api_async` for `ccxt.pro`), so treat them as an escape hatch rather than a supported interface.
**When to step outside.** Run Freqtrade for what it is good at and CCXT alongside it when you need:
| You need | Where it lives |
| ----------------------------------------------------------- | --------------------------------------------------------------------- |
| A venue Freqtrade has not tested | `ccxt.()` directly — 104 to choose from |
| Live order books, trades or order updates | `watch_order_book`, `watch_trades`, `watch_orders` on `ccxt.pro.` |
| Liquidations, transfers between accounts, deposit addresses | `fetch_liquidations`, `transfer`, `fetch_deposit_address` |
| Prediction markets | `ccxt.prediction.polymarket()`, `ccxt.prediction.kalshi()` |
| A venue-specific endpoint with no unified method | the [implicit API](/docs/exchanges/binance/implicit-api) |
| The exchange layer in Go, C#, TypeScript, PHP or Java | the same CCXT API in that language |
A common shape: Freqtrade runs the candle strategies, and a small separate CCXT service handles book-driven execution, funding-carry monitoring or a venue outside the tested list. They share nothing but the exchange, and they agree about it because they are talking to the same library.
## FAQ [#faq]
**Does Freqtrade use CCXT?**
Yes. `ccxt>=4.5.76` is the first dependency in its `pyproject.toml`, and `freqtrade/exchange/exchange.py` constructs both a sync `ccxt` client and an async `ccxt.pro` client for every exchange it trades. Its exchange documentation states outright that "Freqtrade is based on CCXT library".
**Can Freqtrade trade on an exchange that is not in its README list?**
It can attempt to. `freqtrade list-exchanges` walks CCXT's full exchange list and reports which venues expose the capabilities Freqtrade requires. The README's spot list ends with "potentially many others" pointing at the CCXT repository, with the caveat "We cannot guarantee they will work". Untested is not the same as unsupported — but it does mean you are the one testing it.
**Do I still need CCXT if I use Freqtrade?**
You already have it — it is installed as a dependency. You would import it directly when you need something outside Freqtrade's candle-shaped world: a live order-book stream, a second venue in the same process, an untested exchange, a prediction market, or an exchange-specific endpoint.
**Is Freqtrade's WebSocket support the same as CCXT Pro?**
It is CCXT Pro underneath, but only part of it. Freqtrade's configuration docs say WebSocket usage "is limited to ohlcv data streams" and falls back to REST if the socket fails; it can be disabled with `exchange.enable_ws`. CCXT Pro itself exposes `watch_order_book`, `watch_trades`, `watch_ticker`, `watch_orders`, `watch_my_trades`, `watch_positions` and `watch_balance` across 76 exchanges.
**How do I pass a CCXT option through Freqtrade?**
Use `ccxt_config` in the exchange block of your config, or `ccxt_sync_config` / `ccxt_async_config` to target one client. Those dictionaries are merged straight into the CCXT constructor, so anything documented as a constructor property in the [CCXT manual](/docs/manual) works.
**Which is more popular?**
Different units, so compare carefully. Freqtrade has 54k GitHub stars and about 73k PyPI installs a month, as one application. CCXT has 43.8k stars and about 4.7M PyPI plus 494k npm installs a month, as a library that many applications — Freqtrade among them — depend on. Both figures were read in September 2026.
## Next steps [#next-steps]
* [Install CCXT](/docs/install)
* [Manual](/docs/manual) — unified structures and conventions
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [Supported exchanges](/docs/exchange-markets)
* [More comparisons](/docs/comparisons)
# CCXT vs the Gate API and gateapi-python (/docs/comparisons/ccxt-vs-gate-api)
Gate publishes official API clients for Python, Node/TypeScript, Go, Java, PHP and C#, all generated from its OpenAPI specification by [OpenAPI Generator](https://openapi-generator.tech). The Python one is [`gate-api`](https://github.com/gate/gateapi-python); WebSockets are a separate library, [`gatews`](https://github.com/gate/gatews), which the repository describes as "intended to work along with `gateapi-*` series".
[CCXT](/docs/manual) is the alternative: a hand-curated unified API that speaks Gate natively and covers 103 other venues with the same method names, REST and streaming in one package.
The choice comes down to one question: **do you want a client shaped like Gate's API, or a client shaped like every exchange's API?**
## TL;DR [#tldr]
* **Pick the official Gate SDKs** if Gate is your only venue and you want a generated client whose classes, fields and version numbers track Gate's own API surface exactly.
* **Pick CCXT** if you want one dependency covering Gate spot, margin, perpetual futures, delivery futures and options — plus the next hundred exchanges — with WebSockets in the same install.
* **Generated is not the same as complete-for-you.** A generated SDK gives you every endpoint; it does not give you a merged order book, a rate limiter, tick-size rounding or one error type across venues. Those are the parts you would write yourself.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Gate SDKs** |
| --------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Gate is one of them) | Gate only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, Node/TypeScript, Go, Java, PHP, C# — separate generated codebases |
| Packages to install | **1** (`ccxt`) — REST and WebSocket | **2** in Python: `gate-api` for REST, `gate-ws` for streaming |
| Gate products in one client | spot, margin, perpetual futures, delivery futures, options | one generated API class per product line (`SpotApi`, `FuturesApi`, `OptionsApi`, `UnifiedApi`, `AccountApi`, …) |
| Unified market data + trading API | yes — 115 unified capabilities, 51 `fetch*` methods | no — Gate's generated request and response models |
| WebSockets | yes — 16 `watch*`/`unWatch*` methods, same shapes as `fetch*` | yes, in `gate-ws`: `Connection` plus per-channel classes and callbacks |
| Raw endpoint access | yes — 339 Gate endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 50 ms) | manual |
| Unified error types | yes — 41 typed exceptions in one hierarchy | `GateApiException` carrying Gate's `label` and `message` |
| Testnet / sandbox | `exchange.set_sandbox_mode(True)` — swaps in `api-testnet.gateapi.io` | set `host` on `Configuration` yourself |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `gate-api` 64k PyPI installs/month; the repository moved to `gate/gateapi-python` (26 stars), leaving `gateio/gateapi-python` archived at 344 |
| Licence | MIT | Apache-2.0 (per the `gate-api` package metadata) |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `gate/gateapi-python` and `gate/gatews` repositories and their READMEs, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
gate-api
```python
import ccxt
exchange = ccxt.gate()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
import gate_api
from gate_api.exceptions import ApiException, GateApiException
api_client = gate_api.ApiClient()
spot_api = gate_api.SpotApi(api_client)
try:
tickers = spot_api.list_tickers(currency_pair='BTC_USDT')
print(tickers[0].last)
except GateApiException as ex:
print("Gate api exception, label: %s, message: %s" % (ex.label, ex.message))
```
`list_tickers` returns Gate's own model with Gate's field names and string numbers. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, types and units you get from Binance, Kraken or Hyperliquid — so the code that consumes it does not care which venue produced it.
### Place a limit order [#place-a-limit-order]
CCXT
gate-api
```python
import ccxt
exchange = ccxt.gate({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
exchange.cancel_order(order['id'], 'BTC/USDT')
```
```python
import gate_api
from gate_api import Order
configuration = gate_api.Configuration(
host="https://api.gateio.ws/api/v4",
key="YOUR_API_KEY",
secret="YOUR_API_SECRET",
)
spot_api = gate_api.SpotApi(gate_api.ApiClient(configuration))
order = Order(amount='0.001', price='60000', side='buy', currency_pair='BTC_USDT')
created = spot_api.create_order(order)
```
To place that order on Gate's perpetual futures with the official SDK you move to `FuturesApi`, a different order model and a settle-currency argument. In CCXT you change the symbol:
```python
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 1, 60000) # USDT-settled perpetual
```
### Stream trades [#stream-trades]
CCXT
gate-ws
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.gate()
while True:
trades = await exchange.watch_trades('BTC/USDT')
for t in trades:
print(t['symbol'], t['side'], t['amount'], t['price'])
asyncio.run(main())
```
```python
import asyncio
from gate_ws import Configuration, Connection
from gate_ws.spot import SpotPublicTradeChannel
def print_message(conn, response):
if response.error:
conn.close()
return
print(response.result)
async def main():
conn = Connection(Configuration())
channel = SpotPublicTradeChannel(conn, print_message)
channel.subscribe(["BTC_USDT"])
await conn.run()
asyncio.run(main())
```
Two things are different here, and only one of them is style. The style difference is push versus pull: `gate-ws` gives you a callback and a connection to run, CCXT gives you a value to `await`. The other difference is the install — streaming Gate data with the official libraries means a second package with its own release cadence, while `watch_trades` is in the same `ccxt` you already imported.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Generated breadth, curated depth [#generated-breadth-curated-depth]
A generated SDK is a faithful projection of an OpenAPI document: every endpoint, every field, no interpretation. That is genuinely useful, and it is also exactly where the work stops. It does not merge order-book diffs into a live book, model per-endpoint rate-limit weights, round an amount to Gate's tick size, or turn Gate's error labels into types you can catch across venues.
CCXT's Gate implementation is hand-written on top of the same endpoints and does those things. That is the trade: less literal about Gate's payloads, more finished as a client.
### Five product lines, one client [#five-product-lines-one-client]
`ccxt.gate` declares `spot`, `margin`, `swap`, `future` and `option` all true. The unified symbol chooses the venue-side product:
```python
exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000) # spot
exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 1, 60000) # USDT perpetual
exchange.create_order('BTC/USD:BTC', 'limit', 'buy', 1, 60000) # inverse contract
```
With the official SDK each of those is a different generated API class with its own models and its own settle-currency plumbing.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures.
TypeScript
Python
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.gate ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```python
import ccxt
exchange = ccxt.gate()
ticker = exchange.fetch_ticker('BTC/USDT')
```
Gate also publishes clients in six languages, but they are six generated codebases with six idioms — not one API expressed eight ways. A strategy prototyped in Python ports to Go or C# without redesigning the data model.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Gate meters per endpoint. CCXT encodes those costs in the exchange definition and ships a token-bucket throttler that is **on by default** (`enableRateLimit = true`, base `rateLimit` 50 ms). You call methods in a loop; the library paces them. With a generated client, backing off correctly is application code you write and maintain.
### Precision, rounding and string math [#precision-rounding-and-string-math]
Gate rejects orders that violate its tick size, amount increment or minimum notional. CCXT loads the market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities never drift through float rounding.
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### One error hierarchy [#one-error-hierarchy]
`GateApiException` tells you Gate's `label` and `message`, which is precise and Gate-specific. CCXT maps those labels onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError` and 35 more under one `BaseError`. You write `except ccxt.InsufficientFunds` once and the handler still works when the next venue calls the same condition something else.
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.gate({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps in api-testnet.gateapi.io
```
One flag swaps every REST and WebSocket URL, instead of threading a different `host` through each `Configuration` and a different endpoint through the WebSocket library.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 115 unified capabilities CCXT implements for Gate, **all 339 endpoints in Gate's API are generated as callable implicit methods**:
```python
response = exchange.private_spot_get_accounts()
```
Signing, timestamping, rate-limit accounting and error mapping still apply, so the unified API covers what every venue shares and the implicit API covers the Gate-specific remainder. Browse them on the [gate implicit API page](/docs/exchanges/gate/implicit-api).
## What the official Gate SDKs do better [#what-the-official-gate-sdks-do-better]
Real advantages:
* **Exhaustive, machine-checked coverage.** Because the clients are regenerated from Gate's OpenAPI spec, every endpoint and every field is present and typed the moment Gate publishes it, in all six languages at once, with a generated reference page per API class.
* **Version numbers that tell you which API you are on.** From 4.15.2 onwards the package's MINOR and PATCH match the REST API version, with MAJOR bumped for breaking changes. Pinning `gate-api` pins a known Gate API version — CCXT versions track CCXT, not Gate.
* **Gate-native error identity.** `GateApiException.label` is Gate's own error label, with no mapping in between. If you are writing venue-specific recovery logic, that is the shortest path.
* **Very wide Python support.** The README states support for Python 2.7 and 3.4 or later, which matters if you are stuck on a legacy runtime.
* **Smaller dependency for one product line.** If all you do is read Gate spot tickers, `gate-api` alone is a smaller install than all of CCXT.
If Gate is your only venue and you value a literal, generated projection of its API over portability, the official SDKs are a defensible choice.
## If you want CCXT but only this one venue [#if-you-want-ccxt-but-only-this-one-venue]
CCXT publishes a single-exchange Python distribution built from the same source: [`ccxt/gate-python`](https://github.com/ccxt/gate-python).
```bash
pip install gate-io-api
```
It exposes `GateSync`, `GateAsync` and `GateWs` — unified methods, WebSockets and the implicit endpoints, without the other 103 exchanges — from the same codebase, so moving to full `ccxt` later is an import change.
## Migrating from gate-api to CCXT [#migrating-from-gate-api-to-ccxt]
| What you are doing | gate-api / gate-ws | CCXT |
| ------------------- | ----------------------------------------- | ---------------------------------------------------------------------------- |
| Symbols | `'BTC_USDT'` | `'BTC/USDT'` spot, `'BTC/USDT:USDT'` perpetual |
| Product selection | `SpotApi` / `FuturesApi` / `OptionsApi` | the symbol, or `options.defaultType` |
| Credentials | `gate_api.Configuration(key=…, secret=…)` | `ccxt.gate({'apiKey': …, 'secret': …})` |
| Pairs list | `list_currency_pairs()` | `load_markets()` |
| Ticker | `list_tickers()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `list_order_book()` | `fetch_order_book()` |
| Candles | `list_candlesticks()` | `fetch_ohlcv()` |
| New order | `create_order(Order(...))` | `create_order()` |
| Balance | `list_spot_accounts()` | `fetch_balance()` |
| Streams | `gate_ws` channel classes + callbacks | `watch_*` on `ccxt.pro.gate` |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/gate/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [gate unified API reference](/docs/exchanges/gate).
## FAQ [#faq]
**Where did gateio/gateapi-python go?**
Gate moved its GitHub organisation: the SDK now lives at `gate/gateapi-python`, and the old `gateio/gateapi-python` repository is archived. The PyPI package name is unchanged — `pip install gate-api`.
**Do I need a second package for Gate WebSockets?**
With the official libraries, yes — REST is `gate-api` and streaming is `gate-ws`, a separate repository and package. With CCXT, `watch*` methods are in the same `ccxt` package as `fetch*`, under the same MIT licence.
**Does CCXT support Gate futures, options and margin?**
Yes — spot, margin, USDT-settled perpetuals, inverse contracts, delivery futures and options, from one `ccxt.gate` instance selected by the unified symbol and `options.defaultType`.
**Can I still call Gate-specific endpoints through CCXT?**
Yes — all 339 of them, as [implicit methods](/docs/exchanges/gate/implicit-api), with signing and rate limiting applied. Choosing CCXT does not lock you out of anything Gate publishes.
**Does CCXT support the Gate testnet?**
Yes. `exchange.set_sandbox_mode(True)` swaps the REST and WebSocket URLs to Gate's testnet host.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [gate unified API reference](/docs/exchanges/gate)
* [gate implicit API](/docs/exchanges/gate/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Gate EU API (/docs/comparisons/ccxt-vs-gateeu-api)
`gateeu` is a regional entity of Gate — the European entity of Gate, serving EEA users under separate registration.
Because it shares an API dialect with Gate, CCXT implements it by extending its `gate` class. Everything in the [CCXT vs the Gate API](/docs/comparisons/ccxt-vs-gate-api) comparison applies here — this page covers only what is specific to `gateeu`.
## What is different [#what-is-different]
Separate host and separate accounts from the global venue, with a narrower listed market set.
> Credentials are not shared with the global `gate` class.
## What CCXT gives you here [#what-ccxt-gives-you-here]
| | `gateeu` |
| --------------------------------- | ------------------------------------------------------------ |
| Unified capabilities | 113 (inherited from `gate` plus its own overrides) |
| `fetch*` methods | 51 |
| WebSocket `watch*` methods | 16 |
| Raw endpoints as implicit methods | 339 |
| Testnet via `setSandboxMode` | no |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust |
| Licence | MIT |
Figures verified September 2026 against CCXT v4.5.78, read from the source tree with `build/comparisons-facts.cjs`. Counts include everything inherited from `gate`.
## Using it [#using-it]
The class name is the only thing that changes — every unified method behaves as it does everywhere else in CCXT:
Python
TypeScript
```python
import ccxt
exchange = ccxt.gateeu({'apiKey': '...', 'secret': '...'})
markets = exchange.load_markets()
ticker = exchange.fetch_ticker(list(markets)[0])
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.gateeu ({ apiKey: '...', secret: '...' });
const markets = await exchange.loadMarkets ();
const ticker = await exchange.fetchTicker (Object.keys (markets)[0]);
```
Because `gateeu` lists a different market set from `gate`, call `load_markets()` and pick symbols from it rather than assuming a pair exists.
Streaming works the same way:
```python
import ccxt.pro, asyncio
async def main():
exchange = ccxt.pro.gateeu()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
## Should you use this class or the parent? [#should-you-use-this-class-or-the-parent]
Use `gateeu` when you hold an account with Gate EU specifically. Use [`gate`](/docs/exchanges/gate) when you hold an account with the global venue. They are different venues with separate credentials, so this is not a preference — it follows from where your account is.
## FAQ [#faq]
**Do my `gate` API keys work with `gateeu`?**
No. It is a separate legal entity with separate accounts; you need keys issued by Gate EU.
**Does `gateeu` support the full unified API?**
It inherits 113 unified capabilities from `gate`. Where the venue does not offer a feature, the corresponding `has` flag is turned off, and the method raises `NotSupported` rather than failing quietly. Check `exchange.has` at runtime.
**Can I reach Gate EU-specific endpoints?**
Yes — all 339 endpoints in this class's `api` block are generated as implicit methods, with signing, rate limiting and error mapping applied. The mechanism is documented on the [`gate` implicit API page](/docs/exchanges/gate/implicit-api); this venue's own endpoint list differs slightly from the parent's.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [CCXT vs the Gate API](/docs/comparisons/ccxt-vs-gate-api) — the full comparison
* [`gate` API reference](/docs/exchanges/gate) — `gateeu` inherits it; it has no separate reference page
* [Install CCXT](/docs/install)
* [Manual](/docs/manual)
* [More comparisons](/docs/comparisons)
# CCXT vs the Gemini API (/docs/comparisons/ccxt-vs-gemini-api)
Gemini is a US-regulated exchange with spot, perpetuals, margin, staking and prediction markets behind one REST API, plus WebSocket and FIX. To integrate it you either call that API through Gemini's own SDKs, or go through [CCXT](/docs/manual), which speaks Gemini natively behind an API shared with 103 other venues.
The deciding question is narrower than usual here, because **Gemini's official SDK coverage is two languages**: TypeScript and Go. If you write in either of those and Gemini is your only venue, the vendor SDK is a real option. If you write Python, PHP, C#, Java or JavaScript-without-types, Gemini's own repository hands you samples that call the REST API with a plain HTTP client — which is roughly where CCXT starts.
## TL;DR [#tldr]
* **Pick Gemini's own SDK** if you work in TypeScript or Go, Gemini is your only venue, and you want method and field names that match Gemini's API reference exactly — including corners like prediction markets and clearing that a unified library models generically or not at all.
* **Pick CCXT** if you write in any other language, or expect a second venue, or want the order book, rate limiting, precision and error taxonomy handled rather than hand-rolled.
* **Choosing CCXT does not hide Gemini's API.** All 82 Gemini endpoints in CCXT's `api` block are generated as [implicit methods](/docs/exchanges/gemini/implicit-api), signed and rate-limited like any unified call.
## At a glance [#at-a-glance]
| | **CCXT** | **Gemini's own SDKs** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Gemini is one of them) | Gemini only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | TypeScript SDK and Go SDK; other languages get raw-HTTP samples |
| Packages to install | 1 (`ccxt`) | `@gemini-markets/sdk` (npm) or the Go module |
| Gemini products in one client | spot and perpetuals, one `ccxt.gemini` instance | REST reference covers spot, derivatives, margin, staking, clearing and prediction markets |
| Unified market data + trading API | yes — 32 unified capabilities, 16 `fetch*` methods | no — Gemini's own request and response shapes |
| WebSockets | yes — 7 `watch*` methods, same structures as `fetch*` | yes, in the TypeScript and Go SDKs |
| Raw endpoint access | yes — 82 endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 100 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus Gemini reason strings |
| Testnet / sandbox | `exchange.set_sandbox_mode(True)` | `env: "sandbox"` in the TS SDK, or a different base URL |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `@gemini-markets/sdk` 265 npm installs/month; the `gemini/developer-platform` repo shows 5 GitHub stars |
| Licence | MIT | Apache-2.0 |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues on the developer-platform repo |
Figures verified September 2026 against CCXT v4.5.78, the `gemini/developer-platform` repository and Gemini's published REST documentation, with install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker, in Python [#fetch-a-ticker-in-python]
Gemini's repository ships Python **samples**, not a Python SDK. The sample calls the REST endpoint directly.
CCXT
Gemini's Python sample
```python
import ccxt
exchange = ccxt.gemini()
ticker = exchange.fetch_ticker('BTC/USD')
print(ticker['last'], ticker['baseVolume'])
```
```python
import os
import requests
base_url = os.getenv('GEMINI_BASE_URL', 'https://api.gemini.com/v1')
response = requests.get(f"{base_url}/pubticker/btcusd")
response.raise_for_status()
print(response.json())
```
The second snippet is fine until you need the next thing: candles come from a different path shape (`/v2/candles/{symbol}/{timeframe}`), the order book from `/v1/book/{symbol}`, and every private call needs a nonce, a base64-encoded JSON payload and an HMAC signature in three headers. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) with the same keys and units it returns for every other venue.
### Place a limit order, in TypeScript [#place-a-limit-order-in-typescript]
This is the comparison where Gemini has a real SDK, so it is the fairest one.
CCXT
@gemini-markets/sdk
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.gemini ({ apiKey: '...', secret: '...' });
const order = await exchange.createOrder ('BTC/USD', 'limit', 'buy', 0.15, 64500);
console.log (order['id'], order['status']);
```
```typescript
import { createClient, HmacAuth } from "@gemini-markets/sdk/server";
const gemini = await createClient({
env: "sandbox",
auth: new HmacAuth({
apiKey: process.env.GEMINI_API_KEY!,
apiSecret: process.env.GEMINI_API_SECRET!,
}),
});
const order = await gemini.trading.createNewOrder({
symbol: "BTCUSD",
amount: "0.15",
price: "64500.00",
side: "buy",
type: "exchange limit",
client_order_id: `bot-${Date.now()}`,
});
```
Both are readable. The difference is what the return value is: CCXT's is an [order structure](/docs/manual#order-structure) identical to the one `ccxt.kraken` or `ccxt.okx` returns, and `'exchange limit'` is a Gemini string CCXT derives for you from the unified `'limit'` type.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names, arguments and return structures in all of them. Gemini publishes an SDK in two of those seven. For Python, PHP, C#, Java or plain JavaScript, the practical choice for Gemini is CCXT or your own HTTP wrapper.
Python
TypeScript
PHP
C#
Go
```python
import ccxt
exchange = ccxt.gemini()
ticker = exchange.fetch_ticker('BTC/USD')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.gemini ();
const ticker = await exchange.fetchTicker ('BTC/USD');
```
```php
$exchange = new \ccxt\gemini();
$ticker = $exchange->fetch_ticker('BTC/USD');
```
```csharp
var exchange = new ccxt.gemini();
var ticker = await exchange.FetchTicker("BTC/USD");
```
```go
exchange := ccxt.NewGemini(nil)
ticker, err := exchange.FetchTicker("BTC/USD")
```
### Spot and perpetuals from one instance [#spot-and-perpetuals-from-one-instance]
Gemini's perpetual markets carry a `PERP` suffix on the raw market id (`BTCGUSDPERP`). CCXT parses that into a unified swap symbol of the form `BASE/QUOTE:QUOTE`, so the same `create_order` call, the same order structure and the same position handling apply to spot and perps without a second client class.
### WebSockets that look like REST [#websockets-that-look-like-rest]
CCXT Pro — bundled in the same `ccxt` package, no separate purchase — gives Gemini 7 streaming methods: `watchOrderBook`, `watchOrderBookForSymbols`, `watchTrades`, `watchTradesForSymbols`, `watchOHLCV`, `watchBidsAsks` and `watchOrders`.
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.gemini()
while True:
orderbook = await exchange.watch_order_book('BTC/USD')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
`watch_order_book` returns the same structure as `fetch_order_book`. Underneath, CCXT fetches the snapshot, buffers the deltas that arrive while it is in flight, replays them in order, detects sequence gaps, reconnects and resubscribes, and keeps the cache bounded. Every one of those is a place a hand-rolled book drifts quietly rather than failing loudly.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Gemini documents 120 requests per minute on public endpoints and 600 per minute on private ones, recommends staying under 1/s and 5/s respectively, queues a burst of five, and returns `429` past that. CCXT ships a token-bucket throttler that is on by default (`enableRateLimit = true`, `rateLimit = 100` ms for Gemini) so a loop of calls is paced for you, and maps the `429` onto `RateLimitExceeded` rather than a bare HTTP error.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Gemini's failure responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all under `BaseError`. `except ccxt.InsufficientFunds` keeps working when you add a second exchange; matching on Gemini's `reason` strings does not.
### Sandbox without a second code path [#sandbox-without-a-second-code-path]
```python
exchange = ccxt.gemini({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps in api.sandbox.gemini.com
```
One flag swaps the REST and WebSocket hosts. Note that the Gemini sandbox does not list USDT markets, so pick sandbox symbols from `load_markets()` rather than assuming a pair exists.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 32 unified capabilities, all 82 endpoints in CCXT's Gemini `api` block are generated as callable implicit methods, camelCased from their paths:
```python
rates = exchange.public_get_v1_staking_rates()
promos = exchange.public_get_v1_feepromos()
```
Signing, timestamping, rate-limit accounting and error mapping still apply. Browse them on the [Gemini implicit API page](/docs/exchanges/gemini/implicit-api).
## What Gemini's own SDKs do better [#what-geminis-own-sdks-do-better]
An honest list:
* **Coverage of product lines CCXT does not unify.** Gemini's API reference includes prediction markets, clearing, staking and the FIX gateway. The TypeScript SDK exposes those as first-class namespaces (`gemini.trading`, `gemini.marketData` and siblings). CCXT unifies spot and perpetual trading; the rest is reachable only as raw implicit calls, and Gemini's prediction-market and clearing flows are not part of CCXT's unified surface.
* **One-to-one naming with the Gemini docs.** `createNewOrder`, `listDerivativeCandles` and their field names read straight off Gemini's reference. CCXT's unified names are a deliberate abstraction, which is one extra hop when you are debugging against the vendor documentation.
* **Typed Gemini-shaped models.** The TypeScript SDK gives you types describing Gemini's actual payloads, with separate server and browser entry points. CCXT gives you typed *unified* structures — better for portability, less literal about Gemini's wire format.
* **An MCP server and editor tooling in the same repo.** Gemini's developer-platform repository ships an MCP server exposing 40-plus tools across market, orders, funds, account, margin and staking, plus Claude Code skills. If you are building agent tooling against Gemini specifically, that is real infrastructure CCXT does not provide.
If you write TypeScript or Go, trade only on Gemini, and need prediction markets or clearing, Gemini's own SDK is the better fit.
## Migrating from the Gemini API to CCXT [#migrating-from-the-gemini-api-to-ccxt]
| What you are doing | Gemini REST | CCXT |
| ------------------- | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| Symbols | `btcusd`, `BTCGUSDPERP` | `'BTC/USD'` (spot), `BASE/QUOTE:QUOTE` (perp) |
| Symbol list | `/v1/symbols` | `load_markets()` |
| Ticker | `/v1/pubticker/{symbol}` or `/v2/ticker/{symbol}` | `fetch_ticker()` |
| Order book | `/v1/book/{symbol}` | `fetch_order_book()` |
| Candles | `/v2/candles/{symbol}/{timeframe}` | `fetch_ohlcv()` |
| Public trades | `/v1/trades/{symbol}` | `fetch_trades()` |
| New order | `/v1/order/new` | `create_order()` |
| Cancel order | `/v1/order/cancel` | `cancel_order()` |
| Cancel everything | `/v1/order/cancel/all` | the same endpoint as an [implicit method](/docs/exchanges/gemini/implicit-api) — `cancel_all_orders` is not unified here |
| Open orders | `/v1/orders` | `fetch_open_orders()` |
| My trades | `/v1/mytrades` | `fetch_my_trades()` |
| Balance | `/v1/balances` | `fetch_balance()` |
| Streams | Gemini WebSocket channels | `watch_*` on `ccxt.pro.gemini` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/gemini/implicit-api) |
## FAQ [#faq]
**Does Gemini have an official Python SDK?**
Not as of this writing. Gemini's `developer-platform` repository publishes an official Go SDK and an official TypeScript SDK (`@gemini-markets/sdk`), plus samples in TypeScript, Python and Go. The Python material is sample code that calls the REST API with an HTTP client, not a maintained client library. For Python, CCXT is the maintained option.
**Does CCXT support Gemini perpetuals?**
Yes. Gemini's perpetual markets are parsed as unified swap symbols with a settle currency (`BASE/QUOTE:QUOTE`), and the same `create_order`, `fetch_positions` and order-structure handling apply as on any other perpetuals venue.
**How do I use the Gemini sandbox with CCXT?**
Call `exchange.set_sandbox_mode(True)`, which swaps the REST and WebSocket hosts to `api.sandbox.gemini.com`. Get sandbox credentials from `exchange.sandbox.gemini.com`. The sandbox does not list USDT markets, so read symbols from `load_markets()`.
**Can I still call Gemini-specific endpoints through CCXT?**
Yes — all 82 endpoints in CCXT's Gemini definition are generated as [implicit methods](/docs/exchanges/gemini/implicit-api) with signing, rate limiting and error mapping applied. Staking rates, fee promos, clearing and the funding-payment reports are all reachable that way.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.gemini` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [gemini unified API reference](/docs/exchanges/gemini)
* [gemini implicit API](/docs/exchanges/gemini/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs GoCryptoTrader (/docs/comparisons/ccxt-vs-gocryptotrader)
[GoCryptoTrader](https://github.com/thrasher-corp/gocryptotrader) describes itself as "a cryptocurrency trading bot and framework supporting multiple exchanges written in Golang". That is two things, and only one of them competes with [CCXT](/docs/manual).
The framework part — the `exchanges` package, with a unified Go interface over each venue's REST and WebSocket APIs — is a direct alternative to CCXT. The rest of the repository is an application: a config system, an engine, a gRPC service, a CLI, a database layer, a portfolio tracker and an event-driven backtester. CCXT has no equivalent to any of that, and does not try to. The question that decides between them is whether you want a library to build on or a running system to configure.
## TL;DR [#tldr]
* **Pick GoCryptoTrader** if you want the whole apparatus — config, engine, gRPC/JSON-RPC server, CLI, Postgres or SQLite storage, backtester — and its 23 supported venues are the ones you trade. Its README states plainly that "this bot is under development and is not ready for production".
* **Pick CCXT** if you want a library: 104 venues, 76 with WebSocket, one import, no config file, no engine, and the same API available in eight languages.
* **They are not mutually exclusive.** GoCryptoTrader's exchange wrappers are importable Go packages, and so is CCXT's Go build — nothing stops a Go service from using CCXT for venues GoCryptoTrader does not cover.
## At a glance [#at-a-glance]
| | **CCXT** | **GoCryptoTrader** |
| --------------------------- | --------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| What it is | a library | a bot and framework — the `exchanges` package is the library part |
| Exchanges | 104 with REST, 76 of them with WebSocket | 23 rows in the README's support table; 20 marked "Yes" for WebSocket |
| Stated coverage goal | every venue with a maintained implementation | "the top 30 exchanges sorted by average liquidity as ranked by CoinMarketCap" |
| FIX support | no | the support table's FIX column is "No" or "NA" for every listed exchange |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust | Go (`go.mod` declares `go 1.26`) |
| Setup before the first call | construct the exchange | `SetDefaults()`, then `Setup()` with a validated `*config.Exchange` |
| Streaming model | `WatchOrderBook` returns the same struct as `FetchOrderBook` | parsed messages are pushed onto `Websocket.DataHandler`, one stream of mixed types |
| Raw endpoint access | implicit methods for every endpoint — 808 for binance, 446 for okx | the exchange package's own exported request methods |
| Unified error types | 41 typed exceptions in one hierarchy | Go `error` values with sentinel errors per package |
| Engine, CLI, gRPC server | none | `engine`, `cmd/gctcli`, `gctrpc` — "gRPC service and JSON RPC proxy" |
| Backtester | none | "an event-driven backtesting tool to test and iterate trading strategies" |
| Storage | none — you write the sink | "Database support (Postgres and SQLite3)" |
| Tagged releases | continuous, on npm, PyPI, NuGet, Packagist, Go modules, Maven Central | none published on GitHub; consumed by `go get` at a commit |
| Last commit read | — | 3 September 2026 on `master` |
| Popularity | 43.8k GitHub stars · **4.68M PyPI + 494k npm installs/month** | 3.5k GitHub stars · 915 forks |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues | Slack, GitHub issues, a public Kanban board |
Figures verified September 2026 against CCXT v4.5.78, and against the GoCryptoTrader GitHub repository, README, `go.mod`, `exchanges/interfaces.go` and `docs/ADD_NEW_EXCHANGE.md` read on 3 September 2026. Install counts from the npm and PyPI APIs.
## The same job, written both ways [#the-same-job-written-both-ways]
Both sides in Go, since that is where the comparison is real. CCXT's Go build lives at `github.com/ccxt/ccxt/go/v4`.
### Fetch a ticker [#fetch-a-ticker]
CCXT
GoCryptoTrader
```go
package main
import (
"fmt"
ccxt "github.com/ccxt/ccxt/go/v4"
)
func main() {
exchange := ccxt.NewBinance(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
if err != nil {
panic(err)
}
fmt.Println(*ticker.Last)
}
```
```go
package main
import (
"context"
"fmt"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/binance"
)
func main() {
cfg := &config.Config{}
if err := cfg.ReadConfigFromFile("config.json", true); err != nil {
panic(err)
}
exchCfg, err := cfg.GetExchangeConfig("Binance")
if err != nil {
panic(err)
}
var e binance.Exchange
e.SetDefaults()
if err := e.Setup(exchCfg); err != nil {
panic(err)
}
tick, err := e.UpdateTicker(context.Background(), currency.NewBTCUSDT(), asset.Spot)
if err != nil {
panic(err)
}
fmt.Println(tick.Last)
}
```
The extra lines are not incidental — they are the framework showing through. `Setup` takes a `*config.Exchange` and calls `Validate()` on it, so the natural way to get one is to load the project's config file. That is exactly right when you are running the bot, and it is friction when you only wanted a price.
### Place a limit order [#place-a-limit-order]
CCXT
GoCryptoTrader
```go
exchange := ccxt.NewBinance(map[string]any{
"apiKey": "...",
"secret": "...",
})
order, err := exchange.CreateOrder("BTC/USDT", "limit", "buy", 0.001,
ccxt.WithCreateOrderPrice(60000))
if err != nil {
panic(err)
}
fmt.Println(*order.Id)
```
```go
resp, err := e.SubmitOrder(context.Background(), &order.Submit{
Exchange: "Binance",
Pair: currency.NewBTCUSDT(),
AssetType: asset.Spot,
Side: order.Buy,
Type: order.Limit,
Price: 60000,
Amount: 0.001,
})
if err != nil {
panic(err)
}
fmt.Println(resp.OrderID)
```
GoCryptoTrader's `order.Submit` is a wide struct — `TimeInForce`, `ReduceOnly`, `Leverage`, `TriggerPrice`, `TriggerPriceType`, `MarginType`, `AutoBorrow`, `AutoRepay` and more are fields on it. CCXT puts the common arguments positionally and everything else in a `params` map. Both approaches work; the struct is more discoverable in an IDE, the map is easier to pass through from configuration.
## Where the differences actually bite [#where-the-differences-actually-bite]
### A library versus an application with a library inside [#a-library-versus-an-application-with-a-library-inside]
This is the whole comparison. GoCryptoTrader's repository root holds `engine`, `gctrpc`, `gctscript`, `backtester`, `database`, `portfolio`, `communications`, `connchecker`, `signaler` and a `cmd` tree with fourteen tools in it — `gctcli`, `config_builder`, `dbmigrate`, `dbseed`, `gen_cert`, `gen_otp`, `exchange_template` and more. The README's install instructions are `git clone`, `go build`, copy `config_example.json` to `~/.gocryptotrader/config.json`, edit it, run the binary. That is an application.
CCXT is `import ccxt`. It has no config file, no daemon, no CLI to run, no database. If you want an application you build it; if you already have one, there is nothing to displace.
The practical consequence: the exchange wrappers *are* importable on their own — `exchanges/interfaces.go` defines the `IBotExchange` interface, and each venue package exports a concrete `Exchange` type with `UpdateTicker`, `UpdateOrderbook`, `SubmitOrder` and the rest hanging off it — but they were designed to be driven by the engine, and the setup path shows it.
### Coverage [#coverage]
23 exchanges against 104, and the gap is not in the head of the market — both cover Binance, Kraken, Coinbase, OKX, Bybit, Bitfinex, KuCoin and Deribit. It is in the tail: regional venues, perpetuals-first DEXes, and 7 prediction-market venues in `ccxt.prediction` (Polymarket, Kalshi, Limitless, Myriad, Opinion, plus Binance and Hyperliquid prediction products). GoCryptoTrader is explicit about this being deliberate — it aims at "the top 30 exchanges sorted by average liquidity" — so the difference is a stated scope choice, not an oversight.
Streaming: 20 of GoCryptoTrader's 23 listed exchanges are marked "Yes" for WebSocket. CCXT's `watch*` methods cover 76.
### Eight languages, one API [#eight-languages-one-api]
GoCryptoTrader is Go. CCXT is generated from one TypeScript source into TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with the same method names and return structures in each. If your research runs in a Python notebook and your execution service is in Go, that is one integration rather than two.
Go
Python
TypeScript
```go
exchange := ccxt.NewBinance(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
```python
exchange = ccxt.binance()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```typescript
const exchange = new ccxt.binance ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
### Streaming: typed returns versus one data channel [#streaming-typed-returns-versus-one-data-channel]
GoCryptoTrader parses each venue's WebSocket messages and pushes the results onto a single `Websocket.DataHandler` stream — a ticker price, a fills payload, an error, all onto the same channel, with the consumer type-switching over them. That is the right shape for an engine that fans everything into one dispatcher.
CCXT returns values from the call site:
```go
import ccxtpro "github.com/ccxt/ccxt/go/v4/pro"
exchange := ccxtpro.NewBinance(nil)
for {
ob, err := exchange.WatchOrderBook("BTC/USDT")
if err != nil {
panic(err)
}
fmt.Println(ob.Bids[0], ob.Asks[0])
}
```
`WatchOrderBook` returns the same `OrderBook` struct as `FetchOrderBook`, so swapping a polling loop for a stream leaves the downstream code untouched. Underneath, CCXT does the snapshot-plus-delta alignment, sequence-gap detection, checksum verification where the venue publishes one, and reconnect-and-reseed — per exchange, because every venue sequences differently.
### Adding a venue [#adding-a-venue]
Both projects hand-write per-exchange code; the difference is how many times.
GoCryptoTrader's `docs/ADD_NEW_EXCHANGE.md` is 1,117 lines. The path starts with the templating tool (`go run exchange_template.go -name Binance -ws -rest`), then adds a struct to `config_example.json` and `testdata/configtest.json`, registers the venue in `exchanges/support.go`, adds it to the root README template, writes the requester and public/authenticated functions, fills in the wrapper functions, and wires up the WebSocket connection, subscription generation and message handling.
CCXT's per-exchange work happens once, in one TypeScript file, and is transpiled into all eight languages by the build. A venue added this week is available in Python, Go, C#, PHP, Java and JavaScript in the same release.
### Versioning and distribution [#versioning-and-distribution]
GoCryptoTrader publishes no tagged releases on GitHub; you pin a commit through Go modules. That is a normal Go practice, and it means upgrades are a diff against `master` rather than a changelog. CCXT publishes versioned releases continuously to npm, PyPI, NuGet, Packagist, Go modules and Maven Central, so an exchange API change reaches you as a version bump.
## What GoCryptoTrader does better [#what-gocryptotrader-does-better]
Genuine advantages, and several have no CCXT counterpart at all:
* **It is a complete system, not a component.** An AES256-encrypted config file, an engine that runs the enabled exchanges, a gRPC service with a JSON-RPC proxy, `gctcli` to drive it, a connection monitor, an NTP client, and communication packages for Slack, Telegram, SMTP and SMS. If what you want is a running bot rather than a dependency, you are most of the way there on day one.
* **An event-driven backtester.** `backtester/` is a first-class part of the project, built to replay historical or custom data through a strategy. CCXT gives you `fetch_ohlcv` and stops there — the backtest engine is yours to write or to bring.
* **Built-in persistence.** Postgres and SQLite3 support, with migration and seeding tools (`dbmigrate`, `dbseed`) and documented OHLCV and trade storage. CCXT deliberately has no storage layer.
* **Asset type as a first-class dimension.** Every wrapper call takes an `asset.Item` — `asset.Spot`, `asset.Margin`, `asset.USDTMarginedFutures`, `asset.CoinMarginedFutures` — so the product line is explicit in the signature rather than carried in options.
* **Go-native performance tuning through build tags.** `-tags=sonic_on` swaps in Bytedance's Sonic JSON decoder; `-tags=udecimal_on` swaps the decimal implementation, with the precision and division trade-offs documented in the README. That kind of compile-time tuning is not available to a transpiled library.
* **Scripting and mock testing.** `gctscript` for in-process strategy scripts and an exchange HTTP mock package for offline wrapper tests.
If you want a configurable trading bot in Go, trade the major venues, and value the engine and backtester more than breadth of exchange coverage, GoCryptoTrader is the better starting point — and its own README asks you to note that it is under development and not ready for production.
## Migrating from GoCryptoTrader to CCXT [#migrating-from-gocryptotrader-to-ccxt]
Only the exchange layer maps across; the engine, backtester and database have no CCXT equivalent.
| What you are doing | GoCryptoTrader | CCXT (Go) |
| --------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------- |
| Constructing a client | `SetDefaults()` then `Setup(*config.Exchange)` | `ccxt.NewBinance(map[string]any{...})` |
| Symbols | `currency.Pair` + `asset.Item` | `"BTC/USDT"` spot, `"BTC/USDT:USDT"` linear swap |
| Markets metadata | `FetchTradablePairs(ctx, asset)` | `LoadMarkets()` |
| Ticker | `UpdateTicker(ctx, pair, asset)` | `FetchTicker(symbol)` |
| Order book | `UpdateOrderbook(ctx, pair, asset)` | `FetchOrderBook(symbol)` |
| Candles | OHLCV retrieval via the exchange wrapper | `FetchOHLCV(symbol, timeframe)` |
| New order | `SubmitOrder(ctx, *order.Submit)` | `CreateOrder(symbol, type, side, amount, WithCreateOrderPrice(price))` |
| Cancel order | `CancelOrder(ctx, *order.Cancel)` | `CancelOrder(id, symbol)` |
| Balance | `UpdateAccountBalances(ctx, asset)` | `FetchBalance()` |
| Streams | `Websocket.DataHandler` channel | `Watch*` on `github.com/ccxt/ccxt/go/v4/pro` |
| Venue-specific calls | the exchange package's exported methods | the same endpoint as an [implicit method](/docs/exchanges/binance/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual).
## FAQ [#faq]
**Can I use GoCryptoTrader's exchange package as a library without running the bot?**
Yes. `exchanges/interfaces.go` defines the `IBotExchange` interface and each venue package exports a concrete `Exchange` type. You call `SetDefaults()`, then `Setup()` with a validated `*config.Exchange`, then the wrapper methods. The setup path assumes a config file, because the package is written for the engine to drive.
**Which supports more exchanges, CCXT or GoCryptoTrader?**
CCXT — 104 with REST and 76 of those with WebSocket, against the 23 rows in GoCryptoTrader's README support table, 20 of them marked "Yes" for WebSocket. GoCryptoTrader states a target of the top 30 exchanges by average liquidity, so this is a scope difference rather than a gap.
**Does CCXT include a trading engine or a backtester?**
No. CCXT is a library — market data, order entry, accounts, positions and funding across venues. Strategy execution, scheduling, persistence and backtesting are yours to build or to bring from elsewhere. GoCryptoTrader ships all four.
**Is CCXT available for Go?**
Yes — `go get github.com/ccxt/ccxt/go/v4` for REST and `github.com/ccxt/ccxt/go/v4/pro` for WebSocket, with the same method names as the Python, TypeScript, C#, PHP and Java builds. Methods return `(value, error)` in the usual Go style.
**Does GoCryptoTrader support WebSockets?**
Yes, for 20 of the 23 exchanges in its support table. Parsed messages arrive on the exchange's `Websocket.DataHandler` stream rather than as return values. The FIX column in the same table is "No" or "NA" throughout; CCXT does not implement FIX either.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support. GoCryptoTrader is MIT as well.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — unified structures and conventions
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [Supported exchanges](/docs/exchange-markets)
* [More comparisons](/docs/comparisons)
# CCXT vs the GRVT API (/docs/comparisons/ccxt-vs-grvt-api)
GRVT is a perpetuals venue with an on-chain settlement layer, split across three API hosts: `market-data.grvt.io` for public data, `trades.grvt.io` for order entry and `edge.grvt.io` for session and account operations. GRVT publishes an official Python SDK, `grvt-pysdk`, and CCXT implements the venue as `ccxt.grvt`.
There is an unusually direct way to frame the choice here, because **GRVT's own SDK ships a set of classes explicitly described as CCXT-compatible** — `GrvtCcxt`, `GrvtCcxtPro` and `GrvtCcxtWS`, with `fetch_ticker`, `fetch_order_book`, `fetch_ohlcv`, `create_order`, `cancel_order`, `fetch_open_orders` and `fetch_balance` signatures modelled on CCXT's. So the question is not which API shape you prefer. It is: do you want that shape from one vendor in one language, or from a library that speaks it to 104 venues in seven?
## TL;DR [#tldr]
* **Pick `grvt-pysdk`** if you work in Python, GRVT is your only venue, and you want GRVT's raw request/response wrappers (`GrvtRawSync`, `GrvtRawAsync`) alongside the CCXT-shaped ones.
* **Pick CCXT** if you write in anything other than Python — the vendor SDK has no TypeScript, Go, C#, PHP or Java equivalent — or if GRVT is one venue in a book that includes centralised exchanges too.
* **Choosing CCXT does not hide GRVT's API.** All 50 GRVT endpoints across the three hosts are generated as [implicit methods](/docs/exchanges/grvt/implicit-api), signed and rate-limited like any unified call.
## At a glance [#at-a-glance]
| | **CCXT** | **grvt-pysdk** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (GRVT is one of them) | GRVT only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python only (3.10-3.12) |
| Packages to install | 1 (`ccxt`) | 1 (`grvt-pysdk`) |
| Unified market data + trading API | yes — 39 unified capabilities, 19 `fetch*` methods | CCXT-shaped classes plus raw wrappers |
| Markets | GRVT perpetuals, flagged as a DEX in CCXT | GRVT perpetuals |
| WebSockets | yes — 11 `watch*` methods, same structures as `fetch*` | yes — `GrvtCcxtWS` |
| Raw endpoint access | yes — 50 endpoints as implicit methods | yes — `GrvtRawSync` / `GrvtRawAsync` |
| Built-in rate limiter | yes, on by default (`rateLimit` 10 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | GRVT numeric error codes |
| Testnet | `exchange.set_sandbox_mode(True)` → `*.testnet.grvt.io` | `GRVT_ENV` env var: `prod`, `testnet`, `staging`, `dev` |
| Configuration | constructor arguments | environment variables (`GRVT_API_KEY`, `GRVT_PRIVATE_KEY`, `GRVT_TRADING_ACCOUNT_ID`, `GRVT_ENV`) |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 14 GitHub stars · 4.4k PyPI installs/month |
| Licence | MIT | Apache-2.0 |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues, GRVT support |
Figures verified September 2026 against CCXT v4.5.78, the `gravity-technologies/grvt-pysdk` repository and its PyPI listing.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
grvt-pysdk
```python
import ccxt
exchange = ccxt.grvt()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from pysdk.grvt_ccxt import GrvtCcxt
from pysdk.grvt_ccxt_env import GrvtEnv
client = GrvtCcxt(GrvtEnv.PROD)
ticker = client.fetch_ticker('BTC_USDT_Perp')
print(ticker)
```
The method names are deliberately the same — that is the point of the SDK's CCXT-compatible layer. What differs is the symbol: the SDK takes GRVT's instrument id, `BTC_USDT_Perp`, while CCXT takes the unified perpetual symbol `'BTC/USDT:USDT'`, which is the same string you would pass to `ccxt.binance`, `ccxt.bybit` or `ccxt.hyperliquid`.
### Place a limit order [#place-a-limit-order]
CCXT
grvt-pysdk
```python
import ccxt
exchange = ccxt.grvt({'privateKey': '0x...'})
exchange.load_markets() # signs in automatically when credentials are set
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.01, 60000)
print(order['id'], order['status'])
```
```python
import os
from pysdk.grvt_ccxt import GrvtCcxt
from pysdk.grvt_ccxt_env import GrvtEnv
os.environ['GRVT_API_KEY'] = '...'
os.environ['GRVT_PRIVATE_KEY'] = '0x...'
os.environ['GRVT_TRADING_ACCOUNT_ID'] = '...'
client = GrvtCcxt(GrvtEnv.PROD)
order = client.create_order('BTC_USDT_Perp', 'limit', 'buy', 0.01, 60000)
```
Both sides sign the order with your key — GRVT settles on-chain, so an order is a signed message, not just an authenticated HTTP request, and the signing domain differs between mainnet and testnet. CCXT handles the session handshake for you: when credentials are present, `load_markets()` performs the sign-in and loads account information before the first authenticated call.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API [#eight-languages-one-api]
This is the decisive difference. `grvt-pysdk` is Python-only; there is no vendor SDK for TypeScript, Go, C#, PHP or Java. CCXT is written once in TypeScript and transpiled to all of them, with identical method names, arguments and return structures.
Python
TypeScript
PHP
C#
Go
```python
import ccxt
exchange = ccxt.grvt()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.grvt ();
const ticker = await exchange.fetchTicker ('BTC/USDT:USDT');
```
```php
$exchange = new \ccxt\grvt();
$ticker = $exchange->fetch_ticker('BTC/USDT:USDT');
```
```csharp
var exchange = new ccxt.grvt();
var ticker = await exchange.FetchTicker("BTC/USDT:USDT");
```
```go
exchange := ccxt.NewGrvt(nil)
ticker, err := exchange.FetchTicker("BTC/USDT:USDT")
```
### Portability across venue types [#portability-across-venue-types]
GRVT is a self-custodial perpetuals venue; CCXT flags it as a DEX. That normally means a bespoke integration — wallet signing, a session handshake, an instrument naming scheme of its own. In CCXT it is the same interface as everything else, so a strategy can quote GRVT against a centralised venue without a translation layer:
```python
for exchange_id in ['grvt', 'binance', 'bybit', 'hyperliquid']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT:USDT')['last'])
```
### Three hosts, one client [#three-hosts-one-client]
GRVT splits its API across `market-data.grvt.io`, `trades.grvt.io` and `edge.grvt.io`, and mirrors all three on testnet. CCXT models them as three named API groups in one exchange definition, so routing a call to the right host is not something you configure — it follows from the method you called. `set_sandbox_mode(True)` swaps all three at once, and CCXT also switches the signing chain id between mainnet and testnet so signed orders validate in the environment you are actually in.
### WebSockets that look like REST [#websockets-that-look-like-rest]
CCXT Pro — bundled in the same `ccxt` package, no separate purchase — gives GRVT 11 streaming methods: `watchTicker`, `watchTickers`, `watchTrades`, `watchTradesForSymbols`, `watchOHLCV`, `watchOHLCVForSymbols`, `watchOrderBook`, `watchOrderBookForSymbols`, `watchOrders`, `watchMyTrades` and `watchPositions`.
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.grvt()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT:USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
`watch_order_book` returns the same structure as `fetch_order_book`, so swapping a polling loop for a stream is a one-word change. The `*ForSymbols` variants subscribe to many instruments over one connection instead of one socket per symbol. Underneath, CCXT handles connection pooling, ping/pong keep-alive, reconnect-and-resubscribe, the snapshot-plus-delta merge with sequence-gap detection, and bounded caches.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT ships a token-bucket throttler that is on by default (`enableRateLimit = true`, `rateLimit = 10` ms for GRVT), with the relative cost of each endpoint encoded in the exchange definition — GRVT's authentication endpoints carry a much higher cost than a market-data read, and CCXT accounts for that. You call methods in a loop; the library paces them.
### Precision, rounding and string math [#precision-rounding-and-string-math]
GRVT uses tick-size precision, and a perpetuals venue rejects orders that violate tick size, lot size or minimum notional. CCXT loads that metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities do not drift through float rounding.
### One error hierarchy [#one-error-hierarchy]
CCXT maps GRVT's numeric error codes onto a [typed exception tree](/docs/manual#error-handling) — `AuthenticationError`, `PermissionDenied`, `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `OperationFailed` and 34 more, all under `BaseError`. `except ccxt.InsufficientFunds` keeps working when you add a second venue; matching on `1000`, `1001` and `1002` does not.
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.grvt({'privateKey': '0x...'})
exchange.set_sandbox_mode(True) # swaps all three hosts to *.testnet.grvt.io
```
One flag swaps the market-data, trading and edge hosts together, and switches the signing chain id. No environment variables, no forked configuration.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 39 unified capabilities, all 50 endpoints in CCXT's GRVT `api` block are generated as callable implicit methods, camelCased from their paths:
```python
rules = exchange.public_market_post_full_v1_margin_rules()
```
Signing, rate-limit accounting and error mapping still apply. Browse them on the [GRVT implicit API page](/docs/exchanges/grvt/implicit-api).
## What grvt-pysdk does better [#what-grvt-pysdk-does-better]
An honest list, because these are real:
* **Raw wrappers alongside the unified ones.** `GrvtRawSync` and `GrvtRawAsync` are thin, typed wrappers over GRVT's REST API, so you get GRVT's exact request and response models when you want them and the CCXT-shaped layer when you do not. CCXT's implicit methods reach the same endpoints but return untyped payloads.
* **GRVT-specific features land there first.** A new GRVT endpoint or order flag appears in the vendor SDK on GRVT's own schedule. CCXT's implicit API closes most of that gap immediately, but a *unified* wrapper may lag.
* **Environment switching is a first-class concept.** `GRVT_ENV` selects `prod`, `testnet`, `staging` or `dev`. CCXT models production and testnet; staging and dev are not wired into `set_sandbox_mode`.
* **A smaller dependency if GRVT is all you need.** If your whole system talks to GRVT and nothing else, in Python, `grvt-pysdk` is a much smaller install than all of CCXT.
If GRVT is your only venue, you work in Python, and you want the vendor's own typed models, `grvt-pysdk` is a reasonable choice — and its CCXT-compatible layer means moving between the two later is not a rewrite.
## Migrating from grvt-pysdk to CCXT [#migrating-from-grvt-pysdk-to-ccxt]
| What you are doing | grvt-pysdk / GRVT REST | CCXT |
| ------------------- | ---------------------------------------------- | ---------------------------------------------------------------------------- |
| Symbols | `BTC_USDT_Perp` | `'BTC/USDT:USDT'` |
| Configuration | `GRVT_*` environment variables | constructor arguments |
| Environment | `GrvtEnv.PROD` / `GrvtEnv.TESTNET` | `set_sandbox_mode(True)` |
| Instrument list | `/full/v1/all_instruments` | `load_markets()` |
| Ticker | `fetch_ticker()` — `/full/v1/ticker` | `fetch_ticker()` |
| Order book | `fetch_order_book()` — `/full/v1/book` | `fetch_order_book()` |
| Candles | `fetch_ohlcv()` — `/full/v1/kline` | `fetch_ohlcv()` |
| Public trades | `fetch_recent_trades()` — `/full/v1/trade` | `fetch_trades()` |
| New order | `create_order()` — `/full/v1/create_order` | `create_order()` |
| Cancel order | `cancel_order()` — `/full/v1/cancel_order` | `cancel_order()` |
| Cancel everything | `cancel_all_orders()` | `cancel_all_orders()` |
| Open orders | `fetch_open_orders()` — `/full/v1/open_orders` | `fetch_open_orders()` |
| My fills | `/full/v1/fill_history` | `fetch_my_trades()` |
| Balance | `fetch_balance()` — `/full/v1/account_summary` | `fetch_balance()` |
| Positions | `/full/v1/positions` | `fetch_positions()` |
| Leverage | `/full/v1/set_initial_leverage` | `set_leverage()` |
| Streams | `GrvtCcxtWS` | `watch_*` on `ccxt.pro.grvt` |
| Anything not listed | `GrvtRawSync` | the same endpoint as an [implicit method](/docs/exchanges/grvt/implicit-api) |
## FAQ [#faq]
**Does GRVT have an official SDK, and for which languages?**
Yes — `grvt-pysdk`, and it is Python-only (3.10 to 3.12). It provides thin raw REST wrappers (`GrvtRawSync`, `GrvtRawAsync`) and a set of classes explicitly described as CCXT-compatible (`GrvtCcxt`, `GrvtCcxtPro`, `GrvtCcxtWS`). If you need TypeScript, Go, C#, PHP or Java, CCXT is the maintained route.
**What credentials does CCXT need for GRVT?**
A wallet `privateKey`. CCXT signs in with it and loads your account information automatically the first time you call `load_markets()` with credentials set. If you registered with GRVT by email rather than a Web3 wallet, see the GRVT entry in the CCXT FAQ — the sign-in path differs.
**Does CCXT support GRVT testnet?**
Yes. `exchange.set_sandbox_mode(True)` swaps all three hosts to `market-data.testnet.grvt.io`, `trades.testnet.grvt.io` and `edge.testnet.grvt.io`, and switches the signing chain id so signed orders validate against testnet.
**Can I still call GRVT-specific endpoints through CCXT?**
Yes — all 50 endpoints in CCXT's GRVT definition are generated as [implicit methods](/docs/exchanges/grvt/implicit-api), with signing, rate limiting and error mapping applied.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.grvt` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [grvt unified API reference](/docs/exchanges/grvt)
* [grvt implicit API](/docs/exchanges/grvt/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the raw HashKey Global REST API (/docs/comparisons/ccxt-vs-hashkey-api)
HashKey Global documents a REST API and a WebSocket API covering spot and perpetual futures, with a SIM sandbox that mirrors production. What it does not publish is a client library — HashKey's API reference explains the endpoints and shows `curl` and `openssl` examples for signing, and stops there. There is no HashKey-maintained SDK in any language.
So the comparison is not CCXT against a vendor SDK. It is **CCXT against the integration you would write yourself**, and the useful question is how much of that integration you actually want to own.
## TL;DR [#tldr]
* **Call the raw API** if you need one or two public endpoints in one language and would rather not take a dependency.
* **Pick CCXT** if you need signed endpoints, streaming, or more than a handful of calls. HashKey carries CCXT's **certified** badge, which means the implementation is supervised and quality-assured by the CCXT dev team and gets priority support.
* **Choosing CCXT does not hide HashKey's API.** All 67 HashKey endpoints are generated as [implicit methods](/docs/exchanges/hashkey/implicit-api), signed and rate-limited like any unified call.
## At a glance [#at-a-glance]
| | **CCXT** | **The raw HashKey Global API** |
| --------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| Exchanges covered | 104 (HashKey is one of them) | HashKey Global only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | any language with an HTTP client, all of it your code |
| Official client library | n/a | **none** — the documentation shows `curl` and `openssl` signing examples |
| Products in one client | spot and perpetual futures, one `ccxt.hashkey` instance | parallel `spot/*` and `futures/*` endpoint families |
| Unified market data + trading API | yes — 59 unified capabilities, 31 `fetch*` methods | no — HashKey's own request and response shapes |
| WebSockets | yes — 7 `watch*` methods, same structures as `fetch*` | raw socket, plus a listen-key you create and refresh yourself |
| Raw endpoint access | yes — 67 endpoints as implicit methods | yes, it is all you have |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 100 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus HashKey error codes |
| Testnet / sandbox | `exchange.set_sandbox_mode(True)` → `api-glb.sim.hashkeydev.com` | a different base URL you swap yourself |
| Certified | yes | n/a |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month | n/a — no package to count |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub issues — usually same-day | HashKey support |
Figures verified September 2026 against CCXT v4.5.78 and HashKey Global's published API reference.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HashKey API
```python
import ccxt
exchange = ccxt.hashkey()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
url = 'https://api-glb.hashkey.com/quote/v1/ticker/24hr'
response = requests.get(url, params={'symbol': 'BTCUSDT'})
response.raise_for_status()
print(response.json())
```
For one public endpoint the raw call is shorter, and that is fair. The gap opens at the second endpoint, and it opens wide at the first signed one.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HashKey API
```python
import ccxt
exchange = ccxt.hashkey({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import hashlib
import hmac
import time
import requests
from urllib.parse import urlencode
api_key = '...'
secret = '...'
params = {
'symbol': 'BTCUSDT',
'side': 'BUY',
'type': 'LIMIT',
'timeInForce': 'GTC',
'quantity': '0.001',
'price': '60000',
'recvWindow': 5000,
'timestamp': int(time.time() * 1000),
}
query = urlencode(params)
signature = hmac.new(secret.encode(), query.encode(), hashlib.sha256).hexdigest()
response = requests.post(
'https://api-glb.hashkey.com/api/v1/spot/order',
params={**params, 'signature': signature},
headers={'X-HK-APIKEY': api_key},
)
response.raise_for_status()
print(response.json())
```
HashKey signs the concatenation of the query string and the request body with HMAC-SHA256, keyed on your secret, with a millisecond `timestamp` and a `recvWindow` that defaults to 5000 ms. That is thirty lines you now maintain, plus clock-skew handling, plus the same thirty lines again for the futures endpoint family. In CCXT it is one `create_order` call, and the futures order is the same call with a `'BTC/USDT:USDT'` symbol.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Spot and futures are two endpoint families, one CCXT class [#spot-and-futures-are-two-endpoint-families-one-ccxt-class]
HashKey mirrors its shapes across `api/v1/spot/*` and `api/v1/futures/*`: separate order, open-orders, cancel, batch, trade-history and balance endpoints for each, plus futures-only endpoints for leverage, margin type, position margin and risk limits. Written by hand that is two parsers.
CCXT's `ccxt.hashkey` covers both with 59 unified capabilities and 31 `fetch*` methods. The unified symbol picks the family: `'BTC/USDT'` routes to spot, `'BTC/USDT:USDT'` to the perpetual, and `set_leverage`, `fetch_positions` and `set_margin_mode` are unified methods rather than futures-specific paths you look up.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names, arguments and return structures. A raw integration is written once per language, by you.
Python
TypeScript
PHP
C#
Go
```python
import ccxt
exchange = ccxt.hashkey()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.hashkey ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```php
$exchange = new \ccxt\hashkey();
$ticker = $exchange->fetch_ticker('BTC/USDT');
```
```csharp
var exchange = new ccxt.hashkey();
var ticker = await exchange.FetchTicker("BTC/USDT");
```
```go
exchange := ccxt.NewHashkey(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
### WebSockets, and the listen key nobody budgets for [#websockets-and-the-listen-key-nobody-budgets-for]
CCXT Pro — bundled in the same `ccxt` package, no separate purchase — gives HashKey 7 streaming methods: `watchOrderBook`, `watchTicker`, `watchTrades`, `watchOHLCV`, `watchOrders`, `watchMyTrades` and `watchBalance`.
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.hashkey()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
Private streams on HashKey are gated by a **listen key**: you `POST /api/v1/userDataStream` to create one, embed it in the socket URL, `PUT` it periodically to keep it alive and `DELETE` it when done. Forget the refresh and your order stream dies silently after the key expires. CCXT creates the key, builds the URL and refreshes it on a timer for you.
The same applies to the public book: CCXT fetches the REST snapshot, buffers the deltas that arrive while it is in flight, replays them in order, detects sequence gaps, reconnects and resubscribes, and keeps the cache bounded. Every one of those is a place a hand-rolled book drifts rather than fails.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
HashKey documents roughly 5 requests per second on query endpoints and 20 per second on order endpoints, returns `429` when you exceed them, and escalates to an IP block with `418` if you keep going. CCXT encodes the relative cost of each endpoint in its `api` block — `api/v1/spot/order` costs 1, `api/v1/spot/batchOrders` costs 5 — and ships a token-bucket throttler that is on by default (`enableRateLimit = true`, `rateLimit = 100` ms). You call methods in a loop; the library paces them, and a `429` is raised as `RateLimitExceeded` rather than a bare HTTP error.
### Precision, rounding and string math [#precision-rounding-and-string-math]
HashKey rejects orders that violate tick size, lot size or minimum notional. CCXT loads that metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities do not drift through float rounding.
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps HashKey's error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all under `BaseError`. `except ccxt.InsufficientFunds` keeps working when you add a second exchange.
### Sandbox without a second code path [#sandbox-without-a-second-code-path]
```python
exchange = ccxt.hashkey({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps in api-glb.sim.hashkeydev.com
```
One flag swaps the REST and WebSocket hosts to HashKey's SIM environment. HashKey recommends testing there first, and CCXT's [live test runner](/docs/manual) drives the same flag with `--sandbox`.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 59 unified capabilities, all 67 endpoints in CCXT's HashKey `api` block are generated as callable implicit methods, camelCased from their paths:
```python
positions = exchange.private_get_api_v1_futures_positions()
vip = exchange.private_get_api_v1_account_vip_info()
```
Signing, timestamping, rate-limit accounting and error mapping still apply. Browse them on the [HashKey implicit API page](/docs/exchanges/hashkey/implicit-api).
## What the raw HashKey API does better [#what-the-raw-hashkey-api-does-better]
An honest list, because these are real:
* **Zero dependencies.** If your integration is "poll one public ticker every minute", twelve lines and `requests` is genuinely the right answer, and it will never break because a library changed.
* **Literal fidelity to the documentation.** The raw payload is the payload in HashKey's reference. Every field is there, in HashKey's own names, with nothing normalised away — one fewer hop when you are debugging against the vendor docs.
* **Endpoints and flows CCXT does not unify.** Sub-account order queries, address authorisation, asset transfers between account types, VIP fee tiers and the futures risk-limit endpoints are HashKey-specific. CCXT reaches them as raw implicit calls, but they are not unified methods with typed structures.
* **You control the failure modes.** Retry, timeout and backoff policy are exactly what you wrote, with no library behaviour to reason about.
If HashKey is your only venue and your integration is small, static and public-data-only, the raw API is a perfectly reasonable choice.
## Migrating from the raw HashKey API to CCXT [#migrating-from-the-raw-hashkey-api-to-ccxt]
| What you are doing | HashKey REST | CCXT |
| ------------------- | ------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `BTCUSDT` | `'BTC/USDT'` (spot), `'BTC/USDT:USDT'` (perpetual) |
| Product selection | `api/v1/spot/*` vs `api/v1/futures/*` | the unified symbol, or `options.defaultType` |
| Symbol list | `/api/v1/exchangeInfo` | `load_markets()` |
| Ticker | `/quote/v1/ticker/24hr` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `/quote/v1/depth` | `fetch_order_book()` |
| Candles | `/quote/v1/klines` | `fetch_ohlcv()` |
| Public trades | `/quote/v1/trades` | `fetch_trades()` |
| New order | `POST /api/v1/spot/order` | `create_order()` |
| Batch orders | `POST /api/v1/spot/batchOrders` | `create_orders()` |
| Cancel order | `DELETE /api/v1/spot/order` | `cancel_order()` |
| Cancel everything | `DELETE /api/v1/spot/openOrders` | `cancel_all_orders()` |
| Open orders | `GET /api/v1/spot/openOrders` | `fetch_open_orders()` |
| My trades | `/api/v1/account/trades` | `fetch_my_trades()` |
| Balance | `/api/v1/account` | `fetch_balance()` |
| Positions | `/api/v1/futures/positions` | `fetch_positions()` |
| Leverage | `POST /api/v1/futures/leverage` | `set_leverage()` |
| Funding rate | `/api/v1/futures/fundingRate` | `fetch_funding_rate()` |
| Private streams | create and refresh a listen key | `watch_*` on `ccxt.pro.hashkey` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/hashkey/implicit-api) |
## FAQ [#faq]
**Does HashKey Global have an official SDK?**
Not as of this writing. HashKey's API reference documents the REST and WebSocket endpoints and shows `curl` and `openssl` examples for HMAC-SHA256 signing, but publishes no client library. CCXT is the maintained multi-language option, and HashKey is a certified CCXT exchange.
**Does CCXT support HashKey perpetual futures, or only spot?**
Both, from one `ccxt.hashkey` instance. Pass `'BTC/USDT'` for spot and `'BTC/USDT:USDT'` for the perpetual; leverage, margin mode, positions and funding rates are unified methods.
**How do I use the HashKey SIM sandbox with CCXT?**
Call `exchange.set_sandbox_mode(True)`, which swaps the REST host to `api-glb.sim.hashkeydev.com` and the WebSocket host to the matching SIM stream. Get sandbox credentials from HashKey's SIM site.
**How does HashKey authentication work, and does CCXT handle it?**
HashKey signs the concatenation of query string and request body with HMAC-SHA256 keyed on your secret, passes the key in an `X-HK-APIKEY` header, and requires a millisecond `timestamp` with a `recvWindow` (default 5000 ms). CCXT does all of it, including the timestamp, on every private call.
**Can I still call HashKey-specific endpoints through CCXT?**
Yes — all 67 endpoints in CCXT's HashKey definition are generated as [implicit methods](/docs/exchanges/hashkey/implicit-api), with signing, rate limiting and error mapping applied.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.hashkey` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [hashkey unified API reference](/docs/exchanges/hashkey)
* [hashkey implicit API](/docs/exchanges/hashkey/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Hibachi API (/docs/comparisons/ccxt-vs-hibachi-api)
Hibachi is a perpetuals venue with a public market-data host (`data-api.hibachi.xyz`) and a signed trading host (`api.hibachi.xyz`). Orders are signed with a private key rather than only authenticated with a secret, which puts it in the same family as other self-custodial perpetuals venues.
Hibachi publishes an official Python SDK, `hibachi-xyz`, and CCXT implements the venue as `ccxt.hibachi`. The choice comes down to two things, and one of them cuts against CCXT: **which language you write in, and whether you need WebSocket streaming today.**
## TL;DR [#tldr]
* **Pick Hibachi's own SDK** if you work in Python 3.13 or later and need WebSocket streaming — Hibachi's SDK has it and CCXT's Hibachi integration does not.
* **Pick CCXT** if you write in TypeScript, Go, C#, PHP, Java or an older Python, or if Hibachi is one venue among several and you want one interface across all of them.
* **Choosing CCXT does not hide Hibachi's API.** All 28 Hibachi endpoints are generated as [implicit methods](/docs/exchanges/hibachi/implicit-api), signed and rate-limited like any unified call.
## At a glance [#at-a-glance]
| | **CCXT** | **hibachi-xyz (official Python SDK)** |
| --------------------------------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| Exchanges covered | 104 (Hibachi is one of them) | Hibachi only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python only, and the published package requires Python 3.13 or later |
| Packages to install | 1 (`ccxt`) | 1 (`hibachi-xyz`) |
| Markets | Hibachi perpetuals | Hibachi perpetuals |
| Unified market data + trading API | yes — 33 unified capabilities, 24 `fetch*` methods | no — Hibachi's own request and response shapes |
| WebSockets | **no** — CCXT has no `watch*` methods for Hibachi; use `fetch*` and poll | **yes** — market, trade and account WebSocket APIs |
| Raw endpoint access | yes — 28 endpoints as implicit methods | yes, it is the whole product |
| Order signing | handled — API key, account id and private key, ECDSA over the order payload | handled |
| Built-in rate limiter | yes, on by default (`rateLimit` 100 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Hibachi's own error types |
| Testnet / sandbox | no — Hibachi has no test URLs in CCXT, `set_sandbox_mode(True)` raises `NotSupported` | not documented at the repository root |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 10 GitHub stars · 1.5k PyPI installs/month |
| Licence | MIT | not stated at the repository root |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `hibachi-xyz/hibachi_sdk` repository and the `hibachi-xyz` PyPI listing.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch market data [#fetch-market-data]
CCXT
hibachi-xyz
```python
import ccxt
exchange = ccxt.hibachi()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from hibachi_xyz import HibachiApiClient
hibachi = HibachiApiClient()
exchange_info = hibachi.get_exchange_info()
print(exchange_info)
```
The SDK splits market data across `get_exchange_info()` for contract metadata, `get_prices()` for price and funding information, `get_stats()` for 24-hour high, low and volume, and `get_orderbook(symbol, depth, granularity)` for depth. CCXT folds the first three into one [unified ticker structure](/docs/manual#ticker-structure), keyed by the unified symbol: Hibachi's own instrument id is `BTC/USDT-P`, CCXT's is `'BTC/USDT:USDT'` — the same string you pass to `ccxt.binance`, `ccxt.bybit` or `ccxt.hyperliquid` for the equivalent contract.
### Place a limit order [#place-a-limit-order]
CCXT
hibachi-xyz
```python
import ccxt
exchange = ccxt.hibachi({
'apiKey': '...',
'accountId': 123,
'privateKey': '...',
})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.001, 50000)
print(order['id'], order['status'])
```
```python
from hibachi_xyz import HibachiApiClient, Side
hibachi = HibachiApiClient(
api_key="your-api-key",
account_id=123,
private_key="your-private-key"
)
nonce, order_id = hibachi.place_limit_order(
symbol="BTC/USDT-P",
quantity=0.001,
price=50000,
side=Side.BUY,
max_fees_percent=0.001
)
```
Both sides need the same three credentials — an API key, a numeric account id and a private key — because Hibachi orders are cryptographically signed, not just authenticated. Both sides do the signing for you. What differs is the return: CCXT gives you a [unified order structure](/docs/manual#order-structure) with `id`, `status`, `filled`, `remaining`, `average` and the rest, in the same shape every other exchange returns.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API [#eight-languages-one-api]
This is the main reason to choose CCXT here. `hibachi-xyz` is Python-only, and the published package declares Python 3.13 or later — so even a Python 3.11 service cannot install it. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with identical method names and return structures.
Python
TypeScript
PHP
C#
Go
```python
import ccxt
exchange = ccxt.hibachi()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.hibachi ();
const ticker = await exchange.fetchTicker ('BTC/USDT:USDT');
```
```php
$exchange = new \ccxt\hibachi();
$ticker = $exchange->fetch_ticker('BTC/USDT:USDT');
```
```csharp
var exchange = new ccxt.hibachi();
var ticker = await exchange.FetchTicker("BTC/USDT:USDT");
```
```go
exchange := ccxt.NewHibachi(nil)
ticker, err := exchange.FetchTicker("BTC/USDT:USDT")
```
### Portability across venue types [#portability-across-venue-types]
Hibachi is a signed-order, self-custodial perpetuals venue. That normally means a bespoke integration: key handling, a nonce scheme, an instrument naming convention of its own. In CCXT it is the same interface as a centralised exchange, so quoting Hibachi against another venue does not need a translation layer:
```python
for exchange_id in ['hibachi', 'binance', 'bybit', 'hyperliquid']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT:USDT')['last'])
```
### Signing you do not implement [#signing-you-do-not-implement]
Hibachi requires three credentials — `apiKey`, `accountId` and `privateKey` — and signs order payloads with an ECDSA signature over a hashed message (falling back to HMAC-SHA256 for shorter keys). CCXT implements that internally, using its own audited crypto helpers rather than an external dependency, so key material stays in your process and the signature format tracks Hibachi's changes as a library update rather than a code change on your side.
### Rate limits, precision and errors [#rate-limits-precision-and-errors]
* **Rate limiting.** CCXT's token-bucket throttler is on by default (`enableRateLimit = true`, `rateLimit = 100` ms). You call methods in a loop; the library paces them.
* **Precision.** Hibachi uses tick-size precision and rejects orders that violate tick size, lot size or minimum notional. `amount_to_precision`, `price_to_precision` and `cost_to_precision` are backed by the `Precise` string-arithmetic class, so quantities do not drift through float rounding.
* **Errors.** CCXT maps Hibachi's failures onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `NetworkError` and 36 more, all under `BaseError` — so `except ccxt.InsufficientFunds` keeps working on the next venue.
### No sandbox [#no-sandbox]
CCXT's Hibachi definition has no test URLs, so `exchange.set_sandbox_mode(True)` raises `NotSupported`. Plan to validate against a small live account, and use CCXT's [static request and response fixtures](/docs/manual) for regression testing rather than expecting a paper-trading environment.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 33 unified capabilities, all 28 endpoints in CCXT's Hibachi `api` block are generated as callable implicit methods, camelCased from their paths:
```python
funding = exchange.public_get_market_data_funding_rates()
oi = exchange.public_get_market_data_open_interest()
inventory = exchange.public_get_market_inventory()
```
Signing, rate-limit accounting and error mapping still apply. Browse them on the [Hibachi implicit API page](/docs/exchanges/hibachi/implicit-api).
## What hibachi-xyz does better [#what-hibachi-xyz-does-better]
An honest list, and the first item is the important one:
* **It has WebSockets and CCXT does not.** The SDK ships `HibachiWSMarketClient` and matching trade and account clients, with subscriptions for mark price, spot price, funding rate, trades, candlesticks, order book and ask/bid prices, plus WebSocket-based order management. CCXT has no `watch*` methods for Hibachi — you poll `fetch_order_book`, `fetch_trades` and `fetch_open_orders` instead. If you need low-latency streaming on Hibachi today, the vendor SDK is the one that provides it.
* **Typed, Hibachi-shaped models.** The SDK returns typed objects for Hibachi's own payloads, with its own error types. CCXT returns typed *unified* structures — better for portability, less literal about Hibachi's wire format.
* **Hibachi-specific features land there first.** A new endpoint or order flag appears in the vendor SDK on Hibachi's schedule. CCXT's implicit API closes most of that gap immediately, but a *unified* wrapper may lag.
* **A smaller dependency if Hibachi is all you need.** If your entire system talks to Hibachi and nothing else, in Python 3.13, `hibachi-xyz` is a much smaller install than all of CCXT.
If Hibachi is your only venue, you are on Python 3.13 or later, and you need streaming, the official SDK is the better choice today.
## Migrating from hibachi-xyz to CCXT [#migrating-from-hibachi-xyz-to-ccxt]
| What you are doing | Hibachi SDK / REST | CCXT |
| ------------------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| Symbols | `BTC/USDT-P` | `'BTC/USDT:USDT'` |
| Credentials | `api_key`, `account_id`, `private_key` | `apiKey`, `accountId`, `privateKey` |
| Instrument list | `/market/exchange-info` | `load_markets()` |
| Prices / ticker | `/market/data/prices`, `/market/data/stats` | `fetch_ticker()` (one symbol at a time — `fetch_tickers` is not supported here) |
| Order book | `/market/data/orderbook` | `fetch_order_book()` |
| Candles | `/market/data/klines` | `fetch_ohlcv()` |
| Public trades | `/market/data/trades` | `fetch_trades()` |
| Funding rates | `/market/data/funding-rates` | `fetch_funding_rate()` / `fetch_funding_rate_history()` |
| Open interest | `/market/data/open-interest` | `fetch_open_interest()` |
| New order | `place_limit_order()` — `POST /trade/order` | `create_order()` |
| Cancel order | `DELETE /trade/order` | `cancel_order()` |
| Cancel everything | `DELETE /trade/orders` | `cancel_all_orders()` |
| Open orders | `GET /trade/orders` | `fetch_open_orders()` |
| Order history | `/trade/orders/history` | `fetch_closed_orders()` / `fetch_canceled_orders()` |
| My trades | `/trade/account/trades` | `fetch_my_trades()` |
| Balance | `get_account_info()` — `/capital/balance`, `/trade/account/info` | `fetch_balance()` |
| Positions | `/trade/account/info` | `fetch_positions()` |
| Leverage | `POST /trade/account/leverage` | the same endpoint as an [implicit method](/docs/exchanges/hibachi/implicit-api) — `set_leverage` is not unified here |
| Streams | the SDK's WebSocket APIs | not available in CCXT for Hibachi — poll `fetch*` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/hibachi/implicit-api) |
## FAQ [#faq]
**Does CCXT support Hibachi WebSockets?**
No. Hibachi has no `watch*` methods in CCXT, so streaming is not available through `ccxt.pro.hibachi`. Use the `fetch*` methods and poll, or use Hibachi's own Python SDK, which does expose market, trade and account WebSocket APIs. CCXT supports WebSockets on 76 of its 104 exchanges; Hibachi is not one of them today.
**What credentials does CCXT need for Hibachi?**
Three: `apiKey`, `accountId` and `privateKey`. Hibachi orders are signed, so the private key is required for any trading call. CCXT performs the signing internally.
**Does Hibachi have a testnet I can use through CCXT?**
No. CCXT's Hibachi definition has no test URLs, so `set_sandbox_mode(True)` raises `NotSupported`.
**Does CCXT support Hibachi spot markets?**
Hibachi is a perpetuals venue — `has.spot` is `false` and `has.swap` is `true`. All 33 unified capabilities apply to perpetual contracts.
**Can I still call Hibachi-specific endpoints through CCXT?**
Yes — all 28 endpoints in CCXT's Hibachi definition are generated as [implicit methods](/docs/exchanges/hibachi/implicit-api), with signing, rate limiting and error mapping applied.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [hibachi unified API reference](/docs/exchanges/hibachi)
* [hibachi implicit API](/docs/exchanges/hibachi/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the HitBTC API (/docs/comparisons/ccxt-vs-hitbtc-api)
HitBTC's REST and streaming API v3 is well documented and covers spot, isolated and cross margin, and futures. What it does not come with is a client library: HitBTC's own GitHub repository, `hitbtc-com/hitbtc-api`, is an API-documentation repository whose README points at the v3 reference. There is no HitBTC-maintained SDK in any language.
So the honest comparison is not CCXT against a vendor SDK. It is **CCXT against the code you would write yourself** — signing, rate limiting, pagination, order-book maintenance, precision and error handling — and that comparison has a clear shape.
## TL;DR [#tldr]
* **Call the raw API** if you need exactly one or two endpoints, in one language, and would rather own 200 lines than take a dependency.
* **Pick CCXT** if you need more than a handful of endpoints, want the order book maintained and the rate limiter written, or expect to touch a second venue.
* **Choosing CCXT does not hide HitBTC's API.** All 111 HitBTC endpoints are generated as [implicit methods](/docs/exchanges/hitbtc/implicit-api), signed and rate-limited like any unified call.
* **The same CCXT class already drives three venues.** `bequant` and `fmfwio` run on the HitBTC engine, and CCXT implements both by extending its `hitbtc` class — one parser, three exchanges.
## At a glance [#at-a-glance]
| | **CCXT** | **The raw HitBTC API** |
| --------------------------------- | ---------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| Exchanges covered | 104 (HitBTC is one of them) | HitBTC only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | any language with an HTTP client, all of it your code |
| Official client library | n/a | **none** — `hitbtc-com/hitbtc-api` is a documentation repository (LGPL-3.0) |
| HitBTC products in one client | spot, margin, futures — one `ccxt.hitbtc` instance | three parallel endpoint families (`spot/*`, `margin/*`, `futures/*`) |
| Unified market data + trading API | yes — 67 unified capabilities, 35 `fetch*` methods | no — HitBTC's own request and response shapes |
| WebSockets | yes — 8 `watch*` methods, same structures as `fetch*` | raw socket, subscribe/notification protocol, your reconnect logic |
| Raw endpoint access | yes — 111 endpoints as implicit methods | yes, it is all you have |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 3.333 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus HitBTC error codes |
| Testnet / sandbox | `exchange.set_sandbox_mode(True)` | a different base URL you swap yourself |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month | the documentation repository shows 321 GitHub stars |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub issues — usually same-day | HitBTC support |
Figures verified September 2026 against CCXT v4.5.78, HitBTC's published API v3 documentation and the `hitbtc-com/hitbtc-api` repository.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HitBTC API
```python
import ccxt
exchange = ccxt.hitbtc()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
url = 'https://api.hitbtc.com/api/3/public/ticker/BTCUSDT'
response = requests.get(url)
response.raise_for_status()
print(response.json())
```
For one public endpoint the raw call is shorter, and that is a fair point. The difference starts at the second endpoint: you now own symbol mapping, timestamp units, string-versus-float number handling and a response shape that differs from every other venue you will ever add.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HitBTC API
```python
import ccxt
exchange = ccxt.hitbtc({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import requests
from requests.auth import HTTPBasicAuth
url = 'https://api.hitbtc.com/api/3/spot/order'
payload = {
'symbol': 'BTCUSDT',
'side': 'buy',
'type': 'limit',
'time_in_force': 'GTC',
'quantity': '0.001',
'price': '60000',
}
response = requests.post(url, json=payload,
auth=HTTPBasicAuth('API_KEY', 'API_SECRET'))
response.raise_for_status()
print(response.json())
```
HitBTC documents two authentication schemes — HTTP Basic with the key and secret, and an `HS256` HMAC-SHA256 signature with a timestamp window. Basic auth is the easy one to write and the one that makes key rotation and request replay your problem; CCXT implements the signing and you never see it.
Note the endpoint path. Placing the same order on margin is `POST /margin/order`, and on futures it is `POST /futures/order` — three families with three balance endpoints, three history endpoints and three order endpoints. In CCXT they are one `create_order` call, selected by the unified symbol and `options.defaultType`.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Three endpoint families, one unified surface [#three-endpoint-families-one-unified-surface]
HitBTC's v3 API mirrors the same shapes across `spot/*`, `margin/*` and `futures/*`: separate `balance`, `order`, `history/order`, `history/trade`, `fee` and `account` endpoints for each. That is a clean API design, and it also means a hand-rolled integration writes the same parser three times.
CCXT's `ccxt.hitbtc` covers all three with 67 unified capabilities and 35 `fetch*` methods. `fetch_balance()`, `fetch_open_orders()` and `create_order()` route to the right family based on the market type of the symbol you pass.
### One implementation, three venues [#one-implementation-three-venues]
Bequant and FMFW\.io both run on the HitBTC engine, so their APIs are HitBTC-shaped. CCXT implements them as classes that extend `hitbtc` rather than as duplicated parsers:
```python
import ccxt
for exchange_id in ['hitbtc', 'bequant', 'fmfwio']:
exchange = getattr(ccxt, exchange_id)()
markets = exchange.load_markets()
print(exchange_id, len(markets), 'markets')
```
Credentials and listings are each venue's own — these are different exchanges, not aliases — but the request and response handling is shared. A fix to HitBTC parsing lands in all three. See [CCXT vs the Bequant API](/docs/comparisons/ccxt-vs-bequant-api) and [CCXT vs the FMFW.io API](/docs/comparisons/ccxt-vs-fmfwio-api).
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
HitBTC meters per endpoint group with burst allowances — public market data at roughly 30 requests per second with a burst of 50, order placement at roughly 300 per second with a burst of 450, and lower limits on wallet and history endpoints. CCXT encodes the relative cost of each endpoint in its `api` block (you can see the per-endpoint weights: `spot/order` costs 1, `spot/balance` costs 15, `wallet/*` costs 30) and ships a token-bucket throttler that is on by default, with `rateLimit = 3.333` ms as the base interval.
You call methods in a loop; the library paces them. With raw HTTP you write and maintain that, including backing off correctly on a `429`.
### WebSockets that look like REST [#websockets-that-look-like-rest]
CCXT Pro — bundled in the same `ccxt` package, no separate purchase — gives HitBTC 8 streaming methods: `watchOrderBook`, `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchTrades`, `watchOHLCV`, `watchOrders` and `watchBalance`.
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.hitbtc()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
`watch_order_book` returns the same structure as `fetch_order_book`. Underneath, CCXT does the work a raw stream leaves to you:
| | CCXT | raw stream |
| -------------------------------------------------------- | ------------ | ---------- |
| Subscribe and correlate responses to requests | done for you | your code |
| Merge snapshot and incremental updates into a live book | done for you | your code |
| Detect sequence gaps and re-sync | done for you | your code |
| Reconnect, re-authenticate and re-subscribe after a drop | done for you | your code |
| Keep a bounded, depth-limited cache | done for you | your code |
None of those fail loudly. A hand-rolled book drifts, and you find out from a fill you did not expect.
### Precision, rounding and string math [#precision-rounding-and-string-math]
HitBTC uses tick-size precision, and rejects orders that violate tick size, quantity increment or minimum notional. CCXT loads that metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities do not drift through float rounding.
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps HitBTC's error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all under `BaseError`. `except ccxt.InsufficientFunds` keeps working when you add a second exchange; matching on numeric codes does not.
### Demo environment without a second code path [#demo-environment-without-a-second-code-path]
```python
exchange = ccxt.hitbtc({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps in api.demo.hitbtc.com
```
One flag swaps the REST and WebSocket hosts to HitBTC's demo environment. No constant swapping, no forked configuration.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 67 unified capabilities, all 111 endpoints in CCXT's HitBTC `api` block are generated as callable implicit methods, camelCased from their paths:
```python
converted = exchange.public_get_public_converted_candles()
subaccounts = exchange.private_get_sub_account()
```
Signing, rate-limit accounting and error mapping still apply. Browse them on the [HitBTC implicit API page](/docs/exchanges/hitbtc/implicit-api).
## What the raw HitBTC API does better [#what-the-raw-hitbtc-api-does-better]
An honest list, because these are real:
* **Zero dependencies and a smaller surface.** If your integration is "poll one public ticker every minute", `requests.get` plus twelve lines is genuinely the right answer, and it will never break because a library changed.
* **Literal fidelity to the documentation.** The raw payload is the payload in HitBTC's reference. Every field is there, in HitBTC's own names, with nothing normalised away. When you are debugging against the vendor docs that is one fewer hop.
* **Endpoints and fields CCXT does not unify.** Sub-account ACLs, airdrops, amount locks, internal withdrawals and the crypto-address check-mine endpoint are HitBTC-specific. CCXT reaches them as raw implicit calls, but they are not unified methods with typed structures.
* **You control the failure modes.** Your own client's retry, timeout and backoff policy is exactly what you wrote, with no library behaviour to reason about.
If HitBTC is your only venue and your integration is small and static, the raw API is a perfectly reasonable choice.
## Migrating from the raw HitBTC API to CCXT [#migrating-from-the-raw-hitbtc-api-to-ccxt]
| What you are doing | HitBTC REST v3 | CCXT |
| ------------------- | --------------------------------------- | ------------------------------------------------------------------------------ |
| Symbols | `BTCUSDT` | `'BTC/USDT'` (spot), `'BTC/USDT:USDT'` (futures) |
| Product selection | `spot/*`, `margin/*`, `futures/*` paths | `options.defaultType` and the unified symbol |
| Symbol list | `/public/symbol` | `load_markets()` |
| Currencies | `/public/currency` | `fetch_currencies()` |
| Ticker | `/public/ticker/{symbol}` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `/public/orderbook/{symbol}` | `fetch_order_book()` |
| Candles | `/public/candles/{symbol}` | `fetch_ohlcv()` |
| Public trades | `/public/trades/{symbol}` | `fetch_trades()` |
| New order | `POST /spot/order` | `create_order()` |
| Cancel order | `DELETE /spot/order/{client_order_id}` | `cancel_order()` |
| Open orders | `GET /spot/order` | `fetch_open_orders()` |
| Order history | `/spot/history/order` | `fetch_closed_orders()` |
| My trades | `/spot/history/trade` | `fetch_my_trades()` |
| Balance | `/spot/balance`, `/wallet/balance` | `fetch_balance()` |
| Positions | `/futures/account` | `fetch_positions()` |
| Streams | raw WebSocket subscribe protocol | `watch_*` on `ccxt.pro.hitbtc` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/hitbtc/implicit-api) |
## FAQ [#faq]
**Does HitBTC have an official SDK?**
No client library, as of this writing. HitBTC's GitHub repository `hitbtc-com/hitbtc-api` is a documentation repository — its README introduces API v3 and links to the reference. The Python, Node, C# and Java wrappers you will find in search results are community projects, not HitBTC-maintained. CCXT is the maintained multi-language option.
**Does CCXT support HitBTC futures and margin, or only spot?**
All three. `ccxt.hitbtc` covers spot, isolated and cross margin, and futures from one instance, with 67 unified capabilities. Select with the unified symbol and `options.defaultType`.
**Are Bequant and FMFW\.io the same exchange as HitBTC?**
No — they are separate venues with their own accounts, listings and credentials, but they run on the HitBTC engine, so their APIs are HitBTC-shaped. CCXT implements `bequant` and `fmfwio` as classes extending `hitbtc`, which means one parser is maintained for three venues. Your HitBTC API keys do not work on the other two.
**How do I use HitBTC's demo environment with CCXT?**
Call `exchange.set_sandbox_mode(True)`, which swaps the REST and WebSocket hosts to `api.demo.hitbtc.com`. Generate demo credentials from HitBTC's demo site.
**Can I still call HitBTC-specific endpoints through CCXT?**
Yes — all 111 endpoints in CCXT's HitBTC definition are generated as [implicit methods](/docs/exchanges/hitbtc/implicit-api), with signing, rate limiting and error mapping applied.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.hitbtc` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [hitbtc unified API reference](/docs/exchanges/hitbtc)
* [hitbtc implicit API](/docs/exchanges/hitbtc/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [CCXT vs the Bequant API](/docs/comparisons/ccxt-vs-bequant-api) and [CCXT vs the FMFW.io API](/docs/comparisons/ccxt-vs-fmfwio-api)
* [More comparisons](/docs/comparisons)
# CCXT vs the HollaEx API (/docs/comparisons/ccxt-vs-hollaex-api)
HollaEx is two things at once, and that is the interesting part. It is an exchange at `hollaex.com`, and it is **HollaEx Kit** — white-label exchange software that other operators run under their own brand. Every Kit exchange exposes the same `/v2` REST API and the same WebSocket stream; only the host changes. HollaEx's own Node library makes that explicit by taking `apiURL` and `wsURL` as constructor arguments, defaulting to `https://api.hollaex.com` and `wss://api.hollaex.com/stream`.
That shapes the comparison. The question is not only "CCXT or the vendor library" but **"which one covers the language you write in, and can it be pointed at the Kit exchange you actually trade on?"**
## TL;DR [#tldr]
* **Pick `hollaex-node-lib`** if you work in Node, want method names that match HollaEx's API guide exactly, and need the admin-tier endpoints an exchange operator uses.
* **Pick CCXT** if you write in anything other than JavaScript — HollaEx's Python library repository is archived, and there is no maintained PHP, C#, Go or Java client — or if HollaEx is one venue among several.
* **Both can be pointed at any HollaEx Kit exchange.** The vendor library takes `apiURL`/`wsURL`; CCXT's constructor deep-extends `urls`, so you override the same two values.
## At a glance [#at-a-glance]
| | **CCXT** | **hollaex-node-lib** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| Exchanges covered | 104 (HollaEx is one of them) | any HollaEx Kit exchange, via `apiURL` |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Node.js only |
| Other official clients | n/a | the Python library repository, `hollaex-py-lib-old`, was archived by its owner in September 2025 |
| Packages to install | 1 (`ccxt`) | 1 (`hollaex-node-lib`) |
| Unified market data + trading API | yes — 40 unified capabilities, 21 `fetch*` methods | no — HollaEx's own request and response shapes |
| WebSockets | yes — 4 `watch*` methods, same structures as `fetch*` | yes — `connect()` / `subscribe()` with auto-reconnect |
| Raw endpoint access | yes — 29 endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 250 ms, i.e. 4 req/s) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus HollaEx `message` strings |
| Testnet / sandbox | `exchange.set_sandbox_mode(True)` → `api.sandbox.hollaex.com` | point `apiURL` at the sandbox host yourself |
| Admin / operator endpoints | no — user and trader endpoints only | yes, the library documents admin-tier calls |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 10 GitHub stars · 186 npm installs/month |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues, HollaEx documentation |
Figures verified September 2026 against CCXT v4.5.78, the `hollaex/hollaex-node-lib` repository and HollaEx's published API guide, with install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
hollaex-node-lib
```javascript
import ccxt from 'ccxt';
const exchange = new ccxt.hollaex ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
console.log (ticker['last'], ticker['baseVolume']);
```
```javascript
const hollaex = require('hollaex-node-lib');
const client = new hollaex({
apiURL: '',
wsURL: '',
apiKey: '',
apiSecret: ''
});
client.getTicker('xht-usdt').then(res => {
console.log('Volume:', res.volume);
});
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, types and units it returns for Kraken or Binance. The vendor library returns HollaEx's payload, and its symbol format (`xht-usdt`) is HollaEx's own.
### Place a limit order [#place-a-limit-order]
CCXT
hollaex-node-lib
```javascript
import ccxt from 'ccxt';
const exchange = new ccxt.hollaex ({ apiKey: '...', secret: '...' });
const order = await exchange.createOrder ('XHT/USDT', 'limit', 'buy', 0.1, 1);
console.log (order['id'], order['status']);
```
```javascript
client.createOrder({
symbol: 'xht-usdt',
side: 'buy',
size: 0.1,
type: 'limit',
price: 1,
opts: { meta: { post_only: false } }
});
```
Same call, different vocabulary: `size` versus a unified `amount` argument, and `opts.meta.post_only` versus CCXT's unified `params: {'postOnly': true}` which means the same thing on every venue that supports it.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API [#eight-languages-one-api]
This is the decisive difference for HollaEx specifically. The maintained vendor client is Node-only, and the Python library repository was archived by its owner in September 2025. If you write Python, PHP, C#, Go or Java, CCXT is the maintained option — written once in TypeScript and transpiled to all of them with identical method names and return structures.
Python
TypeScript
PHP
C#
Go
```python
import ccxt
exchange = ccxt.hollaex()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.hollaex ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```php
$exchange = new \ccxt\hollaex();
$ticker = $exchange->fetch_ticker('BTC/USDT');
```
```csharp
var exchange = new ccxt.hollaex();
var ticker = await exchange.FetchTicker("BTC/USDT");
```
```go
exchange := ccxt.NewHollaex(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
### Pointing CCXT at another Kit exchange [#pointing-ccxt-at-another-kit-exchange]
CCXT's `hollaex` class is configured for `api.hollaex.com`, but the constructor deep-extends `urls`, so the same class drives any HollaEx Kit venue — the API path structure (the host, then `/v2/`, then the endpoint) and the `api-key` / `api-expires` / `api-signature` header signing are identical across Kit exchanges:
```python
import ccxt
exchange = ccxt.hollaex({
'apiKey': '...',
'secret': '...',
'urls': {'api': {'rest': 'https://api.example-kit-exchange.com'}},
})
markets = exchange.load_markets()
```
For streaming, override `urls['api']['ws']` on `ccxt.pro.hollaex` the same way. This is the same knob the official Node library exposes as `apiURL` and `wsURL`. Call `load_markets()` and read symbols from it rather than assuming a pair exists — every Kit operator lists their own assets.
### WebSockets that look like REST [#websockets-that-look-like-rest]
CCXT Pro — bundled in the same `ccxt` package, no separate purchase — gives HollaEx 4 streaming methods: `watchOrderBook`, `watchTrades`, `watchOrders` and `watchBalance`.
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.hollaex()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
`watch_order_book` returns the same structure as `fetch_order_book`, so swapping a polling loop for a stream is a one-word change and nothing downstream moves. CCXT handles the connection pooling, ping/pong keep-alive, reconnect-and-resubscribe, the snapshot-plus-delta merge and the bounded cache. The vendor library also reconnects automatically — this is one place where both sides do the work — but it hands you HollaEx-shaped messages through callbacks rather than a merged book you `await`.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT sets `rateLimit = 250` ms for HollaEx — four requests per second — and the token-bucket throttler is on by default (`enableRateLimit = true`). You call methods in a loop and the library paces them, and a rate-limit response is raised as `RateLimitExceeded` rather than a bare HTTP error.
### Precision, rounding and string math [#precision-rounding-and-string-math]
HollaEx uses tick-size precision. CCXT loads that metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities do not drift through float rounding — the failure mode where a rounding artefact costs you a rejected order.
### One error hierarchy [#one-error-hierarchy]
CCXT maps HollaEx's responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `BadRequest`, `NetworkError` and 35 more, all under `BaseError`. HollaEx returns different failures under the same HTTP code with the detail in a `message` string; CCXT does the string matching so you catch types.
### Sandbox without a second code path [#sandbox-without-a-second-code-path]
```python
exchange = ccxt.hollaex({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # swaps in api.sandbox.hollaex.com
```
One flag swaps both the REST host and the WebSocket host (`wss://api.sandbox.hollaex.com/stream`).
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 40 unified capabilities, all 29 endpoints in CCXT's HollaEx `api` block are generated as callable implicit methods, camelCased from their paths:
```python
health = exchange.public_get_health()
tiers = exchange.public_get_tiers()
kit = exchange.public_get_kit()
```
Signing, rate-limit accounting and error mapping still apply. Browse them on the [HollaEx implicit API page](/docs/exchanges/hollaex/implicit-api).
## What hollaex-node-lib does better [#what-hollaex-node-lib-does-better]
An honest list, because these are real:
* **Admin-tier endpoints.** HollaEx's API has an operator side — user management, onboarding, kit configuration — that only makes sense if you run a Kit exchange rather than trade on one. The Node library documents those; CCXT deliberately models the trader-facing API only.
* **It is designed to be repointed.** `apiURL`, `wsURL` and `baseURL` are first-class constructor options because pointing at an arbitrary Kit exchange is the library's normal case, not an override. In CCXT it works, but it is a `urls` override rather than a documented product feature.
* **HollaEx's own vocabulary.** `getTicker`, `createOrder({ symbol, side, size, type, price, opts })` and the `xht-usdt` symbol format read straight off HollaEx's API guide. CCXT's unified naming is one hop away from the vendor docs.
* **The surrounding tooling is in the same ecosystem.** `hollaex-cli` and the plugin starter are built around the same conventions, so an operator running a Kit exchange is already in that world.
If you run a HollaEx Kit exchange, work in Node, and need the admin endpoints, the vendor library is the better fit.
## Migrating from hollaex-node-lib to CCXT [#migrating-from-hollaex-node-lib-to-ccxt]
| What you are doing | hollaex-node-lib / REST | CCXT |
| ---------------------- | -------------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `xht-usdt` | `'XHT/USDT'` |
| Base URL | `apiURL` constructor option | `urls.api.rest` override |
| Symbol list | `/v2/constants` | `load_markets()` |
| Ticker | `getTicker()` — `/v2/ticker` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `/v2/orderbook` | `fetch_order_book()` |
| Candles | `/v2/chart` | `fetch_ohlcv()` |
| Public trades | `/v2/trades` | `fetch_trades()` |
| New order | `createOrder({...})` — `POST /v2/order` | `create_order()` |
| Cancel order | `DELETE /v2/order` | `cancel_order()` |
| Cancel everything | `DELETE /v2/order/all` | `cancel_all_orders()` |
| Open orders | `/v2/orders` | `fetch_open_orders()` |
| My trades | `/v2/user/trades` | `fetch_my_trades()` |
| Balance | `/v2/user/balance` | `fetch_balance()` |
| Deposits / withdrawals | `/v2/user/deposits`, `/v2/user/withdrawals` | `fetch_deposits()` / `fetch_withdrawals()` |
| Streams | `client.connect([...])` / `subscribe([...])` | `watch_*` on `ccxt.pro.hollaex` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/hollaex/implicit-api) |
## FAQ [#faq]
**Is there an official HollaEx Python library?**
Not a maintained one. HollaEx's Python library repository, `hollaex-py-lib-old`, was archived by its owner in September 2025 and is read-only. The maintained vendor client is `hollaex-node-lib` for Node.js. For Python — and for PHP, C#, Go and Java — CCXT is the maintained option, and HollaEx's own API guide lists CCXT as the multi-language route.
**Can I use CCXT with a white-label exchange built on HollaEx Kit?**
Yes. Kit exchanges share the same `/v2` API surface and signing scheme, so construct `ccxt.hollaex` with a `urls` override pointing `api.rest` (and `api.ws` on `ccxt.pro.hollaex`) at that exchange's hosts. Then call `load_markets()` — each operator lists their own assets.
**Does CCXT support HollaEx futures or margin?**
No, and neither does the venue through this API. HollaEx is spot-only in CCXT (`has.swap` and `has.future` are `false`), with 40 unified capabilities across market data, trading, balances, deposits and withdrawals.
**How do I use the HollaEx sandbox with CCXT?**
Call `exchange.set_sandbox_mode(True)`, which swaps the REST host to `api.sandbox.hollaex.com` and the WebSocket host to `wss://api.sandbox.hollaex.com/stream`.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.hollaex` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [hollaex unified API reference](/docs/exchanges/hollaex)
* [hollaex implicit API](/docs/exchanges/hollaex/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the HTX API (/docs/comparisons/ccxt-vs-htx-api)
HTX (formerly Huobi) is one of the larger global venues, with spot, cross and isolated margin, coin-margined futures, coin-margined swaps and USDT-margined swaps behind a set of related APIs. To integrate it you either use the official SDKs published by HuobiRDCenter, or go through [CCXT](/docs/manual), where HTX is a [certified exchange](/docs/exchanges/htx) sitting behind an API shared with 103 other venues.
Both work. The question that decides between them is the same one HTX's own repository layout poses: **do you need more than one HTX product line, or more than one venue?**
## TL;DR [#tldr]
* **Pick the official HTX SDKs** if you trade a single product line, work in one of the five languages they cover, and want request and response models that mirror HTX's API reference literally.
* **Pick CCXT** if you want spot, margin, futures and swaps in one client, in any of eight languages, with the rate limiter, precision handling, order-book maintenance and error taxonomy already written.
* **Choosing CCXT does not hide HTX's API.** All 460 HTX endpoints in CCXT's `api` block are generated as [implicit methods](/docs/exchanges/htx/implicit-api), signed and rate-limited like any unified call.
## At a glance [#at-a-glance]
| | **CCXT** | **Official HTX SDKs** |
| --------------------------------- | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (HTX is one of them) | HTX only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, Java, Go, C++, C# — separate codebases per language |
| Packages to install | **1** (`ccxt`) | **one repository per language, per product line** — spot and contract SDKs are separate projects |
| HTX products in one client | spot, margin, coin-margined futures, coin-margined swaps, USDT-margined swaps | spot SDK covers spot; a separate contract SDK covers swap, futures and options |
| Install method | package manager (`pip`, `npm`, `composer`, NuGet, `go get`, Maven) | clone the repo and use the source; the spot Python SDK's README says "download and open the source code directly in your python project" |
| Unified market data + trading API | yes — 87 unified capabilities, 48 `fetch*` methods | no — HTX's own request and response shapes |
| WebSockets | yes — 11 `watch*` / `unWatch*` methods, same structures as `fetch*` | yes, in the spot SDKs and contract SDKs |
| Raw endpoint access | yes — 460 HTX endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 100 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTX `err-code` strings |
| Testnet / sandbox | **no** — HTX's test URLs are not wired up, `set_sandbox_mode(True)` raises `NotSupported` | not offered by the SDKs either |
| Certified | yes | n/a |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | spot SDKs: Python 689 stars, Java 269, Go 180, C++ 60, C# 52. Contract SDKs: Python 13, Java 2, C# 1, Go futures 1, C++ 0 |
| Licence | MIT | Apache-2.0 (spot Python SDK), MIT (contract Python SDK) — varies by repository |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues per repository, HTX support notices |
Figures verified September 2026 against CCXT v4.5.78, the HuobiRDCenter GitHub organisation and HTX's published API documentation.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch recent candles [#fetch-recent-candles]
CCXT
huobi_Python (spot SDK)
```python
import ccxt
exchange = ccxt.htx()
candles = exchange.fetch_ohlcv('BTC/USDT', '5m', limit=10)
for timestamp, o, h, l, c, v in candles:
print(timestamp, o, h, l, c, v)
```
```python
from huobi.client.market import MarketClient
from huobi.constant import CandlestickInterval
market_client = MarketClient()
list_obj = market_client.get_candlestick("btcusdt", CandlestickInterval.MIN5, 10)
```
CCXT returns a [unified OHLCV array](/docs/manual#ohlcv-structure) — `[timestamp, open, high, low, close, volume]`, milliseconds, same on every venue. The SDK returns HTX's own candlestick objects and its own interval enum.
### Place a limit order [#place-a-limit-order]
CCXT
huobi_Python (spot SDK)
```python
import ccxt
exchange = ccxt.htx({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('LTC/USDT', 'limit', 'buy', 4.0, 1.292)
print(order['id'], order['status'])
```
```python
from huobi.client.trade import TradeClient
from huobi.constant import OrderType, OrderSource
trade_client = TradeClient(api_key=g_api_key, secret_key=g_secret_key)
order_id = trade_client.create_order(
symbol=symbol_test, account_id=account_id,
order_type=OrderType.BUY_LIMIT, source=OrderSource.API,
amount=4.0, price=1.292)
```
Two things to notice. First, HTX's spot API is account-scoped: you have to look up an `account_id` before you can place an order, and pass it on every call. CCXT resolves and caches that for you. Second, `OrderType.BUY_LIMIT` fuses side and type into one enum — a shape that does not survive contact with a second exchange. CCXT keeps `side` and `type` as separate unified arguments.
To place the same order on a USDT-margined swap with the official SDKs, you switch to the contract SDK — a different repository, different client classes, different signatures. With CCXT you change the symbol and, if you want swaps to be the default, one option:
```python
exchange = ccxt.htx({'apiKey': '...', 'secret': '...',
'options': {'defaultType': 'swap'}})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 1, 60000)
```
## Where the differences actually bite [#where-the-differences-actually-bite]
### Spot and contracts are two SDKs, one CCXT class [#spot-and-contracts-are-two-sdks-one-ccxt-class]
This is the structural difference. HuobiRDCenter maintains a **spot** SDK per language (`huobi_Python`, `huobi_Java`, `huobi_Golang`, `huobi_Cpp`, `huobi_CSharp`) and a separate **contract** SDK per language (`huobi_python_contract`, `huobi_java_contract`, `huobi_csharp_contract`, `huobi_cpp_contract`, `huobi_futures_Golang`). A strategy that quotes spot and hedges on USDT-margined swaps pulls in two projects, two client hierarchies and two sets of conventions.
The attention gap between them is visible in the star counts: 689 on the Python spot SDK versus 13 on the Python contract SDK, 269 on the Java spot SDK versus 2 on the Java contract SDK.
CCXT ships all of it as one `ccxt.htx` instance. `options.defaultType` selects `spot`, `margin`, `swap` or `future`; the method names do not change.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, so method names, arguments and return structures are identical everywhere. HTX's SDKs are five separate codebases with separate idioms and separate release schedules — and no PHP or JavaScript SDK at all.
Python
TypeScript
PHP
C#
Go
```python
import ccxt
exchange = ccxt.htx()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.htx ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```php
$exchange = new \ccxt\htx();
$ticker = $exchange->fetch_ticker('BTC/USDT');
```
```csharp
var exchange = new ccxt.htx();
var ticker = await exchange.FetchTicker("BTC/USDT");
```
```go
exchange := ccxt.NewHtx(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
### Installation and dependency management [#installation-and-dependency-management]
CCXT is a published package in every one of its languages: `pip install ccxt`, `npm install ccxt`, `composer require ccxt/ccxt`, `dotnet add package ccxt`, `go get`, Maven. The official HTX Python spot SDK is distributed as source — its README instructs you to download the repository and open the source in your project. That matters for reproducible builds, dependency pinning and CI.
Be careful with PyPI here: the `huobi` package on PyPI is a third-party project by an independent author, not HuobiRDCenter's SDK.
### WebSockets that look like REST [#websockets-that-look-like-rest]
CCXT Pro — bundled in the same `ccxt` package, no separate purchase — gives HTX 11 streaming methods: `watchOrderBook`, `watchTicker`, `watchTrades`, `watchOHLCV`, `watchOrders`, `watchMyTrades`, `watchBalance`, plus `unWatchTicker`, `unWatchOHLCV`, `unWatchTrades` and `unWatchOrderBook` for tearing a subscription down without dropping the connection.
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.htx()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
`watch_order_book` returns the same structure as `fetch_order_book`. Underneath, CCXT handles connection pooling per URL, HTX's gzip-deflated WebSocket frames and its ping/pong dialect, automatic reconnect and resubscribe, the REST-snapshot-plus-delta merge with sequence-gap detection, and bounded caches for trades and candles. HTX's WebSocket surface is split across spot and contract hosts with different message formats; `watch_order_book('BTC/USDT')` and `watch_order_book('BTC/USDT:USDT')` are the same call in CCXT.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
HTX meters market-data, public and private interfaces separately, and the limits have changed more than once — HTX publishes adjustments as support notices rather than only in the reference, and returns the remaining allowance in response headers. CCXT encodes per-endpoint cost in the exchange definition and ships a token-bucket throttler that is on by default (`enableRateLimit = true`, `rateLimit = 100` ms), so a loop of calls is paced without you tracking which interface group each one belongs to.
### Precision, rounding and string math [#precision-rounding-and-string-math]
HTX rejects orders that violate tick size, step size or minimum notional, and its spot amount precision differs per symbol. CCXT loads market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities do not drift through float rounding.
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps HTX's `err-code` values onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all under `BaseError`. You write `except ccxt.InsufficientFunds` once instead of matching on `order-value-min-error` and hoping the string never changes.
### No sandbox, on either side [#no-sandbox-on-either-side]
CCXT's HTX definition has no active test URLs, so `exchange.set_sandbox_mode(True)` raises `NotSupported`. Neither do the official SDKs offer a testnet path. Plan to validate against a small live account, and lean on CCXT's [static request and response fixtures](/docs/manual) for regression testing rather than expecting a paper-trading environment.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 87 unified capabilities, all 460 endpoints in CCXT's HTX `api` block are generated as callable implicit methods, camelCased from their paths:
```python
sub_users = exchange.v2_private_get_sub_user_user_list()
adjust = exchange.contract_public_get_linear_swap_api_v1_swap_adjustfactor()
```
Signing, timestamping, rate-limit accounting and error mapping still apply. So the unified API covers what every venue shares, and the implicit API covers HTX's own corners — sub-account management, ETP, algo orders, cross-margin ladders — without dropping to raw HTTP. Browse them on the [HTX implicit API page](/docs/exchanges/htx/implicit-api).
### Maintenance [#maintenance]
CCXT's HTX integration is roughly 10,100 lines of REST implementation plus 2,900 lines of WebSocket implementation, backed by static request and response fixtures that are replayed in every language on every build. HTX also carries CCXT's **certified** badge, which means the implementation is supervised and quality-assured by the CCXT dev team and gets priority support. When HTX changes a response shape, the fix reaches you as a version bump.
## What the official HTX SDKs do better [#what-the-official-htx-sdks-do-better]
An honest list, because these are real:
* **Literal fidelity to the HTX documentation.** `MarketClient`, `TradeClient`, `MarginClient`, `AlgoClient`, `ETFClient`, `SubuserClient` map onto the sections of HTX's reference one for one. Reading the docs and reading the SDK is the same activity. CCXT's unified naming is one hop away from that.
* **C++ coverage.** HuobiRDCenter publishes a C++ spot SDK and a C++ contract SDK. CCXT has no C++ target, so for a C++ execution path the vendor SDK is the only maintained option of the two.
* **Product corners a unified API does not model.** ETF/ETP endpoints, sub-user management and some margin ladder queries are first-class SDK clients. CCXT reaches them only as raw implicit calls, which works but is not typed or documented as a unified method.
* **A smaller dependency for a single product line.** If all you ever do is HTX spot market data in Java, `huobi_Java` alone is a smaller surface than all of CCXT.
If HTX is your only venue, you work in C++, or you are staying inside one product line and want the vendor's exact vocabulary, the official SDKs are a defensible choice.
## Migrating from an HTX SDK to CCXT [#migrating-from-an-htx-sdk-to-ccxt]
| What you are doing | HTX SDK / REST | CCXT |
| ------------------- | --------------------------------------------- | ----------------------------------------------------------------------------- |
| Symbols | `btcusdt`, `BTC-USDT` | `'BTC/USDT'` (spot), `'BTC/USDT:USDT'` (USDT swap), `'BTC/USD:BTC'` (inverse) |
| Product selection | spot SDK or contract SDK | `options.defaultType` = `spot` / `margin` / `swap` / `future` |
| Symbol list | `/v1/common/symbols` | `load_markets()` |
| Ticker | `/market/detail/merged` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `/market/depth` | `fetch_order_book()` |
| Candles | `/market/history/kline` | `fetch_ohlcv()` |
| Public trades | `/market/history/trade` | `fetch_trades()` |
| Account lookup | `/v1/account/accounts` then pass `account-id` | handled internally |
| New order | `/v1/order/orders/place` | `create_order()` |
| Cancel order | `/v1/order/orders/{order-id}/submitcancel` | `cancel_order()` |
| Open orders | `/v1/order/openOrders` | `fetch_open_orders()` |
| My trades | `/v1/order/matchresults` | `fetch_my_trades()` |
| Balance | `/v1/account/accounts/{account-id}/balance` | `fetch_balance()` |
| Positions | contract SDK position clients | `fetch_positions()` |
| Streams | spot or contract WebSocket client | `watch_*` on `ccxt.pro.htx` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/htx/implicit-api) |
## FAQ [#faq]
**Is HTX the same as Huobi?**
Yes — Huobi rebranded to HTX. CCXT's exchange id is `htx`, and the class covers the venue formerly documented as Huobi Global. The `huobi` id is retained as an alias in CCXT's history, but `ccxt.htx` is the current name.
**Does CCXT support HTX futures and swaps, or only spot?**
All of them from one client: spot, cross and isolated margin, coin-margined futures, coin-margined swaps and USDT-margined swaps. Select with `options.defaultType` and the unified symbol — `'BTC/USDT'` for spot, `'BTC/USDT:USDT'` for the linear swap, `'BTC/USD:BTC'` for the inverse.
**Does HTX have a testnet I can use through CCXT?**
No. CCXT's HTX definition has no active test URLs, so `set_sandbox_mode(True)` raises `NotSupported`. Validate against a small live account instead.
**Can I still call HTX-specific endpoints through CCXT?**
Yes — all 460 endpoints in CCXT's HTX definition are generated as [implicit methods](/docs/exchanges/htx/implicit-api), with signing, rate limiting and error mapping applied.
**Is the `huobi` package on PyPI the official SDK?**
No. It is a third-party project by an independent author. The official Python SDKs are the HuobiRDCenter repositories, distributed as source rather than as a PyPI package.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.htx` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [htx unified API reference](/docs/exchanges/htx)
* [htx implicit API](/docs/exchanges/htx/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs Hummingbot (/docs/comparisons/ccxt-vs-hummingbot)
[Hummingbot](https://github.com/hummingbot/hummingbot) describes itself as "an open-source framework that helps you design and deploy automated trading strategies, or **bots**, that can run on many centralized or decentralized exchanges". [CCXT](/docs/manual) is not a bot. It is the exchange-access layer a bot is built on.
That would make the two incomparable, except for one thing: unlike most Python trading bots, Hummingbot does **not** use CCXT. It hand-writes a connector per venue — signing, REST plumbing, order-book diffing and all. So the two projects really do overlap, at exactly one layer, and the question that decides between them is: **do you want the strategy engine too, or only the venue access?**
## TL;DR [#tldr]
* **Pick Hummingbot** if you want a market maker running today rather than a codebase to write — with paper trading, a backtesting dashboard, an executor library and an encrypted keystore — and your venues are on its connector list. It also reaches on-chain AMM DEXes, which CCXT does not.
* **Pick CCXT** if you are building your own system and want venue access as a library: 104 exchanges, 76 of them streaming, in TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java or Rust, with every raw endpoint still reachable.
* **They are not really rivals.** Hummingbot competes with the strategy engine you would otherwise write. CCXT competes with the connector layer underneath it. Plenty of teams run a Hummingbot instance for market making and CCXT for everything else.
## At a glance [#at-a-glance]
| | **CCXT** | **Hummingbot** |
| ------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| What it is | exchange-access library | framework for building and running trading bots |
| Connector layer | its own, one unified API | its own, hand-written per venue — no CCXT dependency |
| Centralised venues | 104 REST, 76 with WebSocket | 24 CLOB CEX rows in the README connector tables |
| On-chain venues | none | 8 CLOB DEX and 12 AMM DEX rows; AMM access runs through the separate Gateway service |
| Prediction markets | 7 venues in `ccxt.prediction` | not listed |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust | Python, with Cython extensions |
| Install | `pip install ccxt` / `npm i ccxt` | Anaconda/Miniconda + `make install` from source, or Docker Compose |
| Strategy engine | none — you write the loop | scripts, V2 controllers, executors, legacy V1 strategies |
| Backtesting | none | yes, on controller pages in the Hummingbot Dashboard |
| Paper trading | testnet where the venue offers one, via `set_sandbox_mode(True)` | yes — `binance_paper_trade` and equivalents, no API keys needed |
| Rate limiting | built in, per-endpoint weights, on by default | built in, `AsyncThrottler` in `hummingbot/core/api_throttler` |
| Raw endpoint access | yes — every endpoint as an implicit method (808 on Binance) | whatever the connector implements |
| Unified error types | 41 typed exceptions in one hierarchy | per-connector exception handling |
| Popularity | 43.8k GitHub stars · 4.7M PyPI + 494k npm installs/month (one package, every venue) | 19.8k GitHub stars, 4.9k forks; installed from source or Docker rather than PyPI |
| Licence | MIT | Apache-2.0 |
| Support | Discord, Telegram, GitHub issues | Discord `#support`, GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the Hummingbot repository README and `setup.py`/`setup/environment.yml` on `master`, hummingbot.org, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Quote a two-sided market [#quote-a-two-sided-market]
CCXT
Hummingbot
```python
import asyncio
import ccxt.pro
async def main():
exchange = ccxt.pro.binance({'apiKey': '...', 'secret': '...'})
symbol, size, spread = 'BTC/USDT', 0.001, 0.001
while True:
book = await exchange.watch_order_book(symbol)
mid = (book['bids'][0][0] + book['asks'][0][0]) / 2
await exchange.cancel_all_orders(symbol)
bid = exchange.price_to_precision(symbol, mid * (1 - spread))
ask = exchange.price_to_precision(symbol, mid * (1 + spread))
await exchange.create_order(symbol, 'limit', 'buy', size, bid)
await exchange.create_order(symbol, 'limit', 'sell', size, ask)
asyncio.run(main())
```
```python
class SimplePMM(StrategyV2Base):
def on_tick(self):
if self.create_timestamp <= self.current_timestamp:
self.cancel_all_orders()
proposal = self.create_proposal()
self.place_orders(self.adjust_proposal_to_budget(proposal))
self.create_timestamp = self.config.order_refresh_time + self.current_timestamp
def create_proposal(self):
ref_price = self.connectors[self.config.exchange].get_price_by_type(
self.config.trading_pair, PriceType.MidPrice)
return [
OrderCandidate(trading_pair=self.config.trading_pair, is_maker=True,
order_type=OrderType.LIMIT, order_side=TradeType.BUY,
amount=Decimal(self.config.order_amount),
price=ref_price * Decimal(1 - self.config.bid_spread)),
OrderCandidate(trading_pair=self.config.trading_pair, is_maker=True,
order_type=OrderType.LIMIT, order_side=TradeType.SELL,
amount=Decimal(self.config.order_amount),
price=ref_price * Decimal(1 + self.config.ask_spread)),
]
```
The Hummingbot excerpt is abridged from `scripts/simple_pmm.py` in its repository. It is shorter than it looks: the framework supplies the clock, the config schema, budget checking, order tracking and fill events. In exchange, your code only exists inside its lifecycle. The CCXT version has no lifecycle — it is a loop you own, in a process you own, and it stops where you stop it.
### From nothing to something running [#from-nothing-to-something-running]
CCXT
Hummingbot
```python
import ccxt
exchange = ccxt.binance()
print(exchange.fetch_ticker('BTC/USDT')['last'])
```
```bash
hbot create simple_pmm --name conf_paper_bot.yml \
--set exchange=binance_paper_trade --set trading_pair=BTC-USDT
hbot start conf_paper_bot.yml
hbot status
```
This is the category difference in four lines each. Three `hbot` commands give you a paper-trading market maker quoting against live Binance data with no API keys. Four lines of CCXT give you a number, and everything you do with it is yours to build. Note the market naming as well: Hummingbot uses `BTC-USDT` with a separate connector id per product line (`binance`, `binance_perpetual`); CCXT uses `'BTC/USDT'` and `'BTC/USDT:USDT'` on a single `ccxt.binance()` instance.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Two connector layers, maintained twice [#two-connector-layers-maintained-twice]
This is the substantive overlap. Hummingbot has no CCXT dependency — neither `setup.py` nor `setup/environment.yml` lists it, and each connector ships its own signing code (`hummingbot/connector/exchange/kraken/kraken_auth.py` builds Kraken's request signature by hand with `hmac`, `hashlib` and `base64`). That is a deliberate design choice: purpose-built connectors can be tuned for the latency and order-tracking behaviour a high-frequency market maker needs.
The cost is arithmetic. Every venue integration exists once in each project, and every venue's API changes have to be absorbed twice. When a venue is on both lists, you get two well-maintained implementations. When it is on neither, both are equal work. When it is on one, that is your answer.
### Coverage points in opposite directions [#coverage-points-in-opposite-directions]
For centralised exchanges, CCXT covers 104 with REST and 76 with WebSocket; the Hummingbot README lists 24 CLOB CEX rows. For on-chain venues the comparison inverts completely — CCXT has no AMM support at all, and Hummingbot lists 12 AMM DEX rows plus 8 CLOB DEX rows.
If your venue list is centralised and long-tailed, CCXT reaches more of it. If it includes Uniswap, Raydium, Meteora, Orca or Curve, CCXT does not reach it at any price.
### One language versus eight [#one-language-versus-eight]
Hummingbot is Python with Cython extensions, installed from source through conda or run in Docker. That is a reasonable footprint for a dedicated trading host and a heavy one for a library dependency.
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with identical method names and return structures, and installs with a single `pip install ccxt` or `npm i ccxt`. Research in Python and execute in Go or C# without a second data model.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Every endpoint of every supported exchange is generated as a callable [implicit method](/docs/exchanges/binance/implicit-api) — 808 of them on Binance — with signing, rate limiting and error mapping already applied. A venue-specific feature that no unified method covers is still one call away. In a hand-written connector, an endpoint that was not implemented is a pull request.
### Scope is the real fork in the road [#scope-is-the-real-fork-in-the-road]
CCXT deliberately stops at the exchange boundary. There is no scheduler, no strategy lifecycle, no persistence, no dashboard and no backtester, because those are opinions and CCXT is trying not to have any. If you want those opinions supplied, a framework is the correct choice and CCXT is the wrong one.
## What Hummingbot does better [#what-hummingbot-does-better]
* **On-chain AMM and DEX trading.** Through [Gateway](https://github.com/hummingbot/gateway), a separate TypeScript service, Hummingbot trades router, AMM and concentrated-liquidity pools across Ethereum, Arbitrum, Avalanche, Base, BSC, Celo, Optimism, Polygon and Solana. Uniswap, Curve, Balancer, PancakeSwap, Raydium, Orca, Meteora and Jupiter are all connector rows. CCXT has no equivalent — it speaks exchange APIs, not chains.
* **A real market-making strategy library.** Pure Market Making, Avellaneda Market Making and Cross-Exchange Market Making ship as strategies, and the V2 executors cover position, DCA, grid, arbitrage, XEMM, TWAP and liquidity-provision patterns as reusable building blocks. That is years of accumulated execution logic you would otherwise write yourself.
* **Backtesting and a dashboard.** Controller configs can be backtested from the Hummingbot Dashboard over historical data with net PnL, max drawdown, Sharpe ratio, profit factor and per-closure-type breakdowns. CCXT has no backtester.
* **Paper trading with no keys.** `binance_paper_trade` simulates against live market data, so a strategy can be exercised end to end before any credential exists. CCXT can only offer whatever testnet the venue itself runs.
* **Operational scaffolding.** An encrypted keystore for API keys, a scriptable `hbot` CLI with stable exit codes, Docker Compose deployment, and the Condor harness for LLM-driven strategies. None of that is a library's job, and all of it is work you would otherwise do.
If you want a market maker rather than a codebase — especially one quoting on Uniswap, Raydium or another AMM — Hummingbot is the better choice, and CCXT will not get you there.
## Migrating from Hummingbot to CCXT [#migrating-from-hummingbot-to-ccxt]
Migration only makes sense at the **connector layer** — replacing Hummingbot's venue access while keeping, or rewriting, your own strategy logic. There is no CCXT equivalent of the strategy framework, and this table does not pretend otherwise. If you want a framework, stay on Hummingbot.
| What you are doing | Hummingbot | CCXT |
| ------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------- |
| Naming a market | `BTC-USDT`, plus a connector id per product (`binance`, `binance_perpetual`) | `'BTC/USDT'` and `'BTC/USDT:USDT'` on one `ccxt.binance()` |
| Connecting | `hbot connect binance` into the encrypted keystore | `ccxt.binance({'apiKey': '...', 'secret': '...'})` |
| Reference price | `get_price_by_type(pair, PriceType.MidPrice)` | `fetch_ticker(symbol)` or `fetch_order_book(symbol)` |
| Order book | `connector.get_order_book(trading_pair)` | `fetch_order_book()` / `watch_order_book()` |
| Candles | the candles feed in `hummingbot/data_feed/candles_feed` | `fetch_ohlcv()` / `watch_ohlcv()` |
| New order | `OrderCandidate` then `self.buy()` / `self.sell()` | `create_order(symbol, type, side, amount, price)` |
| Cancel order | `self.cancel(connector, pair, client_order_id)` | `cancel_order(id, symbol)` |
| Open orders | `self.get_active_orders(connector_name=...)` | `fetch_open_orders(symbol)` |
| Fills | `did_fill_order(OrderFilledEvent)` callback | `fetch_my_trades()` / `watch_my_trades()` |
| Balance | `connector.get_balance(currency)`, plus the budget checker | `fetch_balance()` |
| Paper trading | `binance_paper_trade` connector | `exchange.set_sandbox_mode(True)` where the venue has a testnet |
| Anything not listed | connector method, if implemented | the same endpoint as an implicit method |
## FAQ [#faq]
**Does Hummingbot use CCXT?**
No. Hummingbot writes and maintains its own connector per venue — there is no `ccxt` entry in its `setup.py` or conda environment, and each connector ships its own request signing. This is unusual: most Python trading bots, Freqtrade and OctoBot among them, use CCXT for exchange access.
**Can CCXT trade on Uniswap or Raydium?**
No. CCXT speaks exchange REST and WebSocket APIs, including on-chain order-book venues such as Hyperliquid and dYdX, but it has no AMM or liquidity-pool support. Hummingbot does, through its Gateway service, and that is a genuine capability gap rather than a difference of emphasis.
**Which one supports more exchanges?**
It depends which kind. For centralised exchanges, CCXT — 104 with REST and 76 with WebSocket, against 24 CLOB CEX rows in Hummingbot's README. For AMM DEXes, Hummingbot, because CCXT supports none.
**Can I use CCXT inside a Hummingbot strategy?**
Nothing stops you importing `ccxt` in a script strategy to reach a venue or an endpoint Hummingbot has no connector for — it is an ordinary Python package. Its orders will not be tracked by Hummingbot's order-tracking or budget checker, so treat anything you do that way as outside the framework's accounting.
**Does CCXT do market making?**
CCXT provides the pieces — streaming books, precision-correct prices, order placement, cancellation and fill tracking across 104 venues — and none of the strategy. The quoting logic, inventory management and risk controls are yours to write. If you want those supplied, that is precisely what Hummingbot is for.
**Is CCXT's WebSocket support a paid add-on?**
No. CCXT Pro is bundled in the `ccxt` package under MIT. Use `ccxt.pro.` and the `watch*` methods.
## Next steps [#next-steps]
* [Install CCXT](/docs/install)
* [Manual](/docs/manual) — unified structures and conventions
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [Supported exchanges](/docs/exchange-markets)
* [More comparisons](/docs/comparisons)
# CCXT vs the Hyperliquid API and the official Hyperliquid SDK (/docs/comparisons/ccxt-vs-hyperliquid-api)
[Hyperliquid](https://hyperliquid.xyz) is a perpetuals DEX with an on-chain order book, and its API looks nothing like a CEX API. There are two POST endpoints — `/info` for reads and `/exchange` for everything that changes state — and every `/exchange` request carries an EIP-712 signature over a msgpack-encoded action, plus a nonce that the chain tracks per signing address.
Two ways to talk to it: the official [`hyperliquid-python-sdk`](https://github.com/hyperliquid-dex/hyperliquid-python-sdk) (with an official [Rust SDK](https://github.com/hyperliquid-dex/hyperliquid-rust-sdk) alongside it), or [CCXT](/docs/manual), which does the same signing and exposes Hyperliquid behind the API it uses for 103 other venues.
The question that decides it: **is Hyperliquid the only venue you will trade, in a language the official SDKs already cover?**
## TL;DR [#tldr]
* **Pick the official SDK** if Hyperliquid is your only venue and you want the request payloads to match Hyperliquid's action reference literally — `order`, `modify`, `twapOrder`, `approveAgent` and the rest.
* **Pick CCXT** if you want `create_order` to mean the same thing on Hyperliquid, Binance, Bybit and OKX, in any of eight languages, with the EIP-712 signing, nonce handling and order-book maintenance already written.
* **Signing is not the thing you give up.** CCXT takes `walletAddress` and `privateKey` as first-class credentials and packs, hashes and signs each action itself — no `eth_account`, no separate signer, and the same code path in Python, Go, C#, PHP, Java, JS and TypeScript.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Hyperliquid SDK** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------- |
| Venues covered | 104 (Hyperliquid is one of them) | Hyperliquid only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python and Rust, separate codebases |
| Packages to install | 1 (`ccxt`) | `hyperliquid-python-sdk` plus `eth-account` for signing |
| Unified market data + trading API | yes — 73 unified capabilities, 28 `fetch*` methods | no — Hyperliquid's own action and response shapes |
| On-chain signing | done for you from `walletAddress` + `privateKey` | you construct a `LocalAccount` and pass it in |
| WebSockets | yes — 18 `watch*`/`unWatch*` methods, same shapes as `fetch*` | yes — `info.subscribe(subscription, callback)` |
| Raw endpoint access | yes — both endpoints (`POST /info`, `POST /exchange`) callable directly | yes, it is the whole product |
| Built-in rate limiter | yes, per-request weights, on by default (`rateLimit` 50 ms) | manual |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Python exceptions plus Hyperliquid's error strings |
| Testnet | `exchange.set_sandbox_mode(True)` — swaps the host and the signature source byte | pass `constants.TESTNET_API_URL` |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 1.8k GitHub stars · 618k PyPI installs/month |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `hyperliquid-dex/hyperliquid-python-sdk` repository and its README, Hyperliquid's own API documentation, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Read a price [#read-a-price]
CCXT
hyperliquid-python-sdk
```python
import ccxt
exchange = ccxt.hyperliquid()
ticker = exchange.fetch_ticker('BTC/USDC:USDC')
print(ticker['last'], ticker['baseVolume'])
```
```python
from hyperliquid.info import Info
from hyperliquid.utils import constants
info = Info(constants.MAINNET_API_URL, skip_ws=True)
mids = info.all_mids()
print(mids["BTC"])
```
`all_mids()` returns a dictionary of coin to mid price as a string, which is what Hyperliquid actually sends. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — same keys, same types, same units as the ticker you get from Binance or Kraken — and its symbols are the unified ones, so a perp is `'BTC/USDC:USDC'` and spot is `'BTC/USDC'` rather than `"BTC"` and `"@1"`.
### Place a limit order [#place-a-limit-order]
CCXT
hyperliquid-python-sdk
```python
import ccxt
exchange = ccxt.hyperliquid({
'walletAddress': '0x...',
'privateKey': '0x...',
})
order = exchange.create_order('ETH/USDC:USDC', 'limit', 'buy', 0.2, 1100)
print(order['id'], order['status'])
exchange.cancel_order(order['id'], 'ETH/USDC:USDC')
```
```python
import example_utils
from hyperliquid.utils import constants
address, info, exchange = example_utils.setup(
base_url=constants.TESTNET_API_URL, skip_ws=True)
order_result = exchange.order("ETH", True, 0.2, 1100, {"limit": {"tif": "Gtc"}})
status = order_result["response"]["data"]["statuses"][0]
if "resting" in status:
exchange.cancel("ETH", status["resting"]["oid"])
```
The SDK's `setup()` reads a `config.json`, builds an `eth_account` `LocalAccount` from your secret key and hands it to the `Exchange` constructor; you then read the order id out of a nested response, and `True` is the side. In CCXT the credentials are constructor fields, the side is `'buy'`, and the return value is a [unified order structure](/docs/manual#order-structure) with `id`, `status`, `filled` and `average` in the same places as every other exchange.
### Stream an order book [#stream-an-order-book]
CCXT
hyperliquid-python-sdk
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.hyperliquid()
while True:
orderbook = await exchange.watch_order_book('ETH/USDC:USDC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import example_utils
from hyperliquid.utils import constants
address, info, _ = example_utils.setup(constants.TESTNET_API_URL)
info.subscribe({"type": "l2Book", "coin": "ETH"}, print)
info.subscribe({"type": "orderUpdates", "user": address}, print)
```
Both work. They differ in shape: the SDK is callback-driven and hands your function the raw message, so ordering, buffering and back-pressure are yours to arrange. CCXT is `await`-shaped — `watch_order_book` returns the same structure as `fetch_order_book`, so a polling loop becomes a streaming loop by changing one word and the code downstream never learns which one produced the book.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Signing is most of the integration [#signing-is-most-of-the-integration]
Every state-changing Hyperliquid request is an msgpack-encoded action, keccak-hashed together with the nonce and optional vault address, wrapped in an EIP-712 `Agent` typed-data struct, and signed with secp256k1. Hyperliquid's own documentation adds that the 100 highest nonces are stored per address, that each new nonce must exceed the smallest of them and never repeat, and that nonces must fall within `(T - 2 days, T + 1 day)`.
CCXT implements all of that inside the library — `actionHash`, the EIP-712 domain, the ECDSA signature and the nonce — and, because CCXT is written once and transpiled, the identical signing path exists in Python, Go, C#, PHP, Java and JavaScript. Outside Python and Rust, this is the part you would otherwise be porting by hand from someone else's SDK.
```python
exchange = ccxt.hyperliquid({'walletAddress': '0x...', 'privateKey': '0x...'})
```
Vault and subaccount trading uses the same methods: pass `vaultAddress` in `params` and CCXT folds it into the signed payload.
### One API for CEXes and perp DEXes [#one-api-for-cexes-and-perp-dexes]
This is the difference that shows up when the strategy grows a second leg. Hyperliquid is signature-and-nonce based; Binance is HMAC over a query string; Coinbase is a JWT. Their symbols, order payloads, error codes and stream dialects have nothing in common. CCXT already absorbed that:
```python
venues = {
'hyperliquid': 'BTC/USDC:USDC',
'binance': 'BTC/USDT:USDT',
'bybit': 'BTC/USDT:USDT',
'okx': 'BTC/USDT:USDT',
}
for exchange_id, symbol in venues.items():
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker(symbol)['last'])
```
Basis trades, cross-venue hedges and DEX-versus-CEX arbitrage stop being two integrations with a translation layer between them.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures.
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.hyperliquid ({ walletAddress: '0x...', privateKey: '0x...' });
const ticker = await exchange.fetchTicker ('BTC/USDC:USDC');
```
```python
import ccxt
exchange = ccxt.hyperliquid({'walletAddress': '0x...', 'privateKey': '0x...'})
ticker = exchange.fetch_ticker('BTC/USDC:USDC')
```
```go
exchange := ccxt.NewHyperliquid(map[string]interface{}{
"walletAddress": "0x...",
"privateKey": "0x...",
})
ticker, err := exchange.FetchTicker("BTC/USDC:USDC")
```
The official SDKs cover Python and Rust; CCXT covers both of those and Go, C#, PHP, Java, JavaScript and TypeScript from one source.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Hyperliquid documents an aggregated REST weight limit of 1200 per minute per IP, with `/info` requests weighted 2, 20 or 60 depending on the request type, and address-based limits on `/exchange`. CCXT encodes those per-request weights in the exchange definition — `l2Book`, `allMids`, `clearinghouseState`, `orderStatus` and friends at the cheap weight, the rest at the default — and ships a throttler that is on by default (`enableRateLimit = true`, base `rateLimit` 50 ms). You call methods in a loop; the library paces them.
### Precision, tick size and string math [#precision-tick-size-and-string-math]
Hyperliquid rejects orders that violate tick size or the minimum notional, and it says so in prose: `"Price must be divisible by tick size."`, `"Order must have minimum value of $10"`. CCXT loads the market metadata and gives you `amount_to_precision` and `price_to_precision`, backed by the `Precise` string-arithmetic class so sizes never drift through float rounding.
```python
amount = exchange.amount_to_precision('ETH/USDC:USDC', 0.20000000000000004)
price = exchange.price_to_precision('ETH/USDC:USDC', 1100.123456)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Hyperliquid's prose errors onto its [typed exception tree](/docs/manual#error-handling): that tick-size message becomes `InvalidOrder`, `"Insufficient margin to place order."` becomes `InsufficientFunds`, a post-only order that would have crossed becomes `InvalidOrder`. You write `except ccxt.InsufficientFunds` once, and the same handler keeps working when the next venue reports the same condition as an integer error code.
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.hyperliquid({'walletAddress': '0x...', 'privateKey': '0x...'})
exchange.set_sandbox_mode(True)
```
That swaps in `api.hyperliquid-testnet.xyz` **and** flips the source byte inside the signed phantom agent, which is the part that is easy to miss when you switch hosts by hand — a mainnet-shaped signature against testnet is simply rejected.
### The implicit API is small here, because the API is small [#the-implicit-api-is-small-here-because-the-api-is-small]
On most exchanges the [implicit API](/docs/exchanges/hyperliquid/implicit-api) is the escape hatch that stops a unified library from being a lowest common denominator — 792 raw methods for Binance, 637 for Bitget. Hyperliquid has **two** endpoints, so the escape hatch is `publicPostInfo` and `privatePostExchange`:
```python
response = exchange.public_post_info({'type': 'meta'})
```
That is the honest version of this section: on Hyperliquid nearly all the value is in the unified layer and the signing, not in raw endpoint coverage. Anything the unified methods do not model yet, you can still send through `privatePostExchange` — but you are then constructing the action payload yourself.
## What the official Hyperliquid SDK does better [#what-the-official-hyperliquid-sdk-does-better]
Real advantages, not padding:
* **A Rust SDK written as Rust.** [`hyperliquid-rust-sdk`](https://github.com/hyperliquid-dex/hyperliquid-rust-sdk) is first-party and idiomatic to the language. CCXT reaches Rust too, but through a crate generated from the same TypeScript source as its other targets, so it reads like CCXT rather than like Rust.
* **One-to-one with Hyperliquid's action reference.** Hyperliquid documents `order`, `modify`, `batchModify`, `scheduleCancel`, `twapOrder`, `approveAgent`, `approveBuilderFee`, `tokenDelegate`, `reserveRequestWeight` and more. The SDK's methods track that list literally, so debugging against the docs is one hop instead of two.
* **New actions land there first.** When Hyperliquid ships a new action type, the venue's own SDK is where it appears first; a *unified* CCXT wrapper for it may follow later.
* **Signer flexibility.** The SDK's examples read an encrypted keystore file with a password prompt and support multi-sig authorised-user wallets, because signing is delegated to `eth_account`. CCXT takes a raw `privateKey` in the constructor.
* **Smaller dependency for a single-venue Python bot.** If Hyperliquid is all you will ever touch and you are in Python, the SDK is a smaller install than all of CCXT.
If you are writing a Hyperliquid-only bot and you want your code to read like the Hyperliquid docs, the official SDK is the better fit.
## If you want CCXT but only this one venue [#if-you-want-ccxt-but-only-this-one-venue]
CCXT publishes a single-exchange Python distribution built from the same source: [`ccxt/hyperliquid-python`](https://github.com/ccxt/hyperliquid-python).
```bash
pip install hyperliquid
```
It exposes `HyperliquidSync`, `HyperliquidAsync` and `HyperliquidWs` — the unified methods, the signing and the WebSocket support, without the other 103 exchanges. It is MIT-licensed and tracks the same codebase, so moving to full `ccxt` later is an import change.
## Migrating from hyperliquid-python-sdk to CCXT [#migrating-from-hyperliquid-python-sdk-to-ccxt]
| What you are doing | hyperliquid-python-sdk | CCXT |
| ------------------- | --------------------------------------------------- | ------------------------------------------------ |
| Coin / symbol | `"ETH"`, `"PURR/USDC"`, `"@1"` | `'ETH/USDC:USDC'` (perp), `'PURR/USDC'` (spot) |
| Credentials | `eth_account` `LocalAccount` + `account_address` | `{'walletAddress': ..., 'privateKey': ...}` |
| Metadata | `info.meta()` | `load_markets()` |
| Prices | `info.all_mids()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `info.l2_snapshot(name)` | `fetch_order_book()` |
| Candles | `info.candles_snapshot(name, interval, start, end)` | `fetch_ohlcv()` |
| Account state | `info.user_state(address)` | `fetch_balance()` / `fetch_positions()` |
| Open orders | `info.open_orders(address)` | `fetch_open_orders()` |
| Fills | `info.user_fills(address)` | `fetch_my_trades()` |
| New order | `exchange.order(coin, is_buy, sz, px, order_type)` | `create_order()` |
| Cancel | `exchange.cancel(coin, oid)` | `cancel_order()` |
| Streams | `info.subscribe({...}, callback)` | `watch_*` on `ccxt.pro.hyperliquid` |
| Anything not listed | the raw action | `private_post_exchange()` / `public_post_info()` |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [hyperliquid unified API reference](/docs/exchanges/hyperliquid).
## FAQ [#faq]
**Does CCXT sign Hyperliquid orders itself, or do I need eth\_account?**
CCXT signs them itself. You pass `walletAddress` and `privateKey` to the constructor and the library msgpack-encodes the action, keccak-hashes it with the nonce, builds the EIP-712 typed-data struct and produces the secp256k1 signature. There is no `eth_account` dependency, and the same path exists in all eight CCXT languages.
**Can I use a Hyperliquid API wallet (agent wallet) with CCXT?**
Yes. Pass the API wallet's private key as `privateKey` and your main account's address as `walletAddress` — the same split the official SDK expresses as `LocalAccount` plus `account_address`. For vaults and subaccounts, pass `vaultAddress` in `params`.
**Does CCXT support Hyperliquid spot as well as perps?**
Yes. Perps are unified symbols like `'BTC/USDC:USDC'` and spot pairs are `'BTC/USDC'`, from the same `ccxt.hyperliquid` instance.
**Is CCXT slower than the official SDK?**
CCXT adds parsing and normalisation on top of the same HTTP and WebSocket calls, so there is a small constant per-message overhead. Signing cost is comparable — both do one keccak hash and one ECDSA signature. For anything short of latency-critical market making, network round-trip time dominates; if you are optimising microseconds, Hyperliquid's Rust SDK is the honest recommendation.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.hyperliquid` and the `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, WebSocket support included, no paid tier.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [hyperliquid unified API reference](/docs/exchanges/hyperliquid)
* [hyperliquid implicit API](/docs/exchanges/hyperliquid/implicit-api)
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Independent Reserve API (/docs/comparisons/ccxt-vs-independentreserve-api)
Independent Reserve is an Australian and New Zealand exchange with a JSON-over-HTTP API: public data on `GET`, private calls on `POST`, and an HMAC-SHA256 signature over a comma-joined, order-sensitive parameter string. It also runs a WebSocket service for order and trade events.
On the client side, Independent Reserve maintains **one** client library, and it is for .NET (`IndependentReserve.Client`, Apache-2.0, .NET Standard 2.0), plus an iOS sample client in Objective-C. Its WebSocket repository is documentation and JavaScript samples rather than a library. The Node.js, PHP, Java, Python and Rust wrappers listed on its API page are third-party-authored.
So the question is: **do you write C#, or do you write something else?**
## TL;DR [#tldr]
* **Pick `IndependentReserve.Client`** if you work in .NET, Independent Reserve is your only venue, and you want the vendor's own request and response models — including the choice between nonce-based and timestamp-based expiry.
* **Pick CCXT** if you write in anything else — Python, TypeScript, PHP, Go, Java or JavaScript have no official client — or if Independent Reserve is one venue among several.
* **Choosing CCXT does not hide the API.** All 39 Independent Reserve endpoints are generated as [implicit methods](/docs/exchanges/independentreserve/implicit-api), signed and rate-limited like any unified call.
## At a glance [#at-a-glance]
| | **CCXT** | **Independent Reserve's own clients** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Independent Reserve is one of them) | Independent Reserve only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | **C#/.NET only** (plus an Objective-C iOS sample client) |
| Packages to install | 1 (`ccxt`) | 1 (`IndependentReserve.Client` on NuGet) |
| Unified market data + trading API | yes — 18 unified capabilities, 11 `fetch*` methods | no — Independent Reserve's own request and response shapes |
| WebSockets | yes — `watchOrderBook` and `watchTrades` | not in the .NET client; the WebSocket repository is documentation plus JavaScript samples |
| Raw endpoint access | yes — 39 endpoints as implicit methods | yes, it wraps the public and private methods |
| Signing handled | yes — comma-joined, order-sensitive HMAC-SHA256 | yes, with `expiryMode` selectable as `Nonce` or `Timestamp` |
| Built-in rate limiter | yes, on by default (`rateLimit` 1000 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus Independent Reserve error codes |
| Testnet / sandbox | **no** — the venue publishes none, `set_sandbox_mode(True)` raises `NotSupported` | none |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | the `dotNetApiClient` repository shows 6 GitHub stars |
| Licence | MIT | Apache-2.0 |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues, Independent Reserve support |
Figures verified September 2026 against CCXT v4.5.78, the `independentreserve` GitHub organisation and Independent Reserve's published API page.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw Independent Reserve API
```python
import ccxt
exchange = ccxt.independentreserve()
ticker = exchange.fetch_ticker('BTC/AUD')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
url = 'https://api.independentreserve.com/Public/GetMarketSummary'
response = requests.get(url, params={
'primaryCurrencyCode': 'xbt',
'secondaryCurrencyCode': 'aud',
})
response.raise_for_status()
print(response.json())
```
Note `xbt`. Independent Reserve uses `Xbt` as its currency code for Bitcoin, and pairs are split across two query parameters rather than one symbol string. CCXT maps that onto `'BTC/AUD'` and returns a [unified ticker structure](/docs/manual#ticker-structure) with the same keys and units every other exchange returns.
### Place a limit order [#place-a-limit-order]
CCXT
Raw Independent Reserve API
```python
import ccxt
exchange = ccxt.independentreserve({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/AUD', 'limit', 'buy', 0.001, 90000)
print(order['id'], order['status'])
```
```python
import hashlib
import hmac
import json
import time
import requests
api_key = '...'
secret = '...'
url = 'https://api.independentreserve.com/Private/PlaceLimitOrder'
nonce = int(time.time() * 1000)
params = {
'primaryCurrencyCode': 'Xbt',
'secondaryCurrencyCode': 'Aud',
'orderType': 'LimitBid',
'price': 90000,
'volume': 0.001,
}
# the signed message is a comma-joined string, and the ORDER of the parts matters
parts = [url, f'apiKey={api_key}', f'nonce={nonce}']
parts += [f'{k}={v}' for k, v in params.items()]
signature = hmac.new(secret.encode(), ','.join(parts).encode(),
hashlib.sha256).hexdigest().upper()
body = {'apiKey': api_key, 'nonce': nonce, 'signature': signature, **params}
response = requests.post(url, data=json.dumps(body),
headers={'Content-Type': 'application/json'})
response.raise_for_status()
print(response.json())
```
That comment is the whole point. Independent Reserve signs a **comma-joined string whose element order must match the order of the fields in the body**, prefixed by the full URL, with the signature upper-cased. Get the ordering wrong and you get an authentication failure with no hint as to why. CCXT builds that string for you on every private call, and `'LimitBid'` versus `'LimitOffer'` is derived from the unified `side` argument rather than something you look up.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API [#eight-languages-one-api]
This is the decisive difference. The only official client is for .NET. If you write Python, TypeScript, PHP, Go, Java or JavaScript, your maintained options are CCXT or your own wrapper — the community libraries on Independent Reserve's API page are third-party-authored, with no vendor commitment behind them.
Python
TypeScript
PHP
C#
Go
```python
import ccxt
exchange = ccxt.independentreserve()
ticker = exchange.fetch_ticker('BTC/AUD')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.independentreserve ();
const ticker = await exchange.fetchTicker ('BTC/AUD');
```
```php
$exchange = new \ccxt\independentreserve();
$ticker = $exchange->fetch_ticker('BTC/AUD');
```
```csharp
var exchange = new ccxt.independentreserve();
var ticker = await exchange.FetchTicker("BTC/AUD");
```
```go
exchange := ccxt.NewIndependentreserve(nil)
ticker, err := exchange.FetchTicker("BTC/AUD")
```
### Fiat pairs and currency-code translation [#fiat-pairs-and-currency-code-translation]
Independent Reserve quotes in AUD, NZD, USD and SGD, and uses its own currency codes (`Xbt` for Bitcoin, for instance) split across `primaryCurrencyCode` and `secondaryCurrencyCode` parameters. CCXT resolves all of that through `load_markets()` and gives you ordinary unified symbols — `'BTC/AUD'`, `'ETH/NZD'` — so an AUD-denominated strategy reads the same as a USDT-denominated one on another venue.
### Streaming, with two methods [#streaming-with-two-methods]
CCXT Pro — bundled in the same `ccxt` package, no separate purchase — gives Independent Reserve two streaming methods, `watchOrderBook` and `watchTrades`, over `wss://websockets.independentreserve.com`:
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.independentreserve()
while True:
orderbook = await exchange.watch_order_book('BTC/AUD')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
`watch_order_book` returns the same structure as `fetch_order_book`, so switching a polling loop to a stream is a one-word change. The vendor's WebSocket material is a specification plus JavaScript samples — you would be assembling the snapshot-plus-event merge, gap detection and reconnect logic yourself. There are no `watchTicker`, `watchOrders` or `watchBalance` methods for this venue in CCXT; those still need polling.
### Rate limits and a slow-by-default throttle [#rate-limits-and-a-slow-by-default-throttle]
CCXT sets `rateLimit = 1000` ms for Independent Reserve — one request per second — and the token-bucket throttler is on by default (`enableRateLimit = true`). That is a deliberately conservative pace for a venue that documents caching rather than published per-endpoint quotas. You call methods in a loop; the library paces them.
### Precision and string math [#precision-and-string-math]
CCXT loads Independent Reserve's minimum order volumes and price precision and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities do not drift through float rounding.
```python
amount = exchange.amount_to_precision('BTC/AUD', 0.0012345678)
price = exchange.price_to_precision('BTC/AUD', 91234.56789)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Independent Reserve's failures onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 35 more, all under `BaseError`. `except ccxt.InsufficientFunds` keeps working when you add a second exchange.
### No sandbox, on either side [#no-sandbox-on-either-side]
Independent Reserve publishes no test environment, so `exchange.set_sandbox_mode(True)` raises `NotSupported`. Plan to validate against a small live account, and use CCXT's [static request and response fixtures](/docs/manual) for regression testing.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 18 unified capabilities, all 39 endpoints in CCXT's Independent Reserve `api` block are generated as callable implicit methods, camelCased from their paths:
```python
fx = exchange.public_get_get_fx_rates()
minimums = exchange.public_get_get_order_minimum_volumes()
fees = exchange.private_post_get_brokerage_fees()
```
Signing, nonce handling, rate-limit accounting and error mapping still apply. Browse them on the [Independent Reserve implicit API page](/docs/exchanges/independentreserve/implicit-api).
## What Independent Reserve's own client does better [#what-independent-reserves-own-client-does-better]
An honest list, because these are real:
* **It is the vendor's .NET client, with the vendor's own models.** `IndependentReserve.Client` targets .NET Standard 2.0 and encapsulates the public and private methods with Independent Reserve's own types. If you are on .NET and want request objects that mirror the API reference exactly, that is a real advantage over CCXT's unified structures.
* **Selectable expiry mode.** The .NET client lets you switch between `Nonce` and `Timestamp` expiry for request authentication. CCXT signs with a nonce; the timestamp mode is not exposed as a unified option.
* **A working sample application.** The repository ships a WPF sample that demonstrates the calls and their responses end to end, which is a fast way to see what an endpoint actually returns before you write against it.
* **Endpoints CCXT does not unify.** Fiat bank accounts, fiat withdrawal requests, deposit-address synchronisation with the blockchain, and the currency configuration endpoints are Independent Reserve specifics. CCXT reaches them as raw implicit calls, but they are not unified methods with typed structures.
If you build on .NET and Independent Reserve is your only venue, the official client is a defensible choice.
## Migrating from the Independent Reserve API to CCXT [#migrating-from-the-independent-reserve-api-to-ccxt]
| What you are doing | Independent Reserve REST | CCXT |
| ------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| Symbols | `primaryCurrencyCode=Xbt` + `secondaryCurrencyCode=Aud` | `'BTC/AUD'` |
| Currency list | `/Public/GetValidPrimaryCurrencyCodes` and `/Public/GetValidSecondaryCurrencyCodes` | `load_markets()` (`fetch_currencies` is not supported here) |
| Ticker | `/Public/GetMarketSummary` | `fetch_ticker()` |
| Order book | `/Public/GetOrderBook` | `fetch_order_book()` |
| Public trades | `/Public/GetRecentTrades` | `fetch_trades()` |
| Minimum sizes | `/Public/GetOrderMinimumVolumes` | market metadata from `load_markets()` |
| New limit order | `/Private/PlaceLimitOrder` | `create_order(..., 'limit', ...)` |
| New market order | `/Private/PlaceMarketOrder` | `create_order(..., 'market', ...)` |
| Cancel order | `/Private/CancelOrder` | `cancel_order()` |
| Open orders | `/Private/GetOpenOrders` | `fetch_open_orders()` |
| Closed orders | `/Private/GetClosedOrders` | `fetch_closed_orders()` |
| Order detail | `/Private/GetOrderDetails` | `fetch_order()` |
| My trades | `/Private/GetTrades` | `fetch_my_trades()` |
| Balance | `/Private/GetAccounts` | `fetch_balance()` |
| Deposit address | `/Private/GetDigitalCurrencyDepositAddress2` | `fetch_deposit_address()` |
| Streams | the WebSocket specification and JS samples | `watch_order_book()` / `watch_trades()` on `ccxt.pro.independentreserve` |
| Anything not listed | the raw endpoint | the same endpoint as an [implicit method](/docs/exchanges/independentreserve/implicit-api) |
## FAQ [#faq]
**Does Independent Reserve have an official Python or JavaScript SDK?**
No. The only official client library is `IndependentReserve.Client` for .NET, alongside an Objective-C iOS sample client. The WebSocket repository is documentation plus JavaScript samples, not a library. The Node.js, PHP, Java, Python and Rust wrappers listed on Independent Reserve's API page are third-party-authored. CCXT is the maintained multi-language option.
**Does CCXT support Independent Reserve's AUD and NZD pairs?**
Yes. CCXT maps Independent Reserve's `primaryCurrencyCode`/`secondaryCurrencyCode` pair — including its `Xbt` code for Bitcoin — onto ordinary unified symbols such as `'BTC/AUD'` and `'ETH/NZD'`. Call `load_markets()` and read the symbols from it.
**Does Independent Reserve have a testnet?**
No. The venue publishes no sandbox, so `set_sandbox_mode(True)` raises `NotSupported` in CCXT. Test against a small live account.
**Does CCXT stream Independent Reserve data?**
Partly. `ccxt.pro.independentreserve` supports `watch_order_book` and `watch_trades`. There are no `watchTicker`, `watchOrders`, `watchMyTrades` or `watchBalance` methods for this venue — poll the corresponding `fetch*` methods instead.
**Why does my hand-rolled Independent Reserve signature keep failing?**
Because the signed message is a comma-joined string whose element order must match the order of the fields you send, prefixed with the full request URL, and the resulting hex digest must be upper-cased. It is easy to get subtly wrong. CCXT builds it for you on every private call.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [independentreserve unified API reference](/docs/exchanges/independentreserve)
* [independentreserve implicit API](/docs/exchanges/independentreserve/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the raw INDODAX REST API (/docs/comparisons/ccxt-vs-indodax-api)
[INDODAX](https://indodax.com) is Indonesia's largest crypto exchange by listing count, and its API is well documented — but there is no official client library to compare against. The [`btcid` GitHub organisation](https://github.com/btcid) has exactly one public repository, [`indodax-official-api-docs`](https://github.com/btcid/indodax-official-api-docs), and it contains documentation, not code: `Public-RestAPI.md`, `Private-RestAPI.md`, `Marketdata-websocket.md`, `Private-websocket.md`, a deadman-switch guide, a self-trade-prevention guide and a changelog, plus a PHP signing example.
So the real comparison is not CCXT against an SDK. It is **CCXT against the client you would write yourself**.
## TL;DR [#tldr]
* **Write it yourself** if you call two or three INDODAX endpoints, never intend to add another venue, and would rather own a hundred lines than take a dependency.
* **Use CCXT** if you want the signing, nonces, pacing, precision and error mapping already done — 19 unified capabilities and all 22 endpoints, with the same method names you use on every other exchange.
* **CCXT has no WebSocket support for INDODAX.** The venue publishes market-data and private stream documentation; `indodax` has zero `watch*` methods in CCXT. If you need live streams, that part is yours to build.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw INDODAX API** |
| ----------------------- | ---------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| Official client library | — | none published; documentation repository only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | any, you write the client |
| Symbols | `'BTC/IDR'` | `btc_idr` for public, `BTCIDR` in some payloads |
| Unified capabilities | 19, of which 15 are `fetch*` | n/a |
| Signing | built in | HMAC-SHA512 over the urlencoded body, `Key` + `Sign` headers, `nonce` or `timestamp` + `recvWindow` |
| WebSockets | **no** — `indodax` has no `watch*` methods in CCXT | documented by INDODAX; you write the client |
| Raw endpoint access | yes — 22 endpoints as implicit methods | it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 50 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | `{"success": 0, "error": "..."}` |
| Testnet / sandbox | no — INDODAX has no sandbox in CCXT | no |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month | docs repository: 172 GitHub stars, 123 forks |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub issues — usually same-day | INDODAX support; issues on the docs repository |
Figures verified September 2026 against CCXT v4.5.78 and the `btcid/indodax-official-api-docs` repository, including its public and private REST API documents.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.indodax()
ticker = exchange.fetch_ticker('BTC/IDR')
print(ticker['last'], ticker['baseVolume'], ticker['quoteVolume'])
```
```python
import requests
r = requests.get('https://indodax.com/api/ticker/btc_idr')
t = r.json()['ticker']
print(t['last'], t['vol_btc'], t['vol_idr'])
```
Look at the volume keys. INDODAX names them after the pair — `vol_btc` and `vol_idr` on `btc_idr`, `vol_eth` and `vol_btc` on `eth_btc`. Any generic parser has to build those key names from the pair it asked for. CCXT does exactly that internally and hands you `baseVolume` and `quoteVolume`, which mean the same thing on every venue.
### Place a limit order [#place-a-limit-order]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.indodax({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/IDR', 'limit', 'buy', 0.001, 1500000000)
print(order['id'], order['status'])
```
```python
import hashlib, hmac, time, urllib.parse, requests
payload = {
'method': 'trade',
'timestamp': int(time.time() * 1000),
'recvWindow': 5000,
'pair': 'btc_idr',
'type': 'buy',
'price': 1500000000,
'idr': 150000, # buy side is denominated in the quote currency
}
body = urllib.parse.urlencode(payload)
sign = hmac.new(SECRET.encode(), body.encode(), hashlib.sha512).hexdigest()
r = requests.post('https://indodax.com/tapi', data=body,
headers={'Key': KEY, 'Sign': sign,
'Content-Type': 'application/x-www-form-urlencoded'})
```
Three things in that snippet are easy to get wrong and cost you a live order each time you do:
1. **The signature is over the exact urlencoded body you send.** Re-encoding, reordering or letting a library add a parameter after signing invalidates it.
2. **Every private call is a `POST` to one endpoint** — `https://indodax.com/tapi` — with the operation in a `method` field, not a path. `trade`, `cancelOrder`, `getInfo`, `openOrders`, `getOrder`, `transHistory` are all the same URL.
3. **Buy and sell orders are denominated differently.** A buy is expressed in the quote currency, a sell in the base. CCXT takes an `amount` and converts.
CCXT's `create_order` handles all three and returns a [unified order structure](/docs/manual#order-structure).
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
INDODAX's own documentation sets the public API at 180 requests per minute, trade operations at 20 requests per second per account and pair — **with a five-second trading block if you exceed it** — and cancel operations at 30 per second. A block during a fast market is not a rate-limit error you retry past; it is five seconds of no trading.
CCXT ships a token-bucket throttler that is on by default, with `rateLimit` at 50 ms for INDODAX and per-endpoint costs in the exchange definition. You call methods in a loop; the library paces them.
### Nonces, timestamps and clock drift [#nonces-timestamps-and-clock-drift]
INDODAX accepts either an incrementing `nonce` or a `timestamp` with a `recvWindow`. Incrementing nonces are the classic source of a hard-to-reproduce failure — two processes sharing a key, a restart that resets a counter, an out-of-order retry — and the error arrives as a rejected request, not an obvious bug. CCXT uses the timestamp form with a configurable `recvWindow` and manages it for you.
### Deprecations reach you as a version bump [#deprecations-reach-you-as-a-version-bump]
INDODAX's private API documentation marks `tradeHistory` and `orderHistory` as deprecating in April 2026, with replacements to move to. In a hand-rolled client, that is a ticket you have to notice, schedule and land. In CCXT, `fetch_my_trades` and `fetch_closed_orders` keep the same signature and the endpoint change arrives in a release.
### Symbols and precision [#symbols-and-precision]
INDODAX's public endpoints use `btc_idr` and some payloads use `BTCIDR`. CCXT normalises both to `'BTC/IDR'` and keeps the venue identifier on `market['id']`. It also loads each pair's price and volume increments so `amount_to_precision` and `price_to_precision` produce values the venue accepts — with IDR prices in the hundreds of millions, rounding is not a theoretical concern.
### One error hierarchy [#one-error-hierarchy]
INDODAX signals failure as `{"success": 0, "error": "..."}` with an HTTP 200. A hand-rolled client has to check the body of every response and match on error strings. CCXT does that and raises from a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded` and 36 more under `BaseError` — so one `except` block covers this venue and the next.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures. INDODAX's documentation ships a PHP signing example; every other language is yours to write and re-write.
Python
TypeScript
PHP
```python
import ccxt
exchange = ccxt.indodax()
ticker = exchange.fetch_ticker('BTC/IDR')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.indodax ();
const ticker = await exchange.fetchTicker ('BTC/IDR');
```
```php
$exchange = new \ccxt\indodax();
$ticker = $exchange->fetch_ticker('BTC/IDR');
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 19 unified capabilities, **all 22 INDODAX endpoints are generated as implicit methods**, with signing and rate-limit accounting applied. If INDODAX ships something CCXT has not unified yet, you can still call it:
```python
response = exchange.private_post_get_info()
```
Browse them on the [indodax implicit API page](/docs/exchanges/indodax/implicit-api).
## What going direct does better [#what-going-direct-does-better]
Real advantages of writing your own client:
* **WebSockets.** INDODAX documents both a market-data stream and a private stream, and **CCXT implements neither** — `indodax` has zero `watch*` methods. If your system needs a live book or live order updates from this venue, a hand-rolled client is currently the only way to get them.
* **Endpoints CCXT has not unified.** INDODAX's docs cover a deadman switch and self-trade prevention. CCXT exposes the underlying endpoints as implicit methods, but there is no unified wrapper, so calling them directly is no worse than calling them through CCXT — and you skip a dependency.
* **A hundred lines you can read in full.** For a two-endpoint integration, `requests` plus the HMAC-SHA512 block is less code to audit than a 104-exchange library, and there is no version to track.
* **The docs are the API.** The `method` field names in `Private-RestAPI.md` are exactly what you send. CCXT's unified names are an abstraction you translate back when debugging.
If INDODAX is your only venue, your usage is read-mostly, and you need its WebSocket streams, writing the client is a defensible choice.
## Migrating from a hand-rolled INDODAX client to CCXT [#migrating-from-a-hand-rolled-indodax-client-to-ccxt]
| What you are doing | Raw INDODAX API | CCXT |
| ------------------- | ---------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `btc_idr` | `'BTC/IDR'` |
| Pairs | `GET /api/pairs` | `load_markets()` |
| Ticker | `GET /api/ticker/{pair}` | `fetch_ticker()` |
| Order book | `GET /api/depth/{pair}` | `fetch_order_book()` |
| Trades | `GET /api/trades/{pair}` | `fetch_trades()` |
| Server time | `GET /api/server_time` | `fetch_time()` |
| Balance | `tapi` `method=getInfo` | `fetch_balance()` |
| New order | `tapi` `method=trade` | `create_order()` |
| Cancel order | `tapi` `method=cancelOrder` | `cancel_order()` |
| Order status | `tapi` `method=getOrder` | `fetch_order()` |
| Open orders | `tapi` `method=openOrders` | `fetch_open_orders()` |
| Transfers history | `tapi` `method=transHistory` | `fetch_deposits_withdrawals()` |
| Streams | documented, no client | not available in CCXT for this venue |
| Anything not listed | the `method` name | the same endpoint as an [implicit method](/docs/exchanges/indodax/implicit-api) |
## FAQ [#faq]
**Does INDODAX have an official SDK?**
No. INDODAX publishes official documentation — the [`btcid/indodax-official-api-docs`](https://github.com/btcid/indodax-official-api-docs) repository is the only public repository on its GitHub organisation, and it contains Markdown documents and a PHP signing example rather than a client library.
**Does CCXT support INDODAX WebSockets?**
No. `indodax` has zero `watch*` methods in CCXT. INDODAX documents both a market-data WebSocket and a private WebSocket, but CCXT does not currently implement them, so streaming from this venue means writing your own client.
**How does CCXT sign INDODAX private requests?**
It POSTs a urlencoded body containing the operation in a `method` field, a millisecond `timestamp` and a `recvWindow`, to `https://indodax.com/tapi`, and sends the HMAC-SHA512 of that exact body in a `Sign` header alongside your key in a `Key` header. You supply `apiKey` and `secret`.
**What are INDODAX's rate limits?**
Its documentation states 180 requests per minute on the public API, 20 trade requests per second per account and pair — exceeding that triggers a five-second trading block — and 30 cancel requests per second. CCXT's throttler is on by default and paces requests for you.
**Does INDODAX have a testnet?**
CCXT defines no sandbox URLs for INDODAX, so `setSandboxMode(True)` will not switch you to a test environment.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [indodax unified API reference](/docs/exchanges/indodax)
* [indodax implicit API](/docs/exchanges/indodax/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs Jesse (/docs/comparisons/ccxt-vs-jesse)
[Jesse](https://github.com/jesse-ai/jesse) calls itself "an advanced crypto trading bot written in Python" on GitHub, and in its README "an advanced crypto trading framework that aims to simplify researching and defining YOUR OWN trading strategies for backtesting, optimizing, and live trading." [CCXT](/docs/manual) is a library that talks to exchanges. Jesse is an application you run — a self-hosted dashboard backed by PostgreSQL and Redis, with a strategy class, a backtester, an optimiser and live sessions.
Jesse does not depend on CCXT. It ships its own venue drivers. So the comparison is not "which client" but **how much of your trading system do you want supplied for you, and how many venues do you need to reach?**
## TL;DR [#tldr]
* **Pick Jesse** if you are writing crypto strategies in Python and want the research loop handed to you: backtesting without look-ahead bias, Optuna-based optimisation, Monte Carlo analysis, rule significance testing, an ML pipeline, 300+ indicators and a dashboard to run it all in. CCXT supplies none of that.
* **Pick CCXT** if your venue is not among the ten or so Jesse supports, if you need a language other than Python, or if you are building something that is not a candle-driven strategy — a market-data pipeline, an arbitrage scanner, an accounting service, an exchange integration inside a larger product.
* **They are complementary, and the seam is documented.** Jesse's research API exposes `store_candles()` specifically so you can load history from outside sources; CCXT's `fetch_ohlcv` across 104 venues is exactly such a source.
## At a glance [#at-a-glance]
| | **CCXT** | **Jesse** |
| ----------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| What it is | unified exchange client (market data + trading) | crypto strategy framework: backtest, optimise, live |
| Venue coverage | 104 exchanges with REST, 76 with WebSocket, plus 7 prediction-market venues | 12 exchange/market sources for candle import; 16 exchange/market entries for live trading |
| Backtesting | none | yes — the core feature |
| Optimisation, Monte Carlo, ML | none | Optuna + Ray optimisation, Monte Carlo, rule significance testing, scikit-learn pipeline |
| Indicators | none | 300+, with native Rust implementations |
| Strategy model | none — you write the loop | `Strategy` subclass with `should_long`, `go_long`, `self.buy`, `self.take_profit`, `self.stop_loss` |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust | Python (docs state `>= 3.10 and <= 3.13`) |
| Infrastructure required | none — `pip install ccxt` | PostgreSQL >= 10, Redis >= 5, a Jesse project directory; dashboard served on port 9000 |
| Raw endpoint access | yes — every venue endpoint as an implicit method (808 for Binance) | not exposed; the driver surface is what you get |
| Live trading component | in the same MIT package | separate `jesse_live` plugin installed via `jesse install-live`, requiring a `LICENSE_API_TOKEN` from a jesse.trade account |
| Licence | **MIT** | **MIT** for the repository |
| Popularity | 43.8k GitHub stars · 4.68M PyPI + 494k npm installs/month | 8.4k GitHub stars · 10.3k PyPI installs/month |
| Support | Discord, Telegram, GitHub issues | Discord, help centre, GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the Jesse GitHub repository and `master` branch (last commit 2 September 2026, `setup.py` VERSION "3.1.0"), docs.jesse.trade, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### A moving-average crossover [#a-moving-average-crossover]
Jesse
CCXT
```python
class GoldenCross(Strategy):
def should_long(self):
short_ema = ta.ema(self.candles, 8)
long_ema = ta.ema(self.candles, 21)
return short_ema > long_ema
def go_long(self):
entry_price = self.price - 10
qty = utils.size_to_qty(self.balance * 0.05, entry_price)
self.buy = qty, entry_price
self.take_profit = qty, entry_price * 1.2
self.stop_loss = qty, entry_price * 0.9
```
```python
import ccxt
exchange = ccxt.binance({'apiKey': '...', 'secret': '...'})
candles = exchange.fetch_ohlcv('BTC/USDT', '1h', limit=200)
closes = [c[4] for c in candles]
fast = sum(closes[-8:]) / 8
slow = sum(closes[-21:]) / 21
if fast > slow:
price = closes[-1] - 10
exchange.create_order('BTC/USDT', 'limit', 'buy', 0.01, price)
```
Jesse supplies the loop, the indicator library, the position sizing helper, the bracket orders and the accounting behind `self.balance`. CCXT supplies the candles and the order; the scheduling, the state, the exits and the risk are yours. The Jesse version is shorter because a framework is doing more — and because it only runs inside a Jesse project, on a route Jesse understands.
### Load historical candles for research [#load-historical-candles-for-research]
Jesse
CCXT
```python
from jesse import research
candles, warmup = research.get_candles(
'Binance Perpetual Futures',
'BTC-USDT',
'1h',
start_date_timestamp,
finish_date_timestamp,
warmup_candles_num=0,
)
```
```python
import ccxt
exchange = ccxt.binanceusdm()
candles = exchange.fetch_ohlcv('BTC/USDT:USDT', '1h', since=start_ms, limit=1000)
# [[timestamp, open, high, low, close, volume], ...]
```
Jesse reads from its own PostgreSQL store — you import candles first, and `get_candles` raises if it is not run from inside a Jesse project (`'.env' file not found`). CCXT calls the exchange directly and returns a list, with no database, no project layout and no prior import step. Note the column orders differ: CCXT returns `[timestamp, open, high, low, close, volume]`; Jesse's candles are `[timestamp, open, close, high, low, volume]`.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Venue coverage [#venue-coverage]
Jesse's documentation lists 12 exchange/market entries for importing candles and running backtests — Binance Spot, Binance US Spot, Binance Perpetual Futures, Bitfinex Spot, Coinbase Spot, Bybit USDT/USDC Perpetual, Bybit Spot, Gate.io Perpetual Futures, KuCoin USDT Perpetual, KuCoin Spot and Kraken Pro Futures — and 16 entries for live trading, adding Lighter, Apex Omni, Hyperliquid, Kraken Pro Spot and Gate.io Spot. That is roughly ten distinct venues. The candle-import drivers in the repository sit under `jesse/modes/import_candles_mode/drivers`, one directory per venue.
CCXT covers 104 exchanges with REST and 76 of them with WebSocket, plus 7 prediction-market venues under `ccxt.prediction`. For anything outside Jesse's list — regional exchanges, newer perpetual DEXes, options venues — CCXT is where the implementation exists.
### The live-trading plugin is a separate package [#the-live-trading-plugin-is-a-separate-package]
This is the detail most worth knowing before you commit. The `jesse` repository is MIT and contains the framework, the backtester, the research API and the simulated exchange (`jesse/exchanges` holds `sandbox/` and a base `exchange.py`). Live exchange drivers are not in it.
Live trading is enabled by installing a separate plugin. Jesse's documentation calls it an "official plugin" and says you must "register on our website to generate your license key"; the CLI command is `jesse install-live`, and the installer source reads a `LICENSE_API_TOKEN` from your `.env`, then downloads a build of the `jesse_live` package matched to your OS, CPU architecture, Python version and Jesse version. Backtesting and research need none of this.
CCXT's live trading is the same package as everything else, MIT, with no key, no token and no per-platform build.
### What you have to stand up [#what-you-have-to-stand-up]
CCXT is `pip install ccxt` and a Python file. Jesse's getting-started documentation lists Python `>= 3.10 and <= 3.13`, pip `>= 23`, PostgreSQL `>= 10` and Redis `>= 5`; you clone a project template, copy `.env.example` to `.env`, and `jesse run` starts a Uvicorn server on port 9000 that you drive from a browser.
If you want a research environment, that infrastructure is buying you something. If you want to add exchange connectivity to an existing service, it is a lot to adopt.
### Eight languages versus one [#eight-languages-versus-one]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures. Jesse is Python, and its strategy model, indicators, optimiser and dashboard are all Python. If your execution service is Go or C#, CCXT can be in it and Jesse cannot.
### Everything that is not a candle strategy [#everything-that-is-not-a-candle-strategy]
Jesse's surface is the strategy API — candles in, orders out, with helpers for sizing and risk. CCXT's surface is the exchange: order books, trades, tickers, funding rates, open interest, positions, margin and leverage settings, transfers, deposit addresses, ledgers, and every raw endpoint the venue publishes as an implicit method — 808 of them for Binance. Errors arrive as 41 typed exception classes in one hierarchy, so `InsufficientFunds` means the same thing on Kraken and Bybit.
If your problem is "compute a signal from candles and trade it," Jesse's narrower surface is a feature. If your problem includes reconciliation, treasury movement, market-data capture or venue-specific endpoints, you will run out of Jesse before you run out of CCXT.
## What Jesse does better [#what-jesse-does-better]
* **It backtests, and that is the whole point.** Multi-symbol, multi-timeframe, no look-ahead bias, partial fills, leverage and short-selling, with a metrics system and a debug mode. CCXT has no backtester at all — you would build or borrow one.
* **The research tooling around the backtest is deep.** Optuna-driven parameter optimisation parallelised with Ray, Monte Carlo analysis by trade-order shuffling and by candle simulation, rule significance testing against a bootstrap distribution of random entries, and batch benchmark runs across timeframes, symbols and strategies. That is a lot of statistics you do not have to write.
* **300+ indicators with native Rust implementations**, callable as `ta.ema(self.candles, 8)`. CCXT ships no indicators.
* **A built-in ML pipeline.** `record_features()` and `record_label()` during a gather-mode backtest, `train_model()` with any scikit-learn-compatible estimator, then `ml_predict_proba()` inside the strategy — with scaling and feature ordering handled.
* **The strategy syntax really is terse.** `should_long` / `go_long`, `self.buy = qty, price`, `self.take_profit`, `self.stop_loss`, `self.liquidate()`. Bracket orders and position sizing are one line each.
* **It is an application, not just a library.** Self-hosted dashboard, built-in code editor, interactive charts that overlay orders and completed trades on candles for backtests and live sessions alike, paper trading, multiple accounts, and Telegram/Slack/Discord notifications.
* **A local MCP server.** Jesse ships an MCP server so AI assistants can run backtests, manage candle data and inspect results against your actual project.
If you are a Python trader whose venues are on Jesse's list and whose work is researching candle-driven strategies, Jesse will get you further in a weekend than assembling the same thing from libraries — and CCXT is not trying to compete for that job.
## Using them together [#using-them-together]
Migration is the wrong frame: you do not move from a strategy framework to an exchange client. But the two do meet at a documented seam.
Jesse's research API includes `store_candles(candles, exchange, symbol)`, whose docstring says it "Stores candles in the database. The stored data can later be used for being fetched again via get\_candles or even for running backtests on them. A common use case for this function is for importing candles from a CSV file so you can later use them for backtesting."
CCXT is a better source than a CSV. The pattern:
| Step | Tool |
| ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| Pull history from any of 104 venues | `exchange.fetch_ohlcv(symbol, timeframe, since, limit)` |
| Reorder columns | CCXT gives `[ts, open, high, low, close, volume]`; Jesse wants `[ts, open, close, high, low, volume]` |
| Load into Jesse | `research.store_candles(candles, exchange, symbol)` |
| Backtest, optimise, Monte Carlo | Jesse |
| Trade a venue Jesse does not support live | `ccxt.().create_order(...)` |
| Balances, transfers, funding rates, positions across venues | CCXT unified methods |
That gets Jesse's research loop pointed at market history it cannot import on its own, and gives you an execution path for the venues outside its live list.
## FAQ [#faq]
**Does Jesse use CCXT?**
No. Jesse's `requirements.txt` on `master` does not list `ccxt`; it implements its own exchange drivers, with candle-import drivers under `jesse/modes/import_candles_mode/drivers` (Apex, Binance, Bitfinex, Bybit, Coinbase, Gate, Hyperliquid, Kraken, KuCoin, Lighter) and live drivers in the separate `jesse_live` plugin.
**Which exchanges can Jesse trade live?**
Its documentation lists 16 exchange/market entries: Lighter, Apex Omni, Kraken Pro Futures, Kraken Pro Spot, KuCoin USDT Perpetual Futures, KuCoin Spot, Hyperliquid, Bybit USDT Perpetual Futures, Bybit USDC Perpetual Futures, Bybit Spot, Binance Perpetual Futures, Binance Spot, Binance US Spot, Coinbase Spot, Gate.io Perpetual Futures and Gate.io Spot. CCXT supports 104 exchanges.
**Is Jesse free?**
The GitHub repository is MIT-licensed. Live trading requires the separate `jesse_live` plugin, installed with `jesse install-live`, which needs a `LICENSE_API_TOKEN` generated from a jesse.trade account. Backtesting, optimisation and the research API do not.
**Can CCXT backtest a strategy?**
No. CCXT gives you unified historical data — `fetch_ohlcv`, `fetch_trades` — and live execution, but no simulation loop, fill model or portfolio accounting. If you want those supplied, Jesse (or another engine) supplies them.
**Can I use CCXT data inside Jesse?**
Yes. Fetch candles with `fetch_ohlcv`, reorder the columns to Jesse's `[timestamp, open, close, high, low, volume]`, and load them with `research.store_candles()`. The function exists for exactly this kind of external import.
**Do I need a separate package for CCXT's WebSockets?**
No. CCXT Pro ships inside the `ccxt` package under MIT. Use `ccxt.pro.` and the `watch*` methods.
## Next steps [#next-steps]
* [Install CCXT](/docs/install)
* [Manual](/docs/manual) — unified structures and conventions
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [Supported exchanges](/docs/exchange-markets)
* [Binance implicit API](/docs/exchanges/binance/implicit-api)
* [More comparisons](/docs/comparisons)
# CCXT vs the Kraken Spot and Futures APIs (/docs/comparisons/ccxt-vs-kraken-api)
Kraken is really two exchanges wearing one brand. **Spot** lives at `api.kraken.com` with its own REST and WebSocket dialects. **Futures** lives at `futures.kraken.com/derivatives/api/v3` with a different dialect, a different WebSocket host, and — as Kraken's own derivatives documentation makes explicit when it tells you to authenticate a particular call with "a Spot API key" — a different set of credentials.
Kraken does not publish an official client library. The Python libraries people actually use are community-maintained: [`krakenex`](https://github.com/veox/python3-krakenex), a deliberately minimal REST wrapper, and [`python-kraken-sdk`](https://github.com/btschwertfeger/python-kraken-sdk), which covers Spot and Futures in one package but through separate client classes.
[CCXT](/docs/manual) ships the split as two exchange ids — `kraken` and `krakenfutures` — that answer to the same unified method names. The question that decides between them: **do you want to learn Kraken's two dialects, or one API that happens to speak them?**
## TL;DR [#tldr]
* **Pick `krakenex`** if you want the smallest possible dependency, only need a handful of Spot REST endpoints, and LGPL-3.0 is fine for your project.
* **Pick `python-kraken-sdk`** if you want Spot, xStocks and Futures in one Apache-2.0 Python package with a CLI and WebSocket clients, and you are happy importing a different class per product.
* **Pick CCXT** if you want Spot and Futures behind one method vocabulary, in any of eight languages, with the rate limiting, nonce handling, error taxonomy and order-book reconciliation already written — and the same code shape on the next exchange.
* **Choosing CCXT does not hide anything.** All 61 raw Spot endpoints and 39 raw Futures endpoints are callable as [implicit methods](/docs/exchanges/kraken/implicit-api).
## At a glance [#at-a-glance]
| | **CCXT** | **krakenex** | **python-kraken-sdk** |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------------------------------------- |
| Exchanges covered | 104 | Kraken Spot only | Kraken Spot + Futures |
| Spot and Futures in one vocabulary | yes — `ccxt.kraken()` and `ccxt.krakenfutures()`, same method names | Spot only | separate `kraken.spot` and `kraken.futures` clients |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python | Python (>= 3.11) |
| Unified market data + trading API | yes — same method names across every exchange | no — you pass Kraken method names as strings | no — Kraken's own shapes |
| WebSockets | yes — 13 `watch*` on Spot, 12 on Futures, plus `createOrderWs`, `editOrderWs`, `cancelOrderWs`, `cancelOrdersWs`, `cancelAllOrdersWs` | **no** — REST only | yes, Spot and Futures WS clients |
| Raw endpoint access | yes — 61 Spot + 39 Futures endpoints as implicit methods | yes, it is the whole product | yes, via a generic `request()` |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 1000 ms Spot, 600 ms Futures) | no | not a documented feature |
| Nonce handling | automatic | you pass `nonce` yourself in `data` | handled by the client |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Kraken's `error` string array | Kraken exception classes |
| Sandbox | `set_sandbox_mode(True)` on `krakenfutures` (demo-futures) | none | Futures sandbox documented |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | 726 stars · 88k PyPI installs/month | 83 stars · 131k PyPI installs/month |
| Licence | **MIT** | **LGPL-3.0** (core; examples BSD) | Apache-2.0 |
| Latest release read | continuous | v2.2.2, 1 July 2024 | v3.3.0, 7 July 2026 |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, Kraken's published REST and derivatives documentation, the `python3-krakenex` and `python-kraken-sdk` repositories and PyPI pages, and install counts from PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
python-kraken-sdk
krakenex
```python
import ccxt
spot = ccxt.kraken()
print(spot.fetch_ticker('BTC/USD')['last'])
futures = ccxt.krakenfutures()
print(futures.fetch_ticker('BTC/USD:USD')['last'])
```
```python
from kraken.spot import Market as SpotMarket
from kraken.futures import Market as FuturesMarket
print(SpotMarket().get_ticker(pair="XBTUSD"))
print(FuturesMarket().get_tickers())
```
```python
import krakenex
k = krakenex.API()
print(k.query_public('Ticker', {'pair': 'XXBTZUSD'}))
```
Three things are visible here. First, the **asset codes**: Kraken calls Bitcoin `XBT`, and its Spot REST API prefixes many assets with `X` or `Z` — `XXBTZUSD` is the pair you pass to `Ticker`. CCXT normalises that to `BTC/USD` and keeps Kraken's own id on `market['id']` for when you need it.
Second, the **split**: Spot and Futures are different clients with different method names (`get_ticker(pair=...)` versus `get_tickers()`), because they are different APIs. In CCXT they are different classes with the *same* method name.
Third, `krakenex` is a **transport**, not a model. `query_public('Ticker', ...)` passes the Kraken method name through as a string and hands you the raw JSON back; there is no ticker structure, and no autocomplete.
### Place a limit order [#place-a-limit-order]
CCXT
python-kraken-sdk
```python
import ccxt
exchange = ccxt.kraken({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USD', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from kraken.spot import Trade
trade = Trade(key=key, secret=secret)
trade.create_order(
ordertype="limit",
side="buy",
volume=1,
pair="BTC/EUR",
price=0.01,
)
```
In `krakenex` the same order is `k.query_private('AddOrder', {...})` with Kraken's own field names and a nonce you supply. And the same order on Kraken **Futures** is a different endpoint, a different parameter vocabulary and a different client object in all three of the alternatives. In CCXT it is `ccxt.krakenfutures(...).create_order('BTC/USD:USD', 'limit', 'buy', 1, 60000)` — one symbol changed, one class changed, nothing else.
### Stream an order book [#stream-an-order-book]
CCXT
python-kraken-sdk
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.kraken()
while True:
orderbook = await exchange.watch_order_book('BTC/USD')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import asyncio
from kraken.spot import SpotWSClient
class Client(SpotWSClient):
async def on_message(self, message):
print(message)
async def main():
client = Client()
await client.start()
await client.subscribe(params={"channel": "ticker", "symbol": ["BTC/USD"]})
while not client.exception_occur:
await asyncio.sleep(6)
asyncio.run(main())
```
`krakenex` has no WebSocket support at all, so there is no third tab: streaming Kraken with `krakenex` means writing a WebSocket client yourself.
The two shown are not doing the same thing either. CCXT is **pull-shaped** and returns a **live, fully merged order book** with the same structure as `fetch_order_book`. A raw subscription is **push-shaped** and delivers snapshot and delta messages:
| | CCXT | raw stream |
| ------------------------------------------------ | ---------------------------- | ---------- |
| Apply deltas onto the snapshot in order | done for you | your code |
| Verify Kraken's CRC32 book **checksum** | implemented, opt-in per call | your code |
| Reconnect, re-subscribe and re-seed after a drop | done for you | your code |
| Keep a bounded, depth-limited cache | done for you | your code |
| Same structure as the REST call | yes | no |
Kraken publishes a CRC32 checksum with its book updates because local books drift. CCXT implements the check and leaves it off by default for Kraken — the exchange's checksum has not been reliable enough to re-seed on — so you turn it on with `exchange.options['watchOrderBook']['checksum'] = True` when you want it. Either way, a drifted book does not throw: it quietly disagrees with the exchange until a fill surprises you, which is why the reconciliation belongs in a library that maintains it rather than in your strategy.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Two APIs, one method vocabulary [#two-apis-one-method-vocabulary]
This is the Kraken-specific one, and it is the reason this page exists.
```python
for exchange_id in ['kraken', 'krakenfutures']:
exchange = getattr(ccxt, exchange_id)()
exchange.load_markets()
symbol = 'BTC/USD' if exchange_id == 'kraken' else 'BTC/USD:USD'
print(exchange_id, exchange.fetch_order_book(symbol)['bids'][0])
```
`load_markets`, `fetch_ticker`, `fetch_order_book`, `fetch_ohlcv`, `fetch_trades`, `create_order`, `cancel_order`, `fetch_open_orders`, `fetch_my_trades`, `fetch_balance` — all present on both, with the same signatures and the same [return structures](/docs/manual#ticker-structure). `krakenfutures` adds the derivatives-only ones: `fetch_positions`, `set_leverage`, `fetch_funding_rates`, `fetch_leverage_tiers`. CCXT implements **59 unified capabilities on `kraken`** and **50 on `krakenfutures`**.
### No official SDK means you are hand-rolling either way [#no-official-sdk-means-you-are-hand-rolling-either-way]
Kraken's documentation shows cURL and community libraries rather than a first-party client. Whatever you pick, somebody has to write:
* **Nonce management.** Kraken Spot requires a strictly increasing nonce per key, and getting it wrong returns `EAPI:Invalid nonce` intermittently under concurrency. CCXT generates and signs it for you; with `krakenex` you pass it yourself.
* **Rate-limit accounting.** Kraken meters Spot by a decaying counter, with different costs per endpoint and per tier. CCXT ships a token-bucket throttler that is on by default, with a base `rateLimit` of 1000 ms for Spot and 600 ms for Futures and a 10-second rolling window for the endpoints that need one.
* **Error parsing.** Kraken returns errors as an array of strings. CCXT maps them onto a [typed exception tree](/docs/manual#error-handling): `EAPI:Invalid key` becomes `AuthenticationError`, `EQuery:Invalid asset pair` becomes `BadSymbol`, `EFunding:Invalid amount` becomes `InsufficientFunds`, `EAPI:Rate limit exceeded` and `EGeneral:Too many requests` become `DDoSProtection`, `EAPI:Invalid nonce` becomes `InvalidNonce`, `EService:Unavailable` becomes `ExchangeNotAvailable` — 41 typed exceptions in total, all descending from `BaseError`.
* **Asset-code translation.** `XBT` versus `BTC`, and the `X`/`Z` prefixes on Spot pair ids. CCXT does this in `load_markets` and keeps the raw id available.
* **Precision and rounding.** Kraken rejects orders that violate lot size, tick size or minimum order volume, and its Futures contracts have their own sizing rules. CCXT gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding into a rejected order.
### Eight languages, one API [#eight-languages-one-api]
`krakenex` and `python-kraken-sdk` are Python-only. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures in all eight:
Python
TypeScript
Go
```python
exchange = ccxt.kraken()
ticker = exchange.fetch_ticker('BTC/USD')
```
```typescript
const exchange = new ccxt.kraken ();
const ticker = await exchange.fetchTicker ('BTC/USD');
```
```go
exchange := ccxt.NewKraken(nil)
ticker, err := exchange.FetchTicker("BTC/USD")
```
A strategy prototyped in a Python notebook ports to a Go or C# execution service without redesigning the data model.
### WebSockets that look like REST [#websockets-that-look-like-rest]
CCXT Pro is bundled in the same `ccxt` package — no separate purchase. `kraken` gets **13 streaming methods** (`watchOrderBook`, `watchOrderBookForSymbols`, `watchTrades`, `watchTradesForSymbols`, `watchOHLCV`, `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchBalance`, `watchOrders`, `watchMyTrades` among them) plus order entry over the socket: `createOrderWs`, `editOrderWs`, `cancelOrderWs`, `cancelOrdersWs` and `cancelAllOrdersWs`. `krakenfutures` gets **12**, including `watchPositions`.
`watch_order_book` returns the same structure as `fetch_order_book`. Swapping a polling loop for a stream is a one-word change and nothing downstream moves.
### Sandbox where a sandbox exists [#sandbox-where-a-sandbox-exists]
Kraken Futures has a demo environment; Kraken Spot does not. CCXT reflects that rather than pretending otherwise:
```python
exchange = ccxt.krakenfutures({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True) # demo-futures.kraken.com, REST and WebSocket
```
Calling `set_sandbox_mode(True)` on `ccxt.kraken()` raises `NotSupported`, because there is no Spot sandbox to point it at.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the unified capabilities, every endpoint on both APIs is generated as a callable implicit method, with signing, nonce, rate limiting and error mapping applied:
```python
spot = ccxt.kraken()
response = spot.public_get_asset_pairs()
futures = ccxt.krakenfutures()
response = futures.public_get_tickers()
```
Browse them on the [kraken implicit API](/docs/exchanges/kraken/implicit-api) and [krakenfutures implicit API](/docs/exchanges/krakenfutures/implicit-api) pages.
## What krakenex and python-kraken-sdk do better [#what-krakenex-and-python-kraken-sdk-do-better]
An honest list, because these are real:
* **`krakenex` is genuinely minimal.** Two methods — `query_public` and `query_private` — plus `load_key`, `close` and `json_options`. If you only need a couple of Spot endpoints, that is a tiny amount of code to read, audit and reason about, against a library that models 104 exchanges.
* **`krakenex` passes Kraken's own method names straight through.** `query_public('Ticker', ...)`, `query_private('AddOrder', ...)`: what you write is what the documentation page says, with no abstraction between you and the payload. When Kraken adds an endpoint, it works immediately with no library update at all.
* **`python-kraken-sdk` models xStocks explicitly.** Kraken's tokenised-stock instruments are a first-class part of its Spot clients, and it also ships a command-line tool alongside the SDK — neither of which CCXT provides.
* **`python-kraken-sdk` has a `request()` escape hatch with a first-party feel.** `client.request("GET", "/derivatives/api/v3/accounts")` takes the raw path, so unmapped endpoints need no special support. (CCXT's implicit methods do the same job, but from a camelCased name rather than a literal path.)
* **Kraken-shaped parameters are easier to debug against Kraken's docs.** `ordertype`, `volume`, `pair` in the alternatives versus CCXT's `type`, `amount`, `symbol` — when you are staring at Kraken's reference and an error string, literal is one fewer hop.
Two caveats worth knowing before you choose: `krakenex`'s core is **LGPL-3.0**, which for some proprietary work is a legal question before it is an engineering one, and its last release read at the time of writing was v2.2.2 from July 2024 with **no WebSocket support at all**. `python-kraken-sdk` is Apache-2.0 and actively released, but requires Python 3.11 or newer.
If you are in Python, Kraken-only, and want a maintained community library that covers both Spot and Futures with Kraken's own vocabulary, `python-kraken-sdk` is a reasonable choice.
## Migrating from krakenex to CCXT [#migrating-from-krakenex-to-ccxt]
| What you are doing | krakenex | CCXT |
| ------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------ |
| Symbols | `'XXBTZUSD'` | `'BTC/USD'` Spot, `'BTC/USD:USD'` Futures |
| Client | `krakenex.API(key=..., secret=...)` | `ccxt.kraken({'apiKey': ..., 'secret': ...})` |
| Nonce | you pass it in `data` | automatic |
| Asset pairs | `query_public('AssetPairs')` | `load_markets()` |
| Ticker | `query_public('Ticker')` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `query_public('Depth')` | `fetch_order_book()` |
| Candles | `query_public('OHLC')` | `fetch_ohlcv()` |
| New order | `query_private('AddOrder')` | `create_order()` |
| Cancel order | `query_private('CancelOrder')` | `cancel_order()` |
| Open orders | `query_private('OpenOrders')` | `fetch_open_orders()` |
| Balance | `query_private('Balance')` | `fetch_balance()` |
| Trade history | `query_private('TradesHistory')` | `fetch_my_trades()` |
| Streams | not supported | `watch_*` on `ccxt.pro.kraken` |
| Kraken Futures | not supported | `ccxt.krakenfutures()`, same method names |
| Anything not listed | `query_public` / `query_private` with the method name | the same endpoint as an [implicit method](/docs/exchanges/kraken/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [kraken unified API reference](/docs/exchanges/kraken).
## FAQ [#faq]
**Does CCXT support Kraken Futures?**
Yes, as a separate exchange id: `ccxt.krakenfutures()`. Kraken Spot and Kraken Futures are separate APIs on separate hosts with separate credentials, so CCXT models them as separate clients — but they answer to the same unified method names, so the calling code is nearly identical.
**Why does CCXT call it `BTC/USD` when Kraken calls it `XXBTZUSD`?**
Kraken uses `XBT` for Bitcoin and prefixes many Spot assets with `X` or `Z`. CCXT normalises symbols across all 104 exchanges so the same string works everywhere, and keeps Kraken's native id available on `market['id']` for when you need to talk to Kraken in its own terms.
**Is there an official Kraken SDK?**
Kraken's API documentation does not publish a first-party client library; its examples reference community packages. The widely used Python libraries — `krakenex` and `python-kraken-sdk` — are community-maintained, and `python-kraken-sdk`'s own README states that Kraken is in no way associated with its authors.
**Does Kraken have a sandbox I can use through CCXT?**
Kraken Futures does — `ccxt.krakenfutures().set_sandbox_mode(True)` points every REST and WebSocket URL at `demo-futures.kraken.com`. Kraken Spot has no sandbox, so the same call on `ccxt.kraken()` raises `NotSupported`.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.kraken` or `ccxt.pro.krakenfutures` and call `watch*` methods — 13 and 12 of them respectively.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support. That matters here: `krakenex`'s core is LGPL-3.0, which is a licence-review question that MIT does not raise.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [kraken unified API reference](/docs/exchanges/kraken)
* [kraken implicit API](/docs/exchanges/kraken/implicit-api) — every raw endpoint
* [krakenfutures unified API reference](/docs/exchanges/krakenfutures)
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Kraken Futures API (/docs/comparisons/ccxt-vs-krakenfutures-api)
Kraken runs two separate trading APIs. The spot API at `api.kraken.com` and the derivatives API at `futures.kraken.com` have different base URLs, different signing schemes, different symbol conventions and different WebSocket protocols. They are not two views of one system.
CCXT reflects that by shipping two exchange ids: [`kraken`](/docs/exchanges/kraken) for spot and [`krakenfutures`](/docs/exchanges/krakenfutures) for derivatives. This page is about the derivatives one — for the spot side see [CCXT vs the Kraken API](/docs/comparisons/ccxt-vs-kraken-api).
Kraken publishes no maintained client library for the derivatives API. The alternative to CCXT here is calling the Kraken Futures REST and WebSocket API yourself, optionally starting from the example clients under the [Crypto Facilities](https://github.com/CryptoFacilities) organisation — the business Kraken acquired to become Kraken Futures. For the Python library options that cover both halves of Kraken, see [CCXT vs the Kraken API](/docs/comparisons/ccxt-vs-kraken-api).
## TL;DR [#tldr]
* **Pick the raw API or a Crypto Facilities example client** if you want a thin, literal implementation of the endpoints you use and you are comfortable owning the signing, pacing and reconnect code.
* **Pick CCXT** if you want the derivatives API as unified methods — 53 capabilities including positions, leverage, funding rates and leverage tiers — plus 12 `watch*` streams and a one-flag switch to Kraken's demo environment.
* **Using CCXT for futures does not force a choice on spot.** `ccxt.kraken` and `ccxt.krakenfutures` are separate instances with the same method names, so one codebase covers both.
## At a glance [#at-a-glance]
| | **CCXT (`krakenfutures`)** | **Kraken Futures API direct** |
| ------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| Exchanges covered | 104 (Kraken Futures is one of them) | Kraken Futures only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | any, you write the client |
| Official client libraries | — | Crypto Facilities "Example Client" repos: Python, Node.js, Java, C#, Kotlin, Visual Basic (REST v3); Python, C#, Rust (WebSocket v1) |
| Unified capabilities | 53, of which 21 are `fetch*` | n/a |
| Symbols | `'BTC/USD:USD'` | `PF_XBTUSD`, `PI_XBTUSD` |
| WebSockets | yes — 12 `watch*` methods | yes, you implement the client |
| Raw endpoint access | yes — 39 endpoints as implicit methods | it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 600 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + Kraken error strings |
| Demo / sandbox | `exchange.set_sandbox_mode(True)` | change every base URL by hand |
| Licence | MIT | Kraken's example repos carry their own terms |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month | `CryptoFacilities/REST-v3-Python` 22 stars, last updated September 2021 |
Figures verified September 2026 against CCXT v4.5.78, the CryptoFacilities GitHub organisation and Kraken's derivatives API-testing-environment documentation.
The Crypto Facilities repositories are labelled "Example Client" by Kraken, and their last-updated dates range from October 2019 (Kotlin, Visual Basic) to August 2023 (Rust WebSocket). The Python REST client was last updated in September 2021. They are reference code, not a maintained package on PyPI or npm.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Kraken Futures REST
```python
import ccxt
exchange = ccxt.krakenfutures()
ticker = exchange.fetch_ticker('BTC/USD:USD')
print(ticker['last'], ticker['markPrice'])
```
```python
import requests
r = requests.get('https://futures.kraken.com/derivatives/api/v3/tickers')
tickers = r.json()['tickers']
btc = [t for t in tickers if t['symbol'] == 'PF_XBTUSD'][0]
print(btc['last'], btc['markPrice'])
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) keyed by unified symbol. The raw call returns every instrument in one array, and you filter by Kraken's `PF_`/`PI_` instrument codes yourself.
### Place a limit order [#place-a-limit-order]
CCXT
Kraken Futures REST
```python
import ccxt
exchange = ccxt.krakenfutures({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USD:USD', 'limit', 'buy', 1, 60000)
print(order['id'], order['status'])
```
```python
import base64, hashlib, hmac, time, urllib.parse, requests
post = urllib.parse.urlencode({'orderType': 'lmt', 'symbol': 'PF_XBTUSD',
'side': 'buy', 'size': 1, 'limitPrice': 60000})
endpoint = '/api/v3/sendorder'
sha = hashlib.sha256((post + endpoint).encode()).digest()
sig = base64.b64encode(hmac.new(base64.b64decode(SECRET), sha,
hashlib.sha512).digest())
r = requests.post('https://futures.kraken.com/derivatives' + endpoint,
data=post,
headers={'APIKey': KEY, 'Authent': sig,
'Content-Type': 'application/x-www-form-urlencoded'})
```
That signature is five steps in a specific order: concatenate the POST data with the endpoint path, SHA-256 it, base64-decode your secret, HMAC-SHA512, then base64-encode. It is also **not the scheme Kraken spot uses** — spot signs a different message with a nonce in the body. Two Kraken integrations, two signing implementations to get right and keep right.
### Stream an order book [#stream-an-order-book]
CCXT
Kraken Futures WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.krakenfutures()
while True:
orderbook = await exchange.watch_order_book('BTC/USD:USD')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
# wss://futures.kraken.com/ws/v1
# Send a subscribe frame for book/PF_XBTUSD, take the snapshot message,
# then apply every delta in sequence, detect gaps, re-subscribe and
# re-seed after a drop, and hold the depth-limited book yourself.
```
CCXT's `watch_order_book` returns the same structure as `fetch_order_book` — a live, merged book. The 12 streaming methods on `krakenfutures` are `watchOrderBook`, `watchOrderBookForSymbols`, `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchTrades`, `watchTradesForSymbols`, `watchOrders`, `watchMyTrades`, `watchPositions`, `watchBalance` and `watchStatus`.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Spot and futures are two APIs, and CCXT makes them one shape [#spot-and-futures-are-two-apis-and-ccxt-makes-them-one-shape]
This is the specific reason `krakenfutures` exists as its own class. The two Kraken APIs disagree on signing, on symbols (`XBTUSD` versus `PF_XBTUSD`), on error format and on WebSocket protocol version. In CCXT both are behind the same unified methods:
```python
spot = ccxt.kraken()
futures = ccxt.krakenfutures()
print(spot.fetch_ticker('BTC/USD')['last'])
print(futures.fetch_ticker('BTC/USD:USD')['last'])
```
The derivatives-only concepts are unified too, not bolted on: `fetch_positions`, `fetch_funding_rates`, `fetch_funding_rate_history`, `set_leverage`, `fetch_leverages`, `fetch_leverage_tiers` and `transfer` are all part of the 53 capabilities, and they carry the same names on Bybit, OKX and BitMEX.
### Demo environment without a second code path [#demo-environment-without-a-second-code-path]
Kraken runs a derivatives demo at `demo-futures.kraken.com` that mirrors production — Kraken's own documentation states the WebSocket and REST code there is identical to live in terms of feeds, endpoints and response structure, with only the host differing. You sign up separately and generate demo keys.
In CCXT that is one flag:
```python
exchange = ccxt.krakenfutures({'apiKey': '...', 'secret': '...'})
exchange.set_sandbox_mode(True)
```
Every REST and WebSocket URL swaps. No constant-swapping, no forked configuration.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT ships a token-bucket throttler that is on by default, with `rateLimit` set to 600 ms for `krakenfutures` and per-endpoint cost weights in the exchange definition. With a hand-rolled client, pacing and backoff are application code you write and maintain.
### Precision and string math [#precision-and-string-math]
Kraken Futures rejects orders that violate tick size or contract size. CCXT loads the instrument metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities do not drift through float rounding.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Kraken Futures' error strings onto a [typed exception tree](/docs/manual#error-handling): `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `ExchangeNotAvailable` and 35 more, all under `BaseError`. Catch `ccxt.InsufficientFunds` once and it keeps working when you add another venue.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 53 unified capabilities, **all 39 Kraken Futures endpoints are generated as implicit methods**, with signing and rate-limit accounting applied. Browse them on the [krakenfutures implicit API page](/docs/exchanges/krakenfutures/implicit-api).
## What going direct does better [#what-going-direct-does-better]
Real advantages, not filler:
* **The example clients are literally the docs.** `CryptoFacilities/REST-v3-Python` is a single file, `cfRestApiV3.py`, with one method per endpoint. If you are debugging a signature or a field name against Kraken's reference, nothing is in the way. CCXT's unified names are an abstraction you have to translate back.
* **Kraken publishes reference implementations in six languages for REST and three for WebSocket**, including Kotlin and Visual Basic — languages CCXT does not target. If your stack is one of those, the reference code is a real starting point.
* **A raw client is smaller and has no third-party surface.** If you call three endpoints on one venue, a hundred lines of `requests` plus the signing block is less to audit than a multi-venue library.
* **New Kraken Futures endpoints are usable the day they ship.** You call them immediately; a *unified* CCXT wrapper may lag. (CCXT's implicit API narrows this to the mapping work, not the access.)
* **A maintained third-party package exists.** [`python-kraken-sdk`](https://github.com/btschwertfeger/python-kraken-sdk) (Apache-2.0, 83 GitHub stars) covers Kraken Spot, xStocks and Futures with REST and WebSocket clients and a generic `request()` passthrough. It states that it is unofficial and not endorsed by Kraken. [CCXT vs the Kraken API](/docs/comparisons/ccxt-vs-kraken-api) compares it and `krakenex` against CCXT in detail.
If Kraken Futures is your only venue and you want the thinnest possible layer over Kraken's own documentation, going direct is a reasonable engineering choice.
## Migrating from the Kraken Futures API to CCXT [#migrating-from-the-kraken-futures-api-to-ccxt]
| What you are doing | Kraken Futures API | CCXT |
| ------------------- | --------------------------------- | ------------------------------------------------------------------------------------- |
| Symbols | `PF_XBTUSD`, `PI_XBTUSD` | `'BTC/USD:USD'` |
| Instruments | `GET /api/v3/instruments` | `load_markets()` |
| Ticker | `GET /api/v3/tickers` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `GET /api/v3/orderbook` | `fetch_order_book()` |
| Candles | `charts/` endpoints | `fetch_ohlcv()` |
| New order | `POST /api/v3/sendorder` | `create_order()` |
| Edit order | `POST /api/v3/editorder` | `edit_order()` |
| Cancel order | `POST /api/v3/cancelorder` | `cancel_order()` |
| Cancel all | `POST /api/v3/cancelallorders` | `cancel_all_orders()` |
| Dead-man's switch | `cancelallordersafter` | `cancel_all_orders_after()` |
| Open orders | `GET /api/v3/openorders` | `fetch_open_orders()` |
| Positions | `GET /api/v3/openpositions` | `fetch_positions()` |
| Balance | `GET /api/v3/accounts` | `fetch_balance()` |
| Leverage | `PUT /api/v3/leveragepreferences` | `set_leverage()` |
| Streams | `wss://futures.kraken.com/ws/v1` | `watch_*` on `ccxt.pro.krakenfutures` |
| Anything not listed | the endpoint | the same endpoint as an [implicit method](/docs/exchanges/krakenfutures/implicit-api) |
## FAQ [#faq]
**Why does CCXT have both `kraken` and `krakenfutures`?**
Because Kraken runs two separate APIs. Spot lives at `api.kraken.com` with its own signing scheme and symbols like `XBTUSD`; derivatives live at `futures.kraken.com` with a different signature construction and instrument codes like `PF_XBTUSD`. CCXT gives each its own class so both can be modelled accurately, while presenting the same unified methods on top of each. See [CCXT vs the Kraken API](/docs/comparisons/ccxt-vs-kraken-api) for the spot side.
**Does Kraken publish an official Futures SDK?**
Kraken publishes example clients under the [CryptoFacilities](https://github.com/CryptoFacilities) organisation — REST v3 in Python, Node.js, Java, C#, Kotlin and Visual Basic, and WebSocket v1 in Python, C# and Rust. They are labelled "Example Client" and are not distributed as packages; their last-updated dates run from 2019 to 2023.
**Can I test Kraken Futures without real money?**
Yes. Kraken runs a demo environment at `demo-futures.kraken.com` with its own sign-up and API keys, and Kraken states its REST and WebSocket code is identical to production apart from the host. In CCXT, `exchange.set_sandbox_mode(True)` switches every URL for you.
**Does CCXT support Kraken Futures positions and funding rates?**
Yes — `fetch_positions`, `fetch_funding_rates`, `fetch_funding_rate_history`, `set_leverage`, `fetch_leverages` and `fetch_leverage_tiers` are among the 53 unified capabilities, plus `watch_positions` over the socket.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.krakenfutures` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [krakenfutures unified API reference](/docs/exchanges/krakenfutures)
* [krakenfutures implicit API](/docs/exchanges/krakenfutures/implicit-api) — every raw endpoint
* [CCXT vs the Kraken API](/docs/comparisons/ccxt-vs-kraken-api) — the spot side
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the KuCoin API and the KuCoin Universal SDK (/docs/comparisons/ccxt-vs-kucoin-api)
KuCoin has been replacing its client libraries. The old per-language, per-product repositories — `kucoin-python-sdk`, `kucoin-node-sdk`, `kucoin-go-sdk`, `kucoin-futures-python-sdk`, `kucoin-futures-node-sdk`, `kucoin-futures-go-sdk` — are now archived and read-only on GitHub; the Python one carries the notice "this project is no longer actively maintained or updated" and points readers at the [KuCoin Universal SDK](https://github.com/Kucoin/kucoin-universal-sdk), a monorepo generated from KuCoin's OpenAPI specification.
[CCXT](/docs/manual) is the other option: it speaks KuCoin natively behind an API shared with 103 other exchanges, and its `kucoin` class kept the same method names throughout the migration.
The question that decides between them: **is KuCoin the only venue you will ever touch, in one of the languages the Universal SDK considers stable?**
## TL;DR [#tldr]
* **Pick the KuCoin Universal SDK** if KuCoin is your only venue, you work in Python, Go or Node, and you want request builders whose fields map one-for-one onto KuCoin's API reference.
* **Pick CCXT** if you want one dependency and one mental model across KuCoin spot, margin and futures — and across Binance, Bybit, OKX and 100 more the day you add a second venue — in any of eight languages.
* **The churn is the argument.** KuCoin's SDK layout has changed twice; CCXT absorbed those API changes as version bumps, not as rewrites in your code.
## At a glance [#at-a-glance]
| | **CCXT** | **KuCoin Universal SDK** |
| ------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| Exchanges covered | 104 (KuCoin is one of them) | KuCoin only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, Go, Node.js; PHP `0.1.3-alpha`, Java `0.1.1-alpha` |
| Packages to install | 1 (`ccxt`) | 1 (`kucoin-universal-sdk`), replacing the archived per-product SDKs |
| Spot + margin + futures in one client | yes — one `ccxt.kucoin` instance loads all of them | one SDK, but separate spot / futures / broker services and symbol formats |
| Unified market data + trading API | yes — 112 unified capabilities, 55 `fetch*` methods | no — KuCoin's own request builders and response models |
| WebSockets | yes — 22 `watch*`/`unWatch*` methods, same shapes as `fetch*` | yes — per-service public/private WS with callbacks and auto-reconnect |
| Raw endpoint access | yes — 351 KuCoin endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 7.5 ms) | manual |
| Unified error types | yes — 41 typed exceptions in one hierarchy | KuCoin error codes |
| Testnet / sandbox | not available for KuCoin — CCXT ships no testnet URLs for this venue | not documented in the SDK README |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 54 GitHub stars · 2.3k PyPI + 9.1k npm installs/month |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `Kucoin/kucoin-universal-sdk` repository and its READMEs, the archived KuCoin SDK repositories, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch an order book [#fetch-an-order-book]
CCXT
kucoin-universal-sdk
```python
import ccxt
exchange = ccxt.kucoin()
orderbook = exchange.fetch_order_book('BTC/USDT', 20)
print(orderbook['bids'][0], orderbook['asks'][0])
```
```python
from kucoin_universal_sdk.api import DefaultClient
from kucoin_universal_sdk.generate.spot.market import GetPartOrderBookReqBuilder
from kucoin_universal_sdk.model import ClientOptionBuilder, TransportOptionBuilder
from kucoin_universal_sdk.model import GLOBAL_API_ENDPOINT
client_option = (ClientOptionBuilder()
.set_spot_endpoint(GLOBAL_API_ENDPOINT)
.set_transport_option(TransportOptionBuilder().build())
.build())
client = DefaultClient(client_option)
spot_market_api = client.rest_service().get_spot_service().get_market_api()
request = GetPartOrderBookReqBuilder().set_symbol("BTC-USDT").set_size("20").build()
response = spot_market_api.get_part_order_book(request)
print(response.bids, response.asks)
```
The SDK returns KuCoin's own response model, reached through a service locator and a request builder. CCXT returns a [unified order book structure](/docs/manual#order-book-structure) — the same keys, the same sort order, the same types — whether the venue is KuCoin, Kraken or Hyperliquid.
### Place a limit order [#place-a-limit-order]
CCXT
kucoin-universal-sdk
```python
import ccxt
exchange = ccxt.kucoin({
'apiKey': '...', 'secret': '...', 'password': '...',
})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 10000)
print(order['id'], order['status'])
exchange.cancel_order(order['id'], 'BTC/USDT')
```
```python
import uuid
from kucoin_universal_sdk.generate.spot.order import AddOrderSyncReq, AddOrderSyncReqBuilder
order_api = client.rest_service().get_spot_service().get_order_api()
add_order_req = (AddOrderSyncReqBuilder()
.set_client_oid(str(uuid.uuid4()))
.set_side(AddOrderSyncReq.SideEnum.BUY)
.set_symbol("BTC-USDT")
.set_type(AddOrderSyncReq.TypeEnum.LIMIT)
.set_price("10000")
.set_size("0.001")
.build())
resp = order_api.add_order_sync(add_order_req)
```
Same order, two philosophies. The builder is explicit and typed against KuCoin's schema; `create_order` is five positional arguments that mean the same thing on every exchange CCXT supports. To place that order on KuCoin Futures instead, the SDK routes you through `get_futures_service()` with contract symbols like `XBTUSDTM`; in CCXT you change the symbol to `'BTC/USDT:USDT'`.
### Stream a ticker [#stream-a-ticker]
CCXT
kucoin-universal-sdk
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.kucoin()
while True:
ticker = await exchange.watch_ticker('BTC/USDT')
print(ticker['symbol'], ticker['last'])
asyncio.run(main())
```
```python
kucoin_ws_service = client.ws_service()
spot_public_ws = kucoin_ws_service.new_spot_public_ws()
spot_public_ws.start()
def ticker_event_callback(topic: str, subject: str, data) -> None:
print(topic, subject, data.sequence)
sub_id = spot_public_ws.ticker(["BTC-USDT"], ticker_event_callback)
```
Both reconnect on their own. The difference is the programming model: the SDK is push-shaped, so you register callbacks and hand control to the client, and futures streams come from a second service (`new_futures_public_ws()`, `ticker_v2("XBTUSDTM", ...)`). CCXT is pull-shaped — `watch_ticker` returns the same structure as `fetch_ticker`, from the same instance, for spot and futures alike.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Your integration should not have to follow someone else's migration [#your-integration-should-not-have-to-follow-someone-elses-migration]
Between the archived repositories and the Universal SDK, the KuCoin client landscape has been rearranged twice: per-product SDKs merged into one, request styles replaced with generated builders, and the PHP and Java builds are still published as `0.1.3-alpha` and `0.1.1-alpha`. Each move is a rewrite for code written against the old shape.
CCXT's `kucoin` class has kept the same public surface — `fetch_ticker`, `fetch_ohlcv`, `create_order`, `fetch_balance` — through all of it. When KuCoin changes an endpoint, the change lands inside CCXT and reaches you as a version bump.
### Spot, margin and futures from one client [#spot-margin-and-futures-from-one-client]
`ccxt.kucoin` declares `spot`, `margin`, `swap` and `future` all true, and `load_markets()` pulls spot, margin and contract markets into one market map. The unified symbol tells CCXT where the order goes:
```python
exchange = ccxt.kucoin({'apiKey': '...', 'secret': '...', 'password': '...'})
exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 10000) # spot
exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 1, 10000) # perpetual
```
CCXT also ships `kucoinfutures` as a separate exchange id — the same implementation restricted to contract markets, with `defaultType` set to `swap` — for people who want a futures-only client.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures.
TypeScript
Python
Go
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.kucoin ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```python
import ccxt
exchange = ccxt.kucoin()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```go
exchange := ccxt.NewKucoin(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
The Universal SDK counts Python, Go and Node as its stable targets, with PHP and Java in alpha. If your execution service is C# or Java, that gap is the decision.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
KuCoin meters by request weight per resource pool, and the weight differs per endpoint. CCXT encodes those weights in the exchange definition — you can see the per-endpoint costs in the [kucoin implicit API](/docs/exchanges/kucoin/implicit-api) — and ships a token-bucket throttler that is on by default (`enableRateLimit = true`, base `rateLimit` 7.5 ms). You call methods in a loop; the library paces them.
### Precision, rounding and string math [#precision-rounding-and-string-math]
KuCoin rejects orders that violate its tick size, increment or minimum funds. CCXT loads the market metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities never drift through float rounding.
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps KuCoin's error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError` and 35 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once and it keeps working when you add a second exchange, instead of matching on KuCoin's numeric codes.
### There is no sandbox for this one [#there-is-no-sandbox-for-this-one]
Worth saying plainly: CCXT ships no testnet URLs for KuCoin, so `set_sandbox_mode(True)` is not available on `ccxt.kucoin`. Test with small live orders on a low-balance key, or offline against CCXT's static request/response fixtures. If a sandbox matters to you more than anything else on this page, check what KuCoin currently offers before choosing either library.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
The usual objection to a unified library is that it must be a lowest common denominator. It is not. Alongside the 112 unified capabilities CCXT implements for KuCoin, **all 351 endpoints in KuCoin's API are generated as callable implicit methods** — including the broker endpoints:
```python
response = exchange.broker_get_broker_nd_info(params)
```
Signing, timestamping, rate-limit accounting and error mapping still apply. Browse them all on the [kucoin implicit API page](/docs/exchanges/kucoin/implicit-api).
## What the KuCoin Universal SDK does better [#what-the-kucoin-universal-sdk-does-better]
An honest list:
* **Generated from the spec, so coverage is exhaustive and fast.** The SDK is regenerated from KuCoin's OpenAPI definitions, so a new endpoint appears in all its languages at once, with typed request and response models for every field.
* **Typed builders with enums and IDE autocompletion.** `AddOrderSyncReqBuilder().set_side(AddOrderSyncReq.SideEnum.BUY)` is checked at the KuCoin schema level. CCXT's typing describes *unified* structures, which is better for portability and less literal about KuCoin's payloads.
* **A first-class Broker service.** The Universal SDK models KuCoin's broker API as a typed service alongside spot and futures. CCXT exposes the broker endpoints as implicit methods, but does not model them as unified methods.
* **One-to-one with the KuCoin docs.** When you are reading KuCoin's API reference, the SDK's names match it exactly; CCXT's unified names are a deliberate abstraction and one extra hop when debugging against vendor docs.
* **Smaller dependency for a KuCoin-only bot.** If you will never add a second venue, one venue's SDK is a smaller install than all of CCXT.
If KuCoin is your only venue, forever, and you work in Python, Go or Node, the Universal SDK is a defensible choice.
## If you want CCXT but only this one venue [#if-you-want-ccxt-but-only-this-one-venue]
CCXT publishes a single-exchange Python distribution built from the same source: [`ccxt/kucoin-python`](https://github.com/ccxt/kucoin-python).
```bash
pip install kucoin-api
```
It exposes `KucoinSync`, `KucoinAsync` and `KucoinWs` — the unified methods and the WebSocket support without the other 103 exchanges — under MIT, from the same codebase, so moving to full `ccxt` later is an import change.
## Migrating from a KuCoin SDK to CCXT [#migrating-from-a-kucoin-sdk-to-ccxt]
| What you are doing | KuCoin SDK | CCXT |
| ------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------ |
| Symbols | `'BTC-USDT'` spot, `'XBTUSDTM'` futures | `'BTC/USDT'` spot, `'BTC/USDT:USDT'` perpetual |
| Product selection | spot / futures / broker service | the symbol, or `options.defaultType` |
| Symbol list | `market_api.get_all_symbols()` | `load_markets()` |
| Ticker | spot market API ticker call | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `get_part_order_book()` | `fetch_order_book()` |
| Candles | `market_api.get_klines()` | `fetch_ohlcv()` |
| New order | `order_api.add_order_sync()` | `create_order()` |
| Cancel | order API cancel call | `cancel_order()` |
| Balance | account API call | `fetch_balance()` |
| Streams | `ws_service().new_spot_public_ws()` + callbacks | `watch_*` on `ccxt.pro.kucoin` |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/kucoin/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [kucoin unified API reference](/docs/exchanges/kucoin).
## FAQ [#faq]
**Is the old KuCoin Python SDK deprecated?**
`Kucoin/kucoin-python-sdk` is archived and read-only on GitHub, and its README states the project is no longer actively maintained or updated, pointing readers to the KuCoin Universal SDK. The older `kucoin-node-sdk`, `kucoin-go-sdk` and the separate futures SDKs are archived too. CCXT is unaffected by that move — the `ccxt.kucoin` methods are unchanged.
**Does CCXT support KuCoin Futures?**
Yes, two ways. One `ccxt.kucoin` instance loads spot, margin and contract markets, so `'BTC/USDT:USDT'` routes to the futures endpoints. There is also a dedicated `ccxt.kucoinfutures` exchange id — the same implementation restricted to contracts, defaulting to swap — if you prefer a futures-only client.
**Does CCXT support KuCoin's unified trading account?**
Yes. Pass `uta` in `params` (or as an option) on the methods that support it, and CCXT routes to KuCoin's unified-account endpoints instead of the classic ones.
**Can I still call KuCoin-specific endpoints through CCXT?**
Yes — all 351 of them, as [implicit methods](/docs/exchanges/kucoin/implicit-api), with signing, timestamping and rate limiting applied. Choosing CCXT does not lock you out of anything KuCoin publishes.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.kucoin` and the `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [kucoin unified API reference](/docs/exchanges/kucoin)
* [kucoin implicit API](/docs/exchanges/kucoin/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [More comparisons](/docs/comparisons)
# CCXT vs the KuCoin Futures API (/docs/comparisons/ccxt-vs-kucoinfutures-api)
`kucoinfutures` is a product line of KuCoin — KuCoin's derivatives venue, which runs on a different API host from KuCoin spot.
Because it shares an API dialect with KuCoin, CCXT implements it by extending its `kucoin` class. Everything in the [CCXT vs the KuCoin API](/docs/comparisons/ccxt-vs-kucoin-api) comparison applies here — this page covers only what is specific to `kucoinfutures`.
## What is different [#what-is-different]
Same account as KuCoin spot, but a genuinely different API — different host, different endpoints, different response shapes. That is why CCXT models it as its own class rather than an option on the spot class.
> Symbols are swaps (`BTC/USDT:USDT`). Position, leverage and funding-rate methods live here, not on `kucoin`.
## What CCXT gives you here [#what-ccxt-gives-you-here]
| | `kucoinfutures` |
| --------------------------------- | ------------------------------------------------------------ |
| Unified capabilities | 111 (inherited from `kucoin` plus its own overrides) |
| `fetch*` methods | 56 |
| WebSocket `watch*` methods | 22 |
| Raw endpoints as implicit methods | 351 |
| Testnet via `setSandboxMode` | no |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust |
| Licence | MIT |
Figures verified September 2026 against CCXT v4.5.78, read from the source tree with `build/comparisons-facts.cjs`. Counts include everything inherited from `kucoin`.
## Using it [#using-it]
The class name is the only thing that changes — every unified method behaves as it does everywhere else in CCXT:
Python
TypeScript
```python
import ccxt
exchange = ccxt.kucoinfutures({'apiKey': '...', 'secret': '...'})
markets = exchange.load_markets()
ticker = exchange.fetch_ticker(list(markets)[0])
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.kucoinfutures ({ apiKey: '...', secret: '...' });
const markets = await exchange.loadMarkets ();
const ticker = await exchange.fetchTicker (Object.keys (markets)[0]);
```
Because `kucoinfutures` lists a different market set from `kucoin`, call `load_markets()` and pick symbols from it rather than assuming a pair exists.
Streaming works the same way:
```python
import ccxt.pro, asyncio
async def main():
exchange = ccxt.pro.kucoinfutures()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
## Should you use this class or the parent? [#should-you-use-this-class-or-the-parent]
Use `kucoinfutures` when you hold an account with KuCoin Futures specifically. Use [`kucoin`](/docs/exchanges/kucoin) when you hold an account with the main venue and want its other product lines from one client. They are different hosts, so this is not a preference — it follows from where your account is.
## FAQ [#faq]
**Do my `kucoin` API keys work with `kucoinfutures`?**
Yes — it is the same account and the same credentials, just a different product host.
**Does `kucoinfutures` support the full unified API?**
It inherits 111 unified capabilities from `kucoin`. Where the venue does not offer a feature, the corresponding `has` flag is turned off, and the method raises `NotSupported` rather than failing quietly. Check `exchange.has` at runtime.
**Can I reach KuCoin Futures-specific endpoints?**
Yes — all 351 endpoints in this class's `api` block are generated as implicit methods, with signing, rate limiting and error mapping applied. The mechanism is documented on the [`kucoin` implicit API page](/docs/exchanges/kucoin/implicit-api); this venue's own endpoint list differs slightly from the parent's.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [CCXT vs the KuCoin API](/docs/comparisons/ccxt-vs-kucoin-api) — the full comparison
* [`kucoinfutures` API reference](/docs/exchanges/kucoinfutures)
* [Install CCXT](/docs/install)
* [Manual](/docs/manual)
* [More comparisons](/docs/comparisons)
# CCXT vs the LATOKEN API (/docs/comparisons/ccxt-vs-latoken-api)
LATOKEN's v2 API has one property that shapes every integration built on it: **markets are addressed by pairs of currency UUIDs**, not by symbols. An order book request is for `707ccdf1-af98-4e09-95fc-e685ed0ae4c6/0c3a106d-bde3-4c13-a26e-3fd2394529e5`, and you resolve those identifiers to `BTC` and `USDT` yourself.
LATOKEN publishes an official Python client, [`LATOKEN/latoken-api-v2-python-client`](https://github.com/LATOKEN/latoken-api-v2-python-client), alongside .NET and Java clients. [CCXT](/docs/manual) speaks the same API behind method names shared with 104 other venues, and resolves the UUIDs for you.
The question that decides between them: **do you need LATOKEN's STOMP WebSocket streams?**
## TL;DR [#tldr]
* **Pick LATOKEN's own client** if you need live streaming — LATOKEN's WebSocket API is STOMP-based, its Python client wraps it, and **CCXT does not implement WebSocket support for `latoken`**.
* **Pick CCXT** if you want REST market data and trading as unified methods with real symbols instead of UUID pairs, in eight languages, alongside every other venue in one codebase.
* **Nothing is hidden either way.** All 52 LATOKEN endpoints are callable in CCXT as [implicit methods](/docs/exchanges/latoken/implicit-api), signed and rate-limited.
## At a glance [#at-a-glance]
| | **CCXT** | **LATOKEN official clients** |
| ---------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (LATOKEN is one of them) | LATOKEN only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, C#/.NET, Java — three separate repositories |
| Symbols | `'BTC/USDT'` | a pair of currency UUIDs, `baseCurrency` / `quoteCurrency` |
| Unified capabilities | 22, of which 15 are `fetch*` | n/a — LATOKEN's own shapes |
| WebSockets | **no** — `latoken` has no `watch*` methods in CCXT | yes — STOMP, with asyncio multi-stream subscribe |
| Raw endpoint access | yes — 52 endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 1000 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | LATOKEN error payloads |
| Testnet / sandbox | no — LATOKEN has no sandbox in CCXT | no |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `latoken-api-v2-python-client` 9 GitHub stars · 18 PyPI installs last month; .NET client 2 stars; Java client 1 star |
| Last repository update | continuous releases | Python July 2024, .NET March 2024, Java February 2022 |
| Licence | MIT | see each repository |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the LATOKEN GitHub organisation and PyPI download counts for `latoken-api-v2-python-client`.
Be honest about the WebSocket row before reading further: if streaming LATOKEN is the requirement, CCXT is not the tool for that part of the job, and the rest of this page is about the REST half.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
latoken-api-v2-python-client
```python
import ccxt
exchange = ccxt.latoken()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from latoken.client import LatokenClient
latoken = LatokenClient()
currencies = latoken.getCurrencies() # resolve tags to UUIDs first
# then request the pair by its two currency UUIDs
```
This is the difference in one screen. CCXT loads LATOKEN's currency list and pair list on `load_markets()`, joins them, and gives you `'BTC/USDT'`. Without that step you are carrying a UUID lookup table through your own code, and any log line, alert or database row keyed by market id is a UUID unless you translate it.
### Place a limit order [#place-a-limit-order]
CCXT
latoken-api-v2-python-client
```python
import ccxt
exchange = ccxt.latoken({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from latoken.client import LatokenClient
latoken = LatokenClient(apiKey=apiKey, apiSecret=apiSecret)
# order placement takes baseCurrency / quoteCurrency UUIDs,
# side, condition, type, clientOrderId, quantity, price and timestamp
```
CCXT signs the request the way LATOKEN requires — HMAC-SHA512 over the HTTP method, the path and the urlencoded query, sent as `X-LA-APIKEY`, `X-LA-SIGNATURE` and `X-LA-DIGEST` headers — and returns a [unified order structure](/docs/manual#order-structure).
## Where the differences actually bite [#where-the-differences-actually-bite]
### UUIDs become symbols [#uuids-become-symbols]
`load_markets()` is the whole feature. CCXT fetches LATOKEN's currencies and pairs, resolves each pair's `baseCurrency` and `quoteCurrency` UUIDs to their tags, and builds a market map keyed by `'BTC/USDT'`. Every method after that takes a symbol, and `market['id']` still holds the LATOKEN identifier for when you need it.
### Eight languages, one API [#eight-languages-one-api]
LATOKEN publishes Python, .NET and Java clients as three separate repositories with three separate cadences — most recently updated in July 2024, March 2024 and February 2022. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with identical method names and return structures:
Python
TypeScript
Go
```python
import ccxt
exchange = ccxt.latoken()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.latoken ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```go
exchange := ccxt.NewLatoken(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
### Portability [#portability]
This is the part that shows up six months in. Adding a second venue to a LATOKEN-client integration means a second SDK, a second symbol convention, a second error taxonomy and a translation layer of your own. In CCXT the venue is a variable:
```python
for exchange_id in ['latoken', 'binance', 'kraken', 'okx']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
### Rate limits, precision and errors [#rate-limits-precision-and-errors]
CCXT's throttler is on by default with `rateLimit` at 1000 ms for LATOKEN. `amount_to_precision` and `price_to_precision` apply the pair's quantity and price ticks through the `Precise` string-arithmetic class. LATOKEN's error payloads map onto CCXT's [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded` and 36 more under `BaseError` — so the same `except` block works on the next exchange.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 22 unified capabilities, **all 52 LATOKEN endpoints are generated as implicit methods**, with signing and rate-limit accounting applied. Browse them on the [latoken implicit API page](/docs/exchanges/latoken/implicit-api).
## What LATOKEN's official client does better [#what-latokens-official-client-does-better]
These are real, and the first one is decisive for some readers:
* **It streams and CCXT does not.** LATOKEN's WebSocket API is STOMP-based, and the official Python client wraps it with asyncio, `streamBook()` and `streamPairTickers()` subscriptions and a message callback. CCXT implements **zero** `watch*` methods for `latoken`, so any live order book or ticker feed from this venue has to come from LATOKEN's client or your own STOMP implementation.
* **One-to-one with LATOKEN's v2 documentation.** Method and field names match the reference exactly, which is the shortest path when you are debugging against `api.latoken.com/doc/v2/`.
* **Official .NET and Java clients** exist alongside Python, published by LATOKEN itself.
* **Smaller dependency for one venue.** If LATOKEN is the whole integration, its client is far less code than a multi-exchange library.
If you need LATOKEN market data in real time, use LATOKEN's client — or run it alongside CCXT, streaming with theirs and trading and reconciling with CCXT's unified methods.
## Migrating from the LATOKEN client to CCXT [#migrating-from-the-latoken-client-to-ccxt]
| What you are doing | LATOKEN client | CCXT |
| ------------------- | ------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | a pair of currency UUIDs | `'BTC/USDT'` |
| Currencies | `getCurrencies()` | `fetch_currencies()` |
| Pairs | pair list endpoint | `load_markets()` |
| Server time | `getServerTime()` | `fetch_time()` |
| Ticker | ticker endpoint | `fetch_ticker()` / `fetch_tickers()` |
| Order book | book endpoint | `fetch_order_book()` |
| Trades | trades endpoint | `fetch_trades()` |
| New order | order placement endpoint | `create_order()` |
| Cancel order | cancel endpoint | `cancel_order()` / `cancel_all_orders()` |
| Open orders | active orders endpoint | `fetch_open_orders()` |
| Balance | balances endpoint | `fetch_balance()` |
| Transfers | transfer endpoints | `transfer()` / `fetch_transfers()` |
| Streams | `streamBook()`, `streamPairTickers()` | not available in CCXT for this venue |
| Anything not listed | the endpoint | the same endpoint as an [implicit method](/docs/exchanges/latoken/implicit-api) |
## FAQ [#faq]
**Does CCXT support LATOKEN WebSockets?**
No. `latoken` has no `watch*` methods in CCXT, so there is no streaming order book, ticker or trade feed for this venue through CCXT Pro. LATOKEN's WebSocket API is STOMP-based; use LATOKEN's own Python client or a STOMP library if you need live streams.
**Why does LATOKEN use UUIDs instead of symbols?**
That is how the v2 API models currencies and pairs — each currency has a UUID, and a market is the pair of them. CCXT's `load_markets()` resolves the UUIDs to currency codes and exposes the market as `'BTC/USDT'`, keeping the LATOKEN identifier available on `market['id']`.
**Does LATOKEN have an official SDK?**
Yes — a Python client, a .NET client and a Java client under the [LATOKEN GitHub organisation](https://github.com/LATOKEN). The Python one is installable from PyPI and covers REST plus STOMP WebSockets; its README states that futures, stocks and IEO purchases are out of scope.
**Does LATOKEN have a testnet?**
CCXT defines no sandbox URLs for LATOKEN, so `setSandboxMode(True)` will not switch you to a test environment.
**How does CCXT authenticate with LATOKEN?**
HMAC-SHA512 over the HTTP method, the request path and the urlencoded query, sent in the `X-LA-APIKEY`, `X-LA-SIGNATURE` and `X-LA-DIGEST` headers. You supply `apiKey` and `secret` and CCXT builds the rest.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [latoken unified API reference](/docs/exchanges/latoken)
* [latoken implicit API](/docs/exchanges/latoken/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the LBank API and official LBank connectors (/docs/comparisons/ccxt-vs-lbank-api)
LBank publishes four official connectors under the [LBank-exchange](https://github.com/LBank-exchange) organisation — Python, Java, Go and Node.js. They are thin HTTP clients: you hand them an endpoint path such as `v2/currencyPairs.do`, they sign the request, and you parse whatever comes back.
[CCXT](/docs/manual) speaks the same API behind unified method names shared with 104 other venues, and adds WebSocket support.
The question that decides between them: **do you want a signed HTTP transport, or a trading API?**
## TL;DR [#tldr]
* **Pick the official connector** if you want the smallest possible layer over LBank's own endpoint list, and you are happy to write the parsing, the pacing and the reconnect logic yourself.
* **Pick CCXT** if you want unified tickers, order books, orders and balances — 39 capabilities including 26 `fetch*` methods — plus six `watch*` streams, all named the same way as on every other exchange you touch.
* **Nothing is lost by choosing CCXT.** All 58 LBank endpoints are also callable directly as [implicit methods](/docs/exchanges/lbank/implicit-api), signed and rate-limited.
## At a glance [#at-a-glance]
| | **CCXT** | **Official LBank connectors** |
| --------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (LBank is one of them) | LBank only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, Java, Go, Node.js — four separate repositories |
| Programming model | unified methods returning parsed structures | `http_request("get", "v2/currencyPairs.do")` returning raw JSON |
| Unified capabilities | 39, of which 26 are `fetch*` | n/a |
| Symbols | `'BTC/USDT'` spot, `'BTC/USDT:USDT'` contract | `btc_usdt` |
| WebSockets | yes — 6 `watch*` methods | a raw WebSocket client with an `on_message` callback |
| Raw endpoint access | yes — 58 endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 20 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | LBank error codes |
| Testnet / sandbox | no — LBank has no sandbox in CCXT | no |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `lbank-connector-python` 15 GitHub stars · \~520 PyPI installs/month; Java 3 stars, Go 1, Node.js 1 |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues, LBank support email |
Figures verified September 2026 against CCXT v4.5.78, the LBank-exchange GitHub organisation, and PyPI download counts for `lbank-connector-python`.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
lbank-connector-python
```python
import ccxt
exchange = ccxt.lbank()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
import logging
from lbank.http_client import BlockHttpClient
client = BlockHttpClient(sign_method=sign_method, api_key=api_key,
api_secret=api_secret, base_url=base_url,
log_level=logging.DEBUG)
response = client.http_request("get", "v2/ticker.do", payload={"symbol": "btc_usdt"})
print(response)
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, types and units on every venue. The connector returns LBank's JSON with the `.do` endpoint's own field names, and the endpoint path is a string you have to keep correct yourself.
### Place a limit order [#place-a-limit-order]
CCXT
lbank-connector-python
```python
import ccxt
exchange = ccxt.lbank({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
response = client.http_request(
"post", "v2/create_order.do",
payload={"symbol": "btc_usdt", "type": "buy",
"price": "60000", "amount": "0.001"})
print(response)
```
### Stream an order book [#stream-an-order-book]
CCXT
lbank-connector-python
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.lbank()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from lbank.websocket_client import LbankWebsocketClient
def on_message(client, message):
print(message) # raw frames; you merge the book yourself
ws_client = LbankWebsocketClient(base_url="", on_message=on_message)
ws_client.send(subscribe_msg)
```
CCXT's `watch_order_book` returns a live, merged book with the same structure as `fetch_order_book`. The connector's WebSocket client delivers raw frames to a callback; aligning a REST snapshot with the delta stream, detecting gaps, re-seeding after a reconnect and bounding the cache are all yours to write.
CCXT implements six streaming methods for LBank: `watchOrderBook`, `watchTrades`, `watchTicker`, `watchOHLCV`, `watchOrders` and `watchBalance`.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Two signing schemes, picked for you [#two-signing-schemes-picked-for-you]
LBank accepts two signature methods, and which one applies depends on the key you were issued. CCXT builds the canonical string — your parameters plus `api_key`, `echostr` and `timestamp`, sorted — takes an uppercase MD5 digest of it, then signs that digest with **HMAC-SHA256 for a short secret, or RSA-SHA256 for an RSA private key**, selected automatically from the secret you supplied. The RSA path converts your key to PEM once and caches it.
```python
exchange = ccxt.lbank({'apiKey': '...', 'secret': '...'}) # HMAC or RSA, detected
```
Getting the MD5-then-sign ordering, the `echostr` length and the parameter sort right is the classic first-day-on-LBank bug. It is one line of configuration in CCXT.
### Unified structures instead of `.do` endpoint strings [#unified-structures-instead-of-do-endpoint-strings]
The connector's `http_request("get", "v2/currencyPairs.do")` model means the endpoint path, its parameter names and its response shape all live in your application code as strings. When LBank changes a field, your parser changes. CCXT's parsers live in the library and reach you as a version bump.
### Spot and contract markets in one client [#spot-and-contract-markets-in-one-client]
CCXT's `lbank` loads both LBank's spot pairs and its perpetual contracts (from LBank's separate contract host) into one market map — `'BTC/USDT'` and `'BTC/USDT:USDT'`. Order entry is spot; contract markets give you `fetch_ticker`, `fetch_ohlcv`, `fetch_order_book` and `fetch_funding_rates` under the same method names you use everywhere else. The official connectors' documented examples cover the spot `.do` endpoints only.
### Eight languages, one API [#eight-languages-one-api]
LBank publishes four connectors, and they are four separate codebases with visibly different levels of adoption — 15, 3, 1 and 1 GitHub stars respectively. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with identical method names and return structures:
Python
TypeScript
PHP
```python
import ccxt
exchange = ccxt.lbank()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.lbank ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```php
$exchange = new \ccxt\lbank();
$ticker = $exchange->fetch_ticker('BTC/USDT');
```
### Rate limits and precision [#rate-limits-and-precision]
CCXT's token-bucket throttler is on by default, with `rateLimit` set to 20 ms for LBank and per-endpoint weights in the exchange definition. `amount_to_precision` and `price_to_precision` use the market's tick and step sizes, backed by the `Precise` string-arithmetic class, so you do not lose an order to float rounding at the third decimal.
### One error hierarchy [#one-error-hierarchy]
LBank's numeric error codes map onto CCXT's [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded` and 36 more, all under `BaseError`. One `except` block, every venue.
## What the official LBank connectors do better [#what-the-official-lbank-connectors-do-better]
Real advantages:
* **Direct endpoint access with no mapping to learn.** `http_request("get", "v2/currencyPairs.do")` is exactly the endpoint in LBank's documentation. If you are reading their reference and want the raw response, nothing is in the way.
* **Any endpoint works the day it ships.** A brand-new LBank endpoint is usable through the connector immediately, with no wrapper required. (CCXT's implicit API gives you the same thing, but the unified wrapper may lag.)
* **A far smaller dependency.** The Python connector is a signing helper plus a request wrapper. If your process calls two endpoints, it is much less code to audit than a multi-venue library.
* **Official Java, Go and Node.js connectors** exist alongside Python, published by LBank itself, and the signing is maintained by the people who set the rules for it — including the RSA path.
If LBank is your only venue and you want a signed transport rather than a trading abstraction, the official connector is a reasonable choice.
## Migrating from an LBank connector to CCXT [#migrating-from-an-lbank-connector-to-ccxt]
| What you are doing | LBank connector | CCXT |
| ------------------- | ------------------------------------- | ----------------------------------------------------------------------------- |
| Symbols | `btc_usdt` | `'BTC/USDT'`, `'BTC/USDT:USDT'` |
| Pairs list | `v2/currencyPairs.do` | `load_markets()` |
| Ticker | `v2/ticker.do` | `fetch_ticker()` / `fetch_tickers()` |
| Depth | `v2/depth.do` | `fetch_order_book()` |
| Candles | `v2/kline.do` | `fetch_ohlcv()` |
| New order | `v2/create_order.do` | `create_order()` |
| Cancel order | `v2/cancel_order.do` | `cancel_order()` |
| Open orders | `v2/orders_info_no_deal.do` | `fetch_open_orders()` |
| Account | `v2/user_info.do` | `fetch_balance()` |
| Deposit address | `v2/get_deposit_address.do` | `fetch_deposit_address()` |
| Streams | `LbankWebsocketClient` + `on_message` | `watch_*` on `ccxt.pro.lbank` |
| Anything not listed | the endpoint path | the same endpoint as an [implicit method](/docs/exchanges/lbank/implicit-api) |
## FAQ [#faq]
**Does LBank have an official SDK?**
Yes — four connectors under the [LBank-exchange](https://github.com/LBank-exchange) GitHub organisation: `lbank-connector-python` (MIT, installable from PyPI), plus Java, Go and Node.js. They are thin signed-HTTP clients that take an endpoint path and return raw JSON, rather than typed trading APIs.
**Does CCXT support LBank's RSA API keys?**
Yes. CCXT detects the signing method from the secret you provide — HMAC-SHA256 for a short secret, RSA-SHA256 for an RSA private key — and builds the MD5-then-sign payload LBank expects, including the `echostr` and `timestamp` fields. You pass `apiKey` and `secret` and nothing else changes.
**Does CCXT support LBank futures?**
CCXT loads LBank's perpetual contract markets alongside spot, so `'BTC/USDT:USDT'` works for `fetch_ticker`, `fetch_order_book`, `fetch_ohlcv` and `fetch_funding_rates`. Order entry through `create_order` goes to LBank's spot endpoints.
**Does LBank have a testnet?**
CCXT does not define sandbox URLs for LBank, so `setSandboxMode(True)` will not switch you to a test environment. Use the static fixtures or small live orders instead.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.lbank` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [lbank unified API reference](/docs/exchanges/lbank)
* [lbank implicit API](/docs/exchanges/lbank/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs QuantConnect Lean (/docs/comparisons/ccxt-vs-lean)
[Lean](https://github.com/QuantConnect/Lean) is described by its own readme as "an event-driven, professional-caliber algorithmic trading platform built with a passion for elegant engineering and deep quant concept modeling," and as "modular in design, with each component pluggable and customizable." It is written in C# with first-class Python support, licensed Apache-2.0, and it is the engine behind QuantConnect's hosted platform.
[CCXT](/docs/manual) is not an engine. It is the layer Lean calls a brokerage: connect to a venue, normalise its market data, place and track orders. The decision comes down to one question — **do you need a multi-asset backtesting and execution platform, or do you need to reach a lot of crypto exchanges?**
## TL;DR [#tldr]
* **Pick Lean** if you want a complete platform: event-driven backtesting, an algorithm framework with alpha, portfolio-construction, risk and execution models, parameter optimisation, research notebooks, and eleven asset classes from US equities and options through futures, forex, CFD and crypto. CCXT does none of this.
* **Pick CCXT** if your work is crypto-only and coverage is the binding constraint. Lean's documentation lists six crypto brokerages for local live trading; CCXT supports 104 exchanges with REST, 76 with WebSocket, and 7 prediction-market venues.
* **The data story differs as much as the code.** CCXT pulls history straight from each exchange with `fetch_ohlcv`. Lean runs on a local data directory you populate — from the QuantConnect Dataset Market (priced per file in QuantConnect Credits), from a brokerage, from a third-party provider, or by converting your own files into Lean's documented format.
## At a glance [#at-a-glance]
| | **CCXT** | **Lean** |
| --------------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| What it is | unified exchange client (market data + trading) | event-driven multi-asset trading engine |
| Asset classes | crypto spot, margin, futures, options, perpetuals; 7 prediction-market venues | US Equity, Equity Options, Crypto, Crypto Futures, Forex, Futures, Future Options, Index, Index Options, CFD, India Equity |
| Crypto venue coverage | 104 exchanges with REST, 76 with WebSocket | 6 crypto brokerages for local live trading: Binance, Bybit, Kraken, Coinbase, Bitfinex, dYdX |
| Non-crypto brokerages | none | Interactive Brokers, TradeStation, Charles Schwab, Tastytrade, Alpaca, Tradier, Webull, Public, Bloomberg EMSX, SSC Eze, Trading Technologies, Samco, Zerodha |
| Backtesting engine | none | yes — the core of the product |
| Strategy framework | none | alpha, portfolio construction, risk and execution models; `lean optimize`; `lean research` notebooks |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust | C# and Python; local build needs the .NET 10 SDK |
| Historical data | fetched live from the exchange, free | local data directory populated from the QuantConnect Dataset Market (per-file pricing in QuantConnect Credits), a brokerage, a third-party provider, or your own converted files |
| Raw endpoint access | yes — every venue endpoint as an implicit method (808 for Binance) | brokerage plugin surface; beyond it means writing C# |
| Install | `pip install ccxt` (or npm, NuGet, Go, Maven) | `pip install lean` for the CLI, which runs Lean in Docker; or clone and `dotnet build` |
| Licence | **MIT** | **Apache-2.0** |
| Popularity | 43.8k GitHub stars · 4.68M PyPI + 494k npm installs/month (one package, every venue) | 21.5k GitHub stars · 21.4k PyPI installs/month for the `lean` CLI package |
| Support | Discord, Telegram, GitHub issues | LEAN Forum, Discord, GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the QuantConnect/Lean GitHub repository (last commit 1 September 2026), the QuantConnect documentation for asset classes, brokerages and datasets, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### A moving-average crossover on BTC [#a-moving-average-crossover-on-btc]
Lean
CCXT
```python
from AlgorithmImports import *
class CryptoCross(QCAlgorithm):
def initialize(self):
self.set_start_date(2024, 1, 1)
self.set_cash("USDT", 10000)
self.set_brokerage_model(BrokerageName.BINANCE, AccountType.CASH)
symbol = self.add_crypto("BTCUSDT", Resolution.MINUTE).symbol
self.fast = self.ema(symbol, 30, Resolution.MINUTE)
self.slow = self.ema(symbol, 60, Resolution.MINUTE)
def on_data(self, data):
if self.fast > self.slow:
self.set_holdings("BTCUSDT", 1)
else:
self.liquidate("BTCUSDT")
```
```python
import ccxt
exchange = ccxt.binance({'apiKey': '...', 'secret': '...'})
candles = exchange.fetch_ohlcv('BTC/USDT', '1m', limit=120)
closes = [c[4] for c in candles]
fast = sum(closes[-30:]) / 30
slow = sum(closes[-60:]) / 60
if fast > slow:
exchange.create_order('BTC/USDT', 'market', 'buy', 0.01)
```
The Lean version is a strategy the engine runs — the same class backtests over 2024 and, with a brokerage configured, trades live. The CCXT version is a script: it fetches, computes and sends, and the scheduling, state and portfolio accounting are yours. That asymmetry is the whole comparison in ten lines.
### Place a limit order [#place-a-limit-order]
Lean
CCXT
```python
limit_price = round(self.securities["BTCUSD"].price * 0.95, 2)
quantity = self.portfolio.cash_book["USD"].amount * 0.5 / limit_price
self.limit_order("BTCUSD", quantity, limit_price)
```
```python
ticker = exchange.fetch_ticker('BTC/USDT')
price = exchange.price_to_precision('BTC/USDT', ticker['last'] * 0.95)
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, price)
print(order['id'], order['status'])
```
Lean's order goes through the engine, which knows the account's cash book, the brokerage's order rules and the fill model; it returns an order ticket and the outcome arrives in `on_order_event`. CCXT's order goes to the exchange and returns a [unified order structure](/docs/manual#order-structure) with the same keys on all 104 venues.
### Get historical candles onto your machine [#get-historical-candles-onto-your-machine]
Lean
CCXT
```bash
# Downloads into the local data directory that Lean reads from.
# Sources: the QuantConnect Dataset Market (per-file pricing in
# QuantConnect Credits), a brokerage, or a third-party provider.
lean data download
```
```python
import ccxt
exchange = ccxt.binance()
candles = exchange.fetch_ohlcv('BTC/USDT', '1h', since=start_ms, limit=1000)
# [[timestamp, open, high, low, close, volume], ...]
```
This is the difference people underestimate. Lean is data-directory-driven: it reads `data/crypto`, `data/equity`, `data/forex` and the rest, and you fill those directories by purchasing from the Dataset Market, downloading from a brokerage, or converting your own files to Lean's documented format. CCXT asks the exchange for candles and hands them back.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Reach: eleven asset classes versus 104 crypto venues [#reach-eleven-asset-classes-versus-104-crypto-venues]
Lean's reach across markets is far wider than CCXT's, and that is not a close call. Its documentation lists US Equity, Equity Options, Crypto, Crypto Futures, Forex, Futures, Future Options, Index, Index Options, CFD and India Equity, with brokerage connectivity that includes Interactive Brokers, Charles Schwab, TradeStation, Bloomberg EMSX and Trading Technologies. If your strategy trades SPY options against BTC perpetuals, CCXT cannot be your only dependency.
Within crypto the ranking reverses. Lean's documentation lists six crypto brokerages for local live trading — Binance, Bybit, Kraken, Coinbase, Bitfinex and dYdX — implemented as separate `Lean.Brokerages.*` repositories (the `Brokerages` folder in the Lean repo itself holds the base framework: `Brokerage.cs`, `BrokerageFactory.cs`, `BaseWebsocketsBrokerage.cs`, `DefaultOrderBook.cs` and the WebSocket wrappers). CCXT supports 104 exchanges with REST and 76 with WebSocket, plus 7 prediction-market venues under `ccxt.prediction`. For MEXC, Bitget, Gate, HTX, Hyperliquid, KuCoin, Deribit, BitMEX, Upbit, Bithumb and most of the long tail, there is no Lean plugin and there is a CCXT implementation.
### Open-source engine, commercial platform around it [#open-source-engine-commercial-platform-around-it]
Lean the engine is Apache-2.0 and you can clone it, `dotnet build QuantConnect.Lean.sln` and run the launcher with no account. That is real, and the readme recommends the CLI (`pip install lean`) as the easier path for most users.
What sits around it is a commercial platform. The recommended data source is the QuantConnect Dataset Market, where, per the CLI documentation, "Data from the Dataset Market is priced on a per-file per-download basis, meaning you pay a certain number of QuantConnect Credits (QCC) for each file you download." Downloading historical data from a brokerage through the CLI carries its own requirement: "To use the CLI, you must be a member in an organization on a paid tier." QuantConnect's pricing page shows a free plan alongside Researcher, Team, Trading Firm and Institution tiers.
None of that makes Lean less open source. It does mean the practical cost of running it is not the licence, and it is worth pricing before you commit. CCXT has no account, no credits, no tiers and no data marketplace — it reads from the exchange you are already connected to.
### Eight languages versus C# and Python [#eight-languages-versus-c-and-python]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with the same method names and return structures in every one. Lean is a C# engine with Python algorithm support through `AlgorithmImports`; a local build needs the .NET 10 SDK, which is why the CLI ships Docker images instead.
If your stack is .NET or Python, Lean fits. If parts of it are Go, PHP or Java, CCXT is the layer that can live in all of them.
### The exchange surface beyond trading [#the-exchange-surface-beyond-trading]
Lean's brokerage abstraction models what an engine needs: submit, update, cancel, holdings, cash balance, historical bars. CCXT's surface is the exchange itself — funding rates, open interest, mark and index prices, position mode, leverage and margin mode, transfers between account types, deposit addresses, ledgers, and every raw endpoint the venue publishes as an [implicit method](/docs/exchanges/binance/implicit-api), 808 of them for Binance alone. Errors arrive as 41 typed exception classes in one hierarchy, so `InsufficientFunds` means the same thing on Kraken as on Bybit.
For strategy execution, Lean's narrower model is sufficient and cleaner. For treasury movement, reconciliation, venue-specific features and market-data capture, it is not the right shape.
## What Lean does better [#what-lean-does-better]
* **It is a complete engine and CCXT is not one.** Event-driven backtesting with a fill model, a fee model, a slippage model and portfolio accounting; `lean backtest`, `lean optimize` and `lean research` as first-class commands. Building any of that on CCXT is your project, not a dependency.
* **Eleven asset classes, including everything CCXT will never cover.** US equities, equity and index options, futures and future options, forex, CFD and India equity, alongside crypto and crypto futures. CCXT is crypto and prediction markets, by design.
* **Institutional brokerage connectivity.** Interactive Brokers, Charles Schwab, TradeStation, Tastytrade, Bloomberg EMSX, SSC Eze, Trading Technologies. These are not venues a crypto library reaches, and getting them right is years of work.
* **A genuine plug-in architecture.** `IBrokerage`, `IDataQueueHandler` and `IHistoryProvider` in `Common/Interfaces` are documented extension points, and the readme's claim that Lean "ships with models for all major plug-in points" is borne out by the brokerage plugins living as independent repositories.
* **The algorithm framework.** Alpha models, portfolio construction, risk management and execution as separate composable pieces, so the same signal can be run through different sizing and execution policies without rewriting the strategy.
* **Local-to-cloud continuity.** The same algorithm runs on your machine and on QuantConnect's hosted platform, with a data library, live deployment and a research environment attached.
* **Apache-2.0** carries an explicit patent grant, which some legal departments prefer over a bare permissive licence.
If you are building multi-asset strategies, need equities or options in the same engine as crypto, or want backtesting and live execution supplied rather than assembled, Lean is the better choice and CCXT is not competing for that job.
## Using them together [#using-them-together]
Migration is the wrong frame — nobody replaces a backtesting engine with an exchange client. The comparable layer is narrower than the two projects, and it is worth naming exactly: **Lean's brokerage and data-provider plugins are the part that overlaps with CCXT.** Everything above that layer — the engine, the framework, the optimiser, the research environment — has no CCXT equivalent, and everything CCXT does outside order routing has no Lean equivalent.
Scoped to that layer, the mapping is:
| Venue-layer concern | Lean | CCXT |
| -------------------- | ------------------------------------------------- | ------------------------------------------------- |
| Symbols | `add_crypto("BTCUSDT")`, `Symbol` objects | `'BTC/USDT'` spot, `'BTC/USDT:USDT'` linear swap |
| Venue selection | `set_brokerage_model(BrokerageName.BINANCE, ...)` | `ccxt.binance(...)` — 104 ids, same methods |
| Historical bars | local data directory, `self.history(...)` | `fetch_ohlcv(symbol, timeframe, since, limit)` |
| Live streams | `IDataQueueHandler` implementation per brokerage | `watch_*` on `ccxt.pro.` |
| Order entry | `market_order`, `limit_order`, `set_holdings` | `create_order(symbol, type, side, amount, price)` |
| Account state | `self.portfolio`, `self.portfolio.cash_book` | `fetch_balance()`, `fetch_positions()` |
| Venue with no plugin | write a C# `IBrokerage` / `IHistoryProvider` | usually already supported |
Two practical ways to run both:
* **CCXT as the data collector.** Pull candles from any of 104 venues with `fetch_ohlcv`, convert them to Lean's documented file format, and drop them into the `data/crypto` directory Lean reads from. That gets Lean backtesting venues it has no plugin for.
* **CCXT as the execution path for the long tail.** Run Lean for research, backtesting and the brokerages it supports; route orders on other venues through CCXT. CCXT publishes a `ccxt` NuGet package, so a custom `IBrokerage` or `IHistoryProvider` written against it is a route people take when a venue has no Lean plugin — that is a plugin you would write, not one that ships today.
## FAQ [#faq]
**Does Lean use CCXT?**
No. Lean's crypto connectivity comes from its own C# brokerage plugins — `Lean.Brokerages.Binance`, `.ByBit`, `.Kraken`, `.Coinbase`, `.Bitfinex` and `.dYdX` — each an independent Apache-2.0 repository implementing Lean's `IBrokerage` interface.
**Which crypto exchanges can Lean trade live?**
QuantConnect's documentation for local live trading with the LEAN CLI lists Binance, Bybit, Kraken, Coinbase, Bitfinex and dYdX among the crypto exchanges, alongside a long list of traditional brokerages. CCXT supports 104 exchanges.
**Is Lean free?**
The engine is Apache-2.0 and runs locally. The data most users run it on is not: the recommended source is the QuantConnect Dataset Market, priced per file in QuantConnect Credits, and the CLI documentation for downloading brokerage data states you must be a member in an organization on a paid tier. QuantConnect's pricing page shows a free plan plus four paid tiers.
**Can CCXT backtest a strategy?**
No. CCXT provides unified historical data (`fetch_ohlcv`, `fetch_trades`) and live execution, but no simulation loop, fill model or portfolio accounting. Lean provides all three.
**Can I use CCXT data in Lean?**
Yes, with a conversion step. Lean reads a local data directory whose subdirectories carry `readme.md` files documenting the expected file format; QuantConnect's documentation states that users with their own data can convert it to a LEAN-compatible format. Fetching that data with `fetch_ohlcv` across 104 venues is one way to obtain it.
**Do I need a paid tier or a separate package for CCXT's WebSockets?**
No. CCXT Pro is bundled in the `ccxt` package under MIT, with no account and no tier. Use `ccxt.pro.` and the `watch*` methods.
## Next steps [#next-steps]
* [Install CCXT](/docs/install)
* [Manual](/docs/manual) — unified structures and conventions
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [Supported exchanges](/docs/exchange-markets)
* [Binance implicit API](/docs/exchanges/binance/implicit-api)
* [More comparisons](/docs/comparisons)
# CCXT vs the Lighter API and official Lighter SDK (/docs/comparisons/ccxt-vs-lighter-api)
[Lighter](https://lighter.xyz/) is a zk-rollup perpetuals exchange. Its API is not a normal REST trading API: reads are ordinary HTTP, but every write — an order, a cancel, an auth token — is a **signed transaction**, and the signing scheme is implemented in a native library rather than in the client language.
Lighter publishes two official SDKs, [`elliottech/lighter-python`](https://github.com/elliottech/lighter-python) (Apache-2.0, 326 GitHub stars) and [`elliottech/lighter-go`](https://github.com/elliottech/lighter-go) (Apache-2.0, 87 stars). [CCXT](/docs/manual) speaks the same API behind method names shared with 104 other venues.
Because both sides call the same signer, the question is narrower than usual: **do you want Lighter's own client shapes, or Lighter behind the same interface as every other venue you trade?**
## TL;DR [#tldr]
* **Pick the official SDK** if Lighter is your only venue and you want zero setup around the signer — `lighter-python` ships the native binaries and picks the right one for your platform automatically.
* **Pick CCXT** if Lighter is one venue among several, or if you are in a language Lighter does not publish an SDK for — CCXT gives it 56 unified capabilities and 18 `watch*`/`unWatch*` streaming methods, in eight languages.
* **The signer is the same code either way.** CCXT loads the officially distributed signer binary (or a WASM build of it), so the trade-off is about API shape and portability, not about cryptography.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Lighter SDKs** |
| --------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| Exchanges covered | 104 (Lighter is one of them) | Lighter only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python and Go |
| Signer setup | point `options['libraryPath']` at the official binary; nothing needed in Go | automatic — the Python SDK selects the right native binary for your platform |
| Unified capabilities | 56, of which 19 are `fetch*` | n/a — Lighter's own shapes |
| Symbols | `'ETH/USDC:USDC'` | market index / order-book id |
| WebSockets | yes — 18 `watch*` / `unWatch*` methods | yes, in `lighter-python`; not in `lighter-go` |
| Raw endpoint access | yes — 46 endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 1000 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + Lighter codes |
| Testnet | `exchange.set_sandbox_mode(True)` | separate base URL |
| Licence | MIT | Apache-2.0 |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `lighter-python` 326 stars; `lighter-go` 87 stars |
Figures verified September 2026 against CCXT v4.5.78 and Lighter's two published SDK repositories and API documentation.
## Setting up the signer [#setting-up-the-signer]
This is the one thing that is different from every other CCXT exchange, so it is worth being explicit. CCXT needs your **L1 private key** as a credential, and a path to the officially distributed signer:
Python / C# / PHP
JavaScript / TypeScript
Go
```python
import ccxt
exchange = ccxt.lighter({
'privateKey': '0x...', # your L1 private key
'options': {
# from https://github.com/elliottech/lighter-python/tree/main/lighter/signers
'libraryPath': 'path/to/lighter-signer-linux-arm64.so',
},
})
```
```javascript
import ccxt from 'ccxt';
const exchange = new ccxt.lighter ({
privateKey: '0x...',
options: {
// from https://github.com/ccxt/lighter-wasm
libraryPath: '/path/to/lighter-wasm/lighter.wasm',
wasmExecPath: '/opt/homebrew/opt/go/libexec/lib/wasm/wasm_exec.js',
},
});
```
```go
// Nothing extra: CCXT consumes the official Go package.
exchange := ccxt.NewLighter(map[string]interface{}{
"privateKey": "0x...",
})
```
`accountIndex` and `apiKeyIndex` are optional — CCXT fetches the account index from your address if you do not set one, and defaults the API key index to 254. Set `accountIndex` explicitly when you trade a sub-account. The full setup notes are in the [FAQ](/docs/faq).
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
lighter-python
```python
import ccxt
exchange = ccxt.lighter()
ticker = exchange.fetch_ticker('ETH/USDC:USDC')
print(ticker['last'], ticker['markPrice'])
```
```python
import asyncio
import lighter
async def main():
client = lighter.ApiClient()
order_api = lighter.OrderApi(client)
stats = await order_api.exchange_stats()
print(stats)
asyncio.run(main())
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) keyed by unified symbol. The SDK returns Lighter's own models, generated from its OpenAPI spec, indexed by market id.
### Place a limit order [#place-a-limit-order]
CCXT
lighter-python
```python
import ccxt
exchange = ccxt.lighter({'privateKey': '0x...',
'options': {'libraryPath': '.../lighter-signer-linux-arm64.so'}})
order = exchange.create_order('ETH/USDC:USDC', 'limit', 'buy', 0.05, 3000)
print(order['id'], order['status'])
```
```python
# SignerClient wraps the native signer; every order is a signed transaction
tx, tx_hash, err = await client.create_order(
market_index=market_index,
client_order_index=123,
base_amount=1000,
price=4050_00,
is_ask=True,
order_type=client.ORDER_TYPE_LIMIT,
time_in_force=client.ORDER_TIME_IN_FORCE_GOOD_TILL_TIME,
reduce_only=False,
trigger_price=0,
nonce=nonce,
api_key_index=api_key_index,
)
```
The SDK works in Lighter's own units: market index, integer base amount, integer price, `is_ask` instead of a side. CCXT takes a unified symbol, a human amount and a human price, converts them with the market's precision, builds the transaction, signs it, and returns a [unified order structure](/docs/manual#order-structure).
### Stream an order book [#stream-an-order-book]
CCXT
lighter-python
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.lighter()
while True:
orderbook = await exchange.watch_order_book('ETH/USDC:USDC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import lighter
# examples/websocket/ws.py in the SDK
client = lighter.WsClient(
order_book_ids=[0, 1],
account_ids=[1, 2],
on_order_book_update=on_order_book_update,
on_account_update=on_account_update,
)
client.run()
```
Both stream. The difference is the shape: the SDK is callback-driven and hands you Lighter's messages; CCXT's `watch_order_book` returns the same structure as `fetch_order_book`, so a polling loop becomes a streaming loop by changing one word and nothing downstream changes.
CCXT implements 18 streaming methods for Lighter: `watchOrderBook`, `watchTrades`, `watchTicker`, `watchTickers`, `watchMarkPrice`, `watchMarkPrices`, `watchOrders`, `watchMyTrades`, `watchBalance`, `watchLiquidations`, and eight matching `unWatch*` methods for tearing a subscription down without dropping the connection.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages against two [#eight-languages-against-two]
Lighter publishes Python and Go. CCXT gives you the same Lighter API in TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures, because it is written once in TypeScript and transpiled. If your execution service is C# or Java, CCXT is currently the way you reach Lighter with a maintained client.
Note the split: `lighter-python` has both HTTP and WebSocket support, while `lighter-go` is described by its own README as the reference implementation of signing and hashing plus a basic HTTP client — no WebSocket.
### Perp-specific concepts are unified, not bolted on [#perp-specific-concepts-are-unified-not-bolted-on]
`fetch_positions`, `fetch_funding_rates`, `set_leverage`, `set_margin_mode`, `add_margin`, `reduce_margin`, `transfer` and `cancel_all_orders_after` are all part of the 56 capabilities — and they carry the same names on Hyperliquid, Bybit and OKX. A strategy written against CCXT's perp surface moves between DEX and CEX without a rewrite.
### Testnet without a second code path [#testnet-without-a-second-code-path]
Lighter runs a testnet on a parallel host. In CCXT that is one flag:
```python
exchange = ccxt.lighter({'privateKey': '0x...'})
exchange.set_sandbox_mode(True)
```
Every REST and WebSocket URL switches. No constant swapping.
### Rate limits and precision [#rate-limits-and-precision]
CCXT's throttler is on by default with `rateLimit` set to 1000 ms for Lighter, matching its normal-account budget of 60 requests a minute. Order sizes and prices go through `amount_to_precision` and `price_to_precision`, backed by the `Precise` string-arithmetic class, so the integer amounts the chain expects are derived from the market metadata rather than from float maths you wrote.
### One error hierarchy [#one-error-hierarchy]
Lighter's numeric codes are mapped onto CCXT's [typed exception tree](/docs/manual#error-handling) — `InvalidOrder`, `BadRequest`, `RateLimitExceeded`, `NotSupported`, `ExchangeError` and 36 more, all under `BaseError`. The same `except` block works on the next venue.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the unified methods, **all 46 Lighter endpoints are generated as implicit methods**, with auth-token creation and rate-limit accounting applied. Browse them on the [lighter implicit API page](/docs/exchanges/lighter/implicit-api).
## What the official Lighter SDK does better [#what-the-official-lighter-sdk-does-better]
Genuinely, and these matter on this venue more than most:
* **Signer setup is automatic.** `lighter-python` bundles the native signer for Linux, macOS and Windows on both amd64 and arm64, and selects the right one at import time. CCXT asks you to download the binary (or the [WASM build](https://github.com/ccxt/lighter-wasm) in JavaScript, plus a `wasm_exec.js` path) and point `options['libraryPath']` at it. That is a real extra step, and in JavaScript it also means the signing path only runs under Node, not in a browser.
* **It is the reference implementation.** `lighter-go` *is* the signing and hashing spec; everything else, CCXT included, consumes binaries compiled from it. When the transaction format changes, that repository changes first.
* **Account and key lifecycle tooling.** The SDK's examples cover generating API keys, rotating them, and creating auth tokens for HTTP and WebSocket endpoints — the setup work that happens before any trading, and that is documented against the SDK rather than against a unified library.
* **Models generated one-for-one from the OpenAPI spec.** Every field Lighter returns is present under Lighter's own name, which is the shortest path when you are reading `apidocs.lighter.xyz` and want to know exactly what came back.
If Lighter is your only venue, you work in Python, and you want the smallest possible distance to the protocol, the official SDK is the better fit.
## Migrating from the Lighter SDK to CCXT [#migrating-from-the-lighter-sdk-to-ccxt]
| What you are doing | Lighter SDK | CCXT |
| ------------------- | ----------------------------------- | ------------------------------------------------------------------------------- |
| Markets | `order_api.order_books()` | `load_markets()` |
| Symbols | market index / order-book id | `'ETH/USDC:USDC'` |
| Ticker | `order_api.exchange_stats()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `order_api.order_book_orders()` | `fetch_order_book()` |
| Candles | `candlesticks` endpoint | `fetch_ohlcv()` |
| New order | `SignerClient.create_order()` | `create_order()` |
| Modify order | `SignerClient.modify_order()` | `edit_order()` |
| Cancel order | `SignerClient.cancel_order()` | `cancel_order()` |
| Cancel all | `SignerClient.cancel_all_orders()` | `cancel_all_orders()` / `cancel_all_orders_after()` |
| Open orders | `order_api.account_active_orders()` | `fetch_open_orders()` |
| Positions | `account_api.account()` | `fetch_positions()` |
| Balance | `account_api.account()` | `fetch_balance()` |
| Streams | `WsClient` callbacks | `watch_*` on `ccxt.pro.lighter` |
| Anything not listed | the endpoint | the same endpoint as an [implicit method](/docs/exchanges/lighter/implicit-api) |
## FAQ [#faq]
**How does CCXT authenticate with Lighter?**
With your **L1 private key**, set as the `privateKey` credential. CCXT derives your account index from it (or you set `options['accountIndex']` for a sub-account), defaults `apiKeyIndex` to 254, and signs every transaction and auth token with Lighter's official signer binary, which you point at with `options['libraryPath']`. Go users need no binary — CCXT consumes the official Go package directly.
**Why does CCXT need a signer binary at all?**
Because Lighter's transaction signing is a zk-friendly scheme implemented in Go, not something reproducible from generic HMAC or ECDSA helpers. Rather than reimplement it per language, CCXT calls the officially distributed binaries over FFI, or a WASM build of the same code in JavaScript and TypeScript. It is the same signing code the official SDK uses.
**Does CCXT support Lighter WebSockets?**
Yes — 18 methods, including `watch_order_book`, `watch_trades`, `watch_tickers`, `watch_mark_prices`, `watch_orders`, `watch_my_trades`, `watch_balance` and `watch_liquidations`, plus `unWatch*` counterparts. They return the same structures as the matching `fetch*` methods.
**Can I use Lighter's testnet through CCXT?**
Yes. `exchange.set_sandbox_mode(True)` swaps every REST and WebSocket URL to Lighter's testnet hosts.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.lighter` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [FAQ — how to use Lighter in CCXT](/docs/faq) — credentials and signer setup
* [lighter unified API reference](/docs/exchanges/lighter)
* [lighter implicit API](/docs/exchanges/lighter/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Luno API and official Luno SDKs (/docs/comparisons/ccxt-vs-luno-api)
Luno maintains three API client libraries on GitHub: [`luno-python`](https://github.com/luno/luno-python), [`luno-go`](https://github.com/luno/luno-go) and [`luno-php`](https://github.com/luno/luno-php), all MIT-licensed. They are close to the API — one method per endpoint, Luno's own field names, Luno's own pair codes like `XBTZAR`.
[CCXT](/docs/manual) speaks the same API behind method names shared with 104 other venues, and turns `XBTZAR` into `'BTC/ZAR'`.
The question that decides between them: **is Luno the only venue you will ever trade?**
## TL;DR [#tldr]
* **Pick a Luno SDK** if Luno is your only venue, you work in Python, Go or PHP, and you want field names identical to Luno's reference — or if you need the fuller streaming behaviour in `luno-go`.
* **Pick CCXT** if you want unified symbols, structures and error types across Luno and everything else, in eight languages, from one dependency.
* **Streaming is the honest caveat.** CCXT implements only two `watch*` methods for Luno — `watch_order_book` and `watch_trades` — and both require API credentials, because Luno's Streaming API is authenticated even for market data.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Luno SDKs** |
| --------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Luno is one of them) | Luno only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, Go, PHP (the Java SDK repository is archived) |
| Symbols | `'BTC/ZAR'`, `'ETH/ZAR'` | `XBTZAR`, `ETHZAR` |
| Unified capabilities | 25, of which 18 are `fetch*` | one method per endpoint |
| WebSockets | 2 methods — `watch_order_book`, `watch_trades` | `luno-go/streaming` maintains a book and auto-reconnects; `luno-python` has a stream client; `luno-php` — not published as a streaming client |
| Raw endpoint access | yes — 40 endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 200 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Luno error codes |
| Testnet / sandbox | no — Luno has no sandbox in CCXT | no |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `luno-go` 94 GitHub stars; `luno-python` 71 stars · \~1.3k PyPI installs/month; `luno-php` 12 stars |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues, Luno support |
Figures verified September 2026 against CCXT v4.5.78, the Luno GitHub organisation and PyPI download counts for `luno-python`.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
luno-python
```python
import ccxt
exchange = ccxt.luno()
ticker = exchange.fetch_ticker('BTC/ZAR')
print(ticker['last'], ticker['bid'], ticker['ask'])
```
```python
from luno_python.client import Client
c = Client(api_key_id='key_id', api_key_secret='key_secret')
try:
res = c.get_ticker(pair='XBTZAR')
print(res)
except Exception as e:
print(e)
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, types and units whether the venue is Luno, Kraken or Binance. The SDK returns Luno's payload under Luno's names, keyed by Luno's pair code. Note the `XBT` versus `BTC` difference: CCXT normalises Luno's `XBT` to the unified `BTC` code, so `XBTZAR` becomes `'BTC/ZAR'` and your downstream code does not need a per-venue alias table.
### Place a limit order [#place-a-limit-order]
CCXT
luno-python
```python
import ccxt
exchange = ccxt.luno({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/ZAR', 'limit', 'buy', 0.001, 1200000)
print(order['id'], order['status'])
```
```python
from luno_python.client import Client
c = Client(api_key_id='key_id', api_key_secret='key_secret')
res = c.post_limit_order(pair='XBTZAR', type='BID',
volume='0.001', price='1200000')
print(res)
```
`type='BID'`/`'ASK'` is Luno's convention; CCXT takes `'buy'`/`'sell'` and returns a [unified order structure](/docs/manual#order-structure) with `id`, `status`, `filled`, `remaining`, `average` and `fee` populated the same way as on every other exchange.
### Stream an order book [#stream-an-order-book]
CCXT
luno-go
```python
import ccxt.pro
import asyncio
async def main():
# Luno's Streaming API is authenticated, so credentials are required
exchange = ccxt.pro.luno({'apiKey': '...', 'secret': '...'})
while True:
orderbook = await exchange.watch_order_book('BTC/ZAR')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```go
c, err := streaming.Dial(keyID, keySecret, "XBTZAR")
if err != nil {
log.Fatal(err)
}
defer c.Close()
bids, asks := c.Snapshot()
```
Both maintain a live book from Luno's Streaming API, and both require credentials — Luno authenticates the stream even for market data. CCXT gives you `watch_order_book` and `watch_trades` returning the same structures as `fetch_order_book` and `fetch_trades`, so switching a polling loop to a stream is a one-word change.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API [#eight-languages-one-api]
Luno publishes Python, Go and PHP; the Java SDK repository is archived. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with identical method names and return structures:
Python
TypeScript
C#
```python
import ccxt
exchange = ccxt.luno()
ticker = exchange.fetch_ticker('BTC/ZAR')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.luno ();
const ticker = await exchange.fetchTicker ('BTC/ZAR');
```
```csharp
var exchange = new ccxt.luno();
var ticker = await exchange.FetchTicker("BTC/ZAR");
```
If your service is C#, Java or TypeScript, CCXT is the maintained path to Luno.
### Portability, and Luno's market position [#portability-and-lunos-market-position]
Luno's role in most systems is local-fiat pairs — its own documentation's worked example is `XBTZAR` — while depth and derivatives come from a global venue. That is exactly the situation that ends up multi-venue: Luno for the local on and off ramp, something else for the rest. In CCXT both sit behind the same methods:
```python
for exchange_id in ['luno', 'binance', 'kraken']:
exchange = getattr(ccxt, exchange_id)()
exchange.load_markets()
```
With per-venue SDKs, that reconciliation layer is code you write and maintain.
### Ledgers, accounts and fees are unified too [#ledgers-accounts-and-fees-are-unified-too]
Luno models balances as named accounts with a transaction ledger. CCXT exposes that through `fetch_accounts`, `fetch_ledger` and `fetch_balance` — the same three method names it uses on any exchange with the same shape — along with `fetch_trading_fee`, `fetch_deposit_address` and `create_deposit_address`. Twenty-four unified capabilities in total, 18 of them `fetch*`.
### Rate limits, precision and errors [#rate-limits-precision-and-errors]
CCXT's throttler is on by default with `rateLimit` at 200 ms for Luno. `amount_to_precision` and `price_to_precision` apply each market's `volume_scale` and `price_scale` through the `Precise` string-arithmetic class. Luno's errors map onto CCXT's [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded` and 36 more under `BaseError`.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the unified methods, **all 40 Luno endpoints are generated as implicit methods**, with signing and rate-limit accounting applied. Browse them on the [luno implicit API page](/docs/exchanges/luno/implicit-api).
## What Luno's official SDKs do better [#what-lunos-official-sdks-do-better]
Honestly:
* **Complete endpoint coverage, generated from the API.** The SDKs expose one method per endpoint, including versioned variants like `get_order_v2` and `get_order_v3` and the parts of Luno's product CCXT does not model as unified methods. If you need an endpoint CCXT has not unified, the SDK method already exists with typed arguments.
* **`luno-go`'s streaming client is more capable than CCXT's Luno WebSocket support.** It maintains the order book, exposes monotonic sequence numbers on updates, and its documentation states the connection reconnects automatically on error. CCXT gives Luno only `watch_order_book` and `watch_trades` — no private streams, no ticker stream.
* **Luno's own field names, end to end.** `pair`, `volume`, `counter`, `BID`/`ASK` — exactly what Luno's reference documents. CCXT's unified names are a deliberate abstraction, which is one extra hop when debugging against the vendor docs.
* **A much smaller dependency.** For a single-venue Luno integration in Python, Go or PHP, the official SDK is a fraction of the size of a 104-exchange library.
If Luno is your only venue and you work in Python, Go or PHP — especially if you need rich streaming — the official SDK is the better fit.
## Migrating from a Luno SDK to CCXT [#migrating-from-a-luno-sdk-to-ccxt]
| What you are doing | Luno SDK | CCXT |
| ------------------- | ------------------------------------------------- | ---------------------------------------------------------------------------- |
| Symbols | `XBTZAR` | `'BTC/ZAR'` |
| Markets | `markets()` | `load_markets()` |
| Ticker | `get_ticker()` / `get_tickers()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `get_order_book()` | `fetch_order_book()` |
| Candles | `get_candles()` | `fetch_ohlcv()` |
| Trades | `list_trades()` | `fetch_trades()` |
| Limit order | `post_limit_order()` | `create_order()` |
| Market order | `post_market_order()` | `create_order()` with `'market'` |
| Cancel order | `stop_order()` | `cancel_order()` |
| Open orders | `list_orders()` | `fetch_open_orders()` |
| Balances | `get_balances()` | `fetch_balance()` |
| Accounts / ledger | account endpoints | `fetch_accounts()` / `fetch_ledger()` |
| Streams | `streaming.Dial()` (Go), `stream_client` (Python) | `watch_order_book()`, `watch_trades()` on `ccxt.pro.luno` |
| Anything not listed | the endpoint method | the same endpoint as an [implicit method](/docs/exchanges/luno/implicit-api) |
## FAQ [#faq]
**Does Luno have an official SDK?**
Yes — MIT-licensed clients for [Python](https://github.com/luno/luno-python), [Go](https://github.com/luno/luno-go) and [PHP](https://github.com/luno/luno-php), maintained under Luno's GitHub organisation. A Java SDK repository exists but is archived.
**Why does CCXT call Luno's `XBTZAR` pair `BTC/ZAR`?**
Because `XBT` and `BTC` are the same asset under two conventions, and CCXT normalises to one so that portfolio, risk and logging code does not need a per-venue alias table. The original identifier is still available on `market['id']`.
**Does CCXT support Luno WebSockets?**
Partially. `ccxt.pro.luno` implements `watch_order_book` and `watch_trades` — two methods — and both need API credentials because Luno's Streaming API authenticates even market-data connections. There are no private streams for Luno in CCXT. `luno-go`'s streaming package is the fuller client.
**Which markets does Luno expose through CCXT?**
Whatever Luno lists to your account. CCXT reads them at runtime with `load_markets()` from Luno's `markets` endpoint, so each pair appears as a unified symbol — `XBTZAR` becomes `'BTC/ZAR'` — with its tick size, step size and minimum volume already parsed.
**Does Luno have a testnet?**
CCXT defines no sandbox URLs for Luno, so `setSandboxMode(True)` will not switch you to a test environment.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [luno unified API reference](/docs/exchanges/luno)
* [luno implicit API](/docs/exchanges/luno/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the raw Mercado Bitcoin API (/docs/comparisons/ccxt-vs-mercado-api)
[Mercado Bitcoin](https://www.mercadobitcoin.com.br) is Brazil's largest crypto exchange, and its API is free and documented at `api.mercadobitcoin.net/api/v4/docs`. What it does not publish is a client library: its developer page describes REST integration "using any programming language of your preference" and offers code samples, not an SDK.
So the comparison here is not CCXT against a vendor SDK. It is **CCXT against the client you would write yourself** — and it is worth being clear up front about what CCXT does and does not cover on this venue.
## TL;DR [#tldr]
* **Write it yourself** if you need Mercado Bitcoin's v4 trading endpoints, its WebSocket feed, or anything beyond the 15 capabilities CCXT unifies here.
* **Use CCXT** if you want signed requests, nonces, pacing, precision and typed errors already handled behind the same method names you use on every other exchange.
* **Know the boundary.** CCXT drives Mercado Bitcoin's **v3 trade API** for private calls plus its public and v4 candle endpoints, and implements **zero `watch*` methods** — so the v4 REST trading surface and the WebSocket feed are outside what `ccxt.mercado` gives you today.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw Mercado Bitcoin API** |
| ----------------------- | ---------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| Official client library | — | none published; documentation and code samples only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | any, you write the client |
| Symbols | `'BTC/BRL'` | `BTC` as the coin path segment; `BRLBTC` in some payloads |
| Unified capabilities | 15, of which 9 are `fetch*` | n/a |
| API versions used | v3 trade API for private, public API and v4 candles for market data | v4 is the current documented surface |
| Signing | built in | HMAC-SHA512 over the request path plus urlencoded body, `TAPI-ID` + `TAPI-MAC` headers, incrementing `tapi_nonce` |
| WebSockets | **no** — `mercado` has no `watch*` methods in CCXT | offered for public data; you write the client |
| Raw endpoint access | yes — 21 endpoints as implicit methods | it is the whole product |
| Built-in rate limiter | yes, on by default (`rateLimit` 1000 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | `error_message` in the response body |
| Testnet / sandbox | no — Mercado Bitcoin has no sandbox in CCXT | no |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month | n/a — no vendor package to measure |
| Licence | MIT | n/a — the API itself is free to use |
| Support | Discord, Telegram, GitHub issues — usually same-day | Mercado Bitcoin support |
Figures verified September 2026 against CCXT v4.5.78 and Mercado Bitcoin's published developer page and v4 API documentation.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.mercado()
ticker = exchange.fetch_ticker('BTC/BRL')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
r = requests.get('https://www.mercadobitcoin.net/api/BTC/ticker/')
t = r.json()['ticker']
print(t['last'], t['vol'])
```
The public read is genuinely simple — that is not the part CCXT earns its place on. Note the trailing slash: Mercado Bitcoin's public paths require it, and dropping it is a redirect or a 404 depending on the endpoint. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure), so the same downstream code reads Mercado Bitcoin, Binance and Kraken.
### Place a limit order [#place-a-limit-order]
CCXT
Raw REST
```python
import ccxt
exchange = ccxt.mercado({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/BRL', 'limit', 'buy', 0.001, 350000)
print(order['id'], order['status'])
```
```python
import hashlib, hmac, time, urllib.parse, requests
body = urllib.parse.urlencode({
'tapi_method': 'place_buy_order',
'tapi_nonce': int(time.time() * 1000),
'coin_pair': 'BRLBTC',
'quantity': '0.001',
'limit_price': '350000',
})
message = '/tapi/v3/?' + body
mac = hmac.new(SECRET.encode(), message.encode(), hashlib.sha512).hexdigest()
r = requests.post('https://www.mercadobitcoin.net/tapi/v3/', data=body,
headers={'TAPI-ID': KEY, 'TAPI-MAC': mac,
'Content-Type': 'application/x-www-form-urlencoded'})
```
Three details in that block are where hand-rolled clients break:
1. **The signed message is the path plus `?` plus the exact body** — not the body alone, and not the full URL. Get the prefix wrong and every request fails authentication with no hint as to why.
2. **Every private call is a `POST` to `/tapi/v3/`** with the operation in `tapi_method`. `place_buy_order`, `cancel_order`, `list_orders`, `get_account_info` are all the same URL.
3. **`tapi_nonce` must strictly increase.** Two processes sharing a key, a restart, or an out-of-order retry produces a rejection that looks like a credentials problem and is not.
CCXT builds all three and returns a [unified order structure](/docs/manual#order-structure).
## Where the differences actually bite [#where-the-differences-actually-bite]
### Symbols and the coin-pair convention [#symbols-and-the-coin-pair-convention]
Mercado Bitcoin's public endpoints take the coin as a path segment (`/api/BTC/ticker/`), while the trade API takes a `coin_pair` written quote-first (`BRLBTC`). Two conventions for the same market, in the same integration. CCXT normalises both to `'BTC/BRL'` and keeps the venue identifiers on the market object.
### Rate limits and pacing [#rate-limits-and-pacing]
CCXT ships a token-bucket throttler that is on by default, with `rateLimit` at 1000 ms for Mercado Bitcoin. In a hand-rolled client, pacing and backoff are application code — and on a venue whose private surface is a single POST endpoint, an unpaced retry loop is easy to write by accident.
### One error hierarchy [#one-error-hierarchy]
Mercado Bitcoin returns failures in the response body, as an `error_message` field, often with an HTTP 200. A hand-rolled client has to inspect every response and match on strings. CCXT does that and raises from a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `AuthenticationError`, `RateLimitExceeded` and 36 more under `BaseError` — so one `except` block covers this venue and the next one you add.
### Precision and string math [#precision-and-string-math]
BRL prices run to hundreds of thousands and quantities to eight decimals. CCXT applies each market's tick and step sizes through `amount_to_precision` and `price_to_precision`, backed by the `Precise` string-arithmetic class, so a value never drifts through float rounding into a rejected order.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures. Mercado Bitcoin's documentation offers code samples; each language you support is a client you write and maintain yourself.
Python
TypeScript
Go
```python
import ccxt
exchange = ccxt.mercado()
ticker = exchange.fetch_ticker('BTC/BRL')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.mercado ();
const ticker = await exchange.fetchTicker ('BTC/BRL');
```
```go
exchange := ccxt.NewMercado(nil)
ticker, err := exchange.FetchTicker("BTC/BRL")
```
### Portability [#portability]
Mercado Bitcoin is usually one venue in a Brazilian system, not the whole of it — the BRL on-ramp alongside a global venue for depth. In CCXT the venue is a variable and the reconciliation layer is the library:
```python
for exchange_id in ['mercado', 'binance', 'kraken']:
exchange = getattr(ccxt, exchange_id)()
exchange.load_markets()
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 15 unified capabilities, **all 21 endpoints CCXT models for Mercado Bitcoin are generated as implicit methods**, with signing and rate-limit accounting applied:
```python
response = exchange.private_post_get_account_info()
```
Browse them on the [mercado implicit API page](/docs/exchanges/mercado/implicit-api).
## What going direct does better [#what-going-direct-does-better]
These are real, and on this venue they are more substantial than usual:
* **The v4 API is the current surface, and CCXT drives v3 for trading.** Mercado Bitcoin's documented flow is to create an API key with 2FA, authenticate against an Authorize endpoint for a token, then read your account id from a List Accounts endpoint. CCXT's private path uses the older v3 trade API with `TAPI-ID`/`TAPI-MAC` signing instead. If you want the v4 trading endpoints, you call them yourself.
* **WebSockets.** Mercado Bitcoin offers a WebSocket for public data. `mercado` has **zero `watch*` methods** in CCXT, so any live feed from this venue is a client you write.
* **Endpoints CCXT does not model.** CCXT covers 21 endpoints here — a small subset of what a full v4 integration exposes. Anything outside that set is a direct call regardless.
* **A small, readable client.** For a read-mostly BRL price feed, `requests` plus a URL is a handful of lines, with no dependency to track.
If your Mercado Bitcoin integration needs v4 trading or streaming, going direct is not a compromise — it is the only route today.
## Migrating from a hand-rolled Mercado Bitcoin client to CCXT [#migrating-from-a-hand-rolled-mercado-bitcoin-client-to-ccxt]
| What you are doing | Raw Mercado Bitcoin API | CCXT |
| ------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------- |
| Symbols | `BTC` path segment / `BRLBTC` coin pair | `'BTC/BRL'` |
| Coin list | `GET /api/coins` | `load_markets()` |
| Ticker | `GET /api/{coin}/ticker/` | `fetch_ticker()` |
| Order book | `GET /api/{coin}/orderbook/` | `fetch_order_book()` |
| Trades | `GET /api/{coin}/trades/` | `fetch_trades()` |
| Candles | v4 `candles` | `fetch_ohlcv()` |
| Balance | `tapi_method=get_account_info` | `fetch_balance()` |
| Limit buy / sell | `place_buy_order` / `place_sell_order` | `create_order()` |
| Market buy / sell | `place_market_buy_order` / `place_market_sell_order` | `create_order()` with `'market'` |
| Cancel order | `cancel_order` | `cancel_order()` |
| Order status | `get_order` | `fetch_order()` |
| Open orders | `list_orders` | `fetch_open_orders()` |
| Streams | offered by the venue, no client | not available in CCXT for this venue |
| Anything not listed | the `tapi_method` name | the same endpoint as an [implicit method](/docs/exchanges/mercado/implicit-api) |
## FAQ [#faq]
**Does Mercado Bitcoin have an official SDK?**
No. Its developer page describes REST integration in the language of your choice and provides code samples, with documentation at `api.mercadobitcoin.net/api/v4/docs`. There is no vendor-published client library, so any comparison is against a client you write.
**Does CCXT support Mercado Bitcoin WebSockets?**
No. `mercado` has zero `watch*` methods in CCXT. The venue offers a WebSocket for public data, so streaming means writing your own client.
**Which Mercado Bitcoin API version does CCXT use?**
Private calls go through the v3 trade API at `/tapi/v3/`, signed with HMAC-SHA512 in a `TAPI-MAC` header. Market data comes from the public API and, for candles, from the v4 endpoints. The v4 Authorize-token trading flow is not what CCXT drives.
**How does CCXT sign Mercado Bitcoin private requests?**
It POSTs a urlencoded body containing `tapi_method` and an incrementing `tapi_nonce` to `/tapi/v3/`, and signs the string `/tapi/v3/?` followed by that exact body with HMAC-SHA512, sending your key in `TAPI-ID` and the digest in `TAPI-MAC`. You supply `apiKey` and `secret`.
**Does Mercado Bitcoin have a testnet?**
CCXT defines no sandbox URLs for Mercado Bitcoin, so `setSandboxMode(True)` will not switch you to a test environment.
**Is CCXT free?**
Yes. MIT-licensed.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [mercado unified API reference](/docs/exchanges/mercado)
* [mercado implicit API](/docs/exchanges/mercado/implicit-api) — every raw endpoint
* [More comparisons](/docs/comparisons)
# CCXT vs the MEXC API and official MEXC SDK (/docs/comparisons/ccxt-vs-mexc-api)
MEXC publishes an official connector, [`mexcdevelop/mexc-api-sdk`](https://github.com/mexcdevelop/mexc-api-sdk), generated into five languages from one spec. It covers the spot v3 REST API. [CCXT](/docs/manual) speaks the same API, plus MEXC's margin and contract endpoints and its WebSocket feed, behind method names shared with 104 other venues.
The question that decides between them: **do you need anything beyond spot REST?**
## TL;DR [#tldr]
* **Pick the official MEXC SDK** if you only ever call spot REST endpoints, you want method names that match MEXC's docs literally, and a `git clone` install is acceptable in your build.
* **Pick CCXT** if you need MEXC's swap markets, margin, or its WebSocket streams — the official SDK covers none of those, and MEXC's spot streams are Protocol Buffers, not JSON.
* **CCXT is not a lowest common denominator here.** All 238 MEXC endpoints are generated as [implicit methods](/docs/exchanges/mexc/implicit-api), signed and rate-limited like everything else.
## At a glance [#at-a-glance]
| | **CCXT** | **Official MEXC SDK** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| Exchanges covered | 104 (MEXC is one of them) | MEXC only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python, JavaScript, Go, Java, .NET — generated from one spec |
| Install | `pip install ccxt` / `npm i ccxt` | `git clone`, then unzip the `dist/` folder for your language |
| MEXC products covered | spot, margin, swap | spot |
| Unified market data + trading API | yes — same method names on every exchange | no — MEXC's own request/response shapes |
| WebSockets | yes — 16 `watch*` / `unWatch*` methods, protobuf decoded for you | not in the SDK |
| Raw endpoint access | yes — 238 MEXC endpoints as implicit methods | spot endpoints only |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 50 ms) | no |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + MEXC error codes |
| Testnet / sandbox | no — MEXC has no sandbox in CCXT | no |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | 316 GitHub stars, 134 forks; last repository update February 2024 |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub issues — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `mexcdevelop/mexc-api-sdk` repository and MEXC's published spot v3 and contract v1 API documentation.
CCXT implements **83 unified capabilities** for MEXC — 40 of them `fetch*` methods — and marks it a **certified** exchange, meaning it is covered by the static request/response regression fixtures that run in CI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
mexc-api-sdk
```python
import ccxt
exchange = ccxt.mexc()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from mexc_sdk import Spot
spot = Spot(api_key='apiKey', api_secret='apiSecret')
response = spot.ticker24hr(symbol='BTCUSDT')
print(response)
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — same keys, same types, same units on every venue. The SDK returns MEXC's payload as it arrives.
### Place a limit order [#place-a-limit-order]
CCXT
mexc-api-sdk
```python
import ccxt
exchange = ccxt.mexc({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from mexc_sdk import Spot
spot = Spot(api_key='apiKey', api_secret='apiSecret')
response = spot.newOrder(symbol='BTCUSDT', side='BUY', orderType='LIMIT',
options={'quantity': 1, 'price': 30000})
print(response)
```
To reach MEXC's swap markets you change one option in CCXT and nothing else:
```python
exchange = ccxt.mexc({'apiKey': '...', 'secret': '...',
'options': {'defaultType': 'swap'}})
positions = exchange.fetch_positions(['BTC/USDT:USDT'])
```
The official SDK has no contract client at all.
### Stream an order book [#stream-an-order-book]
CCXT
Raw MEXC WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.mexc()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
# MEXC publishes .proto schemas, not a client:
# https://github.com/mexcdevelop/websocket-proto
# You compile the 16 .proto files, open the socket, subscribe,
# decode each binary frame, fetch a REST snapshot, align it with
# the diff stream, and re-seed on every gap and reconnect.
```
This is the largest practical gap between the two options. MEXC's spot streams are **Protocol Buffers**: the exchange publishes schemas in [`mexcdevelop/websocket-proto`](https://github.com/mexcdevelop/websocket-proto) — 16 `.proto` files covering tickers, depths, trades, klines, account, orders and deals — and leaves the client to you. CCXT decodes those frames internally and hands you the same order book, trade and order structures that `fetch_order_book`, `fetch_trades` and `fetch_orders` return.
It also runs the parts around the socket: the REST snapshot fetch and delta alignment, reconnect and resubscribe, bounded caches, and the private-stream **`listenKey` refresh on a 20-minute timer** so your user-data stream does not expire silently.
## Where the differences actually bite [#where-the-differences-actually-bite]
### The official SDK is spot-only [#the-official-sdk-is-spot-only]
MEXC's spot v3 API and its contract v1 API are separate products with different base URLs and different signing headers — spot signs `totalParams` with HMAC-SHA256 into a `signature` query parameter, contract signs `accessKey + timestamp + requestParam` into a `Signature` header alongside `ApiKey` and `Request-Time`. The official SDK implements the first and not the second.
CCXT implements both behind one class. `options.defaultType` picks `spot` or `swap`; `'BTC/USDT'` and `'BTC/USDT:USDT'` pick the market.
One thing to know before you plan around it: MEXC's own contract documentation carries a notice dated 2022-07-25 stating that the contract *place order* and *cancel order* endpoints are closed temporarily while query endpoints stay available, and marks those endpoints "(Under maintenance)". CCXT exposes them either way — the availability is MEXC's call, not the library's.
### Installation [#installation]
The official SDK is not published to PyPI or npm by MEXC. Its README installs it by cloning the repository and unzipping the `dist/` folder for your language. That works, but it does not pin cleanly in a lockfile or a container build. CCXT is one package from your language's ordinary registry.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures.
Python
TypeScript
Go
```python
import ccxt
exchange = ccxt.mexc()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.mexc ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```go
exchange := ccxt.NewMexc(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
MEXC's SDK is also generated into five languages, but each is a MEXC-shaped client — not a portable API you can point at a second venue.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
MEXC meters per endpoint with weights, at 500 requests per 10 seconds per endpoint by IP and again by UID, and disconnects WebSocket clients above 100 messages per second. CCXT encodes the weights in the exchange definition and ships a token-bucket throttler that is on by default (`enableRateLimit = true`, `rateLimit = 50` ms). You write loops; the library paces them.
### One error hierarchy [#one-error-hierarchy]
CCXT maps MEXC's numeric codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `OnMaintenance` and 35 more, all under `BaseError`. You catch `ccxt.InsufficientFunds` once instead of matching on a code that may be re-used differently on the next venue.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 83 unified capabilities, **all 238 MEXC endpoints are callable as implicit methods**, with signing, timestamping and rate-limit accounting applied:
```python
response = exchange.spot_private_get_capital_config_getall()
```
Browse them on the [mexc implicit API page](/docs/exchanges/mexc/implicit-api).
## What the official MEXC SDK does better [#what-the-official-mexc-sdk-does-better]
Honestly, and these are real:
* **Literal fidelity to MEXC's docs.** `ticker24hr()`, `newOrder()`, `depth()` — the names and fields are exactly what you are reading in the MEXC API reference. CCXT's unified names are a deliberate abstraction, which is one extra hop when you are debugging against the vendor documentation.
* **Vendor-generated across five languages from one spec.** The Python, JavaScript, Go, Java and .NET builds come from the same generator, so a team split across languages sees the same MEXC-shaped surface. MEXC also publishes a [Postman collection](https://github.com/mexcdevelop/mexc-api-postman) for exploring endpoints before writing code.
* **A much smaller dependency for spot-only work.** If all your process does is poll spot tickers, the SDK is a fraction of the size of CCXT.
* **New MEXC spot features land in the vendor's own client first.** A unified CCXT wrapper for a brand-new MEXC feature may lag the vendor SDK, even though the implicit API closes most of that gap on day one.
If MEXC spot REST is the whole of your integration and it always will be, the official SDK is a defensible choice. As soon as futures or streaming enters the plan, you are writing the missing client yourself.
There is also a widely used community Python wrapper, [`makarworld/pymexc`](https://github.com/makarworld/pymexc) — MIT, 65 GitHub stars, roughly 2.9k PyPI installs a month — which does cover spot and futures HTTP plus WebSocket classes. It describes itself as unofficial.
## Migrating from the MEXC SDK to CCXT [#migrating-from-the-mexc-sdk-to-ccxt]
| What you are doing | MEXC SDK | CCXT |
| ------------------- | ---------------- | ---------------------------------------------------------------------------- |
| Symbols | `'BTCUSDT'` | `'BTC/USDT'` spot, `'BTC/USDT:USDT'` swap |
| Product selection | spot client only | `options.defaultType` = `spot` / `margin` / `swap` |
| Exchange info | `exchangeInfo()` | `load_markets()` |
| 24h ticker | `ticker24hr()` | `fetch_ticker()` / `fetch_tickers()` |
| Depth | `depth()` | `fetch_order_book()` |
| Klines | `klines()` | `fetch_ohlcv()` |
| New order | `newOrder()` | `create_order()` |
| Cancel order | `cancelOrder()` | `cancel_order()` |
| Open orders | `openOrders()` | `fetch_open_orders()` |
| Account | `accountInfo()` | `fetch_balance()` |
| Streams | not in the SDK | `watch_*` on `ccxt.pro.mexc` |
| Anything not listed | — | the same endpoint as an [implicit method](/docs/exchanges/mexc/implicit-api) |
## FAQ [#faq]
**Does MEXC have an official Python SDK?**
Yes — [`mexcdevelop/mexc-api-sdk`](https://github.com/mexcdevelop/mexc-api-sdk), MIT-licensed, generated into Python, JavaScript, Go, Java and .NET. It covers the spot v3 REST API. It is installed by cloning the repository and unzipping the `dist/` folder rather than from PyPI, and it does not include a WebSocket client or the contract API.
**Does CCXT support MEXC futures?**
Yes. `ccxt.mexc` covers spot, margin and swap markets from one instance, selected with `options.defaultType` and unified symbols such as `'BTC/USDT:USDT'`. Note that MEXC's own contract docs flag the contract order-placement endpoints as under maintenance; that is a venue-side status, not a CCXT limitation.
**How do I read MEXC's protobuf WebSocket feed?**
MEXC publishes `.proto` schemas rather than a client. CCXT decodes those frames for you: use `ccxt.pro.mexc` and call `watch_order_book`, `watch_trades`, `watch_ohlcv`, `watch_ticker`, `watch_orders`, `watch_my_trades` or `watch_balance` — 16 `watch*`/`unWatch*` methods in total — and you get the same structures the REST methods return.
**Does MEXC have a testnet, and does `setSandboxMode` work?**
CCXT does not define sandbox URLs for MEXC, so `setSandboxMode(True)` will not switch you to a test environment. Test against small live orders or against the static fixtures instead.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is bundled in the `ccxt` package under MIT. Use `ccxt.pro.mexc` and call `watch*` methods.
**Can I still call MEXC-specific endpoints through CCXT?**
Yes — all 238 of them, as [implicit methods](/docs/exchanges/mexc/implicit-api), with signing and rate limiting applied.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [mexc unified API reference](/docs/exchanges/mexc)
* [mexc implicit API](/docs/exchanges/mexc/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Mode Trade API (/docs/comparisons/ccxt-vs-modetrade-api)
[Mode Trade](https://trade.mode.network) is the perpetuals exchange on the Mode Ethereum L2. It does not publish a client library under its own name. It is a broker front end on **Orderly Network's** shared EVM orderbook — the API host CCXT's `modetrade` class talks to is `api-evm.orderly.org`, and [Orderly's launch announcement](https://www.globenewswire.com/news-release/2025/04/10/3059677/0/en/Mode-launches-AI-native-perpetuals-DEX-powered-by-Orderly.html) describes Mode Trade as built on Orderly's infrastructure, with over 100 pairs and up to 50x leverage.
So the realistic alternative to [CCXT](/docs/manual) is not a Mode SDK. It is Orderly's own connectors: [`orderly-evm-connector-python`](https://github.com/OrderlyNetwork/orderly-evm-connector-python) (MIT, on PyPI as `orderly-evm-connector`) and Orderly's TypeScript SDKs. The question is: **do you want Orderly's API shapes, or Mode Trade behind the same interface as every other venue you trade?**
## TL;DR [#tldr]
* **Pick Orderly's connector** if you are building against the Orderly stack itself, in Python or TypeScript, and want method and field names that match Orderly's reference one-for-one.
* **Pick CCXT** if you want Mode Trade as one venue among many: 56 unified capabilities, 10 `watch*` streaming methods, and the same code in TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java or Rust.
* **Both sign the same way.** Orderly authenticates with an ed25519 key pair (`orderly-key`, `orderly-secret`, `orderly-account-id`), and CCXT implements that signing internally — the choice is about API shape and portability, not cryptography.
## At a glance [#at-a-glance]
| | **CCXT** | **Orderly's own connectors** |
| --------------------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (Mode Trade is one of them) | the Orderly EVM API |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python (`orderly-evm-connector`), TypeScript (`js-sdk`, `orderly-sdk-js`) |
| Packages to install | **1** (`ccxt`) | `pip install orderly-evm-connector`, or an npm package per JS SDK |
| Unified market data + trading API | yes — same method names across every exchange | no — Orderly's own request/response shapes |
| Unified capabilities implemented | 56 for `modetrade`, of which 27 are `fetch*` | n/a |
| Symbols | `'BTC/USDC:USDC'` | `PERP_BTC_USDC` |
| WebSockets | yes — 10 `watch*` methods | yes — public and private stream clients |
| Raw endpoint access | yes — 115 endpoints as implicit methods | whatever the connector wraps |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 100 ms) | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | `ClientError` / `ServerError` / three parameter errors |
| Testnet | `set_sandbox_mode(True)` swaps REST and WS URLs | `orderly_testnet=True` |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `orderly-evm-connector-python` 14 GitHub stars; `js-sdk` 19 stars; `orderly-sdk-js` 12 stars |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues on each repository |
Figures verified September 2026 against CCXT v4.5.78, the OrderlyNetwork GitHub organisation's repository listing and READMEs, and the `orderly-evm-connector` PyPI record (v0.2.9, published June 2026).
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a funding rate [#fetch-a-funding-rate]
CCXT
orderly-evm-connector
```python
import ccxt
exchange = ccxt.modetrade()
rate = exchange.fetch_funding_rate('BTC/USDC:USDC')
print(rate['fundingRate'], rate['fundingTimestamp'])
```
```python
from orderly_evm_connector.rest import Rest as Client
client = Client(orderly_testnet=False, timeout=5)
response = client.get_predicted_funding_rate_for_one_market(symbol="PERP_BTC_USDC")
print(response)
```
CCXT returns a [unified funding rate structure](/docs/manual#funding-rate-structure) — the same keys, types and units you get from Binance or Bybit, so a cross-venue funding monitor does not need a Mode-shaped branch. The connector returns Orderly's payload, keyed by `PERP_BTC_USDC`, which you map yourself.
One gap worth naming up front: `modetrade` declares `fetchTicker: false` and `fetchTickers: false` in CCXT. Last price and 24h stats come from `fetch_ohlcv`, from the order book, or over the socket with `watch_ticker` — which *is* implemented.
### Place a limit order [#place-a-limit-order]
CCXT
orderly-evm-connector
```python
import ccxt
exchange = ccxt.modetrade({
'apiKey': 'ed25519:...', # orderly key
'secret': 'ed25519:...', # orderly secret
'accountId': '0x...',
})
order = exchange.create_order('BTC/USDC:USDC', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from orderly_evm_connector.rest import Rest as Client
client = Client(
orderly_key="ed25519:...",
orderly_secret="ed25519:...",
orderly_account_id="0x...",
orderly_testnet=False,
timeout=5,
)
response = client.create_order(
symbol="PERP_BTC_USDC",
order_type="LIMIT",
side="BUY",
order_price=60000,
order_quantity=0.001,
)
```
The credentials are identical because the signing is identical: CCXT builds the same `orderly-account-id` / `orderly-key` / `orderly-timestamp` / `orderly-signature` headers, signing `timestamp + method + path + body` with ed25519 over a base58-decoded secret. What differs is everything above that line — the order object CCXT hands back is a [unified order structure](/docs/manual#order-structure), and `create_order` takes the same five arguments on Bybit, OKX or Kraken.
Trigger, stop-loss, take-profit and reduce-only orders go through unified params rather than separate call shapes:
```python
order = exchange.create_order(
'BTC/USDC:USDC', 'limit', 'buy', 0.001, 60000,
{'takeProfitPrice': 66000, 'stopLossPrice': 57000})
```
### Stream an order book [#stream-an-order-book]
CCXT
orderly-evm-connector
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.modetrade()
while True:
orderbook = await exchange.watch_order_book('BTC/USDC:USDC')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import logging, time
from orderly_evm_connector.websocket.websocket_api import WebsocketPublicAPIClient
def message_handler(_, message):
logging.info(message)
wss_client = WebsocketPublicAPIClient(
orderly_testnet=False,
orderly_account_id="0x...",
wss_id="ClientID",
on_message=message_handler,
on_close=lambda _: logging.info("closed"),
)
wss_client.get_24h_tickers()
time.sleep(1000)
wss_client.stop()
```
Two different programming models. CCXT is pull-shaped — you `await` a method and get a value, so the streaming code reads like the REST code next to it. The connector is push-shaped: you register `on_message` / `on_close` callbacks and hand control to the client.
The connector does handle reconnection (its README documents up to 30 retries at 5-second intervals, with resubscription after reconnect). What it does not do is assemble an order book for you: it exposes `request_orderbook`, `get_orderbook` and `get_orderbookupdate` as separate subscriptions, and aligning the snapshot with the delta stream is your code. `watch_order_book` returns a live, merged book with that alignment, gap detection and bounded caching already done — and it returns the same [order book structure](/docs/manual#order-book-structure) as `fetch_order_book`.
CCXT implements 10 streaming methods for `modetrade`: `watchOrderBook`, `watchTrades`, `watchOHLCV`, `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchBalance`, `watchOrders`, `watchMyTrades` and `watchPositions`.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures in every one. Orderly publishes Python and TypeScript; if your execution service is in Go, C# or Java, CCXT is the option that exists.
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.modetrade()
orderbook = exchange.fetch_order_book('BTC/USDC:USDC')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.modetrade ();
const orderbook = await exchange.fetchOrderBook ('BTC/USDC:USDC');
```
```csharp
var exchange = new ccxt.modetrade();
var orderbook = await exchange.FetchOrderBook("BTC/USDC:USDC");
```
```go
exchange := ccxt.NewModetrade(nil)
orderbook, err := exchange.FetchOrderBook("BTC/USDC:USDC")
```
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT ships a token-bucket throttler that is on by default (`enableRateLimit = true`, `rateLimit = 100` ms for `modetrade`), with per-endpoint weights encoded in the exchange definition. Orderly's connector documents no throttler — pacing and back-off on a 429 are your code.
### One error hierarchy [#one-error-hierarchy]
CCXT maps Orderly's error codes onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. The connector raises `ClientError` for 4XX and `ServerError` for 5XX, with the venue's numeric code as a property you match on yourself.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` pulls Mode Trade's tick and step sizes, and CCXT exposes them through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities never drift through float rounding into a rejected order.
```python
amount = exchange.amount_to_precision('BTC/USDC:USDC', 0.0012345678)
price = exchange.price_to_precision('BTC/USDC:USDC', 61234.56789)
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 56 unified capabilities, **all 115 endpoints in the API definition are generated as callable implicit methods**, with signing, rate-limit accounting and error mapping applied:
```python
# any raw endpoint, camelCased from its path
response = exchange.v1_private_get_client_holding()
```
Browse them on the [modetrade implicit API page](/docs/exchanges/modetrade/implicit-api).
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.modetrade({'apiKey': '...', 'secret': '...', 'accountId': '0x...'})
exchange.set_sandbox_mode(True) # swaps in the testnet REST and WebSocket URLs
```
## What Orderly's connectors do better [#what-orderlys-connectors-do-better]
An honest list:
* **They are first-party to the API.** Orderly writes the API and the connector. A new Orderly endpoint appears in their own client before it is modelled as a *unified* CCXT method (CCXT's implicit API usually closes the gap on day one, but a unified wrapper can lag).
* **Field names match the Orderly reference exactly.** `PERP_BTC_USDC`, `order_quantity`, `order_price` — when you are debugging with the vendor docs open, a one-to-one mapping is one less hop than CCXT's deliberate abstraction.
* **Smaller dependency for a single venue.** If all you do is call the Orderly EVM API from Python, `orderly-evm-connector` is a much smaller install than a library covering 104 exchanges.
* **The TypeScript SDKs cover more than trading.** Orderly's `js-sdk` includes wallet integration and React building blocks for a front end — territory CCXT does not enter at all.
* **Ticker-shaped market data.** The connector's `get_futures_info_for_one_market()` and `get_futures_info_for_all_markets()` return last price and 24h stats directly. CCXT declares `fetchTicker: false` for `modetrade`, so on the REST side you assemble that from `fetch_ohlcv` or the order book.
* **Orderly-specific concepts stay explicit.** Broker ids, account-id derivation and on-chain deposit flows are surfaced directly by the Orderly stack; CCXT abstracts what it can and leaves the rest to the implicit API.
If you are building on Orderly itself — a broker, a front end, or a service pinned to one venue — Orderly's own connectors are the more direct route.
## Migrating from Orderly's connector to CCXT [#migrating-from-orderlys-connector-to-ccxt]
| What you are doing | Orderly connector | CCXT |
| ------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| Symbols | `PERP_BTC_USDC` | `'BTC/USDC:USDC'` |
| Client | `Rest(orderly_key=..., orderly_secret=..., orderly_account_id=...)` | `ccxt.modetrade({'apiKey': ..., 'secret': ..., 'accountId': ...})` |
| Markets | `get_available_symbols()` | `load_markets()` |
| Market info | `get_futures_info_for_one_market()` | `load_markets()` — `fetch_ticker` is **not** implemented for `modetrade` |
| Order book | `get_orderbook_snapshot()` | `fetch_order_book()` |
| Candles | `get_kline()` | `fetch_ohlcv()` |
| New order | `create_order()` | `create_order()` |
| Cancel order | `cancel_order()` | `cancel_order()` |
| Open orders | `get_orders()` with a status filter | `fetch_open_orders()` |
| Balance | `get_current_holdings()` | `fetch_balance()` |
| Positions | `get_all_positions_info()` | `fetch_positions()` |
| Funding rate | `get_funding_rate_history_for_one_market()` | `fetch_funding_rate()` / `fetch_funding_rate_history()` |
| Streams | `WebsocketPublicAPIClient` / `WebsocketPrivateAPIClient` callbacks | `watch_*` on `ccxt.pro.modetrade` |
| Testnet | `orderly_testnet=True` | `set_sandbox_mode(True)` |
| Anything not listed | native call | the same endpoint as an [implicit method](/docs/exchanges/modetrade/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [modetrade unified API reference](/docs/exchanges/modetrade).
## FAQ [#faq]
**Does Mode Trade have its own API SDK?**
Not under its own name. Mode Trade runs on Orderly Network's EVM orderbook, and the client libraries for that API are published by Orderly: `orderly-evm-connector-python` for Python and `js-sdk` / `orderly-sdk-js` for TypeScript. CCXT's `modetrade` class talks to the same host, `api-evm.orderly.org`.
**Does CCXT support Mode Trade WebSockets?**
Yes — 10 `watch*` methods, covering order book, trades, OHLCV, tickers, bids/asks, balance, orders, positions and own trades. Use `ccxt.pro.modetrade` and `await exchange.watch_order_book('BTC/USDC:USDC')`.
**What credentials does CCXT need for Mode Trade?**
An Orderly ed25519 key and secret plus an account id: `ccxt.modetrade({'apiKey': 'ed25519:...', 'secret': 'ed25519:...', 'accountId': '0x...'})`. CCXT accepts the keys with or without the `ed25519:` prefix and does the signing for you.
**Can I test against a testnet?**
Yes. `exchange.set_sandbox_mode(True)` swaps in the testnet REST and WebSocket URLs in one call, with no second code path.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.modetrade` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [modetrade unified API reference](/docs/exchanges/modetrade)
* [modetrade implicit API](/docs/exchanges/modetrade/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the Mudrex API and the official Mudrex Python SDK (/docs/comparisons/ccxt-vs-mudrex-api)
[Mudrex](https://mudrex.com) is an India-based venue whose futures API lives at `https://trade.mudrex.com/fapi/v1`. Its [own documentation](https://docs.trade.mudrex.com/docs/overview) describes an `X-Authentication` header carrying your API secret, a public market-data surface that needs no authentication, and live kline, mark-kline and ticker streams over WebSocket.
Mudrex publishes one client library: [`mudrex-python-sdk`](https://github.com/mudrex/mudrex-python-sdk), on PyPI as `mudrex-sdk`. Its README describes it as the "Official Python SDK for the Mudrex HTTP APIs" and says it "currently supports only the **Trading API** (futures orders, positions, leverage, wallet, etc.) via the `TradeClient`".
[CCXT](/docs/manual) speaks the same API behind method names shared with 103 other venues. The question that decides between them: **is Python-only, trading-only coverage enough, or do you want market data, streaming and other languages too?**
## TL;DR [#tldr]
* **Pick `mudrex-sdk`** if you are in Python, Mudrex is your only venue, and you want method and field names that match Mudrex's own reference exactly — `place_order(..., order_type="LONG", trigger_type="MARKET")` is Mudrex's model, not a translation of it.
* **Pick CCXT** if you want market data as well as trading, WebSocket candles and tickers, a rate limiter that is on by default, and the same code in TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java or Rust.
* **Rate limiting is the sharpest difference.** The SDK's README states: "This SDK does **not** throttle requests — it fires them immediately… You are responsible for pacing your requests." CCXT's throttler is on by default with per-endpoint weights.
## At a glance [#at-a-glance]
| | **CCXT** | **`mudrex-sdk`** |
| --------------------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| Exchanges covered | 104 (Mudrex is one of them) | Mudrex only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python 3.9+ only |
| Scope | market data + trading | trading API only (`TradeClient`) |
| Unified market data + trading API | yes — same method names across every exchange | no — Mudrex's own request/response shapes |
| Unified capabilities implemented | 30 for `mudrex`, of which 14 are `fetch*` | n/a |
| Symbols | `'BTC/USDT:USDT'` | `"BTCUSDT"` or an asset UUID |
| Order model | `create_order(symbol, 'limit', 'buy', amount, price)` | `place_order(symbol, order_type="LONG", trigger_type="MARKET", ...)` |
| WebSockets | yes — `watchOHLCV`, `watchTicker`, `watchTickers` | none |
| Raw endpoint access | yes — 26 endpoints as implicit methods | whatever `TradeClient` wraps |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 100 ms) | **no** — README: "does not retry or throttle" |
| Unified error types | yes — 41 typed exceptions in one hierarchy | `MudrexAPIError` / `MudrexRequestError` |
| Testnet / sandbox | none — Mudrex publishes no sandbox | none |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | `mudrex-sdk` has two published releases (0.1.0 and 0.1.1) |
| Licence | MIT | MIT (stated in the README) |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `mudrex-python-sdk` README, the `mudrex-sdk` PyPI record (v0.1.1, published April 2026) and Mudrex's own API documentation.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
mudrex-sdk
```python
import ccxt
exchange = ccxt.mudrex()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from mudrex import TradeClient
client = TradeClient(api_secret="your_api_secret")
future = client.get_future("BTCUSDT")
print(future)
```
There is no ticker method in the SDK. `get_future()` returns the contract record, and `list_futures()` enumerates contracts — the SDK's own API reference lists no market-data call beyond those. CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) with the same keys, types and units you get from Binance or Bybit, plus `fetch_ohlcv` and `fetch_mark_ohlcv` for candles.
### Place a limit order [#place-a-limit-order]
CCXT
mudrex-sdk
```python
import ccxt
exchange = ccxt.mudrex({'secret': '...'})
order = exchange.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from mudrex import TradeClient
client = TradeClient(api_secret="your_api_secret")
resp = client.place_order(
"BTCUSDT",
leverage="10",
quantity="0.001",
order_type="LONG",
trigger_type="MARKET",
)
print(resp.order_id)
```
The two models are genuinely different, not just differently spelled. Mudrex's `order_type` is direction (`LONG` / `SHORT`) and `trigger_type` is execution style (`MARKET` / `LIMIT`). CCXT maps that onto the unified `side` / `type` pair that every other exchange uses, so the same strategy code places an order on Mudrex and on Bybit.
Two other footguns the SDK documents and CCXT removes. The README warns that numeric parameters accept `str`, `int` or `float` and that "The SDK does not convert types… **pass strings**" to avoid float serialisation problems — CCXT's `Precise` string arithmetic and `amount_to_precision` handle that. And the README explains that single-object responses carry `order_id` while list responses carry `id`; CCXT normalises both to `order['id']`.
### Stream candles [#stream-candles]
CCXT
mudrex-sdk
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.mudrex()
while True:
candles = await exchange.watch_ohlcv('BTC/USDT:USDT', '1m')
print(candles[-1])
asyncio.run(main())
```
```python
# not available: mudrex-sdk wraps the HTTP trading API only.
# Mudrex documents public kline / mark-kline / ticker WebSocket streams,
# but you connect to them yourself.
```
CCXT implements three streaming methods for `mudrex` — `watchOHLCV`, `watchTicker` and `watchTickers` — against `wss://trade.mudrex.com/fapi/v1/price/ws/linear`, with connection pooling, ping/pong keep-alive, automatic reconnect and resubscribe, and a bounded candle cache. `watch_ohlcv` returns the same array shape as `fetch_ohlcv`, so swapping a polling loop for a stream leaves the downstream code untouched.
There are no private streams for `mudrex` in CCXT — orders, positions and balances are REST-only on this venue.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
The SDK's README is unusually direct about this. It lists Mudrex's limits — 2 requests/second, 50/minute, 1000/hour, 10000/day — and then says the SDK "does not retry or throttle", advises you to "add a small delay between calls (e.g. `time.sleep(0.5)`)", and tells you to catch the 429 and back off yourself.
CCXT ships a token-bucket throttler that is on by default (`enableRateLimit = true`), with per-endpoint weights encoded in the exchange definition — wallet and funds reads cost five times a contract lookup, order placement and cancellation cost double. If your tier is tighter than CCXT's default pace, raise the interval once and every call obeys it:
```python
exchange = ccxt.mudrex({'secret': '...'})
exchange.rateLimit = 500 # ms between requests
exchange.enableRateLimit = True # already the default
```
### One error hierarchy [#one-error-hierarchy]
CCXT maps Mudrex's error responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. The SDK raises `MudrexAPIError` (with `code`, `message`, `response`) and `MudrexRequestError`, so classifying "out of funds" versus "bad price" versus "rate limited" is string or code matching you write and maintain.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` pulls Mudrex's tick and step sizes, and CCXT exposes them through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class:
```python
amount = exchange.amount_to_precision('BTC/USDT:USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT:USDT', 61234.56789)
```
The SDK explicitly leaves this to you — its troubleshooting section walks through the "Order value less than minimum required value" error and tells you to read `min_order_value` from `get_future(symbol)` yourself.
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures in every one. `mudrex-sdk` is Python only.
Python
TypeScript
C#
Go
```python
import ccxt
exchange = ccxt.mudrex()
ticker = exchange.fetch_ticker('BTC/USDT:USDT')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.mudrex ();
const ticker = await exchange.fetchTicker ('BTC/USDT:USDT');
```
```csharp
var exchange = new ccxt.mudrex();
var ticker = await exchange.FetchTicker("BTC/USDT:USDT");
```
```go
exchange := ccxt.NewMudrex(nil)
ticker, err := exchange.FetchTicker("BTC/USDT:USDT")
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 30 unified capabilities, **all 26 endpoints in the API definition are generated as callable implicit methods**, with authentication, rate-limit accounting and error mapping applied:
```python
# any raw Mudrex endpoint, camelCased from its path
response = exchange.private_get_futures_positions_position_id_liq_price({
'position_id': '...'})
```
Browse them on the [mudrex implicit API page](/docs/exchanges/mudrex/implicit-api).
### Portability [#portability]
CCXT's `mudrex` is the same object shape as its `binance`, `bybit` and `okx` objects, so adding a second venue does not mean a second data model:
```python
for exchange_id in ['mudrex', 'binance', 'bybit']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT:USDT')['last'])
```
## What `mudrex-sdk` does better [#what-mudrex-sdk-does-better]
An honest list, because these are real:
* **It is first-party.** Mudrex writes the API and the SDK. New Mudrex endpoints and parameter changes land there first, and its README is maintained against the live API rather than reverse-engineered.
* **Field names match the Mudrex docs exactly.** `order_type="LONG"`, `trigger_type="MARKET"`, `position_id`, `min_order_value` — while you are debugging with the vendor reference open, that is one less hop than CCXT's deliberate abstraction.
* **Typed response objects with attribute access.** `resp.order_id`, `order.id`, `position.id` — the SDK returns model objects rather than dictionaries, and the README documents exactly which id lives where.
* **Mudrex-specific plumbing is surfaced directly.** Wallet-to-futures transfers, the INR transfer endpoint, `reverse_position`, `close_position_partial`, `place_risk_order` / `amend_risk_order` and `get_liquidation_price` are first-class methods with docstrings.
* **A far smaller dependency.** If all you do is place futures orders on Mudrex from Python, one small `requests`-based package is a smaller install and a smaller surface than a library covering 104 exchanges.
If Mudrex is your only venue, you are writing Python, and you are happy to pace requests and parse market data yourself, the official SDK is a defensible choice.
## Migrating from `mudrex-sdk` to CCXT [#migrating-from-mudrex-sdk-to-ccxt]
| What you are doing | `mudrex-sdk` | CCXT |
| ------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------ |
| Symbols | `"BTCUSDT"` or an asset UUID | `'BTC/USDT:USDT'` |
| Client | `TradeClient(api_secret=...)` | `ccxt.mudrex({'secret': '...'})` |
| Contracts | `list_futures()` / `get_future()` | `load_markets()` / `fetch_markets()` |
| Ticker | not available | `fetch_ticker()` / `fetch_tickers()` |
| Candles | not available | `fetch_ohlcv()` / `fetch_mark_ohlcv()` |
| New order | `place_order(order_type="LONG", trigger_type="LIMIT", ...)` | `create_order(symbol, 'limit', 'buy', amount, price)` |
| Amend order | `amend_order()` | `edit_order()` |
| Cancel order | `cancel_order()` | `cancel_order()` |
| Open orders | `get_orders()` | `fetch_open_orders()` |
| Order history | `get_order_history()` | `fetch_closed_orders()` / `fetch_orders()` |
| Positions | `get_positions()` | `fetch_positions()` |
| Close position | `close_position()` / `close_position_partial()` | `close_position()` |
| Add margin | `add_margin()` | `add_margin()` / `reduce_margin()` |
| Leverage | `get_leverage()` / `set_leverage()` | `fetch_leverage()` / `set_leverage()` |
| Balance | `get_wallet_funds()` / `get_available_funds()` | `fetch_balance()` |
| Transfer | `transfer("SPOT", "FUTURES", "100")` | `transfer()` |
| Streams | not available | `watch_ohlcv` / `watch_ticker` / `watch_tickers` on `ccxt.pro.mudrex` |
| Anything not listed | native call | the same endpoint as an [implicit method](/docs/exchanges/mudrex/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [mudrex unified API reference](/docs/exchanges/mudrex).
## FAQ [#faq]
**Does the official Mudrex SDK support market data?**
Not beyond contract metadata. The README says it "currently supports only the Trading API (futures orders, positions, leverage, wallet, etc.)", and its API reference lists `list_futures` and `get_future` but no ticker, order book or candle method. CCXT implements `fetch_ticker`, `fetch_tickers`, `fetch_ohlcv` and `fetch_mark_ohlcv` for `mudrex`.
**Does CCXT support Mudrex WebSockets?**
Partly. CCXT implements three `watch*` methods — `watchOHLCV`, `watchTicker` and `watchTickers` — against Mudrex's public price stream. There are no private (order, position, balance) streams for this venue in CCXT, and none in the official SDK either.
**Does either library handle Mudrex's rate limits for me?**
CCXT does: the throttler is on by default with per-endpoint weights. `mudrex-sdk` does not — its README states it fires requests immediately and that pacing and back-off are your responsibility.
**What credentials does CCXT need for Mudrex?**
Only the secret, sent as the `X-Authentication` header: `ccxt.mudrex({'secret': '...'})`. Mudrex does not use a separate API key or an HMAC signature.
**Does Mudrex have a testnet?**
No. Mudrex publishes no sandbox environment, so `set_sandbox_mode(True)` has nothing to point at. Test against CCXT's offline static fixtures and small live orders.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [mudrex unified API reference](/docs/exchanges/mudrex)
* [mudrex implicit API](/docs/exchanges/mudrex/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the MyOKX (EEA) API (/docs/comparisons/ccxt-vs-myokx-api)
`myokx` is a regional entity of OKX — OKX's EEA entity, served from `eea.okx.com` under European registration.
Because it shares an API dialect with OKX, CCXT implements it by extending its `okx` class. Everything in the [CCXT vs the OKX API](/docs/comparisons/ccxt-vs-okx-api) comparison applies here — this page covers only what is specific to `myokx`.
## What is different [#what-is-different]
Separate host and accounts from the global venue, with product coverage limited to what the EEA entity is licensed to offer.
> Credentials are not shared with the global `okx` class.
## What CCXT gives you here [#what-ccxt-gives-you-here]
| | `myokx` |
| --------------------------------- | ------------------------------------------------------------ |
| Unified capabilities | 121 (inherited from `okx` plus its own overrides) |
| `fetch*` methods | 64 |
| WebSocket `watch*` methods | 19 |
| Raw endpoints as implicit methods | 446 |
| Testnet via `setSandboxMode` | yes |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust |
| Licence | MIT |
Figures verified September 2026 against CCXT v4.5.78, read from the source tree with `build/comparisons-facts.cjs`. Counts include everything inherited from `okx`.
## Using it [#using-it]
The class name is the only thing that changes — every unified method behaves as it does everywhere else in CCXT:
Python
TypeScript
```python
import ccxt
exchange = ccxt.myokx({'apiKey': '...', 'secret': '...'})
markets = exchange.load_markets()
ticker = exchange.fetch_ticker(list(markets)[0])
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.myokx ({ apiKey: '...', secret: '...' });
const markets = await exchange.loadMarkets ();
const ticker = await exchange.fetchTicker (Object.keys (markets)[0]);
```
Because `myokx` lists a different market set from `okx`, call `load_markets()` and pick symbols from it rather than assuming a pair exists.
Streaming works the same way:
```python
import ccxt.pro, asyncio
async def main():
exchange = ccxt.pro.myokx()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
## Should you use this class or the parent? [#should-you-use-this-class-or-the-parent]
Use `myokx` when you hold an account with MyOKX (EEA) specifically. Use [`okx`](/docs/exchanges/okx) when you hold an account with the global venue. They are different venues with separate credentials, so this is not a preference — it follows from where your account is.
## FAQ [#faq]
**Do my `okx` API keys work with `myokx`?**
No. It is a separate legal entity with separate accounts; you need keys issued by MyOKX (EEA).
**Does `myokx` support the full unified API?**
It inherits 121 unified capabilities from `okx`. Where the venue does not offer a feature, the corresponding `has` flag is turned off, and the method raises `NotSupported` rather than failing quietly. Check `exchange.has` at runtime.
**Can I reach MyOKX (EEA)-specific endpoints?**
Yes — all 446 endpoints in this class's `api` block are generated as implicit methods, with signing, rate limiting and error mapping applied. The mechanism is documented on the [`okx` implicit API page](/docs/exchanges/okx/implicit-api); this venue's own endpoint list differs slightly from the parent's.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [CCXT vs the OKX API](/docs/comparisons/ccxt-vs-okx-api) — the full comparison
* [`okx` API reference](/docs/exchanges/okx) — `myokx` inherits it; it has no separate reference page
* [Install CCXT](/docs/install)
* [Manual](/docs/manual)
* [More comparisons](/docs/comparisons)
# CCXT vs the Nado API and the official Nado SDKs (/docs/comparisons/ccxt-vs-nado-api)
[Nado](https://www.nado.xyz/) is an orderbook DEX for perpetuals and spot, settling on Ink. It has no API keys: every private request is an [EIP-712](https://docs.nado.xyz/developer-resources/get-started/core-concepts) signature from your wallet, and accounts are `bytes32` subaccounts rather than user ids. Nado publishes three official SDKs — [TypeScript](https://github.com/nadohq/nado-typescript-sdk), [Python](https://github.com/nadohq/nado-python-sdk) and [Rust](https://crates.io/crates/nado-sdk) — plus a CLI and an MCP server.
So this is not a case of a venue with no client library. The question is narrower: **do you want the protocol's own vocabulary, or the same vocabulary you already use on every other exchange?**
## TL;DR [#tldr]
* **Pick a Nado SDK** if Nado is the system, not one venue in it — you are working with subaccounts, linked signers, NLP mint/burn, isolated positions and health groups, and you want the protocol's own types.
* **Pick CCXT** if Nado is one of several venues: 63 unified capabilities, 24 `watch*`/`unWatch*` streaming methods, unified symbols like `'BTC/USDT0:USDT0'` instead of numeric product ids, and the same code against 103 other exchanges.
* **CCXT still signs like Nado does.** It takes `walletAddress` and `privateKey`, builds the same EIP-712 `Order`, `Cancellation` and trigger payloads, and posts them to the same gateway — nothing is proxied or simplified away.
## At a glance [#at-a-glance]
| | **CCXT** | **Official Nado SDKs** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| Exchanges covered | 104 (Nado is one of them) | Nado only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | TypeScript, Python, Rust |
| Packages to install | 1 (`ccxt`) | `@nadohq/client` + `viem` + `bignumber.js`, or `nado-protocol`, or `nado-sdk` |
| Unified market data + trading API | yes — same method names across every exchange | no — Nado's own protocol types |
| Nado capabilities implemented | 63 unified methods, 25 of them `fetch*` | full protocol surface, including NLP and linked signers |
| Symbols | `'BTC/USDT0:USDT0'` | numeric `product_id` |
| Order sizing | decimal amounts and prices | `priceX18`, base units, `to_x18()` helpers |
| WebSockets | yes — 24 `watch*`/`unWatch*` methods | subscription message builders; you own the socket |
| Raw endpoint access | yes — 14 Nado endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint costs, on by default | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | Nado's numeric `error_code` |
| Testnet | `exchange.set_sandbox_mode(True)` | `NadoClientMode` / `chainEnv` selection |
| Popularity | 43.8k GitHub stars · 4.7M PyPI + 494k npm installs/month (one package, every venue) | `@nadohq/client` 7.2k npm · `nado-protocol` 16k PyPI installs/month |
| Licence | MIT | ISC (TypeScript), MIT OR Apache-2.0 (Rust) |
| Support | Discord, Telegram, GitHub issues — usually same-day | Nado Telegram community, support tickets |
Figures verified September 2026 against CCXT v4.5.78, the Nado developer documentation and SDK repositories, and package metadata and install counts from npm, PyPI and crates.io.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a market price [#fetch-a-market-price]
CCXT
@nadohq/engine-client
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.nado ();
const ticker = await exchange.fetchTicker ('BTC/USDT0:USDT0');
console.log (ticker['last'], ticker['quoteVolume']);
```
```typescript
import { EngineClient, ENGINE_CLIENT_ENDPOINTS } from '@nadohq/engine-client';
import { createWalletClient, http } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';
import { ink } from 'viem/chains';
const walletClient = createWalletClient({
account: privateKeyToAccount('0x...'),
chain: ink,
transport: http(),
});
const engine = new EngineClient({
url: ENGINE_CLIENT_ENDPOINTS.inkMainnet,
walletClient,
});
const price = await engine.getMarketPrice({ productId: 1 });
```
The Nado SDK wants a `viem` wallet client, a chain, an endpoint constant and a numeric `productId`. CCXT resolves `'BTC/USDT0:USDT0'` to Nado's `BTC-PERP_USDT0` ticker and its product id from `load_markets()`, and hands back a [unified ticker structure](/docs/manual#ticker-structure).
### Place a limit order [#place-a-limit-order]
CCXT
nado-protocol
```python
import ccxt
exchange = ccxt.nado({
'walletAddress': '0x...',
'privateKey': '0x...',
})
order = exchange.create_order('BTC/USDT0:USDT0', 'limit', 'buy', 0.1, 10000)
print(order['id'], order['status'])
```
```python
from nado_protocol.client import create_nado_client, NadoClientMode
from nado_protocol.engine_client.types.execute import (
OrderParams, PlaceOrderParams, SubaccountParams)
from nado_protocol.utils.expiration import OrderType, get_expiration_timestamp
from nado_protocol.utils.math import to_pow_10, to_x18
from nado_protocol.utils.nonce import gen_order_nonce
from nado_protocol.utils.order import build_appendix
client = create_nado_client(NadoClientMode.DEVNET, "0x...")
owner = client.context.engine_client.signer.address
order = OrderParams(
sender=SubaccountParams(subaccount_owner=owner, subaccount_name="default"),
priceX18=to_x18(20000),
amount=to_pow_10(1, 17),
expiration=get_expiration_timestamp(40),
nonce=gen_order_nonce(),
appendix=build_appendix(order_type=OrderType.POST_ONLY),
)
res = client.market.place_order({"product_id": 1, "order": order})
```
Both end up posting the same signed payload to `POST /v1/execute`:
```json
{
"place_order": {
"product_id": 2,
"order": {
"sender": "0x123000000000000000000000000000000000012364656661756c740000000000",
"priceX18": "10000000000000000000000",
"amount": "100000000000000000",
"expiration": "4294967295",
"nonce": "1870132061784768512",
"appendix": "1266640143977021441"
},
"signature": ""
}
}
```
CCXT builds the `bytes32` sender from your wallet address and subaccount name, scales the price to X18 and the amount to base units, packs the order type into `appendix`, generates the nonce, and signs the EIP-712 `Order` struct with `secp256k1` — from five ordinary arguments.
### Stream an order book [#stream-an-order-book]
CCXT
Nado subscriptions API
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.nado()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT0:USDT0')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```json
{
"method": "subscribe",
"stream": {
"type": "book_depth",
"product_id": 0
},
"id": 10
}
```
These are not the same thing. Nado's `book_depth` stream delivers **incremental depth diffs, batched roughly every 50 ms, containing only the changed price levels**. CCXT returns a **live, fully merged order book** with the same structure `fetch_order_book` returns.
| | CCXT | raw subscription |
| --------------------------------------------------------------- | ------------ | ---------------- |
| Seed the book from a snapshot and align it with the diff stream | done for you | your code |
| Apply and prune incremental levels | done for you | your code |
| Send a ping frame every 30 seconds, as the docs require | done for you | your code |
| Negotiate `permessage-deflate`, which the endpoint requires | done for you | your code |
| Reconnect, re-subscribe and re-seed after a drop | done for you | your code |
| Keep a bounded, depth-limited cache | done for you | your code |
## Where the differences actually bite [#where-the-differences-actually-bite]
### Unified symbols instead of product ids [#unified-symbols-instead-of-product-ids]
Nado addresses markets by numeric `product_id`, and subaccounts by a 32-byte value that packs the owner address together with a padded subaccount name. Every SDK example carries that vocabulary. In CCXT the market is `'BTC/USDT0:USDT0'`, the subaccount is `options['subaccount']` (default `'default'`), and the encoding happens inside `load_markets()` and the order builder.
### No X18 arithmetic in your code [#no-x18-arithmetic-in-your-code]
Prices go over the wire as `priceX18` — the price multiplied by 10^18 — and amounts in base units. Getting that wrong is a silent 10^18-factor bug, which is why the SDKs ship `to_x18()` and `to_pow_10()` helpers. CCXT takes decimal `amount` and `price`, applies the market's tick and step through `amount_to_precision` / `price_to_precision`, and does the scaling with the `Precise` string-arithmetic class so nothing routes through a float.
### WebSockets that look like REST [#websockets-that-look-like-rest]
CCXT Pro is bundled in the same `ccxt` package and gives Nado **24 streaming methods**: `watchOrderBook`, `watchOrderBookForSymbols`, `watchTicker`, `watchTickers`, `watchTrades`, `watchTradesForSymbols`, `watchOHLCV`, `watchOHLCVForSymbols`, `watchBidsAsks`, `watchOrders`, `watchMyTrades`, `watchPositions`, and an `unWatch*` counterpart for each.
`watch_order_book` returns the same structure as `fetch_order_book`; `watch_orders` returns the same structure as `fetch_orders`. Swapping a polling loop for a stream changes one word. Nado's TypeScript SDK exposes `client.ws` as, in its own README's words, "WebSocket query, execute, and subscription message builders" — it builds the messages; the socket lifecycle, reconnects and book merging stay yours.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
Nado's limiter is weight-based and split across three buckets: IP addresses get 2400 weight per minute (400 per 10 seconds) for queries, wallet addresses get 600 per minute (100 per 10 seconds) for executes, order placement is capped separately — 600 per minute with spot leverage, 30 per minute without — and cancellations get their own 600 per minute. Individual queries carry weights from 1 to 20, and some are computed from your query parameters.
CCXT ships a token-bucket throttler that is on by default, with a 25 ms base `rateLimit` and per-endpoint costs, so a loop of calls paces itself instead of collecting 429s.
### One error hierarchy [#one-error-hierarchy]
Nado answers failures with `{"status": "failure", "error_code": 2007, "error": "..."}`. CCXT maps those codes onto a [typed exception tree](/docs/manual#error-handling): `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `PermissionDenied`, `RestrictedLocation`, `OnMaintenance`, `OperationRejected` and 33 more, all descending from `BaseError`. You catch `ccxt.InsufficientFunds` once and it keeps working on the next venue.
### Testnet without a second code path [#testnet-without-a-second-code-path]
```python
exchange = ccxt.nado({'walletAddress': '0x...', 'privateKey': '0x...'})
exchange.set_sandbox_mode(True) # gateway/archive/trigger all move to *.test.nado.xyz
```
One flag swaps every REST and WebSocket host to Nado's testnet, including the archive indexer and the trigger service.
### The implicit API, and its honest limit [#the-implicit-api-and-its-honest-limit]
Every Nado endpoint is generated as a callable implicit method:
```python
symbols = exchange.gateway_public_get_symbols()
tickers = exchange.archivev2_public_get_tickers()
```
There are only 14 of them, and that is a property of the venue rather than of CCXT: Nado multiplexes almost everything through `POST /v1/execute` and `POST /v1/query`, so the interesting variation lives in the request body, not the path. Calling `gateway_private_post_execute` directly means constructing and signing the payload yourself. Browse the list on the [nado implicit API page](/docs/exchanges/nado/implicit-api).
## What the official Nado SDKs do better [#what-the-official-nado-sdks-do-better]
An honest list, because these are real:
* **They cover protocol surface CCXT does not unify.** NLP mint and burn, `getMaxOrderSize`, `getMaxWithdrawable`, health groups, isolated positions, insurance, referrals and on-chain deposits are first-class methods in `@nadohq/client`. CCXT models the exchange-shaped subset — markets, orders, positions, balances, funding — because that is what has to look the same on 104 venues.
* **Linked signers and 1-Click Trading.** The SDKs expose `linkSigner` and `engine.setLinkedSigner()` for delegated signing. That is a Nado-specific account model with no unified CCXT equivalent.
* **They talk to the contracts, not just the API.** `@nadohq/client` composes a `viem` public and wallet client, so deposits, withdrawals and token allowances are in the same object as the trading calls. CCXT is an exchange-API library; on-chain calls are out of scope.
* **A Rust SDK written as Rust.** `nado-sdk` is on crates.io under MIT OR Apache-2.0, with an API shaped by the language. CCXT's Rust crate is generated from its TypeScript source, so for a latency-sensitive market maker who wants idiomatic Rust, `nado-sdk` is the closer fit.
* **They are the reference for new protocol features.** A new Nado product type appears in the first-party SDKs before it is modelled as a unified CCXT method.
If Nado is the venue you are building *on* rather than one of several you connect *to*, the official SDKs will fit better.
## Migrating from a Nado SDK to CCXT [#migrating-from-a-nado-sdk-to-ccxt]
| What you are doing | Nado SDK | CCXT |
| ------------------- | -------------------------------------------- | ---------------------------------------------------------------------------- |
| Credentials | wallet private key / `viem` wallet client | `{'walletAddress': ..., 'privateKey': ...}` |
| Markets | `getAllMarkets()`, `getSymbols()` | `load_markets()` |
| Market identifier | numeric `product_id` | `'BTC/USDT0:USDT0'` |
| Subaccount | `bytes32` sender | `options['subaccount']`, default `'default'` |
| Price / amount | `priceX18`, base units | decimal `price`, `amount` |
| Ticker | archive `tickers` query | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `getMarketLiquidity()`, `orderbook` | `fetch_order_book()` |
| Candles | indexer candlesticks | `fetch_ohlcv()` |
| New order | `placeOrder()` / `place_order()` | `create_order()` |
| Amend | `cancelAndPlace()` | `edit_order()` |
| Cancel | `cancelOrders()`, `cancelProductOrders()` | `cancel_order()`, `cancel_orders()`, `cancel_all_orders()` |
| Open orders | `getSubaccountOrders()` | `fetch_open_orders()` |
| Balance | `getSubaccountSummary()` | `fetch_balance()` |
| Positions | `getIsolatedPositions()`, subaccount summary | `fetch_positions()` |
| Streams | subscription message builders | `watch_*` on `ccxt.pro.nado` |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/nado/implicit-api) |
## FAQ [#faq]
**Does CCXT support Nado WebSockets?**
Yes. CCXT implements 24 `watch*`/`unWatch*` methods for Nado, covering order books, tickers, trades, candles, best bid/ask, orders, own trades and positions. Use `ccxt.pro.nado` and `await exchange.watch_order_book('BTC/USDT0:USDT0')` — the order book comes back merged, not as raw depth diffs.
**How do I authenticate to Nado through CCXT — there are no API keys?**
You pass `walletAddress` and `privateKey` instead of `apiKey` and `secret`. CCXT builds the `bytes32` subaccount sender, constructs the EIP-712 typed data for orders, cancellations and trigger requests, and signs with `secp256k1` — the same scheme the official SDKs use.
**Does Nado have an official SDK?**
Yes, three: a TypeScript monorepo (`@nadohq/client` and friends, ISC), a Python SDK (`nado-protocol` on PyPI), and a Rust SDK (`nado-sdk` on crates.io, MIT OR Apache-2.0). There is also a CLI and an MCP server. This page compares against them, not against raw HTTP.
**Can I use Nado's testnet through CCXT?**
Yes. `exchange.set_sandbox_mode(True)` moves the gateway, archive and trigger hosts to their `*.test.nado.xyz` equivalents in one call, including the WebSocket endpoints.
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.nado` and call `watch*` methods.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [nado unified API reference](/docs/exchanges/nado)
* [nado implicit API](/docs/exchanges/nado/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [More comparisons](/docs/comparisons)
# CCXT vs NautilusTrader (/docs/comparisons/ccxt-vs-nautilustrader)
[NautilusTrader](https://github.com/nautechsystems/nautilus_trader) describes itself in its README as "an open-source, production-grade, Rust-native engine for multi-asset, multi-venue trading systems," spanning "research, deterministic simulation, and live execution within a single event-driven architecture, with Python serving as the control plane." [CCXT](/docs/manual) is a client library: it speaks to exchanges and normalises what comes back. It has no engine, no backtester and no strategy lifecycle.
So the two overlap in exactly one layer — the venue adapter — and the question that decides between them is whether you need an execution engine or a way to reach a venue.
## TL;DR [#tldr]
* **Pick NautilusTrader** if you want the engine: nanosecond-resolution event-driven backtests, an order and position model with OCO/OUO/OTO contingencies and post-only, reduce-only and iceberg execution instructions, and the same strategy code running against a simulated venue and a live one. That is a large, well-specified system that CCXT does not attempt.
* **Pick CCXT** if the venue you need is not one of the 18 NautilusTrader lists, or you want the same API in eight languages, or LGPL-3.0 is not a licence your legal team will sign off on.
* **They are not really substitutes.** CCXT is a component; NautilusTrader is an architecture. A common arrangement is NautilusTrader running strategies on the venues it adapts, and CCXT handling everything else — data collection, account and funding operations, and the long tail of exchanges.
## At a glance [#at-a-glance]
| | **CCXT** | **NautilusTrader** |
| ------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------- |
| What it is | unified exchange client (market data + trading) | event-driven trading engine with venue adapters |
| Venue coverage | 104 exchanges with REST, 76 of them with WebSocket | 18 integrations in the README table — 16 venues plus Databento and Tardis as data providers |
| Crypto venues | 104, plus 7 prediction-market venues in `ccxt.prediction` | 13 crypto exchanges (7 CEX, 5 DEX, 1 perpetuals exchange) plus Polymarket |
| Non-crypto venues | none | Betfair (sports betting), Interactive Brokers (multi-venue brokerage) |
| Backtesting engine | none — you bring your own | yes — multi-venue, multi-instrument, nanosecond resolution |
| Order/position model | unified order and position structures per call | full OMS with contingency orders (OCO, OUO, OTO), emulated orders, position tracking |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust | Rust core, Python control plane via PyO3; systems can also be written entirely in Rust |
| Python versions | 3.10–3.14 (PyPI classifiers) | 3.12–3.14 |
| Raw endpoint access | yes — every endpoint as an implicit method (808 for Binance) | adapter surface; anything beyond it means editing or writing an adapter |
| Adapter stability grades | not applicable — one interface for all venues | `planned`, `building`, `beta`, `stable`; all 18 currently marked `stable` |
| State persistence | none — stateless client | optional Redis-backed cache and message bus |
| Licence | **MIT** | **LGPL-3.0** (contributions require a CLA) |
| Popularity | 43.8k GitHub stars · 4.68M PyPI + 494k npm installs/month | 28.3k GitHub stars · 361k PyPI installs/month |
| Support | Discord, Telegram, GitHub issues | Discord, GitHub issues, support email |
Figures verified September 2026 against CCXT v4.5.78, the NautilusTrader GitHub repository and `develop` README (last commit 3 September 2026, latest release 2.0.0rc4 on 2 September 2026), and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Place a limit order on Binance [#place-a-limit-order-on-binance]
CCXT
NautilusTrader
```python
import ccxt
exchange = ccxt.binance({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
from nautilus_trader.model import OrderSide
class MyStrategy(Strategy):
def buy(self) -> None:
order = self.order_factory.limit(
instrument_id=self.instrument_id,
order_side=OrderSide.BUY,
quantity=self.instrument.make_qty(self.trade_size),
price=self.instrument.make_price(60_000.00),
)
self.submit_order(order)
```
The CCXT call is a request that returns a value. The NautilusTrader call is a command onto a message bus: the order is created by a factory bound to the instrument's precision, submitted through a risk engine, and its lifecycle arrives back as `on_order_accepted`, `on_order_filled` and `on_position_opened` events. That is more ceremony and considerably more machinery — the machinery is the product.
### Stream quotes and react to them [#stream-quotes-and-react-to-them]
CCXT
NautilusTrader
```python
import asyncio
import ccxt.pro
async def main():
exchange = ccxt.pro.binance()
while True:
book = await exchange.watch_order_book('BTC/USDT')
print(book['bids'][0], book['asks'][0])
asyncio.run(main())
```
```python
class MyStrategy(Strategy):
def on_start(self) -> None:
self.instrument = self.cache.instrument(self.instrument_id)
self.subscribe_quotes(self.instrument_id)
def on_quote(self, quote) -> None:
self.log.info(f"{quote.bid_price} / {quote.ask_price}")
```
CCXT is pull-shaped — `await` a method, get a value, and the surrounding code is an ordinary loop. NautilusTrader is push-shaped, and the same handler fires whether the quote came off a live WebSocket or out of a backtest data catalogue. That equivalence is the point of the design.
### Run a backtest [#run-a-backtest]
CCXT
NautilusTrader
```python
import ccxt
exchange = ccxt.binance()
candles = exchange.fetch_ohlcv('BTC/USDT', '1h', limit=1000)
# CCXT stops here. The simulation loop, fill model,
# fee model and portfolio accounting are yours to write.
```
```python
engine = BacktestEngine(config=BacktestEngineConfig())
engine.add_venue(
venue=SIM,
oms_type=OmsType.NETTING,
account_type=AccountType.MARGIN,
starting_balances=[Money(1_000_000, USD)],
base_currency=USD,
default_leverage=Decimal(1),
)
engine.add_instrument(EURUSD)
engine.add_data(bars)
engine.add_strategy(strategy)
engine.run()
```
This is the honest shape of the difference. CCXT hands you clean historical candles for 104 venues and nothing else. NautilusTrader hands you a venue simulator with an order-matching model, account types, leverage and multi-venue accounting — and it only runs against the instruments and data its own model understands.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Coverage versus depth [#coverage-versus-depth]
NautilusTrader's README lists 18 integrations, all currently marked `stable` on a four-level scale (`planned`, `building`, `beta`, `stable`). Of those, 13 are crypto exchanges — Binance, BitMEX, Bybit, Coinbase, Deribit, Kraken and OKX on the CEX side; Derive, dYdX, Hyperliquid, Lighter and Lighter on Robinhood on the DEX side; plus AX Exchange — with Polymarket, Betfair and Interactive Brokers alongside, and Databento and Tardis as data providers.
Each of those adapters models the venue properly: instrument definitions, product types, order types the venue actually accepts. The Binance adapter, for example, covers spot (including Binance US), USDT-margined futures and coin-margined futures, with `LIVE`, `DEMO` and `TESTNET` environments, and its documentation states that margin trading is unsupported.
CCXT covers 104 exchanges behind one interface, plus 7 prediction-market venues. The depth per venue is a unified surface rather than a bespoke domain model. If your venue is on NautilusTrader's list, its adapter probably knows more about it than a unified interface can. If your venue is not on that list, CCXT is a one-line change and NautilusTrader is an adapter to write.
### The licence [#the-licence]
NautilusTrader is **LGPL-3.0**; its README links the GNU Lesser General Public License v3.0, and its security notes say Rust dependencies are checked "against an allow list of licenses compatible with NautilusTrader's `LGPL-3.0-only` license." Contributions require signing a CLA.
CCXT is **MIT**.
These are different obligations, not better and worse ones. LGPL-3.0 permits linking from proprietary code but attaches conditions — around modification, relinking and conveying the library — that MIT does not. Which matters to you depends on how you ship. It is a legal review, not an engineering preference, and it is worth doing before you build on either.
### Eight languages versus a Rust core with a Python control plane [#eight-languages-versus-a-rust-core-with-a-python-control-plane]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with the same method names and return structures in each. A Go execution service and a Python research notebook see the same `fetch_ohlcv` and the same OHLCV shape.
NautilusTrader is Rust and Python: Python bindings via PyO3 for the v2 runtime, with the option of writing systems entirely in Rust. Its supported Python range is 3.12–3.14 on Linux (x86\_64 and ARM64), macOS (ARM64) and Windows (x86\_64). If your stack is Rust or Python, that is a strength. If part of it is C# or PHP, it is a wall.
### What each project says is out of scope [#what-each-project-says-is-out-of-scope]
NautilusTrader's roadmap states that the open-source project "focuses on single-node backtesting and live trading for individual and small-team quantitative traders" and that "UI dashboards, distributed orchestration, and built-in AI/ML tooling are out of scope."
CCXT's scope boundary is different and larger: no engine, no backtester, no scheduler, no persistence, no strategy lifecycle. What it does cover is every endpoint each venue publishes — 808 implicit methods for Binance alone — with signing, rate limiting and error mapping applied.
### One error hierarchy versus adapter-native errors [#one-error-hierarchy-versus-adapter-native-errors]
CCXT maps venue error codes into 41 typed exception classes in a single hierarchy, so `InsufficientFunds` means the same thing on Kraken as on Bybit and your retry logic does not need a per-venue branch. NautilusTrader handles venue errors inside each adapter and surfaces them through order rejection and denial events, which is the right shape for an engine but not a portable exception taxonomy you can catch across venues.
## What NautilusTrader does better [#what-nautilustrader-does-better]
* **It has a backtester, and a serious one.** Multiple venues, instruments and strategies simultaneously, with quote ticks, trade ticks, bars, order book data and custom data at nanosecond resolution. CCXT has nothing in this area at all.
* **Research-to-live parity is a design guarantee, not a convention.** The same strategy class, the same event handlers, the same time model and the same execution semantics run in simulation and in production. Anyone who has maintained a backtester and a live bot as two codebases knows what this is worth.
* **The order model is far richer.** Time-in-force `IOC`, `FOK`, `GTC`, `GTD`, `DAY`, `AT_THE_OPEN` and `AT_THE_CLOSE`; execution instructions for post-only, reduce-only and icebergs; contingency orders including `OCO`, `OUO` and `OTO`; order emulation. CCXT unifies order placement, not order choreography.
* **The Rust core is genuinely fast, and the project treats it seriously.** mimalloc allocation, tokio networking, a stated Soundness Pledge, optional Redis-backed state persistence, and configurable precision modes (128-bit with 16 decimals, or 64-bit with 9).
* **It is not crypto-only.** Interactive Brokers, Databento and Betfair adapters put equities, futures, options and betting markets in the same engine as the crypto venues. CCXT is crypto and prediction markets only.
* **Supply-chain rigour is documented in detail.** Signed commits on protected branches, pinned lock files, cargo-vet and cargo-deny, CodeQL, SLSA build provenance and Sigstore-signed container images with SBOMs.
If you are building a single event-driven trading system in Python or Rust, on venues NautilusTrader already adapts, and you want backtest and live execution to share one codebase — NautilusTrader is the better tool, and CCXT is not really competing for that job.
## Using them together [#using-them-together]
Migration is the wrong frame here: nobody moves from an execution engine to an exchange client. The two sit at different layers, and the productive question is which layer you are actually shopping for.
* **NautilusTrader for the engine.** Strategy lifecycle, risk engine, order management, backtesting and live execution on its adapted venues.
* **CCXT for reach.** Historical candle collection across many venues, account and balance reconciliation, funding rates, transfers and deposit addresses, and trading on the exchanges NautilusTrader has no adapter for.
If what you are comparing is only the venue-adapter layer — because you are deciding what to build a new integration on — the mapping looks like this:
| Adapter concern | NautilusTrader | CCXT |
| --------------------- | --------------------------------------------------------------- | ------------------------------------------------------------ |
| Instruments / symbols | `InstrumentProvider`, `InstrumentId` like `BTCUSDT.BINANCE` | `load_markets()`, unified `'BTC/USDT'` and `'BTC/USDT:USDT'` |
| Market data client | adapter `DataClient` per venue | `fetch_ticker`, `fetch_order_book`, `fetch_ohlcv` |
| Live streams | adapter data client feeding `on_quote` / `on_bar` | `watch_*` on `ccxt.pro.` |
| Execution client | adapter `ExecutionClient` per venue | `create_order`, `cancel_order`, `fetch_open_orders` |
| Sandbox / testnet | per-adapter environment enum, e.g. `BinanceEnvironment.TESTNET` | `exchange.set_sandbox_mode(True)` |
| Venue with no support | write an adapter (RFC issue first, per the roadmap) | usually already supported; otherwise implicit methods |
## FAQ [#faq]
**Does NautilusTrader use CCXT?**
No. Its adapters are written directly against each venue's REST and WebSocket APIs, in Rust with Python bindings, and its README lists 18 such integrations. There is no CCXT dependency.
**Can I use CCXT inside NautilusTrader?**
Not as a drop-in adapter — NautilusTrader adapters implement its own data-client and execution-client interfaces against its domain model. Teams more commonly run CCXT alongside the engine for data collection, account reconciliation and venues the engine does not adapt.
**Does CCXT have a backtester?**
No. CCXT gives you unified historical data (`fetch_ohlcv`, `fetch_trades`) and live execution; the simulation loop, fill model and portfolio accounting are yours or another library's. If you want that supplied, NautilusTrader supplies it.
**Which supports more crypto exchanges?**
CCXT — 104 with REST, 76 of them with WebSocket, plus 7 prediction-market venues. NautilusTrader lists 13 crypto exchanges plus Polymarket, all currently marked `stable`.
**Is LGPL-3.0 a problem for a closed-source trading firm?**
That is a question for your lawyers, not a technical one. LGPL-3.0 allows use from proprietary software but attaches conditions that MIT does not. If you run the software internally and never distribute it, the practical exposure is different again. CCXT's MIT licence does not raise the question.
**Do I need a paid tier for CCXT's WebSocket support?**
No. CCXT Pro ships inside the `ccxt` package under MIT. Use `ccxt.pro.` and the `watch*` methods.
## Next steps [#next-steps]
* [Install CCXT](/docs/install)
* [Manual](/docs/manual) — unified structures and conventions
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [Supported exchanges](/docs/exchange-markets)
* [Binance implicit API](/docs/exchanges/binance/implicit-api)
* [More comparisons](/docs/comparisons)
# CCXT vs the raw NDAX API (/docs/comparisons/ccxt-vs-ndax-api)
[NDAX](https://ndax.io) is a Canadian exchange with CAD and USDT markets. Its API is documented at [apidoc.ndax.io](https://apidoc.ndax.io/), which describes version 3.3 of the NDAX Exchange software — an [AlphaPoint](https://apidoc.ndax.io/) deployment, with the AlphaPoint conventions that come with it: an OMS id required on nearly every call, a WebSocket-first frame format, and an authentication handshake that can end in a session token rather than a per-request signature.
NDAX does not publish a client library. The repositories under its GitHub organisation are documentation — [`NDAXlO/ndax-api-documentation`](https://github.com/NDAXlO/ndax-api-documentation) is a two-commit reference for the WebSocket API with no code in it — and neither the API reference nor those repositories link to an official SDK in any language. The only third-party client this comparison found is [`RobJohnston/Ndax.Api`](https://github.com/RobJohnston/Ndax.Api), an unaffiliated .NET Standard library, MIT-licensed, with no stars and 18 commits.
So the honest comparison here is not CCXT against a vendor SDK. It is **CCXT against the code you would write yourself**.
## TL;DR [#tldr]
* **Write it yourself** if you need one or two NDAX endpoints, in a language CCXT does not cover, and you are comfortable owning the auth handshake and the OMS-id plumbing forever.
* **Pick CCXT** if you want NDAX with 36 unified capabilities, four `watch*` streaming methods, a rate limiter, typed errors and testnet support — in TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java or Rust.
* **Choosing CCXT does not hide the raw API.** All 104 NDAX endpoints are generated as [implicit methods](/docs/exchanges/ndax/implicit-api), signed and rate-limited, so anything the unified API does not model is still one call away.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw NDAX API** |
| --------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (NDAX is one of them) | NDAX only |
| Official client library | n/a | **none published** |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write; one unaffiliated .NET library exists |
| Unified market data + trading API | yes — same method names across every exchange | no — AlphaPoint request/response shapes |
| Unified capabilities implemented | 36 for `ndax`, of which 19 are `fetch*` | n/a |
| Symbols | `'BTC/CAD'`, `'BTC/USDT'` | numeric `InstrumentId`, plus `OMSId` |
| Authentication | handled — nonce + HMAC-SHA256, or session token after `sign_in()` | `Nonce` + `UserId` + `APIKey` + `Signature` headers, or Basic auth then a session token |
| Two-factor sign-in | `sign_in()` handles the `Pending2FaToken` exchange and TOTP | your code |
| OMS / account ids | injected automatically (`options['omsId']`, `fetch_accounts()`) | passed by hand on nearly every call |
| WebSockets | yes — `watchOrderBook`, `watchTrades`, `watchTicker`, `watchOHLCV` | yes, and it is the primary interface — you frame the messages |
| Raw endpoint access | yes — 104 endpoints as implicit methods | it is all raw |
| Built-in rate limiter | yes, on by default (`rateLimit` 1000 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus AlphaPoint error payloads |
| Testnet / staging | `set_sandbox_mode(True)` swaps in the staging host | swap the base URL yourself |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | n/a — no package to count |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub — usually same-day | NDAX support desk |
Figures verified September 2026 against CCXT v4.5.78, the NDAX API reference at apidoc.ndax.io, the `NDAXlO` GitHub repositories and the third-party `RobJohnston/Ndax.Api` repository.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.ndax()
ticker = exchange.fetch_ticker('BTC/CAD')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
# instrument ids are numeric and per-OMS, so first list the instruments
instruments = requests.get(
'https://api.ndax.io:8443/AP/GetInstruments',
params={'OMSId': 1}).json()
instrument_id = next(i['InstrumentId'] for i in instruments
if i['Symbol'] == 'BTCCAD')
summary = requests.get(
'https://api.ndax.io:8443/AP/GetLevel1',
params={'OMSId': 1, 'InstrumentId': instrument_id}).json()
print(summary['LastTradedPx'])
```
The raw path needs the OMS id and a numeric instrument id before it can ask for anything. CCXT resolves both during `load_markets()` and returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, types and units you get from Kraken or Coinbase.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.ndax({
'apiKey': '...',
'secret': '...',
'uid': '...', # UserId
})
order = exchange.create_order('BTC/CAD', 'limit', 'buy', 0.001, 80000)
print(order['id'], order['status'])
```
```python
import hashlib, hmac, time, requests
nonce = str(int(time.time() * 1000))
message = nonce + user_id + api_key
signature = hmac.new(secret.encode(), message.encode(),
hashlib.sha256).hexdigest()
response = requests.post(
'https://api.ndax.io:8443/AP/SendOrder',
headers={
'Nonce': nonce,
'APIKey': api_key,
'Signature': signature,
'UserId': user_id,
'Content-Type': 'application/json',
},
json={
'OMSId': 1,
'AccountId': account_id, # look this up first
'InstrumentId': instrument_id,
'Side': 0, # 0 = buy
'OrderType': 2, # 2 = limit
'Quantity': 0.001,
'LimitPrice': 80000,
'TimeInForce': 1,
}).json()
```
CCXT implements exactly that signing scheme — `hmac(nonce + uid + apiKey, secret, sha256)` in the `Nonce` / `APIKey` / `Signature` / `UserId` headers — plus the enum tables (`Side`, `OrderType`, `TimeInForce`), the OMS id, and the account-id lookup. The `AccountId` in particular is not a constant: CCXT calls `fetch_accounts()` once and uses the first account unless you override it with `options['accountId']` or a per-call param.
### Stream an order book [#stream-an-order-book]
CCXT
Raw WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.ndax()
while True:
orderbook = await exchange.watch_order_book('BTC/CAD')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import asyncio, json, websockets
async def main():
async with websockets.connect('wss://api.ndax.io/WSGateway') as ws:
# AlphaPoint frames: m = message type, i = sequence, n = function, o = payload
await ws.send(json.dumps({
'm': 0, 'i': 2, 'n': 'SubscribeLevel2',
'o': json.dumps({'OMSId': 1, 'InstrumentId': 1, 'Depth': 20}),
}))
async for message in ws:
frame = json.loads(message)
updates = json.loads(frame['o']) # array-of-arrays, positional fields
print(updates[:2])
asyncio.run(main())
```
The raw frame format is doubly encoded — the payload is a JSON string inside a JSON object — and Level 2 updates arrive as positional arrays whose meaning you look up in the reference. NDAX's docs also specify client-generated sequence numbers, recommending even numbers starting at 2.
CCXT implements four streaming methods for `ndax`: `watchOrderBook`, `watchTrades`, `watchTicker` and `watchOHLCV`. `watch_order_book` returns a live, merged book — snapshot and deltas aligned, gaps detected, cache bounded — in the same [order book structure](/docs/manual#order-book-structure) as `fetch_order_book`, with reconnection and resubscription handled underneath. There are no private (order, balance) streams for `ndax` in CCXT.
## Where the differences actually bite [#where-the-differences-actually-bite]
### The sign-in handshake [#the-sign-in-handshake]
NDAX supports two authentication paths, and CCXT implements both. The per-request path is the nonce/HMAC one above. The session path is `sign_in()`: Basic auth with `login:password`, which may come back with `Requires2FA` and a `Pending2FaToken`; CCXT then computes a TOTP code from `twofa`, posts it with the pending token, stores the resulting session token, and sends it as `APToken` on subsequent requests.
```python
exchange = ccxt.ndax({
'apiKey': '...', 'secret': '...', 'uid': '...',
'login': '...', 'password': '...', 'twofa': '...',
})
exchange.sign_in()
```
That is a stateful, three-step, TOTP-bearing flow. It is the kind of thing that works on the first day and breaks quietly six months later when the token expires in a way you did not model.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT ships a token-bucket throttler that is on by default (`enableRateLimit = true`, `rateLimit = 1000` ms for `ndax`). You call methods in a loop and the library paces them. On the raw path, pacing and back-off are code you write.
### One error hierarchy [#one-error-hierarchy]
CCXT's [typed exception tree](/docs/manual#error-handling) has 41 classes descending from `BaseError`. For NDAX it maps the venue's own strings — `Not_Enough_Funds` to `InsufficientFunds`, `Resource Not Found` to `OrderNotFound`, `Invalid InstrumentId` to `BadSymbol`, the 2FA-required message to `AuthenticationError` — on top of the base HTTP mapping, where a 429 becomes `RateLimitExceeded`, a 401 becomes `AuthenticationError` and transport failures become `NetworkError` subclasses. You write `except ccxt.InsufficientFunds` once and it keeps working when you add a second exchange, instead of matching on `errorcode: 101` and hoping the string never changes.
### Precision, rounding and string math [#precision-rounding-and-string-math]
`load_markets()` pulls NDAX's tick and step sizes and exposes them through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities never drift through float rounding into a rejected order:
```python
amount = exchange.amount_to_precision('BTC/CAD', 0.0012345678)
price = exchange.price_to_precision('BTC/CAD', 81234.56789)
```
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names and return structures in every one. On the raw path, each language is a fresh implementation of the same handshake.
Python
TypeScript
Go
```python
import ccxt
exchange = ccxt.ndax()
ticker = exchange.fetch_ticker('BTC/CAD')
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.ndax ();
const ticker = await exchange.fetchTicker ('BTC/CAD');
```
```go
exchange := ccxt.NewNdax(nil)
ticker, err := exchange.FetchTicker("BTC/CAD")
```
### Staging without a second code path [#staging-without-a-second-code-path]
NDAX runs a staging environment on a separate host. CCXT has it wired to the standard switch:
```python
exchange = ccxt.ndax({'apiKey': '...', 'secret': '...', 'uid': '...'})
exchange.set_sandbox_mode(True) # swaps in the staging REST and WebSocket URLs
```
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 36 unified capabilities, **all 104 NDAX endpoints are generated as callable implicit methods**, with signing, rate-limit accounting and error mapping applied:
```python
# any raw NDAX endpoint, camelCased from its path
response = exchange.private_get_get_account_positions({
'OMSId': 1, 'AccountId': 1})
```
Browse them on the [ndax implicit API page](/docs/exchanges/ndax/implicit-api).
## What writing it yourself does better [#what-writing-it-yourself-does-better]
An honest list — hand-rolling is not always the wrong call:
* **The WebSocket API is the whole API.** AlphaPoint exposes essentially every function over the socket, including private ones. CCXT's `ndax` uses the socket for four public market-data methods and REST for everything else, so private streams — order and balance events — are simply not available through CCXT for this venue. If you need them, you write the client.
* **The docs map one-to-one onto raw frames.** Reading apidoc.ndax.io while debugging your own client is a direct correspondence: `SendOrder` is `SendOrder`. CCXT's unified names are a deliberate abstraction, which is an extra hop.
* **A far smaller dependency.** If you need three endpoints, sixty lines of `requests` code is a smaller install and a smaller attack surface than a library covering 104 exchanges.
* **Any language you like.** CCXT ships eight. If your service is in Elixir, Swift or Kotlin, the raw API is the only route — and `RobJohnston/Ndax.Api` shows that a focused single-venue client is a tractable weekend project.
* **AlphaPoint knowledge transfers.** The same frame format and OMS conventions appear across other AlphaPoint deployments, so a client you write is partly reusable at other white-label venues.
If NDAX is your only venue, you need its private WebSocket events, and you are in a language CCXT does not ship, writing your own client is the right answer.
## Migrating from a hand-rolled NDAX client to CCXT [#migrating-from-a-hand-rolled-ndax-client-to-ccxt]
| What you are doing | Raw NDAX API | CCXT |
| ------------------- | ------------------------------------------- | ---------------------------------------------------------------------------- |
| Symbols | numeric `InstrumentId` + `OMSId` | `'BTC/CAD'` |
| Client | your signing helper | `ccxt.ndax({'apiKey': ..., 'secret': ..., 'uid': ...})` |
| Instruments | `GetInstruments` | `load_markets()` |
| Ticker | `GetLevel1` | `fetch_ticker()` |
| Order book | `GetL2Snapshot` | `fetch_order_book()` |
| Candles | `GetTickerHistory` | `fetch_ohlcv()` |
| Public trades | `GetLastTrades` | `fetch_trades()` |
| Accounts | `GetUserAccounts` | `fetch_accounts()` |
| Balance | `GetAccountPositions` | `fetch_balance()` |
| New order | `SendOrder` | `create_order()` |
| Modify order | `ModifyOrder` | `edit_order()` |
| Cancel order | `CancelOrder` | `cancel_order()` |
| Open orders | `GetOpenOrders` | `fetch_open_orders()` |
| Own trades | `GetTradesHistory` | `fetch_my_trades()` |
| Streams | `SubscribeLevel2` etc. in AlphaPoint frames | `watch_*` on `ccxt.pro.ndax` |
| Staging | swap the base URL | `set_sandbox_mode(True)` |
| Anything not listed | raw call | the same endpoint as an [implicit method](/docs/exchanges/ndax/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [ndax unified API reference](/docs/exchanges/ndax).
## FAQ [#faq]
**Does NDAX have an official API SDK?**
No. NDAX publishes API documentation at apidoc.ndax.io and a documentation-only GitHub repository for the WebSocket API, but no client library in any language. The only third-party client this page found is an unaffiliated .NET Standard project, `RobJohnston/Ndax.Api`.
**What credentials does CCXT need for NDAX?**
`apiKey`, `secret` and `uid` (your NDAX `UserId`) for the per-request HMAC path. If you want the session-token path, also supply `login`, `password` and `twofa`, then call `exchange.sign_in()` — CCXT handles the `Pending2FaToken` exchange and computes the TOTP code.
**Do I have to pass OMSId and AccountId myself in CCXT?**
No. CCXT sets `OMSId` from `options['omsId']` (default 1) and resolves `AccountId` by calling `fetch_accounts()` once, using the first account. You can override either with `options` or a per-call param.
**Does CCXT support NDAX WebSockets?**
Yes, for public market data — `watchOrderBook`, `watchTrades`, `watchTicker` and `watchOHLCV`. Private order and balance streams are not implemented for this venue, even though the underlying AlphaPoint socket exposes them.
**Can I test NDAX against a staging environment?**
Yes. `exchange.set_sandbox_mode(True)` swaps in NDAX's staging REST and WebSocket hosts in one call, with no second code path.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [ndax unified API reference](/docs/exchanges/ndax)
* [ndax implicit API](/docs/exchanges/ndax/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs OctoBot (/docs/comparisons/ccxt-vs-octobot)
[OctoBot](https://github.com/Drakkar-Software/OctoBot) is a "free open source crypto trading bot to automate AI, Grid, DCA and TradingView strategies on Binance, Hyperliquid and 15+ exchanges, with a simple interface". Its README does not leave the relationship in any doubt:
> OctoBot supports the vast majority of crypto exchanges thanks to the great [CCXT library](https://github.com/ccxt/ccxt).
That is accurate down to the code. OctoBot-Trading, the engine package, lists `ccxt` under "Exchange connection requirements", its default connector class is `CCXTConnector`, and its per-exchange tentacles are quirk layers over a `ccxt.async_support` or `ccxt.pro` client. So the two are not rivals. The question is **which layer your problem lives at**: a bot you configure and watch, or the exchange library underneath it that you program.
## TL;DR [#tldr]
* **Pick OctoBot** if you want strategies you configure rather than write — grids, DCA, crypto baskets, TradingView alerts, LLM-driven modes — with a web interface, a mobile app, paper trading, backtesting and Telegram control. None of that exists in CCXT and none of it is on its roadmap.
* **Pick CCXT directly** if you are building your own system, need a venue or a unified method OctoBot has no tentacle for, or want the exchange layer in TypeScript, Go, C#, PHP or Java rather than Python.
* **Choosing OctoBot is choosing CCXT.** Its profiles are written in CCXT exchange ids and CCXT unified symbols, because that is what is doing the work.
## At a glance [#at-a-glance]
| | **CCXT** | **OctoBot** |
| -------------------------- | ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| What it is | exchange-access library | configurable trading bot with a visual interface |
| Exchange access | its own | CCXT — `ccxt` is a direct dependency of OctoBot-Trading, pinned to an exact version |
| Exchanges | 104 REST, 76 with WebSocket | "15+" per the README; several dozen exchange tentacles in OctoBot-Tentacles, plus a generic CCXT REST tentacle for the rest |
| Venues named in the README | n/a — all 104 are supported the same way | Binance, Coinbase, Bybit, Hyperliquid, MEXC, KuCoin, HollaEx-powered exchanges, OKX, Binance US, Crypto.com, HTX, Bitget, BingX, CoinEx, BitMart, Phemex, Gate.io, Ascendex |
| Prediction markets | 7 venues in `ccxt.prediction` | a Polymarket tentacle |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust | Python |
| How you use it | import a library, write code | install, then configure a profile; Python only if you write a tentacle |
| Install | `pip install ccxt` / `npm i ccxt` | executables for Windows, macOS, Linux and Raspberry Pi, Docker image, DigitalOcean one-click, or from source |
| Strategy engine | none — you write the loop | trading modes: grid, DCA, crypto basket, market making, TradingView, ChatGPT/Ollama |
| Backtesting | none | built-in backtesting engine plus paper trading |
| Control surface | none — it is a library | web interface, mobile app, Telegram |
| Raw endpoint access | yes — every endpoint as an implicit method (808 on Binance) | via the CCXT client underneath |
| Unified error types | 41 typed exceptions in one hierarchy | CCXT exceptions mapped onto OctoBot's own error types |
| Popularity | 43.8k GitHub stars · 4.7M PyPI + 494k npm installs/month | 6.5k GitHub stars, 1.3k forks; the project's own counter reported 73,932 installed OctoBots |
| Licence | MIT | GPL-3.0 |
| Support | Discord, Telegram, GitHub issues | Discord, Telegram, GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the OctoBot repository README and default config on `master`, the OctoBot-Trading and OctoBot-Tentacles repositories, the project's public community-stats endpoint, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Point the system at an exchange and a market [#point-the-system-at-an-exchange-and-a-market]
CCXT
OctoBot
```python
import ccxt
exchange = ccxt.binance({'apiKey': '...', 'secret': '...'})
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'])
```
```json
{
"config": {
"crypto-currencies": {
"Bitcoin": { "enabled": true, "pairs": ["BTC/USDT"] }
},
"exchanges": {
"binance": { "enabled": true, "exchange-type": "spot" }
}
}
}
```
Look at what the two sides have in common. `binance` is a CCXT exchange id. `BTC/USDT` is a CCXT [unified symbol](/docs/manual#symbols-and-market-ids). OctoBot's profile file is not translating your intent into something else — it is filling in the arguments that end up on a CCXT client. That is the whole relationship in one screen: OctoBot decides *what* to trade and *when*; CCXT is what actually talks to Binance.
### Teach the system an exchange quirk [#teach-the-system-an-exchange-quirk]
CCXT
OctoBot
```python
exchange = ccxt.coinex({
'apiKey': '...',
'secret': '...',
'options': {'createMarketBuyOrderRequiresPrice': False},
})
```
```python
class Coinex(exchanges.RestExchange):
@classmethod
def get_name(cls):
return 'coinex'
def get_additional_connector_config(self):
# tell ccxt to use amount as provided and not to compute it by multiplying it by price
return {
ccxt_constants.CCXT_OPTIONS: {
"createMarketBuyOrderRequiresPrice": False
}
}
```
This is an abridged excerpt from OctoBot's own Coinex tentacle, comment included. `ccxt_constants.CCXT_OPTIONS` is the string `"options"`, `get_name()` returns the CCXT exchange id, and the flag being set is a CCXT option. An exchange tentacle is a place to record what a venue does differently — the request itself is still a CCXT call.
## Where the differences actually bite [#where-the-differences-actually-bite]
### The dependency runs one way [#the-dependency-runs-one-way]
OctoBot's engine imports `ccxt.async_support` and `ccxt.pro`, wraps them in a `CCXTConnector`, and adapts CCXT structures into its internal enums. `RestExchange.DEFAULT_CONNECTOR_CLASS` is that connector. It calls CCXT's `check_required_credentials()` on start-up and logs the CCXT version it is using. Its internal field-name constants are CCXT's own: `CCXT_INFO = "info"`, `CCXT_OPTIONS = "options"`, `CCXT_FETCH_MARKETS = "fetchMarkets"`.
So a venue that CCXT supports and OctoBot has no tentacle for is not out of reach — `DefaultRestExchange.is_supporting_exchange()` accepts any exchange name, and OctoBot ships a `configurable_default_ccxt_rest` tentacle for exactly that case. The dedicated tentacles are where per-venue knowledge accumulates, not where support begins.
### Version pinning decides when new venues reach you [#version-pinning-decides-when-new-venues-reach-you]
OctoBot-Trading pins CCXT to an exact version rather than a floor — `ccxt==4.5.28` at the time of writing, with a comment requiring authenticated exchange tests to pass before the pin moves. That is a defensible choice for a bot that must not break someone's live grid overnight, and it means new venues, new unified methods and venue fixes land in CCXT first and reach OctoBot when the pin is bumped.
If you are integrating a venue that CCXT added recently, or you need a fix that shipped last week, calling CCXT yourself removes the wait entirely.
### You configure OctoBot; you program CCXT [#you-configure-octobot-you-program-ccxt]
OctoBot's surface is a profile, a set of enabled tentacles and a web UI. That is a feature — it is how a grid bot ends up running on a Raspberry Pi with no code written — and it is a ceiling. Anything the trading modes do not express means writing a tentacle against OctoBot's internal APIs, which is a larger commitment than importing a library.
CCXT has no ceiling of that kind and no floor either. There is no scheduler, no persistence, no UI and no strategy: `fetch_order_book` returns an order book, and what happens next is entirely your code.
### Coverage and streaming [#coverage-and-streaming]
CCXT covers 104 exchanges with REST and 76 with WebSocket, and the `watch*` methods span order books, trades, tickers, OHLCV, orders, my-trades, positions and balances. OctoBot's README says "15+ exchanges"; OctoBot-Tentacles carries several dozen exchange tentacle directories, roughly half of them paired with a `_websocket_feed` tentacle for the venues where streaming is wired up.
Beyond order flow, CCXT's unified API covers `fetch_funding_rate_history`, `fetch_open_interest`, `fetch_leverage_tiers`, `fetch_liquidations`, transfers, deposit addresses, and 7 prediction-market venues in `ccxt.prediction` — of which OctoBot ships a tentacle for one, Polymarket.
### One language versus eight [#one-language-versus-eight]
OctoBot is Python. CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust with identical method names and return structures. If the execution service is in Go and the research is in Python, the exchange layer is the same library in both.
### Licence [#licence]
OctoBot is **GPL-3.0**; CCXT is **MIT**. Running OctoBot for yourself raises no question. Building a product that redistributes a modified OctoBot is a legal review before it is an engineering decision, and CCXT's licence does not start that conversation.
## What OctoBot does better [#what-octobot-does-better]
* **Strategies you configure instead of write.** Grid trading, DCA, crypto baskets, market making, TradingView alert automation and LLM-driven modes using OpenAI models or a local Ollama server all ship as trading modes with configurable parameters. In CCXT every one of those is a program you write from scratch.
* **A real interface.** A web UI, a mobile app for iOS and Android, and Telegram control — so the bot can be operated from a phone rather than an SSH session. CCXT has no interface at all, by design.
* **Backtesting and paper trading.** A built-in backtesting engine over historical data with a simulated portfolio, and a trader-simulator mode with configurable maker/taker fees and a starting portfolio, so a profile can be exercised end to end before any money moves. CCXT has neither.
* **Installation for people who do not want to build anything.** Pre-built executables for Windows, macOS, Linux and Raspberry Pi, an official Docker image, and a one-click DigitalOcean deployment, on minimum hardware of one 1 GHz core, 250 MB RAM and 1 GB disk.
* **Per-venue knowledge already written down.** Its exchange tentacles encode retry behaviour for specific error codes, order-not-found error strings, pagination limits and market-status fixes per venue — the kind of thing you only learn by running into it in production.
If you want a trading bot rather than a codebase — especially a grid or DCA bot you will operate from a phone — OctoBot is the better choice, and building the same thing on CCXT would take months.
## Using them together [#using-them-together]
Migration is the wrong frame: OctoBot *is* a CCXT application. What is worth knowing is where the seam is.
**Inside OctoBot.** Profiles name exchanges by CCXT id and markets by CCXT unified symbol, so anything you learn from the [CCXT manual](/docs/manual) about a venue's ids, symbols and market structure applies directly to an OctoBot config. Exchange tentacles can push configuration into the CCXT client through `get_additional_connector_config()`, which is how OctoBot sets CCXT `options` per venue. For an exchange with no dedicated tentacle, the `configurable_default_ccxt_rest` tentacle runs the generic CCXT REST connector.
**Alongside OctoBot.** Reach for CCXT directly, in your own code, when you need:
| You need | Where it lives |
| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| A venue OctoBot has no tentacle for, right now | `ccxt.()` — 104 to choose from |
| Live order books, trades, orders or positions in your own code | `watch_order_book`, `watch_trades`, `watch_orders`, `watch_positions` on `ccxt.pro.` |
| Funding-rate history, open interest, leverage tiers, liquidations | `fetch_funding_rate_history`, `fetch_open_interest`, `fetch_leverage_tiers`, `fetch_liquidations` |
| Prediction markets beyond Polymarket | `ccxt.prediction.kalshi()`, `ccxt.prediction.limitless()`, `ccxt.prediction.myriad()` |
| A venue-specific endpoint with no unified method | the [implicit API](/docs/exchanges/binance/implicit-api) |
| The exchange layer in Go, C#, TypeScript, PHP or Java | the same CCXT API in that language |
A common shape: OctoBot runs the configured strategies on the venues it knows well, and a small CCXT service handles reporting, a venue outside the tentacle list, or execution that has to react faster than a configured trading mode. They agree about markets and symbols without any glue, because underneath they are the same library.
## FAQ [#faq]
**Does OctoBot use CCXT?**
Yes, and it says so in its README: "OctoBot supports the vast majority of crypto exchanges thanks to the great CCXT library." OctoBot-Trading lists `ccxt` under "Exchange connection requirements", and its default exchange connector wraps a `ccxt.async_support` or `ccxt.pro` client.
**Can OctoBot trade on an exchange that is not in its list?**
Often, yes. OctoBot's default REST exchange class accepts any exchange name and falls back to the generic CCXT connector, and OctoBot-Tentacles ships a `configurable_default_ccxt_rest` tentacle for that path. Venues with a dedicated tentacle get their quirks handled; the rest get whatever the generic connector and CCXT provide.
**Do I still need CCXT if I use OctoBot?**
You already have it — it is installed as a dependency. You would use it directly for anything outside the bot's shape: your own streaming code, funding-rate or open-interest data, reporting across accounts, a venue OctoBot has not integrated, or a prediction market other than Polymarket.
**Which CCXT version does OctoBot run?**
OctoBot-Trading pins an exact version rather than a range — `ccxt==4.5.28` when this page was written, against CCXT v4.5.78 current. Pinning is deliberate: the requirements file asks for authenticated exchange tests to pass before the pin changes. If you need something newer, calling CCXT yourself is the way to get it.
**Is CCXT a trading bot?**
No. CCXT is the exchange-access layer: markets, tickers, order books, candles, orders, balances, positions, funding and transfers, unified across 104 venues in eight languages. It has no strategies, no scheduler, no UI and no backtester. OctoBot is one example of the kind of application built on top of it.
**Is CCXT's WebSocket support a paid add-on?**
No. CCXT Pro is bundled in the `ccxt` package under MIT, the same package OctoBot depends on. Use `ccxt.pro.` and the `watch*` methods.
## Next steps [#next-steps]
* [Install CCXT](/docs/install)
* [Manual](/docs/manual) — unified structures and conventions
* [CCXT Pro manual](/docs/pro-manual) — the `watch*` streaming methods
* [Supported exchanges](/docs/exchange-markets)
* [More comparisons](/docs/comparisons)
# CCXT vs the OKX API and python-okx (/docs/comparisons/ccxt-vs-okx-api)
OKX's v5 API is a single, well-documented REST and WebSocket surface covering spot, margin, futures, perpetual swaps and options. The Python client OKX's own v5 documentation points developers at is [`python-okx`](https://github.com/okxapi/python-okx) — a wrapper whose own README describes it as "an unofficial Python wrapper for the OKX exchange v5 API".
[CCXT](/docs/manual) speaks the same v5 API, behind method names shared with 103 other venues. The question that decides between them: **is OKX the only venue your code will ever touch — and are you in Python?**
## TL;DR [#tldr]
* **Pick `python-okx`** if OKX is your only venue, you are in Python, and you want `instId`, `tdMode` and `ordType` to read exactly as they do in OKX's reference.
* **Pick CCXT** if you want one dependency across OKX spot, margin, futures, swaps and options — and across the next venue you add, in whichever of eight languages your service is written in.
* **Demo trading works either way.** OKX's demo environment is a header (`x-simulated-trading: 1`); CCXT sets it for you via `set_sandbox_mode(True)`.
* **Choosing CCXT does not hide anything.** All 446 raw OKX endpoints are callable as [implicit methods](/docs/exchanges/okx/implicit-api).
## At a glance [#at-a-glance]
| | **CCXT** | **python-okx** |
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Exchanges covered | 104 (OKX is one of them) | OKX only |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | Python only (>= 3.7) |
| Packages to install | **1** (`ccxt`) | 1 (`python-okx`) |
| Client objects | one — `ccxt.okx()` | one per domain — `Account`, `Trade`, `MarketData`, `PublicData`, `Funding`, `Grid`, `CopyTrading`, `SubAccount`, `BlockTrading`, `Convert`, `SpreadTrading`, `TradingData`, `Status`, `DualInvest`, `FDBroker` |
| Unified market data + trading API | yes — same method names across every exchange | no — OKX's own request/response shapes |
| WebSockets | yes — 19 `watch*` / `unWatch*` methods, plus `createOrderWs`, `editOrderWs`, `cancelOrderWs`, `cancelOrdersWs`, `cancelAllOrdersWs` | yes — `WsPublicAsync` / `WsPrivateAsync` with raw channel subscribe |
| Raw endpoint access | yes — 446 OKX endpoints as implicit methods | yes, it is the whole product |
| Built-in rate limiter | yes, per-endpoint weights, on by default (`rateLimit` 110 ms) | not a documented feature |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status + OKX `code`/`sCode` |
| Demo trading | `exchange.set_sandbox_mode(True)` | `flag="1"` on each client you construct |
| Regional hosts | `okx`, `myokx` (EEA), `okxus` (US) as separate ids | one client, base URL is yours to manage |
| Popularity | 43.8k GitHub stars · **4.8M PyPI + 494k npm installs/month** (one package, every venue) | 858 GitHub stars · 94k PyPI installs/month; community Node SDK `okx-api` 168 stars · 27k npm installs/month |
| Licence | MIT | MIT |
| Support | Discord, Telegram, GitHub — usually same-day | GitHub issues |
Figures verified September 2026 against CCXT v4.5.78, the `python-okx` repository and PyPI page, OKX's published v5 documentation, the `okx-api` repository, and install counts from npm and PyPI.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
python-okx
```python
import ccxt
exchange = ccxt.okx()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
from okx import MarketData
market = MarketData.MarketAPI(flag="0") # "1" for demo trading
ticker = market.get_ticker(instId="BTC-USDT")
print(ticker)
```
CCXT returns a [unified ticker structure](/docs/manual#ticker-structure) — the same keys, types and units whether the venue is OKX, Binance or Kraken. `python-okx` returns OKX's `code`/`msg`/`data` envelope, which you unwrap and parse yourself. Note where `flag` lives: in `python-okx` it is a constructor argument on every client object you build, so the demo/live decision is repeated at each construction site.
### Place a limit order [#place-a-limit-order]
CCXT
python-okx
```python
import ccxt
exchange = ccxt.okx({'apiKey': '...', 'secret': '...', 'password': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 30000)
print(order['id'], order['status'])
```
```python
from okx import Trade
trade = Trade.TradeAPI(
api_key="...",
api_secret_key="...",
passphrase="...",
flag="0",
)
order = trade.place_order(
instId="BTC-USDT", tdMode="cash", side="buy",
ordType="limit", px="30000", sz="1",
)
```
`tdMode` is the tell. In `python-okx` you pick the trade mode (`cash`, `cross`, `isolated`) per call and match it to the instrument yourself. In CCXT the instrument is the symbol — `'BTC/USDT'` spot, `'BTC/USDT:USDT'` linear swap, `'BTC/USD:BTC'` inverse, `'BTC/USD:BTC-241227-60000-P'` option — and `create_order` derives the mode, with `params` still available when you want to override it.
### Stream an order book [#stream-an-order-book]
CCXT
python-okx
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.okx()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
from okx.websocket.WsPublicAsync import WsPublicAsync
def publicCallback(message):
print("publicCallback", message)
async def main():
ws = WsPublicAsync(url="wss://ws.okx.com:8443/ws/v5/public")
await ws.start()
args = [{"channel": "tickers", "instId": "BTC-USDT"}]
await ws.send("subscribe", args, callback=publicCallback, id="send001")
```
These are not doing the same thing. CCXT returns a **live, fully merged order book** with the same structure as `fetch_order_book`. A raw `books` subscription delivers a snapshot followed by deltas, and everything after that is yours:
| | CCXT | raw stream |
| ------------------------------------------------------------ | ------------ | ---------- |
| Apply deltas onto the snapshot in order | done for you | your code |
| Verify OKX's order-book **checksum** and re-seed on mismatch | done for you | your code |
| Reconnect, re-subscribe and re-seed after a drop | done for you | your code |
| Keep a bounded, depth-limited cache | done for you | your code |
| Same structure as the REST call | yes | no |
OKX publishes a checksum with its book updates precisely because local books drift. A drifted book does not throw — it just quietly disagrees with the exchange until a fill surprises you.
## Where the differences actually bite [#where-the-differences-actually-bite]
### One client versus fifteen modules [#one-client-versus-fifteen-modules]
`python-okx` mirrors OKX's documentation structure: `okx/Account.py`, `Trade.py`, `MarketData.py`, `PublicData.py`, `Funding.py`, `Grid.py`, `CopyTrading.py`, `SubAccount.py`, `BlockTrading.py`, `Convert.py`, `SpreadTrading.py`, `TradingData.py`, `Status.py`, `DualInvest.py`, `FDBroker.py`, plus a `websocket` subpackage. A strategy that reads a book, places an order and sweeps a funding balance imports and constructs three API objects, each with its own credentials and `flag`.
CCXT gives you one `ccxt.okx()` instance for all of it, with **125 unified capabilities** and **64 `fetch*` methods** hanging off it.
### Portability is the whole point [#portability-is-the-whole-point]
This is the difference that shows up six months in, not on day one. A second venue means a second SDK, a second payload shape, a second symbol convention, a second error taxonomy and a second WebSocket dialect — then a translation layer of your own so the rest of the system can stay venue-agnostic. That layer is precisely what CCXT already is, across 104 venues.
```python
for exchange_id in ['okx', 'binance', 'bybit', 'kraken', 'coinbase']:
exchange = getattr(ccxt, exchange_id)()
print(exchange_id, exchange.fetch_ticker('BTC/USDT')['last'])
```
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Rust, with identical method names, arguments and return structures in all eight. `python-okx` is Python-only; the well-maintained community Node SDK [`okx-api`](https://github.com/tiagosiebler/okx-api) covers TypeScript, and beyond that you are writing your own.
Python
TypeScript
C#
Go
```python
exchange = ccxt.okx()
ticker = exchange.fetch_ticker('BTC/USDT')
```
```typescript
const exchange = new ccxt.okx ();
const ticker = await exchange.fetchTicker ('BTC/USDT');
```
```csharp
var exchange = new ccxt.okx();
var ticker = await exchange.FetchTicker("BTC/USDT");
```
```go
exchange := ccxt.NewOkx(nil)
ticker, err := exchange.FetchTicker("BTC/USDT")
```
A strategy prototyped in a Python notebook ports to a Go or C# execution service without redesigning the data model.
### Demo trading behind one flag [#demo-trading-behind-one-flag]
OKX's demo environment is not a separate host with separate keys — it is the live host with `x-simulated-trading: 1` in the header. CCXT wires that into the standard sandbox switch, so the rest of your code does not change:
```python
exchange = ccxt.okx({'apiKey': '...', 'secret': '...', 'password': '...'})
exchange.set_sandbox_mode(True) # sets x-simulated-trading: 1
```
Turn it off and the header is removed. In `python-okx` the equivalent is `flag="1"`, passed to every client object you construct — correct, but repeated at each construction site rather than set once on the instance.
### Regional hosts as first-class ids [#regional-hosts-as-first-class-ids]
OKX operates regional entities on separate hosts. CCXT ships `myokx` for the EEA entity and `okxus` for the US one as separate exchange ids that inherit the full `okx` implementation, so switching region is a class name, not a base-URL edit threaded through your configuration.
### WebSockets that look like REST [#websockets-that-look-like-rest]
CCXT Pro is bundled in the same `ccxt` package — no separate purchase — and gives OKX **19 streaming methods**: `watchOrderBook`, `watchOrderBookForSymbols`, `watchTrades`, `watchTradesForSymbols`, `watchOHLCV`, `watchTicker`, `watchTickers`, `watchBidsAsks`, `watchMarkPrice`, `watchMarkPrices`, `watchFundingRate`, `watchFundingRates`, `watchBalance`, `watchOrders`, `watchPositions`, `watchMyTrades`, `watchLiquidationsForSymbols`, `watchMyLiquidationsForSymbols` and their `unWatch*` counterparts. Order entry over the socket is there too: `createOrderWs`, `editOrderWs`, `cancelOrderWs`, `cancelOrdersWs` and `cancelAllOrdersWs`.
`watch_order_book` returns the same structure as `fetch_order_book`; `watch_orders` the same as `fetch_orders`. Swapping a polling loop for a stream is a one-word change.
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
OKX meters per endpoint, with different budgets for public and private routes and some per-instrument sublimits. CCXT encodes those weights in the exchange definition and ships a token-bucket throttler that is **on by default** (`rateLimit` 110 ms for OKX). You call methods in a loop; the library paces them. With a raw wrapper, pacing and backing off on OKX's `50011` rate-limit code is application code you write and maintain.
### One error hierarchy [#one-error-hierarchy]
CCXT maps OKX's `code` and per-order `sCode` values onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. `except ccxt.InsufficientFunds` keeps working when you add a second exchange; matching on `"51008"` does not.
### Precision, rounding and string math [#precision-rounding-and-string-math]
OKX rejects orders that violate lot size, tick size or minimum size, and contract sizes differ per instrument. CCXT loads OKX's instrument metadata and gives you `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class, so quantities never drift through float rounding into a rejected order at 3am.
### Nothing is hidden — the implicit API [#nothing-is-hidden--the-implicit-api]
Alongside the 125 unified capabilities, **all 446 endpoints in OKX's API are generated as callable implicit methods**, with signing, rate-limit accounting and error mapping still applied:
```python
# any raw OKX endpoint, camelCased from its path
response = exchange.public_get_market_tickers({'instType': 'SPOT'})
```
So the unified API covers what every venue shares, and the implicit API covers the OKX-specific remainder — without dropping to raw HTTP or adding a second dependency. Browse them on the [OKX implicit API page](/docs/exchanges/okx/implicit-api).
## What python-okx does better [#what-python-okx-does-better]
An honest list, because these are real:
* **It is a literal mirror of OKX's v5 reference.** `instId`, `tdMode`, `ordType`, `px`, `sz`, `posSide` — the names in your code are the names on the documentation page you are reading, and the module you import tells you which docs section you are in. CCXT's unified names are a deliberate abstraction, which is one extra hop when debugging against the vendor docs.
* **New v5 endpoints appear as methods almost immediately.** A thin pass-through wrapper can add a documented endpoint the week it ships; a *unified* CCXT method modelled across 104 venues can trail. (CCXT's implicit API closes most of that gap on day one, but the unified wrapper may lag.)
* **The dependency surface is tiny.** One MIT-licensed Python package targeting one exchange is much less to install and audit than all of CCXT, if OKX in Python is genuinely the whole job.
* **The demo `flag` is explicit at every call site.** Some teams prefer that to an instance-level mode: it is impossible to be confused about which environment a given client object is talking to.
* **It is what OKX's own docs point at.** If you file a question against OKX's developer channels with a `python-okx` traceback, you are speaking the same language as the reference material.
If OKX is your only venue, forever, and you are writing Python, `python-okx` is a defensible choice.
## Migrating from python-okx to CCXT [#migrating-from-python-okx-to-ccxt]
| What you are doing | python-okx | CCXT |
| ------------------- | ------------------------------------------------- | --------------------------------------------------------------------------- |
| Symbols | `instId="BTC-USDT"` | `'BTC/USDT'` spot, `'BTC/USDT:USDT'` linear swap, `'BTC/USD:BTC'` inverse |
| Client | one API class per module | `ccxt.okx({'apiKey': ..., 'secret': ..., 'password': ...})` |
| Instruments | `PublicData.PublicAPI().get_instruments()` | `load_markets()` |
| Ticker | `MarketData.MarketAPI().get_ticker()` | `fetch_ticker()` / `fetch_tickers()` |
| Order book | `MarketData.MarketAPI().get_orderbook()` | `fetch_order_book()` |
| Candles | `MarketData.MarketAPI().get_candlesticks()` | `fetch_ohlcv()` |
| New order | `Trade.TradeAPI().place_order()` | `create_order()` |
| Cancel order | `Trade.TradeAPI().cancel_order()` | `cancel_order()` |
| Open orders | `Trade.TradeAPI().get_order_list()` | `fetch_open_orders()` |
| Balance | `Account.AccountAPI().get_account_balance()` | `fetch_balance()` |
| Positions | `Account.AccountAPI().get_positions()` | `fetch_positions()` |
| Streams | `WsPublicAsync(...).send("subscribe", args, ...)` | `watch_*` on `ccxt.pro.okx` |
| Demo trading | `flag="1"` on each client | `set_sandbox_mode(True)` |
| Anything not listed | native method | the same endpoint as an [implicit method](/docs/exchanges/okx/implicit-api) |
Start with [Install](/docs/install), then the [Manual](/docs/manual), then the [okx unified API reference](/docs/exchanges/okx).
## FAQ [#faq]
**Is python-okx an official OKX SDK?**
OKX's own v5 documentation points developers at the `python-okx` package on PyPI, and the repository lives in the `okxapi` GitHub organisation — but the README itself opens with "This is an unofficial Python wrapper for the OKX exchange v5 API". Treat it as OKX-endorsed rather than OKX-guaranteed.
**Does CCXT support OKX demo trading?**
Yes. `exchange.set_sandbox_mode(True)` adds OKX's `x-simulated-trading: 1` header to every request and removes it again when you turn the flag off. That is the same mechanism `python-okx` exposes as `flag="1"`.
**Does CCXT support OKX futures, swaps, margin and options?**
Yes — spot, margin, dated futures, perpetual swaps and options from one `ccxt.okx` instance. The product is selected by the unified symbol, with `options.defaultType` setting the default (`spot`, `margin`, `swap`, `future`, `option`, `funding`).
**Do I need CCXT Pro separately for WebSockets?**
No. CCXT Pro is included in the `ccxt` package. Use `ccxt.pro.okx` and call `watch*` methods — 19 of them for OKX, plus five `*Ws` methods for order entry over the socket.
**Can I still call OKX-specific endpoints?**
Yes — all 446 of them, as [implicit methods](/docs/exchanges/okx/implicit-api), with signing and rate limiting applied.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [Install CCXT](/docs/install) in your language
* [Manual](/docs/manual) — the unified API, structures and conventions
* [okx unified API reference](/docs/exchanges/okx)
* [okx implicit API](/docs/exchanges/okx/implicit-api) — every raw endpoint
* [CCXT Pro manual](/docs/pro-manual) — WebSocket methods
* [More comparisons](/docs/comparisons)
# CCXT vs the OKX US API (/docs/comparisons/ccxt-vs-okxus-api)
`okxus` is a regional entity of OKX — the US entity of OKX, served from `us.okx.com`.
Because it shares an API dialect with OKX, CCXT implements it by extending its `okx` class. Everything in the [CCXT vs the OKX API](/docs/comparisons/ccxt-vs-okx-api) comparison applies here — this page covers only what is specific to `okxus`.
## What is different [#what-is-different]
Separate host, separate accounts and a narrower product set than the global venue — notably fewer derivatives, reflecting what the US entity offers.
> Credentials are not shared with the global `okx` class.
## What CCXT gives you here [#what-ccxt-gives-you-here]
| | `okxus` |
| --------------------------------- | ------------------------------------------------------------ |
| Unified capabilities | 122 (inherited from `okx` plus its own overrides) |
| `fetch*` methods | 64 |
| WebSocket `watch*` methods | 19 |
| Raw endpoints as implicit methods | 446 |
| Testnet via `setSandboxMode` | yes |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust |
| Licence | MIT |
Figures verified September 2026 against CCXT v4.5.78, read from the source tree with `build/comparisons-facts.cjs`. Counts include everything inherited from `okx`.
## Using it [#using-it]
The class name is the only thing that changes — every unified method behaves as it does everywhere else in CCXT:
Python
TypeScript
```python
import ccxt
exchange = ccxt.okxus({'apiKey': '...', 'secret': '...'})
markets = exchange.load_markets()
ticker = exchange.fetch_ticker(list(markets)[0])
```
```typescript
import ccxt from 'ccxt';
const exchange = new ccxt.okxus ({ apiKey: '...', secret: '...' });
const markets = await exchange.loadMarkets ();
const ticker = await exchange.fetchTicker (Object.keys (markets)[0]);
```
Because `okxus` lists a different market set from `okx`, call `load_markets()` and pick symbols from it rather than assuming a pair exists.
Streaming works the same way:
```python
import ccxt.pro, asyncio
async def main():
exchange = ccxt.pro.okxus()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
## Should you use this class or the parent? [#should-you-use-this-class-or-the-parent]
Use `okxus` when you hold an account with OKX US specifically. Use [`okx`](/docs/exchanges/okx) when you hold an account with the global venue. They are different venues with separate credentials, so this is not a preference — it follows from where your account is.
## FAQ [#faq]
**Do my `okx` API keys work with `okxus`?**
No. It is a separate legal entity with separate accounts; you need keys issued by OKX US.
**Does `okxus` support the full unified API?**
It inherits 122 unified capabilities from `okx`. Where the venue does not offer a feature, the corresponding `has` flag is turned off, and the method raises `NotSupported` rather than failing quietly. Check `exchange.has` at runtime.
**Can I reach OKX US-specific endpoints?**
Yes — all 446 endpoints in this class's `api` block are generated as implicit methods, with signing, rate limiting and error mapping applied. The mechanism is documented on the [`okx` implicit API page](/docs/exchanges/okx/implicit-api); this venue's own endpoint list differs slightly from the parent's.
**Is CCXT free?**
Yes. MIT-licensed, including the WebSocket support.
## Next steps [#next-steps]
* [CCXT vs the OKX API](/docs/comparisons/ccxt-vs-okx-api) — the full comparison
* [`okx` API reference](/docs/exchanges/okx) — `okxus` inherits it; it has no separate reference page
* [Install CCXT](/docs/install)
* [Manual](/docs/manual)
* [More comparisons](/docs/comparisons)
# CCXT vs the raw One Trading API (/docs/comparisons/ccxt-vs-onetrading-api)
[One Trading](https://onetrading.com/) is an Austrian, EU-regulated exchange — the venue formerly known as Bitpanda Pro. Its API lives at `https://api.onetrading.com/fast` with a WebSocket feed at `wss://streams.onetrading.com/`, and it is documented at [docs.onetrading.com](https://docs.onetrading.com/).
The Bitpanda Pro era had an official Python SDK. It no longer resolves: `bitpanda-labs/bitpanda-pro-sdk-py` returns 404 on GitHub, and `bitpanda-pro-sdk` is not on PyPI. One Trading's current documentation — including its own machine-readable index at `docs.onetrading.com/llms.txt` — lists no client library in any language.
So the comparison is not CCXT against a vendor SDK. It is **CCXT against the code you would write yourself**, and the deciding question is: **is spot coverage enough, or do you need the futures endpoints CCXT does not yet model?**
## TL;DR [#tldr]
* **Write it yourself** if you need One Trading's futures API — positions, funding rates, portfolio summary — because CCXT's `onetrading` class is spot-only and those endpoints are not in its definition, so they are not reachable as implicit methods either.
* **Pick CCXT** if you are trading One Trading spot: 30 unified capabilities, seven `watch*` streaming methods, a rate limiter, typed errors, and the same code in TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java or Rust.
* **Authentication is the easy part on this venue.** One Trading uses a bearer API key — no secret, no HMAC, no nonce — so the value CCXT adds here is normalisation, streaming and portability rather than signing.
## At a glance [#at-a-glance]
| | **CCXT** | **Raw One Trading API** |
| --------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
| Exchanges covered | 104 (One Trading is one of them) | One Trading only |
| Official client library | n/a | **none currently published** |
| Languages | TypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java, Rust — one API | whatever you write |
| Unified market data + trading API | yes — same method names across every exchange | no — One Trading's own request/response shapes |
| Unified capabilities implemented | 30 for `onetrading`, of which 14 are `fetch*` | n/a |
| Symbols | `'BTC/USDT'` | `instrument_code`, e.g. `BTC_USDT` |
| Products covered | **spot only** | spot **and futures** (positions, funding rates, portfolio summary) |
| Authentication | `Authorization: Bearer ` — handled | `Authorization: Bearer `, key needs the `TRADE` scope |
| WebSockets | yes — seven `watch*` methods, public and private | yes, and it also carries order entry, which CCXT does not expose |
| Raw endpoint access | yes — 20 endpoints as implicit methods | it is all raw |
| Built-in rate limiter | yes, on by default (`rateLimit` 300 ms) | your code |
| Unified error types | yes — 41 typed exceptions in one hierarchy | HTTP status plus One Trading error payloads |
| Testnet / sandbox | none — One Trading publishes no sandbox | none |
| Popularity | 43.8k GitHub stars · 4.8M PyPI + 494k npm installs/month (one package, every venue) | n/a — no package to count |
| Licence | MIT | n/a |
| Support | Discord, Telegram, GitHub — usually same-day | One Trading support |
Figures verified September 2026 against CCXT v4.5.78 and One Trading's published documentation at docs.onetrading.com, plus checks that `bitpanda-labs/bitpanda-pro-sdk-py` and the `bitpanda-pro-sdk` PyPI package no longer resolve.
## The same job, written both ways [#the-same-job-written-both-ways]
### Fetch a ticker [#fetch-a-ticker]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.onetrading()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'], ticker['baseVolume'])
```
```python
import requests
response = requests.get(
'https://api.onetrading.com/fast/v1/market-ticker/BTC_USDT').json()
print(response)
```
The raw call is short — this is not an API where authentication or signing is the hard part. What CCXT adds is the [unified ticker structure](/docs/manual#ticker-structure): the same keys, the same types, the same units as Kraken or Binance, with the instrument code translated to and from `'BTC/USDT'` and precision loaded from `/instruments`.
### Place a limit order [#place-a-limit-order]
CCXT
Raw HTTP
```python
import ccxt
exchange = ccxt.onetrading({'apiKey': '...'})
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.001, 60000)
print(order['id'], order['status'])
```
```python
import requests
response = requests.post(
'https://api.onetrading.com/fast/v1/account/orders',
headers={
'Authorization': 'Bearer ' + api_key, # key needs the TRADE scope
'Content-Type': 'application/json',
},
json={
'instrument_code': 'BTC_USDT',
'type': 'LIMIT',
'side': 'BUY',
'amount': '0.001',
'price': '60000',
'time_in_force': 'GOOD_TILL_CANCELLED',
}).json()
```
CCXT returns a [unified order structure](/docs/manual#order-structure) with `id`, `status`, `filled`, `remaining`, `average` and `cost` normalised, and accepts One Trading's stop orders through unified params (`create_order(..., 'limit', ..., {'triggerPrice': 58000})`) rather than a different body shape.
### Stream an order book [#stream-an-order-book]
CCXT
Raw WebSocket
```python
import ccxt.pro
import asyncio
async def main():
exchange = ccxt.pro.onetrading()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print(orderbook['bids'][0], orderbook['asks'][0])
asyncio.run(main())
```
```python
import asyncio, json, websockets
async def main():
async with websockets.connect('wss://streams.onetrading.com/') as ws:
await ws.send(json.dumps({
'type': 'SUBSCRIBE',
'channels': [{
'name': 'ORDER_BOOK',
'depth': 20,
'instrument_codes': ['BTC_USDT'],
}],
}))
async for message in ws:
frame = json.loads(message)
# ORDER_BOOK_SNAPSHOT once, then update frames carrying `changes` —
# merging them, detecting gaps and re-seeding is your code
print(frame['type'])
asyncio.run(main())
```
One Trading's documentation separates `Orderbook Snapshot` from `Orderbook Update` for exactly the reason every venue does: a live book is a snapshot plus a delta stream, and keeping the two aligned is the work. CCXT does that for you and hands back the same [order book structure](/docs/manual#order-book-structure) as `fetch_order_book`.
CCXT implements seven streaming methods for `onetrading`: `watchOrderBook`, `watchTicker`, `watchTickers`, `watchOHLCV`, `watchBalance`, `watchOrders` and `watchMyTrades` — public and private, over the same authenticated connection.
## Where the differences actually bite [#where-the-differences-actually-bite]
### Rate limits you do not have to model [#rate-limits-you-do-not-have-to-model]
CCXT ships a token-bucket throttler that is on by default (`enableRateLimit = true`, `rateLimit = 300` ms for `onetrading`). You call methods in a loop and the library paces them. On the raw path, pacing and back-off on a 429 are code you write and maintain.
### One error hierarchy [#one-error-hierarchy]
CCXT maps One Trading's error responses onto a [typed exception tree](/docs/manual#error-handling) — `InsufficientFunds`, `InvalidOrder`, `OrderNotFound`, `RateLimitExceeded`, `AuthenticationError`, `NetworkError`, `ExchangeNotAvailable` and 34 more, all descending from `BaseError`. You write `except ccxt.InsufficientFunds` once and it still works on the next exchange.
### Precision, rounding and string math [#precision-rounding-and-string-math]
One Trading's `/instruments` endpoint publishes per-instrument precision and minimum and maximum trading limits. CCXT loads them in `load_markets()` and exposes them through `amount_to_precision`, `price_to_precision` and `cost_to_precision`, backed by the `Precise` string-arithmetic class so quantities never drift through float rounding into a rejected order:
```python
amount = exchange.amount_to_precision('BTC/USDT', 0.0012345678)
price = exchange.price_to_precision('BTC/USDT', 61234.56789)
```
### Eight languages, one API [#eight-languages-one-api]
CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go, Java and Ru