Comprehensive New User Guide for Institutions

Welcome to Bullish! This guide will provide an overview of the products, options, and best practices to get the most out of Bullish, and to provide references for your use. Your Bullish Relationship Manager will guide you through the processes referenced in this guide. Recommendations are noted with a star (★) throughout this guide.

Quick Start Guide

  1. Activate account 
  2. Login to the Bullish UI
  3. Connect to Bullish
    1. Cloudflare
    2. Cloud Armor (aka Cloudflare Bypass)
    3. Direct connect via AWS or GCP
  4. Choose from Bullish API options

Activate your account

Now that you have completed the on-boarding process, your company's authorized representative will receive an email containing a link to create a secure password and the preferred method of two-factor authentication.

  • When securing your account, the recommended browser is Google Chrome. Please ensure the browser is updated to the latest version. If using a Windows machine, we strongly recommend having the browser in Incognito mode for the account activation step (subsequent logins should not require Incognito mode).
  • Access the link in the email, establish a password, and at the prompt to Add a Device, please set up your preferred method of two-factor authentication. We support a time-based one-time password (TOTP) application, such as Google Authenticator or Authy, and WebAuthn passkeys, such as Yubikey. You may establish this by going to Settings/Add a Device.
  • When you arrive at the screen that asks for KYC documents (ID, proof of address, financial & tax info), please click the Bullish logo in the top left to skip this step, as KYC has already been completed.

Review the Bullish products available to you

As an institutional customer, the following Bullish products are available to you:

  • Spot Trading
    • Place buy or sell orders at current or specified market prices using the assets available in your spot account.
  • Automated Market Making
    • Automated Market Making (AMM) Instructions allow eligible customers to directly make markets using idle assets and generate income.
  • Margin Trading
    • Borrow assets for the purposes of transacting on the Bullish Exchange (“Margin Loans”) and to lend assets to fund Margin Loans.
  • Trading Accounts
    • Multiple trading accounts can be set up under one institutional entity, each with separate users, balances, positions and permissions.
  • Perpetual Futures
    • Employ up to 7 times leverage trading on perpetual markets; profit from both rising and falling prices.
  • Trading API
    • Gain access to a range of trading features by connecting to the Bullish Trading API.
  • Line of Credit
    • An additional lending instrument may be available. Contact your Relationship Manager to discuss.

Learn about Unified Trading Accounts 

Institutional customers may have multiple trading accounts within their Bullish account structure. Additional information can be found by reviewing this section in our Help Center.

Bullish Exchange Institutional customers may setup multiple Trading accounts under their Institutional account, each with separate balances, positions, and users. Profits and losses are tracked individually within each Trading account, which enables Institutions to isolate and manage different trading strategies or keep customer accounts separate. Institutions may have up to a maximum of 50 Trading accounts.

To simplify management of funds, all deposits and withdrawals on the Bullish exchange are managed through a single Trading account called the Primary Account. Funds may be transferred between the Primary Account and any otherTrading account within the same Institution account, free of charge via the Bullish Trading API or the Bullish exchange web interface. 

 

Bullish Account Structure

Screenshot 2024-02-21 at 4.11.15 PM.png

To add additional users or sub-accounts, please complete the Account Set-up form and submit it to your Relationship Manager.

  • The Authorized Representative adds users, permissions and sub accounts in the form.

  • Rate limits will be reassigned from the total institutional limit


Log in to your account

Once you have completed the onboarding, you can log in from the web interface at https://exchange.bullish.com/login. Logging in enables you to:

  • Set-up account recovery question and passkey
  • Set-up two-factor authentication
  • Generate an API key
  • Generate a FIX password (if applicable)

We also have a test environment, SimNext. Contact your Relationship Manager to get connected to Simnext. Once you’ve successfully logged in, decide how you want to connect to Bullish.


Select your connectivity option

Connecting to Bullish can be done in several ways. Depending on your goals, comfort level and technical expertise, you can choose the method best suited for you. Here are the primary connection options:

