Hello, I’m getting the below error while using websocket to fetch live market data, The access token is valid.
Error:
Authorized WS URL:
wss://wsfeeder-api.upstox.com/market-data-feeder/v3/upstox-developer-api/feeds?requestId=3897cb43-be44-4afc-9479-0f8516e1ebd2&code=l7XPs-d2223c2c-d2cc-4494-9e39-e79bea2fe31c
ERROR:websocket:Handshake status 403 Forbidden -+-+- {'date': 'Tue, 20 Jan 2026 10:30:28 GMT', 'transfer-encoding': 'chunked', 'connection': 'keep-alive'} -+-+- None - goodbye
❌ WebSocket error: Handshake status 403 Forbidden -+-+- {'date': 'Tue, 20 Jan 2026 10:30:28 GMT', 'transfer-encoding': 'chunked', 'connection': 'keep-alive'} -+-+- None
🔌 WebSocket closed None None
My Code:
----------- IMPORTS -----------
import json
import time
import threading
import requests
import websocket
from google.protobuf.json_format import MessageToDict
import MarketDataFeedV3_pb2 as pb
# ----------- CONFIG -----------
ACCESS_TOKEN = “eyJ0eXAiOiJKV1QiLCJrZXlfaWQiOiJza192MS4wIiwiYWxnIjoiSFMyNTYifQ.eyJzdWIiOiI4RkFTWk4iLCJqdGkiOiI2OTZmNTQ4YzM1NjBhNTZiOGNlNDcyNTEiLCJpc011bHRpQ2xpZW50IjpmYWxzZSwiaXNQbHVzUGxhbiI6ZmFsc2UsImlhdCI6MTc2ODkwMzgyMCwiaXNzIjoidWRhcGktZ2F0ZXdheS1zZXJ2aWNlIiwiZXhwIjoxNzY4OTQ2NDAwfQ.qEevL3UyE_LqR9d5FhtMPTxQ0V8CgUCPSbA9xM0oNeY”
# -----------------------------
def get_market_data_feed_authorize_v3():
headers = {
"Accept": "application/json",
"Authorization": f"Bearer {ACCESS_TOKEN}"
}
url = "https://api.upstox.com/v3/feed/market-data-feed/authorize"
r = requests.get(url, headers=headers)
r.raise_for_status()
return r.json()
def decode_protobuf(buffer):
feed = pb.FeedResponse()
feed.ParseFromString(buffer)
return MessageToDict(feed)
def on_open(ws):
print("✅ WebSocket connected")
subscribe_message = {
"guid": "python-client-1",
"method": "sub",
"data": {
"mode": "full",
"instrumentKeys": \[
"NSE_INDEX|Nifty 50",
"NSE_INDEX|Nifty Bank"
\]
}
}
ws.send(json.dumps(subscribe_message))
print("📡 Subscription sent")
def on_message(ws, message):
try:
decoded = decode_protobuf(message)
print(json.dumps(decoded, indent=2))
except Exception as e:
print("❌ Decode error:", e)
def on_error(ws, error):
print("❌ WebSocket error:", error)
def on_close(ws, close_status_code, close_msg):
print("🔌 WebSocket closed", close_status_code, close_msg)
def start_socket(ws_url):
ws = websocket.WebSocketApp(
ws_url,
subprotocols=\["binary"\], # 🔴 THIS IS MANDATORY
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
ws.run_forever()
# ----------- MAIN -----------
auth_response = get_market_data_feed_authorize_v3()
WS_URL = auth_response[“data”][“authorized_redirect_uri”]
print(“Authorized WS URL:”)
print(WS_URL)
threading.Thread(
target=start_socket,
args=(WS_URL,),
daemon=True
).start()
# Keep notebook alive
while True:
time.sleep(1)