This is an unofficial Python wrapper for the Binance exchange REST API v3.
If you came here looking for the Binance exchange to purchase cryptocurrencies, then go here. If you want to automate interactions with Binance stick around.
Please make sure your python-binance version isv.1.0.20or higher.The previous versions are no longer recommended because some endpoints have been deprecated.
- Source code
- https://github.com/sammchardy/python-binance
- Documentation
- https://python-binance.readthedocs.io/en/latest/
- Community Telegram Chat
- https://t.me/python_binance
- Announcements Channel
- https://t.me/python_binance_announcements
- Examples including async
- https://github.com/sammchardy/python-binance/tree/master/examples
Make sure you update often and check the Changelog for new features and bug fixes.
Your contributions, suggestions, and fixes are always welcome! Don't hesitate to open a GitHub issue or reach out to us on our Telegram chat
- Implementation of all General, Market Data and Account endpoints.
- Asyncio implementation
- Demo trading support (by providing demo=True)
- Testnet support for Spot, Futures and Vanilla Options (deprecated)
- Simple handling of authentication include RSA and EDDSA keys
- Verbose mode for inspecting requests (verbose=True)
- No need to generate timestamps yourself, the wrapper does it for you
- RecvWindow sent by default
- Response exception handling
- Customizable HTTP headers
- Websocket handling with reconnection and multiplexed connections
- CRUD over websockets, create/fetch/edit through websockets for minimum latency.
- Symbol Depth Cache
- Historical Kline/Candle fetching function
- Withdraw functionality
- Deposit addresses
- Margin Trading
- Futures Trading
- Porfolio Margin Trading
- Vanilla Options
- Proxy support (REST and WS)
- Orjson support for faster JSON parsing
- Support other domains (.us, .jp, etc)
- Support for the Gift Card API
The breaking changes include the migration from wapi to sapi endpoints which related to the wallet endpoints detailed in the Binance Docs
The other breaking change is for websocket streams and the Depth Cache Manager which have been converted to use Asynchronous Context Managers. See examples in the Async section below or view the websockets and depth cache docs.
Register an account with Binance.
Generate an API Key and assign relevant permissions.
If you are using an exchange from the US, Japan or other TLD then make sure pass tld='us' when creating the client.
To use the Spot, Vanilla Options , or Futures Testnet pass testnet=True when creating the client.
pip install python-binancefrombinanceimportClient, ThreadedWebsocketManager, ThreadedDepthCacheManagerclient=Client(api_key, api_secret) # get market depthdepth=client.get_order_book(symbol='BNBBTC') # place a test market buy order, to place an actual order use the create_order functionorder=client.create_test_order( symbol='BNBBTC', side=Client.SIDE_BUY, type=Client.ORDER_TYPE_MARKET, quantity=100) # get all symbol pricesprices=client.get_all_tickers() # withdraw 100 ETH# check docs for assumptions around withdrawalsfrombinance.exceptionsimportBinanceAPIExceptiontry: result=client.withdraw( asset='ETH', address='<eth_address>', amount=100) exceptBinanceAPIExceptionase: print(e) else: print("Success") # fetch list of withdrawalswithdraws=client.get_withdraw_history() # fetch list of ETH withdrawalseth_withdraws=client.get_withdraw_history(coin='ETH') # get a deposit address for BTCaddress=client.get_deposit_address(coin='BTC') # get historical kline data from any date range# fetch 1 minute klines for the last day up until nowklines=client.get_historical_klines("BNBBTC", Client.KLINE_INTERVAL_1MINUTE, "1 day ago UTC") # fetch 30 minute klines for the last month of 2017klines=client.get_historical_klines("ETHBTC", Client.KLINE_INTERVAL_30MINUTE, "1 Dec, 2017", "1 Jan, 2018") # fetch weekly klines since it listedklines=client.get_historical_klines("NEOBTC", Client.KLINE_INTERVAL_1WEEK, "1 Jan, 2017") # create conditional order using the dedicated methodalgo_order=client.futures_create_algo_order(symbol="LTCUSDT", side="BUY", type="STOP_MARKET", quantity=0.1, triggerPrice=120) # create conditional order using the create_order method (will redirect to the algoOrder as well)order2=awaitclient.futures_create_order(symbol="LTCUSDT", side="BUY", type="STOP_MARKET", quantity=0.1, triggerPrice=120) # cancel algo/conditional ordercancel2=awaitclient.futures_cancel_algo_order(orderId=order2["orderId"], symbol="LTCUSDT") # fetch open algo/conditional ordersopen_orders=awaitclient.futures_get_open_algo_orders(symbol="LTCUSDT") # create order through websocketsorder_ws=client.ws_create_order( symbol="LTCUSDT", side="BUY", type="MARKET", quantity=0.1) # get account using custom headersaccount=client.get_account(headers={'MyCustomKey': 'MyCustomValue'}) # socket manager using threadstwm=ThreadedWebsocketManager() twm.start() # depth cache manager using threadsdcm=ThreadedDepthCacheManager() dcm.start() defhandle_socket_message(msg): print(f"message type: {msg['e']}") print(msg) defhandle_dcm_message(depth_cache): print(f"symbol {depth_cache.symbol}") print("top 5 bids") print(depth_cache.get_bids()[:5]) print("top 5 asks") print(depth_cache.get_asks()[:5]) print("last update time{}".format(depth_cache.update_time)) twm.start_kline_socket(callback=handle_socket_message, symbol='BNBBTC') dcm.start_depth_cache(callback=handle_dcm_message, symbol='ETHBTC') # replace with a current options symboloptions_symbol='BTC-241227-41000-C'dcm.start_options_depth_cache(callback=handle_dcm_message, symbol=options_symbol) # join the threaded managers to the main threadtwm.join() dcm.join()For more check out the documentation.
Read Async basics for Binance for more information.
importasyncioimportjsonfrombinanceimportAsyncClient, DepthCacheManager, BinanceSocketManagerasyncdefmain(): # initialise the clientclient=awaitAsyncClient.create() # run some simple requestsprint(json.dumps(awaitclient.get_exchange_info(), indent=2)) print(json.dumps(awaitclient.get_symbol_ticker(symbol="BTCUSDT"), indent=2)) # initialise websocket factory managerbsm=BinanceSocketManager(client) # create listener using async with# this will exit and close the connection after 5 messagesasyncwithbsm.trade_socket('ETHBTC') asts: for_inrange(5): res=awaitts.recv() print(f'recv {res}') # get historical kline data from any date range# fetch 1 minute klines for the last day up until nowklines=client.get_historical_klines("BNBBTC", AsyncClient.KLINE_INTERVAL_1MINUTE, "1 day ago UTC") # use generator to fetch 1 minute klines for the last day up until nowasyncforklineinawaitclient.get_historical_klines_generator("BNBBTC", AsyncClient.KLINE_INTERVAL_1MINUTE, "1 day ago UTC"): print(kline) # fetch 30 minute klines for the last month of 2017klines=awaitclient.get_historical_klines("ETHBTC", Client.KLINE_INTERVAL_30MINUTE, "1 Dec, 2017", "1 Jan, 2018") # fetch weekly klines since it listedklines=awaitclient.get_historical_klines("NEOBTC", Client.KLINE_INTERVAL_1WEEK, "1 Jan, 2017") # create order through websocketsorder_ws=awaitclient.ws_create_order( symbol="LTCUSDT", side="BUY", type="MARKET", quantity=0.1) # setup an async context the Depth Cache and exit after 5 messagesasyncwithDepthCacheManager(client, symbol='ETHBTC') asdcm_socket: for_inrange(5): depth_cache=awaitdcm_socket.recv() print(f"symbol {depth_cache.symbol} updated:{depth_cache.update_time}") print("Top 5 asks:") print(depth_cache.get_asks()[:5]) print("Top 5 bids:") print(depth_cache.get_bids()[:5]) # Vanilla options Depth Cache works the same, update the symbol to a current oneoptions_symbol='BTC-241227-41000-C'asyncwithOptionsDepthCacheManager(client, symbol=options_symbol) asdcm_socket: for_inrange(5): depth_cache=awaitdcm_socket.recv() count+=1print(f"symbol {depth_cache.symbol} updated:{depth_cache.update_time}") print("Top 5 asks:") print(depth_cache.get_asks()[:5]) print("Top 5 bids:") print(depth_cache.get_bids()[:5]) awaitclient.close_connection() if__name__=="__main__": loop=asyncio.get_event_loop() loop.run_until_complete(main())The library is under MIT license, that means it's absolutely free for any developer to build commercial and opensource software on top of it, but use it at your own risk with no warranties, as is.
Python-binance also supports orjson for parsing JSON since it is much faster than the builtin library. This is especially important when using websockets because some exchanges return big messages that need to be parsed and dispatched as quickly as possible.
However, orjson is not enabled by default because it is not supported by every python interpreter. If you want to opt-in, you just need to install it (pip install orjson) on your local environment. Python-binance will detect the installion and pick it up automatically.
For business inquiries: [email protected]
- Check out CCXT for more than 100 crypto exchanges with a unified trading API.
- If you use Kucoin check out my python-kucoin library.