Skip to main content

Spot WebSocket Guide

REST APIs are great for executing actions (like placing orders), but they are too slow for monitoring the market. For real-time data, you should use the WebSocket API.

This guide covers connecting, authenticating, and handling real-time streams.

Prerequisites​

  • Endpoint: wss://api.big.one/ws/v2
  • Library: We recommend websockets (Python) or ws (Node.js).
  • Protocol: JSON is the default and easiest to use.

Lesson 1: Connection & Heartbeat​

BigONE's WebSocket server requires you to keep the connection alive. If you are silent for too long, the server will disconnect you.

The Logic​

  1. Connect to wss://api.big.one/ws/v2.
  2. Every 30 seconds, send a Ping frame or a dummy message.
  3. Listen for PING messages from the server and reply with PONG (most libraries handle this automatically).
import asyncio
import websockets
import json

URL = "wss://api.big.one/ws/v2"

async def connect():
async with websockets.connect(URL) as websocket:
print("Connected!")

# Keep-Alive Loop (Simplified)
while True:
try:
msg = await websocket.recv()
print(f"< {msg}")
except websockets.exceptions.ConnectionClosed:
print("Disconnected")
break

Lesson 2: Subscribing to Public Channels​

You don't need authentication to watch public market data like the Order Book or Recent Trades.

The Request Format​

Every request needs a unique requestId.

{
"requestId": "1",
"subscribeMarketDepthRequest": {
"market": "BTC-USDT"
}
}

Handling Order Book Data​

The Order Book stream sends two types of messages:

  1. Snapshot: The full order book (Bids + Asks). Sent immediately after subscription.
  2. Update: Incremental changes.
Order Book Strategy

For simple bots, you can just use the Snapshot and re-subscribe periodically. For high-frequency trading, you must apply the Updates to your local snapshot.


Lesson 3: Authentication (Private Channels)​

To receive updates about Your Orders or Your Balances, you must log in.

The Logic​

  1. Connect.
  2. Immediately send the authenticateCustomerRequest with your JWT.
  3. Wait for the success response.
  4. Then subscribe to private channels.

Payload:

{
"requestId": "auth-1",
"authenticateCustomerRequest": {
"token": "Bearer YOUR_JWT_TOKEN"
}
}

Complete Example​

This script connects, authenticates, and watches both the BTC-USDT Order Book and Your Order Status.

import asyncio
import websockets
import json
import time
import jwt # pip install PyJWT

# --- Config ---
API_KEY = "YOUR_KEY"
SECRET_KEY = "YOUR_SECRET"
WS_URL = "wss://api.big.one/ws/v2"

def generate_token():
payload = {
"sub": API_KEY,
"nonce": int(time.time() * 1000000),
"iat": int(time.time()),
"exp": int(time.time()) + 60 # Token for handshake only
}
return jwt.encode(payload, SECRET_KEY, algorithm="HS256")

async def run():
async with websockets.connect(WS_URL) as ws:
print("1. Connected")

# 2. Authenticate
token = generate_token()
auth_req = {
"requestId": "auth",
"authenticateCustomerRequest": {"token": f"Bearer {token}"}
}
await ws.send(json.dumps(auth_req))
print("2. Sent Auth...")

# 3. Subscribe
subs = [
# Public: Order Book
{
"requestId": "sub-depth",
"subscribeMarketDepthRequest": {"market": "BTC-USDT"}
},
# Private: My Orders
{
"requestId": "sub-orders",
"subscribeViewerOrdersRequest": {"market": "BTC-USDT"}
}
]

for sub in subs:
await ws.send(json.dumps(sub))
print("3. Subscribed")

# 4. Loop & Listen
while True:
response = await ws.recv()
data = json.loads(response)

# Check for Errors
if "error" in data:
print(f"ERROR: {data['error']}")
continue

# Identify Message Type
if "marketDepth" in data:
bids = data['marketDepth'].get('bids', [])
best_bid = bids[0] if bids else "None"
print(f"[Depth] Best Bid: {best_bid}")

elif "orderUpdate" in data:
order = data['orderUpdate']
print(f"[Order] {order['id']} is {order['state']}")

if __name__ == "__main__":
asyncio.run(run())

Conclusion​

WebSockets are essential for responding to market moves.

Key Takeaways:

  • Heartbeat: Ensure your library handles Pings or implement a manual Keep-Alive.
  • Sequence: Always Authenticate before subscribing to private channels.
  • Data Flow: Handle initial Snapshots differently from subsequent Updates.

Next Steps:

  • Read the Spot WebSocket Reference for the full list of channels.
  • Implement a local Order Book cache that applies marketDepth updates efficiently.