Cloudflare
  • 50 msgs/sec
  • Static Rate Limits
Cloud Armor
  • 100 messages per second*
  • IP Whitelisting
  • Higher rate limits for order entry
  • Increased Stability
Direct Connect via AWS or GCP

Recommended for Institutions


Cloud Armor (also known as Cloudflare bypass) and Direct Connect allow for a more stable network traffic and better latencies compared to Cloudflare. 

  • Cloud Armor is a whitelist-only endpoint accessible via the Internet. This provides a stable connection point for order entry, market data, and private data. 
  • Direct Connect allows users to connect without going over the public internet. This option provides the most stability and lowest latencies. 

For more information on Cloud Armor(Cloudflare Bypass) and Direct Connect, please reach out to your sales representative.


Requesting Cloud Armor or Direct Connect access

Both Cloud Armor and Direct Connect access are accessible by whitelist only. If you would like to access the exchange via CloudArmor or Direct Connect, download and complete the Direct Connectivity Onboarding form and return it to your Relationship Manager. 


Bullish Rate Limits

Information on Bullish rate limits can be found in our API documentation here.

Funding and Withdrawing from Your Account 

  • All new withdrawal addresses must be whitelisted by the authorized representative.
  • Standard Bullish Exchange operating hours to support manual deposits and withdrawals are Monday to Friday, 0900 - 0100 (UTC +8) excluding public holidays in the United States, Hong Kong and Gibraltar. 
  • Please note that Permitted Fiat Currency (USD only) deposits will be subject to the operating hours of our US banking partner. 
  • Bank account details are required for our deposit and withdrawal verification process for USD. The initiating/receiving bank account details should match the information provided in your onboarding documents.

Withdrawals from Primary Account 

 A USD bank account cannot be added manually to your Bullish account. Once you have successfully deposited USD from a bank account into your Bullish account, those accounts are automatically stored and made available for future withdrawals. All linked accounts will show in the Select Destination drop-down list in the Fiat Currency withdrawal section.

The withdrawal limit for any 24-hour period is currently set at USD$10 million for both fiat and digital currency. This limit may be revised. Your Relationship Manager will notify you if this happens. 

Bullish has different withdrawal transaction limits for each asset, please reach out to your Relationship Manager for details.

Permitted Digital Currency (PDC): Target to process within 1 hour (during standard operating hours)

Permitted Fiat Currency (PFC): PFC withdrawals will be subject to standard banking network processing times. There may be delays due to technical issues out of our control and checks performed by the relevant banks.

Deposits to Primary Account:

PDC deposits will be reflected in your spot account upon receipt and after satisfying relevant compliance checks. 

Important Deposit Memo:MFC: : For your deposit to be reflected in your spot account in a timely manner, please ONLY include the unique 9-character memo in the deposit instructions.

Include

The unqiue 9-character memo in the deposit instructions

ex: AS4FG5XY2

Do not include 

Additional characters in your deposit memo

ex: "Memo AS4FG5XY2” or “Client name AS4FG5XY2” or “Deposit memo USD AS4FG5XY2”

  • PFC deposits will be reflected in your spot account upon receipt of cleared funds and will be subject to processing through the relevant bank network and completion of bank compliance checks. 
  • Timing will also be dependent on there being no errors in your wire transfer or bank transfer instructions. 
  • PFC deposits will only be accepted in USD. Please ensure that all PFC deposits are converted into USD prior to transfer to Bullish. 
  • To avoid delays in processing, please check each deposit transaction to confirm bank instructions and details are correct.

Market Parameters

  • Automated Market Making Instructions Withdrawal Timing: Automated Market Making Instructions withdrawals are instant and deposited into your spot account. 
  • Trading Fees:
    • Fees for all trading pairs (except for USDC/USD): Maker Fees: 0 bps, Taker Fees: 1 bps 
    • Fees for USDC/USD Trading Pair: Maker Fees: 0, Taker Fees: 0 
  • Please refer to the Fee Schedule for all other market parameters and the Terms of Service for further details. 

 Using the Bullish APIs

