KLines WebSocket
Streams real-time candle updates for a futures symbol at a chosen interval. Used to render live charts.
| Event name | FETCH_CANDLESTICK_CS_PRO |
| Connection | See Connection. |
Pair format — SYMBOL_INTERVAL
The pair field on the subscribe payload is SYMBOL_INTERVAL (with an underscore), where INTERVAL is in minutes. This is different from every other futures WebSocket (which use just SYMBOL).
| Pattern | Description |
|---|---|
BTCUSDT_5 | 5-minute BTCUSDT candles |
ETHUSDT_15 | 15-minute ETHUSDT candles |
DOGEUSDT_60 | 1-hour DOGEUSDT candles |
Subscribe
- Python
- Java
- Go
- Node.js
import socketio
sio = socketio.Client()
BASE_URL = "wss://ws.coinswitch.co/"
NAMESPACE = "/exchange_2"
pair = "BTCUSDT_5" # SYMBOL_INTERVAL
sio.connect(
url=BASE_URL,
namespaces=[NAMESPACE],
transports="websocket",
socketio_path="/pro/realtime-rates-socket/futures/exchange_2",
wait=True,
wait_timeout=3600,
)
sio.emit(
"FETCH_CANDLESTICK_CS_PRO",
{"event": "subscribe", "pair": pair},
namespace=NAMESPACE,
)
@sio.on("FETCH_CANDLESTICK_CS_PRO", namespace=NAMESPACE)
def on_kline(data):
print("Kline:", data)
sio.wait()
import okhttp3.*;
import org.json.JSONObject;
String exchange = "exchange_2";
String coinPair = "BTCUSDT_5"; // SYMBOL_INTERVAL
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("wss://ws.coinswitch.co/pro/realtime-rates-socket/futures/?EIO=4&transport=websocket")
.build();
JSONObject subscribe = new JSONObject()
.put("event", "subscribe")
.put("pair", coinPair);
String namespaceFrame = "40/" + exchange + ",";
String subscribeFrame = "42/" + exchange + ",[\"FETCH_CANDLESTICK_CS_PRO\"," + subscribe + "]";
WebSocket ws = client.newWebSocket(request, new WebSocketListener() { /* ... */ });
ws.send(namespaceFrame);
ws.send(subscribeFrame);
import (
"log"
socketio "github.com/zishang520/socket.io-client-go/v2/client"
)
opts := socketio.DefaultOptions()
opts.SetTransports([]string{"websocket"})
opts.SetPath("/pro/realtime-rates-socket/futures/exchange_2")
sock := socketio.Connect("wss://ws.coinswitch.co/exchange_2", opts)
defer sock.Close()
sock.On("connect", func(args ...any) {
sock.Emit("FETCH_CANDLESTICK_CS_PRO", map[string]any{
"event": "subscribe",
"pair": "BTCUSDT_5",
})
})
sock.On("FETCH_CANDLESTICK_CS_PRO", func(args ...any) {
log.Println("update:", args)
})
select {}
// npm install socket.io-client@^4
const { io } = require('socket.io-client');
const sock = io('wss://ws.coinswitch.co/exchange_2', {
path: '/pro/realtime-rates-socket/futures/exchange_2',
transports: ['websocket'],
});
sock.on('connect', () => {
sock.emit('FETCH_CANDLESTICK_CS_PRO', { event: 'subscribe', pair: 'BTCUSDT_5' });
});
sock.on('FETCH_CANDLESTICK_CS_PRO', (data) => {
console.log('update:', data);
});
Update payload
{
"o": "104562.7",
"h": "104588.5",
"l": "104535",
"c": "104558.7",
"v": "43.205",
"q": "1918381.4344",
"s": "BTCUSDT",
"i": "5",
"x": false,
"t": 1734343500000,
"T": 1734343799999,
"ts": 1734343543430
}
| Field | Type | Description |
|---|---|---|
s | string | Symbol. |
i | string | Interval in minutes. |
o / h / l / c | string | Open / high / low / close. |
v | string | Base-asset volume during the candle. |
q | string | Quote-asset (USDT) volume during the candle. |
t | integer | Candle start time (Unix ms). |
T | integer | Candle close time (Unix ms). |
ts | integer | Time of the most recent trade in this candle (Unix ms). |
x | boolean | true if this candle is closed (final). false while it's still updating. |
While a candle is open, x is false and you'll receive multiple updates as new trades print. When the interval boundary passes, you receive a final update with x = true, then the first update for the next candle.