Skip to main content

Subscribe to Aggregated Orderbook

Subscribe to real-time orderbook updates for specific trading pairs across multiple exchanges.

Subscribe to Specific Exchanges

Request:
{
  "type": "subscribe_aggregated",
  "symbol": "BTC/USDT",
  "exchanges": ["binance", "okx", "bybit", "kucoin"]
}
Success Response:
{
  "type": "aggregated_subscription_response",
  "symbol": "BTC/USDT",
  "exchanges": ["binance", "okx", "bybit", "kucoin"],
  "requested": ["binance", "okx", "bybit", "kucoin"],
  "success": true,
  "message": "Subscribed to BTC/USDT on 4 exchanges",
  "subscription_id": "sub_123456"
}

Subscribe to All Available Exchanges

Request:
{
  "type": "subscribe_aggregated",
  "symbol": "BTC/USDT",
  "exchanges": "all"
}
Success Response:
{
  "type": "aggregated_subscription_response",
  "symbol": "BTC/USDT",
  "exchanges": ["binance", "okx", "bybit", "kucoin", "gate", "mexc", "bitget", "cryptocom"],
  "requested": "all",
  "success": true,
  "message": "Subscribed to BTC/USDT on 25 exchanges",
  "subscription_id": "sub_789012"
}

Real-time Orderbook Updates

Once subscribed, you’ll receive continuous orderbook updates:
{
  "type": "aggregated_orderbook_update",
  "symbol": "BTC/USDT",
  "timestamp": "2025-08-19T19:45:13.392607",
  "update_number": 1,
  "subscription_id": "sub_123456",
  "data": {
    "bids": [
      {
        "price": 113393.9,
        "amount": 0.0001,
        "exchanges": ["bybit"],
        "exchange_count": 1,
        "value": 11.33939
      },
      {
        "price": 113390.0,
        "amount": 0.0025,
        "exchanges": ["binance", "okx"],
        "exchange_count": 2,
        "value": 283.475
      }
    ],
    "asks": [
      {
        "price": 113400.0,
        "amount": 0.0005,
        "exchanges": ["binance", "okx"],
        "exchange_count": 2,
        "value": 56.7
      },
      {
        "price": 113405.5,
        "amount": 0.0015,
        "exchanges": ["kucoin"],
        "exchange_count": 1,
        "value": 170.1083
      }
    ],
    "market_stats": {
      "best_bid": 113393.9,
      "best_ask": 113400.0,
      "spread": 6.1,
      "spread_percent": 0.0054,
      "mid_price": 113396.95,
      "total_bid_volume": 0.0026,
      "total_ask_volume": 0.002,
      "participating_exchanges": 4
    }
  }
}

Subscription Management

Get Current Orderbook Snapshot

Request the current orderbook state for an active subscription: Request:
{
  "type": "get_aggregated_orderbook",
  "symbol": "BTC/USDT"
}
Response:
{
  "type": "aggregated_orderbook_data",
  "symbol": "BTC/USDT",
  "timestamp": "2025-08-19T19:45:13.392607",
  "data": {
    "bids": [...],
    "asks": [...],
    "market_stats": {
      "best_bid": 113393.9,
      "best_ask": 113400.0,
      "spread": 6.1,
      "spread_percent": 0.0054,
      "mid_price": 113396.95
    }
  }
}

Unsubscribe from Symbol

Stop receiving updates for a specific trading pair: Request:
{
  "type": "unsubscribe_aggregated",
  "symbol": "BTC/USDT"
}
Response:
{
  "type": "unsubscribe_response",
  "symbol": "BTC/USDT",
  "success": true,
  "message": "Successfully unsubscribed from BTC/USDT"
}

Subscription Errors

Invalid Symbol

{
  "type": "subscription_error",
  "error": "invalid_symbol",
  "message": "Symbol BTC/INVALID is not supported",
  "symbol": "BTC/INVALID",
  "suggested_symbols": ["BTC/USDT", "BTC/USD", "BTC/EUR"]
}

Exchange Not Available

{
  "type": "subscription_error",
  "error": "exchange_unavailable",
  "message": "Exchange 'invalid_exchange' is not supported",
  "exchange": "invalid_exchange",
  "supported_exchanges": ["binance", "okx", "bybit", "kucoin"]
}

No Active Subscription

{
  "type": "error",
  "error": "no_subscription",
  "message": "No active subscription found for BTC/USDT",
  "symbol": "BTC/USDT"
}

Data Structure

Orderbook Entry

Each bid/ask entry contains:
FieldTypeDescription
pricenumberOrder price level
amountnumberTotal amount at this price
exchangesarrayList of exchanges contributing
exchange_countnumberNumber of exchanges
valuenumberPrice × Amount

Market Statistics

Real-time market statistics included with each update:
FieldTypeDescription
best_bidnumberHighest bid price
best_asknumberLowest ask price
spreadnumberBid-ask spread
spread_percentnumberSpread as percentage
mid_pricenumber(best_bid + best_ask) / 2
total_bid_volumenumberTotal bid volume
total_ask_volumenumberTotal ask volume
participating_exchangesnumberActive exchanges count

Best Practices

Subscription Management

  • Subscribe only to needed symbols
  • Unsubscribe from unused pairs
  • Monitor subscription count
  • Handle subscription errors gracefully

Data Processing

  • Process updates efficiently
  • Implement proper buffering
  • Handle high-frequency updates
  • Monitor memory usage

Code Examples

Python Subscription Manager

import asyncio
import websockets
import json

class SubscriptionManager:
    def __init__(self, api_key):
        self.api_key = api_key
        self.websocket = None
        self.subscriptions = set()
    
    async def subscribe(self, symbol, exchanges="all"):
        if not self.websocket:
            await self.connect()
        
        subscribe_msg = {
            "type": "subscribe_aggregated",
            "symbol": symbol,
            "exchanges": exchanges
        }
        
        await self.websocket.send(json.dumps(subscribe_msg))
        self.subscriptions.add(symbol)
        print(f"Subscribed to {symbol}")
    
    async def unsubscribe(self, symbol):
        if symbol not in self.subscriptions:
            print(f"Not subscribed to {symbol}")
            return
        
        unsubscribe_msg = {
            "type": "unsubscribe_aggregated",
            "symbol": symbol
        }
        
        await self.websocket.send(json.dumps(unsubscribe_msg))
        self.subscriptions.remove(symbol)
        print(f"Unsubscribed from {symbol}")

JavaScript Subscription Handler

class SubscriptionHandler {
    constructor(websocket) {
        this.ws = websocket;
        this.subscriptions = new Set();
    }
    
    subscribe(symbol, exchanges = 'all') {
        const subscribeMsg = {
            type: 'subscribe_aggregated',
            symbol: symbol,
            exchanges: exchanges
        };
        
        this.ws.send(JSON.stringify(subscribeMsg));
        this.subscriptions.add(symbol);
        console.log(`Subscribed to ${symbol}`);
    }
    
    unsubscribe(symbol) {
        if (!this.subscriptions.has(symbol)) {
            console.log(`Not subscribed to ${symbol}`);
            return;
        }
        
        const unsubscribeMsg = {
            type: 'unsubscribe_aggregated',
            symbol: symbol
        };
        
        this.ws.send(JSON.stringify(unsubscribeMsg));
        this.subscriptions.delete(symbol);
        console.log(`Unsubscribed from ${symbol}`);
    }
}
Each subscription consumes data from your 50GB monthly limit. Monitor your usage and unsubscribe from unused symbols to conserve data.