Websocket

General WSS information

  • The base endpoint is here

Access Websocket Stream

WEBSOCKET /openapi/quote/ws/v1
name
values

topic

realtimes, trade, kline_$interval, depth

event

sub, cancel, cancel_all

interval

1m, 5m, 15m, 30m, 1h, 2h, 6h, 12h, 1d, 1w, 1M

Sample Subscription Data:

{
  "symbol" : "$symbol0, $symbol1",
  "topic" : "$topic",
  "event" : "sub",
  // customizable parameter
  "params" : {
      // kline max limit is 2000, default is 1
      "limit" : "$limit",
      // Whether data is returned in binary format, default to false
      "binary" : "false"
  }
}
name
Explanation

limit

Specify number of entries returned

binary

Whether returned values is in binary format. DEFAULT value is false

Heartbeat

The client need to send a PING message to the server regularly through the Websocket, which then the server replies with PONG. If the client does not send the message every 5 minutes, the server will close the connection.

  • Request

{
    "ping": 1535975085052
}
  • Response

{
    "pong": 1535975085052
}

Trade Streams

The Trade Streams push raw trade information; each trade has a unique buyer and seller.

After successful handshake and connected to server, the server will return the latest 60 trades. After this payload, the following will be real-time trades.

Variable "v" acts as an tradeId. This variable is shared across different symbols; however, each ID is unique. For example, suppose in the last 5 seconds 3 trades happened in BTCUSDT, ETHUSDT, and XRPUSDT. Their version (which is "v") will be consecutive: 112, 113, 114.

Subscription message structure:

{
  "symbol": "$symbol0, $symbol1",
  "topic": "trade",
  "event": "sub",
  "params": {
    "binary": false // Whether data returned is in binary format
  }
}

Payload:

{
  "symbol": "BTCUSDT",
  "topic": "trade",
  "data": [{
    "v": "456635155170485593", // Version
    "t": 1565594873508,  //Timestamp
    "p": "21369.0", // Price
    "q": "0.01798", // Quantity
    "m": false // true = buy, false = sell
  }, {
    "v": "426655153373417376",
    "t": 1565594873531,
    "p": "21725.5",
    "q": "1.0012",
    "m": false
  }],
  "f": false // Whether this is the first entry
}

Market Tickers Stream

24hr Ticker statistics for a symbol that changed in an array.

Subscription message structure:

{
  "symbol": "$symbol0, $symbol1",
  "topic": "realtimes",
  "event": "sub",
  "params": {
    "binary": false
  }
}

Payload:

{
  "symbol": "ETHUSDT",
  "topic": "realtimes",
  "data": [{
    "t": "1565592599015", //time
    "s": "ETHUSDT", //symbol
    "c": "212.63", //close
    "h": "216.96", //high
    "l": "206.78", //low
    "o": "210.23", //open
    "v": "73013.575", //volume
    "qv": "15726612.498168", //trade amount (in base asset, in this case is USDT)
    }],
  "f": false // Whether this is the first entry
}

Kline/Candlestick Streams

The Kline/Candlestick Stream push updates to the current klines/candlestick every second.

m -> minutes h -> hours d -> days w -> weeks M -> months

  • 1m

  • 5m

  • 15m

  • 30m

  • 1h

  • 2h

  • 4h

  • 6h

  • 8h

  • 12h

  • 1d

  • 1w

  • 1M

Subscription message structure:

{
  "symbol": "$symbol0, $symbol1",
  "topic": "kline_"+$interval,
  "event": "sub",
  "params": {
    "binary": false
  }
}

Payload:

{
  "symbol": "BTCUSDT",
  "topic": "kline",
  "params": {"klineType": "15m"},
  "data": [{
    "t": 1565595900000, //kline start time
    "s": "BTCUSDT", // symbol
    "c": "11436.14", //close
    "h": "11437", //high
    "l": "11381.89", //low
    "o": "11381.89", //open
    "v": "16.3306" //volume
  }],
  "f": true// Whether this is the first entry
}

Orderbook Depth Stream

The Depth Streams for symbols.

Here is the book dump instructions:

  • The book dump frequency:Every 300ms, if book version changed.

  • The book dump depth:300 for asks and bids each.

  • The book version change event:

    • order enters book

    • order leaves book

    • order quantity or amount changes

    • order is finished

Full Depth Stream

{
  "symbol": "$symbol0, $symbol1",
  "topic": "depth",
  "event": "sub",
  "params": {
    "binary": false
    }
}

Full depth streams all orderbook data, therefore the data frequency is relatively low. If you wish to get higher frequency streams, please see below to subscribe to merged depth. Notice: "mergedDepth" has fewer data.

Payload:

