CCXT

CCXT vs the BTC Markets API

BTC Markets publishes one client per language and most are dormant. Compare CCXT and those official clients on coverage, streaming, rate limits and upkeep.

BTC Markets 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, 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

  • 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 seven 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

CCXTOfficial BTC Markets clients
Exchanges covered104 (BTC Markets is one of them)BTC Markets only
LanguagesTypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java — one APIseparate repositories: Python, .NET, Rust, Node/TypeScript, Java, Go, Swift
Packages to install1 (ccxt)clone a repository, or npm install btcmarkets-node-sdk
Unified market data + trading APIyes — same method names across every exchangeno — BTC Markets' own request/response shapes
Unified capabilities implemented20 for btcmarketsvaries per repository
WebSocketsno — 0 watch* methods for btcmarketsyes in btcmarkets-node-sdk (trade, tick, orderbook, heartbeat, orderChange, fundChange)
Raw endpoint accessyes — 35 BTC Markets endpoints as implicit methodswhatever the repository wraps
Built-in rate limiteryes, on by default (rateLimit 1000 ms)not a documented feature
Unified error typesyes — 41 typed exceptions in one hierarchyHTTP status + BTC Markets error codes
Testnet / sandboxnone — BTC Markets publishes no sandboxnone
Popularity43.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
LicenceMITbtcmarkets-node-sdk MIT; the api-v3-client-* repositories carry no licence file
SupportDiscord, Telegram, GitHub — usually same-dayGitHub issues on each repository, BTC Markets support desk

Figures verified September 2026 against CCXT v4.5.77, the BTCMarkets GitHub organisation's repository listing and READMEs, and npm install counts.

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:

RepositoryLanguageStarsLast pushed
api-v3-client-rustRust1April 2026
api-v3-client-dotnetC#1January 2026
api-v3-client-pythonPython5May 2024
btcmarkets-node-sdkTypeScript2January 2023 — archived, read-only
api-client-nodeJavaScript0May 2021
api-v3-client-javaJava3February 2020
api-v3-client-goGo0October 2019
api-v3-client-swiftSwift0October 2019
api-client-phpPHP0July 2019
api-client-pythonPython15June 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

Fetch a ticker

import ccxt

exchange = ccxt.btcmarkets()
ticker = exchange.fetch_ticker('BTC/AUD')
print(ticker['last'], ticker['baseVolume'])

The CCXT call returns a unified 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

import ccxt

exchange = ccxt.btcmarkets({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('BTC/AUD', 'limit', 'buy', 0.001, 90000)
print(order['id'], order['status'])

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 regardless.

Where the differences actually bite

Seven languages, one API

CCXT is written once in TypeScript and transpiled to JavaScript, Python, PHP, C#/.NET, Go and Java, 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.

import ccxt
exchange = ccxt.btcmarkets()
ticker = exchange.fetch_ticker('BTC/AUD')

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

CCXT maps BTC Markets' error responses onto a typed exception treeInsufficientFunds, 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

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.

amount = exchange.amount_to_precision('BTC/AUD', 0.0012345678)
price = exchange.price_to_precision('BTC/AUD', 91234.56789)

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:

# any raw BTC Markets endpoint, camelCased from its path
response = exchange.private_get_reports_id({'id': '...'})

Browse them on the btcmarkets implicit API page.

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:

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

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.
  • Rust and Swift clients exist at all. CCXT does not ship those languages. If your service is in Rust, api-v3-client-rust is the only first-party option.

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

What you are doingBTC Markets clientCCXT
SymbolsmarketId: 'BTC-AUD''BTC/AUD'
Clientnew BTCMarkets({ key, secret })ccxt.btcmarkets({'apiKey': ..., 'secret': ...})
MarketsGET /v3/marketsload_markets()
Tickermarkets.getTicker()fetch_ticker()
Order bookGET /v3/markets/{id}/orderbookfetch_order_book()
CandlesGET /v3/markets/{id}/candlesfetch_ohlcv()
New orderPOST /v3/orderscreate_order()
Cancel orderDELETE /v3/orders/{id}cancel_order()
Open ordersGET /v3/orders?status=openfetch_open_orders()
Balanceaccount.getBalances()fetch_balance()
Trade historyGET /v3/tradesfetch_my_trades()
Streamsclient.socket.subscribe(...)not available in CCXT for btcmarkets
Anything not listednative callthe same endpoint as an implicit method

Start with Install, then the Manual, then the btcmarkets unified API reference.

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, 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

On this page