Balance Updates WebSocket
Pushes a fresh balance snapshot whenever any of your wallet balances change — typically after order placements, fills, cancellations, or deposits/withdrawals.
| Type | Socket.IO v4 |
| Base URL | wss://ws.coinswitch.co/ |
| Handshake path | /pro/realtime-rates-socket/spot/balance-updates |
| Namespace | /balanceupdates |
| Event name | FETCH_BALANCE_UPDATES |
| Auth | API key on the subscribe payload. |
Subscribe payload
| Parameter | Type | Required | Description |
|---|---|---|---|
event | string | Yes | Must be "subscribe" (case-sensitive). |
apikey | string | Yes | Your CoinSwitch API key. |
Subscribe
- Python
- Java
- Go
- Node.js
import socketio
BASE_URL = "https://ws.coinswitch.co"
HANDSHAKE_PATH = "/pro/realtime-rates-socket/spot/balance-updates"
NAMESPACE = "/balanceupdates"
sio = socketio.Client()
@sio.event(namespace=NAMESPACE)
def connect():
sio.emit(
"FETCH_BALANCE_UPDATES",
{"apikey": "<your api key>", "event": "subscribe"},
namespace=NAMESPACE,
)
@sio.on("FETCH_BALANCE_UPDATES", namespace=NAMESPACE)
def on_balance_update(data):
print("Balance update:", data)
sio.connect(
BASE_URL,
namespaces=[NAMESPACE],
socketio_path=HANDSHAKE_PATH.lstrip("/"),
)
sio.wait()
import okhttp3.*;
import org.json.JSONObject;
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("wss://ws.coinswitch.co/pro/realtime-rates-socket/spot/balance-updates?EIO=4&transport=websocket")
.build();
JSONObject subscribe = new JSONObject()
.put("event", "subscribe")
.put("apikey", "<your api key>");
String namespaceFrame = "40/balanceupdates,";
String subscribeFrame = "42/balanceupdates,[\"FETCH_BALANCE_UPDATES\"," + 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/spot/balance-updates")
sock := socketio.Connect("wss://ws.coinswitch.co/balanceupdates", opts)
defer sock.Close()
sock.On("connect", func(args ...any) {
sock.Emit("FETCH_BALANCE_UPDATES", map[string]any{
"apikey": "<your api key>",
"event": "subscribe",
})
})
sock.On("FETCH_BALANCE_UPDATES", 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/balanceupdates', {
path: '/pro/realtime-rates-socket/spot/balance-updates',
transports: ['websocket'],
});
sock.on('connect', () => {
sock.emit('FETCH_BALANCE_UPDATES', {
apikey: '<your api key>',
event: 'subscribe',
});
});
sock.on('FETCH_BALANCE_UPDATES', (data) => {
console.log('update:', data);
});
Update payload
A flat object keyed by lowercase coin code, with one entry per asset that you hold:
{
"btc": {
"free_balance": 0.0001154,
"locked_balance": 0
},
"inr": {
"free_balance": 5003.373751312903,
"locked_balance": 705
}
}
| Field | Type | Description |
|---|---|---|
<coin>.free_balance | number | Available balance — what you can spend on a new order. |
<coin>.locked_balance | number | Reserved against open orders. Released back to free_balance when those orders fill or cancel. |
Each push replaces your previous snapshot entirely — you don't need to merge updates.