{
  "symbol": "BTCUSDT",
  "topic": "depth",
  "data": [{
    "s": "BTCUSDT", //Symbol
    "t": 1565600357643, //Timestamp
    "v": "112801745_18", //Version
    "b": [ //Bids
      ["11371.49", "0.0014"], //[Price, Quantity]
      ["11371.12", "0.2"],
      ["11369.97", "0.3523"],
      ["11369.96", "0.5"],
      ["11369.95", "0.0934"],
      ["11369.94", "1.6809"],
      ["11369.6", "0.0047"],
      ["11369.17", "0.3"],
      ["11369.16", "0.2"],
      ["11369.04", "1.3203"],
    "a": [//Asks
      ["11375.41", "0.0053"], //[Price, Quantity]
      ["11375.42", "0.0043"],
      ["11375.48", "0.0052"],
      ["11375.58", "0.0541"],
      ["11375.7", "0.0386"],
      ["11375.71", "2"],
      ["11377", "2.0691"],
      ["11377.01", "0.0167"],
      ["11377.12", "1.5"],
      ["11377.61", "0.3"]
    ]
  }],
  "f": true // Whether this is the first entry
}

Merged Depth

{
  "symbol": "$symbol0, $symbol1",
  "topic": "mergedDepth",
  "event": "sub",
  "params": {
    "binary": false,
    "dumpScale": 1
  }
}

dumpScale must be specified for this endpoint. It it the precision of the ticker, it cannot be larger than the specified precision. Check precision at brokerInfo (token, options, and contracts).

Sample brokerInfo return:

{
"filters":[
    {"minPrice":"0.01",
     "maxPrice":"100000.00000000",
     "tickSize":"0.01",
     "filterType":"PRICE_FILTER"},
    {"minQty":"0.00005",
     "maxQty":"100000.00000000",
     "stepSize":"0.000001",
     "filterType":"LOT_SIZE"},
    {"minNotional":"1",
     "filterType":"MIN_NOTIONAL"
     }],
"exchangeId":"301",
"symbol":"BTCUSDT",
"symbolName":"BTCUSDT",
"status":"TRADING",
"baseAsset":"BTC",
"baseAssetPrecision":"0.000001",
"quoteAsset":"USDT",
"quotePrecision":"0.01", // BTCUSDT's precision is 0.01,max dumpScale is -log10(0.01)=2
"icebergAllowed":false
}

Diff. Depth Stream

{
  "symbol": "$symbol0, $symbol1",
  "topic": "diffDepth",
  "event": "sub",
  "params": {
    "binary": false
  }
}

Order book price and quantity depth updates used to locally manage an order book pushed every second.

In the Diff. (difference) depth stream, the quantity doesn"t necessarily mean the corresponding quantity to the price anymore. If the quantity is 0, it means this previous price level is not in the orderbook anymore. If the quantity is > 0, it means the updated quantity for this price level.

Suppose now we have received the first depth data payload:

["0.00181860", "155.92000000"] // price, quantity

If the next payload is:

["0.00181860", "12.3"]

This means that this price level"s quantity has changed.

If the next payload is:

["0.00181860", "0"]

This means that this price level is not in orderbook anymore.

Payload:

{
  "symbol": "BTCUSDT",
  "topic": "diffDepth",
  "data": [{
    "e": 0,
    "t": 1565687625534,
    "v": "115277986_18",
    "b": [
      ["11316.78", "0.078"],
      ["11313.16", "0.0052"],
      ["11312.12", "0"],
      ["11309.75", "0.0067"],
      ["11309.58", "0"],
      ["11306.14", "0.0073"]
    ],
    "a": [
      ["11318.96", "0.0041"],
      ["11318.99", "0.0017"],
      ["11319.12", "0.0017"],
      ["11319.22", "0.4516"],
      ["11319.23", "0.0934"],
      ["11319.24", "3.0665"]
    ]
  }],
  "f": false //Whether this is the first entry
}

Index Data Stream

This stream is for index prices gathered for options and futures.

Subscription message structure:

{
  "symbol": "$symbol0, $symbol1",
  "topic": "index",
  "event": "sub",
}

Payload:

{
  "symbol": "BTCUSDT",  
  "topic": "index",
  "data": [{
    "symbol": "BTCUSDT",
    "index": "27655.0941",
    "edp": "27597.08799333",
    "formula": "(27589.72[BINANCE])/1"
  }],
  "f": true // Whether this is the first entry
}

Error handling

Error Codes:

INVALID_REQUEST("-10000", "Invalid request!")
JSON_FORMAT_ERROR("-10001", "Invalid JSON!")
INVALID_EVENT("-10002", "Invalid event")
REQUIRED_EVENT("-10003", "Event required!")
INVALID_TOPIC("-10004", "Invalid topic!")
REQUIRED_TOPIC("-10005", "Topic required!")
PARAM_EMPTY("-10007", "Params required!")
PERIOD_EMPTY("-10008", "Period required!")
PERIOD_ERROR("-10009", "Invalid period!")
SYMBOLS_ERROR("-100010", "Invalid Symbols!")