Bullish provides two API options for sending order flow to the exchange. 

  • Trading
    • FIX Connection: The Financial Information eXchange or FIX protocol is also available. FIX connections enable fast, direct, and stable trading.
    • REST API: REST allows you to interact with the exchange by sending HTTP requests to access various features. 
  • Market and Private Data
    • WebSockets API: This API enables real-time data transfer between your applications and Bullish. It's useful when you need uninterrupted streaming of market data or private data. WebSockets are the preferred method when connecting to Bullish. Additional information can be found in our API docs.
    • REST API: Private data is available via REST. However, we recommend using WebSockets to continuously receive market data and private data.

Bullish Web Interface: The Bullish web interface is efficient and easy to use. Whether you choose API or FIX connections as your primary way of trading, you should use the Bullish web interface to set up passkeys, API keys, and to generate deposit memos.


Setting up your FIX connection

To set up your FIX connection, complete the FIX Connectivity Onboarding form and return to your Relationship Manager. The onboarding form will guide you through the following steps:

  1. Providing your Sender Comp ID 
  2. Setting up your direct connection through AWS or GCP. You may have only one connection.
  3. Setting up your connection in the SIMNEXT test environment.
  4. Scheduling a session to perform conformance testing with our Operations team
  5. Upon successful completion of the conformance testing, you will receive the service name details to establish the connection to the production. environment.
NOTE: You may have up to 20 FIX sessions per institutional account. Rate limits will be set per trading account.

Designing Your Bullish API

Let’s complete the design of your API. In this guide, you will find the steps to design your Bullish API and some commonly asked questions that clients ask. We recommend that you: 

  • Generate API keys
  • Login via API
  • Establish your connection
  • Receive market data
  • Create Order
  • Read Order
  • Perform Custody Actions
  • Optional: Submit Automated Market Making Instruction

Generating your API keys

Log in to the Bullish web interface to generate your API keys. This is not required for FIX. To generate an API key, follow these steps:

  1. Log in into your Bullish account
  2. Click on your account initials at the upper right corner and then click Settings
  3. Click API keys and then click Add API key
  4. Select the API key type, either Bullish, ECDSA or HMAC
  5. Enter a key name in the Key Name field
  6. Adding an IP whitelist is optional. Should an IP whitelist be added, login requests must be from within the IP whitelist range.
  7. Click Generate API Key

Designing Your Bullish API

Step 1: Login

These Github references will assist you in logging in. 

Step 2: Receive Market Data

These Github references will assist you in getting market data

Step 3: Create Order: 

trading-api/v1/orders :
It requires require strict field ordering , price and quantity precision: https://github.com/bullish-exchange/api-examples/blob/master/create_order_v2.py

trading-api/v2/orders:
It does not require require strict field ordering , price and quantity precision: https://github.com/bullish-exchange/api-examples/blob/master/bullish/rest/v2_endpoints/create_order.py 

Step 4: Read Order

Next you’ll set up Read Order access. 

 Step 5: Perform Custody Actions

You’ll set up the following custody actions. 

Optional : Submit Automated Market Making Instructions

If you are considering generating incoming via Automated Market Making Instructions, try these actions. 

Frequently Asked Questions

API

  1. Why am I getting an “invalid signature” error with my orders? 

Answer 1: To successfully create an order, a bearer token is required in the authorization header, strict field ordering in the JSON request payload, and strict decimal precisions on the price and quantity field. 


For more information :
https://api.exchange.bullish.com/docs/api/rest/trading-api/v1/#post-/orders

https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#overview--construct-the-bx-signature-header


body = {

    "timestamp": timestamp,

    "nonce": next_nonce,

    "authorizer": AUTHORIZER,

    "command": {

        "commandType": "V2CreateOrder",

        "handle": None,

        "symbol": "BTCUSD",

        "type": "LMT",

        "side": "BUY",

        "price": "30071.5000",

        "stopPrice": None,

        "quantity": "1.87000000",

        "timeInForce": "GTC",

        "allowMargin": False,

        "tradingAccountId": TRADING_ACCOUNT_ID,

    },

}

