QFEX provides a realtime best bid/offer (BBO) stream for all symbols via websocket.

How it works

Connect to the public websocket:
  • URL: wss://mds.qfex.com
Then send a subscribe message:
{
  "type": "subscribe",
  "channels": ["bbo"],
  "symbols": ["AAPL-USD", "SP500-USD"]
}
Or subscribe to all symbols with a wildcard:
{ "type": "subscribe", "channels": ["bbo"], "symbols": ["*"] }

Sample Code

# Python (websocket-client)
# pip install websocket-client
import json
import websocket

def on_open(ws):
    sub = {
        "type": "subscribe",
        "channels": ["bbo"],
        "symbols": ["SP500-USD"]  # or ["*"]
    }
    ws.send(json.dumps(sub))

def on_message(ws, message):
    data = json.loads(message)
    print("BBO update:", json.dumps(data, indent=2))

def on_error(ws, error):
    print("Error:", error)

def on_close(ws, close_status_code, close_msg):
    print("Closed:", close_status_code, close_msg)

if __name__ == "__main__":
    ws = websocket.WebSocketApp(
        "wss://mds.qfex.com",
        on_open=on_open,
        on_message=on_message,
        on_error=on_error,
        on_close=on_close,
    )
    ws.run_forever()

Example Response

{
  "type": "bbo",
  "symbol": "AAPL-USD",
  "bid": [["10101.10", "0.45054140"]],
  "ask": [["10102.55", "0.57753524"]],
  "sequence": 30272539,
  "time": "2025-09-04T09:26:39.545268322Z"
}

Unsubscribe (optional)

{ "type": "unsubscribe", "channels": ["bbo"], "symbols": ["SP500-USD"] }

Notes
  • Similar to Level 2 but only contains top-of-book (best bid/ask).
  • Updates are realtime (not pulsed).
  • Supports wildcard * to receive BBO for all symbols.