Package: cbpro-SCR
coinbasepro-pythonThe Python client for theCoinbase Pro API(formerly known as
the GDAX)Provided under MIT License by Daniel Oostra.Note: this library may be subtly broken or buggy. The code is released under
the MIT License – please take the following message to heart:THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.BenefitsA simple to use python wrapper for both public and authenticated endpoints.In about 10 minutes, you could be programmatically trading on one of the
largest Bitcoin exchanges in theworld!Do not worry about handling the nuances of the API with easy-to-use methods
for every API endpoint.Gain an advantage in the market by getting under the hood of CB Pro to learn
what and who is behind every tick.Under DevelopmentTest ScriptsAdditional Functionality for the real-time order bookFIX API ClientLooking for assistanceGetting StartedThis README is documentation on the syntax of the python client presented in
this repository. See function docstrings for full syntax details.This API attempts to present a clean interface to CB Pro, but in order to use it
to its full potential, you must familiarize yourself with the official CB Pro
documentation.https://docs.pro.coinbase.com/You may manually install the project or usepip:pipinstallcbpro#orpipinstallgit+git://github.com/danpaquin/coinbasepro-python.gitPublic ClientOnly some endpoints in the API are available to everyone.  The public endpoints
can be reached usingPublicClientimportcbpropublic_client=cbpro.PublicClient()PublicClient Methodsget_productspublic_client.get_products()get_product_order_book# Get the order book at the default level.public_client.get_product_order_book('BTC-USD')# Get the order book at a specific level.public_client.get_product_order_book('BTC-USD',level=1)get_product_ticker# Get the product ticker for a specific product.public_client.get_product_ticker(product_id='ETH-USD')get_product_trades(paginated)# Get the product trades for a specific product.# Returns a generatorpublic_client.get_product_trades(product_id='ETH-USD')get_product_historic_ratespublic_client.get_product_historic_rates('ETH-USD')# To include other parameters, see function docstring:public_client.get_product_historic_rates('ETH-USD',granularity=3000)get_product_24hr_statspublic_client.get_product_24hr_stats('ETH-USD')get_currenciespublic_client.get_currencies()get_timepublic_client.get_time()Authenticated ClientNot all API endpoints are available to everyone.
Those requiring user authentication can be reached usingAuthenticatedClient.
You must setup API access within youraccount settings.
TheAuthenticatedClientinherits all methods from thePublicClientclass, so you will only need to initialize one if you are planning to
integrate both into your script.importcbproauth_client=cbpro.AuthenticatedClient(key,b64secret,passphrase)# Use the sandbox API (requires a different set of API access credentials)auth_client=cbpro.AuthenticatedClient(key,b64secret,passphrase,api_url="https://api-public.sandbox.pro.coinbase.com")PaginationSome calls arepaginated, meaning multiple
calls must be made to receive the full set of data. The CB Pro Python API provides
an abstraction for paginated endpoints in the form of generators which provide a
clean interface for iteration but may make multiple HTTP requests behind the
scenes. The pagination optionsbefore,after, andlimitmay be supplied as
keyword arguments if desired, but aren't necessary for typical use cases.fills_gen=auth_client.get_fills()# Get all fills (will possibly make multiple HTTP requests)all_fills=list(fills_gen)One use case for pagination parameters worth pointing out is retrieving only
new data since the previous request. For the case ofget_fills(), thetrade_idis the parameter used for indexing. By passingbefore=some_trade_id, only fills more recent than thattrade_idwill be
returned. Note that when usingbefore, a maximum of 100 entries will be
returned - this is a limitation of CB Pro.fromitertoolsimportislice# Get 5 most recent fillsrecent_fills=islice(auth_client.get_fills(),5)# Only fetch new fills since last call by utilizing `before` parameter.new_fills=auth_client.get_fills(before=recent_fills[0]['trade_id'])AuthenticatedClient Methodsget_accountsauth_client.get_accounts()get_accountauth_client.get_account("7d0f7d8e-dd34-4d9c-a846-06f431c381ba")get_account_history(paginated)# Returns generator:auth_client.get_account_history("7d0f7d8e-dd34-4d9c-a846-06f431c381ba")get_account_holds(paginated)# Returns generator:auth_client.get_account_holds("7d0f7d8e-dd34-4d9c-a846-06f431c381ba")buy & sell# Buy 0.01 BTC @ 100 USDauth_client.buy(price='100.00',#USDsize='0.01',#BTCorder_type='limit',product_id='BTC-USD')# Sell 0.01 BTC @ 200 USDauth_client.sell(price='200.00',#USDsize='0.01',#BTCorder_type='limit',product_id='BTC-USD')# Limit order-specific methodauth_client.place_limit_order(product_id='BTC-USD',side='buy',price='200.00',size='0.01')# Place a market order by specifying amount of USD to use.# Alternatively, `size` could be used to specify quantity in BTC amount.auth_client.place_market_order(product_id='BTC-USD',side='buy',funds='100.00')# Stop order. `funds` can be used instead of `size` here.auth_client.place_stop_order(product_id='BTC-USD',stop_type='loss',price='200.00',size='0.01')cancel_orderauth_client.cancel_order("d50ec984-77a8-460a-b958-66f114b0de9b")cancel_allauth_client.cancel_all(product_id='BTC-USD')get_orders(paginated)# Returns generator:auth_client.get_orders()get_orderauth_client.get_order("d50ec984-77a8-460a-b958-66f114b0de9b")get_fills(paginated)# All return generatorsauth_client.get_fills()# Get fills for a specific orderauth_client.get_fills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")# Get fills for a specific productauth_client.get_fills(product_id="ETH-BTC")deposit & withdrawdepositParams={'amount':'25.00',# Currency determined by account specified'coinbase_account_id':'60680c98bfe96c2601f27e9c'}auth_client.deposit(depositParams)# Withdraw from CB Pro into Coinbase WalletwithdrawParams={'amount':'1.00',# Currency determined by account specified'coinbase_account_id':'536a541fa9393bb3c7000023'}auth_client.withdraw(withdrawParams)WebsocketClientIf you would like to receive real-time market updates, you must subscribe to thewebsocket feed.Subscribe to a single productimportcbpro# Parameters are optionalwsClient=cbpro.WebsocketClient(url="wss://ws-feed.pro.coinbase.com",products="BTC-USD",channels=["ticker"])# Do other stuff...wsClient.close()Subscribe to multiple productsimportcbpro# Parameters are optionalwsClient=cbpro.WebsocketClient(url="wss://ws-feed.pro.coinbase.com",products=["BTC-USD","ETH-USD"],channels=["ticker"])# Do other stuff...wsClient.close()WebsocketClient + MongodbTheWebsocketClientnow supports data gathering via MongoDB. Given a
MongoDB collection, theWebsocketClientwill stream results directly into
the database collection.# import PyMongo and connect to a local, running Mongo instancefrompymongoimportMongoClientimportcbpromongo_client=MongoClient('mongodb://localhost:27017/')# specify the database and collectiondb=mongo_client.cryptocurrency_databaseBTC_collection=db.BTC_collection# instantiate a WebsocketClient instance, with a Mongo collection as a parameterwsClient=cbpro.WebsocketClient(url="wss://ws-feed.pro.coinbase.com",products="BTC-USD",mongo_collection=BTC_collection,should_print=False)wsClient.start()WebsocketClient MethodsTheWebsocketClientsubscribes in a separate thread upon initialization.
There are three methods which you could overwrite (before initialization) so it
can react to the data streaming in.  The current client is a template used for
illustration purposes only.onOpen - called once,immediately beforethe socket connection is made, this
is where you want to add initial parameters.onMessage - called once for every message that arrives and accepts one
argument that contains the message of dict type.on_close - called once after the websocket has been closed.close - call this method to close the websocket connection (do not overwrite).importcbpro,timeclassmyWebsocketClient(cbpro.WebsocketClient):defon_open(self):self.url="wss://ws-feed.pro.coinbase.com/"self.products=["LTC-USD"]self.message_count=0print("Lets count the messages!")defon_message(self,msg):self.message_count+=1if'price'inmsgand'type'inmsg:print("Message type:",msg["type"],"\t@{:.3f}".format(float(msg["price"])))defon_close(self):print("-- Goodbye! --")wsClient=myWebsocketClient()wsClient.start()print(wsClient.url,wsClient.products)while(wsClient.message_count<500):print("\nmessage_count =","{}\n".format(wsClient.message_count))time.sleep(1)wsClient.close()TestingA test suite is under development. Tests for the authenticated client require a
set of sandbox API credentials. To provide them, renameapi_config.json.examplein the tests folder toapi_config.jsonand edit the
file accordingly. To run the tests, start in the project directory and runpython -m pytestReal-time OrderBookTheOrderBookis a convenient data structure to keep a real-time record of
the orderbook for the product_id input. It processes incoming messages from an
already existing WebsocketClient. Please provide your feedback for future
improvements.importcbpro,time,QueueclassmyWebsocketClient(cbpro.WebsocketClient):defon_open(self):self.products=['BTC-USD','ETH-USD']self.order_book_btc=OrderBookConsole(product_id='BTC-USD')self.order_book_eth=OrderBookConsole(product_id='ETH-USD')defon_message(self,msg):self.order_book_btc.process_message(msg)self.order_book_eth.process_message(msg)wsClient=myWebsocketClient()wsClient.start()time.sleep(10)whileTrue:print(wsClient.order_book_btc.get_ask())print(wsClient.order_book_eth.get_bid())time.sleep(1)TestingUnit tests are under development using the pytest framework. Contributions are
welcome!To run the full test suite, in the project
directory run:python-mpytestChange Log1.1.2Current PyPI releaseRefactor project for Coinbase ProMajor overhaul on how pagination is handled1.0The first release that is not backwards compatibleRefactored to follow PEP 8 StandardsImproved Documentation0.3Added crypto and LTC deposit & withdraw (undocumented).Added support for Margin trading (undocumented).Enhanced functionality of the WebsocketClient.Soft launch of the OrderBook (undocumented).Minor bug squashing & syntax improvements.0.2.2Added additional API functionality such as cancelAll() and ETH withdrawal.0.2.1AllowedWebsocketClientto operate intuitively and restructured example
workflow.0.2.0Renamed project to GDAX-PythonMerged Websocket updates to handle errors and reconnect.0.1.2Updated JSON handling for increased compatibility among some users.Added support for payment methods, reports, and Coinbase user accounts.Other compatibility updates.0.1.1b2Original PyPI Release.