Answer 2: use POST /trading-api/v2/orders
This endpoint uses the new signing format which does not require strict field ordering or the  addition of null fields in the request body. Quantities and prices do not require strict precision. For example, for asset precision of 4 - 100, 100.0, 100.00, 100.000 and 100.0000 are all accepted.

{

  "commandType": "V3CreateOrder",

  "clientOrderId": "1234",

  "symbol": "BTCUSD",

  "type": "LIMIT",

  "side": "BUY",

  "price": "31000.1",

  "quantity": "1.1",

  "timeInForce": "GTC",

  "allowBorrow": true,

  "tradingAccountId": "111000000000001"

}

  1. Why am I getting the error message “A session has already been initiated successfully using the same login payload. To start a new session, use a unique login payload” with my subsequent login requests? 

Answer: This happens when you are running the login process with multiple threads which generate the same nonce and expiration time.


Introduce time gap in the expiration time in between the login requests

{

  "publicKey": "<PUBLIC_KEY>",

  "signature": "<SIGNATURE>",

  "loginPayload": {

    "userId": "100008771"

    "nonce": 1638776636,

    "expirationTime": 1638776936,

    "biometricsUsed": false,

    "sessionKey": null

  }

  1. Why am I getting invalid nonce rejects with my orders ? 

Potential reason 1: Nonce is incorrectly formatted 


The nonce for order entry is presented in epoch timestamp in microseconds (e.g. 1699095419468000) while the nonce involved in the login process is presented in epoch timestamp in seconds. (e.g. 1638776636)

The login API nonce has no connection to the orders API nonce. Nonce has to be increasing for the next order request

For more information: https://api.exchange.bullish.com/docs/api/rest/trading-api/v1/#overview--construct-the-bx-nonce-header

Potential Reason 2: Nonce gets out-of-order inflight


The nonce has to be received in order in each of the requests received from the client’s side.

There is a chance of messages being reordered inflight when multiple order requests are sent in a short time period. 


Suggestion 1: To ensure the order of the create order or cancel order requests, you must wait for an acknowledgement response which will contain the orderId generated on the server side. Also remember that the nonce parameter, for these two requests, must be a unique increasing integer value.


Suggestion 2: Include the header BX-NONCE-WINDOW-ENABLED as a string representation of a boolean value which enables out-of-order processing of Create Order or Cancel Order requests up to a window size of 100 from the highest previously used nonce value (inclusive).


For more information: https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#overview--how-to-enable-out-of-order-processing-of-order-requests

 

  1. Why am I getting rate-limited on my web-socket connection requests ?

Each WebSocket category has a maximum number of open connections. Once it is reached, new WebSocket requests will be rejected. The WebSocket connections fall under the below categories.

  1. Unauthenticated WebSockets, maximum of 100 open connections per IP address.
  2. Authenticated WebSockets, maximum of 10 open connections per API key.

For more information :https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#overview--max-open-websocket-connections

  1. Why does my web-socket get disconnected automatically?

During the period where there are no updates, the server will disconnect idle web-socket connections if the keep-alive ping is not maintained. Please introduce the keep-alive ping in your websocket subscription at a regular interval, every five seconds to ensure your websocket is active even during the quiet times to stay connected with us. 


Python example:

def ping(conn):

    ping_message = {

        "jsonrpc": "2.0",

        "type": "command",

        "method": "keepalivePing",

        "params": {},

        "id": get_id()

    }

    conn.send(json.dumps(ping_message))

    threading.Timer(interval=5, function=ping, args=(conn,)).start()

  1. Why is my websocket connection on l1 orderbook not publishing an update as it is connected ?
Only when an update has occurred in the top of the order-book will the update event be published.
Was this article helpful?
0 out of 0 found this helpful