CCXT

CCXT vs the Bitbns API and official Bitbns SDKs

Bitbns ships official Python and Node clients. Compared with CCXT on symbol handling, the INR/USDT endpoint split, signing, rate limits and streaming support.

Bitbns, the Indian exchange, publishes official clients under the bitbns-official GitHub organisation: bitbnspy for Python and node-bitbns-api for Node.js. CCXT 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

  • 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 seven languages.
  • Nothing is hidden. All 36 Bitbns endpoints CCXT models are callable as implicit methods, signed and rate-limited.

At a glance

CCXTOfficial Bitbns SDKs
Exchanges covered104 (Bitbns is one of them)Bitbns only
LanguagesTypeScript, JavaScript, Python, PHP, C#/.NET, Go, Java — one APIPython (bitbnspy), Node.js (bitbns)
Packages to install1 (ccxt)one per language
Unified market data + trading APIyes — same names on every exchangeno — Bitbns's own method and payload shapes
Unified capabilities17n/a — endpoint wrappers
Symbols'BTC/INR', 'BTC/USDT'bare coin tickers: 'BTC', 'XRPUSDT'
WebSocketsnobitbns has no watch* methodsyes — getOrderBookSocket, getTickerSocket in bitbnspy
Raw endpoint accessyes — 36 endpoints as implicit methodsyes, it is the whole product
Built-in rate limiteryes, on by default (rateLimit 1000 ms)not a documented feature
Unified error typesyes — 41 typed exceptions in one hierarchyBitbns status / error fields in the payload
Testnet / sandboxnot available for bitbnsnot offered
Popularity43.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
LicenceMITMIT
SupportDiscord, Telegram, GitHub issues — usually same-dayGitHub issues

Figures verified September 2026 against CCXT v4.5.77, the bitbns-official repositories, and install counts from npm and PyPI.

The same job, written both ways

Fetch tickers

import ccxt

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

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

import ccxt

exchange = ccxt.bitbns({'apiKey': '...', 'secret': '...'})
order = exchange.create_order('XRP/INR', 'limit', 'buy', 200, 25)
print(order['id'], order['status'])

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

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

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

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 seven languages.

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

Bitbns answers with a status field and an error string rather than HTTP status codes alone. CCXT translates those onto a typed exception treeInsufficientFunds, 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.

Seven languages, one API

import ccxt from 'ccxt';
const exchange = new ccxt.bitbns ();
const ticker = await exchange.fetchTicker ('BTC/INR');

Bitbns publishes Python and Node clients. CCXT gives you the same API in seven 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

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

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

What you are doingBitbns SDKCCXT
Symbols'BTC', 'XRPUSDT''BTC/INR', 'XRP/USDT'
Market listticker payload keysload_markets()
TickerfetchTickers()fetch_ticker() / fetch_tickers()
Order bookgetBuyOrderBook() / getSellOrderBook()fetch_order_book()
BuyplaceBuyOrder()create_order(symbol, 'limit', 'buy', ...)
SellplaceSellOrder()create_order(symbol, 'limit', 'sell', ...)
Stop-lossstop-loss buy/sell methodscreate_order(..., params={'triggerPrice': ...})
Cancelcancel-order method (INR / USDT variants)cancel_order()
Open orderslistOpenOrders()fetch_open_orders()
Order statusorder-status methodfetch_order()
BalancecurrentCoinBalance()fetch_balance()
My tradestrade-history methodfetch_my_trades()
Deposit addressgetCoinAddress()fetch_deposit_address()
Deposits / withdrawalshistory methodsfetch_deposits() / fetch_withdrawals()
StreamsgetOrderBookSocket() / getTickerSocket()not available in CCXT for bitbns
Anything not listednative methodthe same endpoint as an implicit method

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, with signing and rate limiting applied.

Is CCXT free? Yes. MIT-licensed.

Next steps

On this page