Dhanhq api v2.1.0 : WebSocket connection error: server rejected WebSocket connection: HTTP 429

Hi Team,

I am using dhanhq version 2.1.0 and getting error - WebSocket connection error: server rejected WebSocket connection: HTTP 429

I hav verified that my hand data api subscription is active . The python version is 3.10 and websockets version is 13.1 .

I tried everything but unable to resolve this.The datafeed was working fine in earlier version and suddenly stopped working and i am trying to upgrade to latest.

from dhanhq import DhanContext, MarketFeed
import asyncio
import nest_asyncio
nest_asyncio.apply()

client_id = "1000XXXXX"
access_token = """
iXumheETHFIgbhiBsx0WrsU0dIfGV_sorP2xfTsp4StDFfsu8ikkQnnFOj_n8kdcw
               """
instruments =[
    (MarketFeed.IDX, "13", MarketFeed.Ticker), #NIFTY
    (MarketFeed.IDX, "21", MarketFeed.Ticker), #INDIA VIX
    (MarketFeed.IDX, "25", MarketFeed.Ticker), #BANKNIFTY
    (MarketFeed.IDX, "27", MarketFeed.Ticker),  #FINNIFTY
    (MarketFeed.IDX, "442", MarketFeed.Ticker)  #MIDCPNIFTY
    ]

version = "v2"
dhan_context = DhanContext(client_id,access_token.strip())

async def fetchdata():
        print('Gen marketfeed v2 ..')
        data = MarketFeed(dhan_context, instruments, version)
        try:

            while True:
                print('Run forever:')
                data.run_forever()
                print('get data:')
                response = data.get_data()
                print('Response:')
                print((response))
                print('LTP : ',response['LTP'])

        except Exception as e:
            print('Exception:>>',e)

        # Close Connection
        print('Close Connection')
        await data.disconnect()

asyncio.run(fetchdata());

error snippet

Gen marketfeed v2 ..
Run forever:
Exception:>> server rejected WebSocket connection: HTTP 429
Close Connection
Connection closed!

Any help or suggestion is much appreciated.

Thanks

Hey @alok.nayak

What is the frequency here for you connecting to the websocket? Also, are you running multiple programs from your end as well?

Do note, there is an update on how websocket needs to be handled: here

1 Like

@Hardik ,

I am connecting only once to the websocket to fetch the datafeed.
No multiple programs are running from my end. Just trying the above code on pycharm editor.

Thanks

Hey @alok.nayak

Can you mail your IP details and Client ID on help@dhan.co with this thread, the team will check logs and assist you directly.

sent a mail to the support team .

Hello @Tradehull_Imran

I am facing connection error in WebSocket connection error: server rejected WebSocket connection: HTTP 400

import datetime
import warnings
from dhanhq import marketfeed
import xlwings as xw
import pandas as pd
import time
import os

warnings.filterwarnings("ignore")

def get_instrument_file():
    global instrument_df
    current_date = time.strftime("%Y-%m-%d")
    expected_file = 'all_instrument ' + str(current_date) + '.csv'
    for item in os.listdir("Dependencies"):
        path = os.path.join(item)

        if (item.startswith('all_instrument')) and (current_date not in item.split(" ")[1]):
            if os.path.isfile("Dependencies\\" + path):
                os.remove("Dependencies\\" + path)

    if expected_file in os.listdir("Dependencies"):
        try:
            print(f"Reading existing file {expected_file}")
            instrument_df = pd.read_csv("Dependencies\\" + expected_file, low_memory=False)
        except Exception as e:
            print("This BOT Is Instrument file is not generated completely, Picking New File from Dhan Again")
            instrument_df = pd.read_csv("https://images.dhan.co/api-data/api-scrip-master.csv", low_memory=False)
            instrument_df.to_csv("Dependencies\\" + expected_file)
    else:
        # This will fetch instrument_df file from Dhan
        print("This BOT Is Picking New File From Dhan")
        instrument_df = pd.read_csv("https://images.dhan.co/api-data/api-scrip-master.csv", low_memory=False)
        instrument_df.to_csv("Dependencies\\" + expected_file)
    return instrument_df

# Excel sheet setup
wb = xw.Book("Websocket.xlsx")
sheet = wb.sheets['LTP']
client_id = ""
access_token = ""
# Fetch the instrument file
current_date = time.strftime("%Y-%m-%d")
expected_file = 'all_instrument ' + str(current_date) + '.csv'
global instrument_df, old_instruments
old_instruments = list()
instrument_df = get_instrument_file()

def create_instruments(watchlist, stock_exchange):
    rows = dict()
    row = 1
    instruments = list()
    instrument_exchange = {'NSE': "NSE", 'BSE': "BSE", 'NFO': 'NSE', 'BFO': 'BSE', 'MCX': 'MCX', 'CUR': 'NSE', 'BSE_IDX': 'BSE', 'NSE_IDX': 'NSE'}
    exchange_id = {'NSE': marketfeed.NSE, 'BSE': marketfeed.BSE, 'MCX': marketfeed.MCX, 'NFO': marketfeed.NSE_FNO, 'BFO': marketfeed.BSE_FNO, 'IDX': marketfeed.IDX, 'BSE_IDX': marketfeed.IDX, 'NSE_IDX': marketfeed.IDX}

    for tradingsymbol in watchlist:
        try:
            row += 1
            exchange_ = stock_exchange[tradingsymbol]
            exchange = instrument_exchange[exchange_]
            security_id = instrument_df[
                ((instrument_df['SEM_TRADING_SYMBOL'] == tradingsymbol) | (instrument_df['SEM_CUSTOM_SYMBOL'] == tradingsymbol)) &
                (instrument_df['SEM_EXM_EXCH_ID'] == instrument_exchange[exchange])
            ].iloc[-1]['SEM_SMST_SECURITY_ID']
            exchange_segment = exchange_id[exchange_]
            # Subscribe to Quote mode for now, can be changed to Ticker or Depth as needed
            instruments.append((exchange_segment, str(security_id), marketfeed.Quote))
            rows[security_id] = row
        except Exception as e:
            print(f"Error: {e} for {tradingsymbol}")
            continue

    return instruments, rows

def run_feed(client_id, access_token, instruments):
    try:
        # Initialize DhanFeed
        data = marketfeed.DhanFeed(client_id, access_token, instruments)
        previous_watchlist = []
        rows = {}
        old_instruments = instruments

        while True:
            # Check for updated watchlist
            last_row_col1 = sheet.range('A1').end('down').row
            last_row_col2 = sheet.range('B1').end('down').row
            row = max(last_row_col1, last_row_col2)
            data_frame = sheet.range('A1').expand().options(pd.DataFrame, header=1, index=False).value
            stock_exchange = sheet.range(f'A2:B{row}').options(dict).value
            watchlist = data_frame['Script Name'].to_list()

            # If watchlist has changed, update the feed
            if watchlist != previous_watchlist:
                print("Watchlist changed. Reconnecting the feed...")

                # Create new instruments and row mappings before disconnecting
                new_instruments, new_rows = create_instruments(watchlist, stock_exchange)

                # Disconnect the current connection
                data.disconnect()
                print("Disconnected from WebSocket feed.")

                # Update previous watchlist and rows before reconnecting
                previous_watchlist = watchlist
                rows = new_rows
                old_instruments = new_instruments

                # Reconnect with the updated instruments
                data = marketfeed.DhanFeed(client_id, access_token, new_instruments)
                data.run_forever()

            # Start receiving data
            response = data.get_data()

            if response:
                print(f"{datetime.datetime.now().time()}: LTP Received")
                if 'LTP' in response.keys():
                    df = pd.DataFrame(response, index=[0])
                    security_id = response['security_id']
                    row = rows.get(int(security_id), None)

                    if row:
                        df = df[['LTP', 'avg_price', 'volume', 'total_sell_quantity', 'open', 'close', 'high', 'low']]
                        sheet.range(f'C{row}').value = df.values.tolist()

    except Exception as e:
        print(f"WebSocket connection error: {e}")
        print("Reconnecting Again...")
        # time.sleep(5)  # Short delay before reconnecting
        run_feed(client_id, access_token, instruments)  # Retry the connection

def main_loop():
    # Fetch initial instrument data and start the feed
    last_row_col1 = sheet.range('A1').end('down').row
    last_row_col2 = sheet.range('B1').end('down').row
    row = max(last_row_col1, last_row_col2)
    data_frame = sheet.range('A1').expand().options(pd.DataFrame, header=1, index=False).value
    stock_exchange = sheet.range(f'A2:B{row}').options(dict).value
    watchlist = data_frame['Script Name'].to_list()

    instruments, rows = create_instruments(watchlist, stock_exchange)
    run_feed(client_id, access_token, instruments)

if __name__ == "__main__":
    main_loop()

ERROR

C:\Users\Admin\Desktop\20250924_DHAN\5. Session5- Python Part 2\5. Session5- Python Part 2\Ltp Based Strike Selection>py Dhan_websocket.py
Reading existing file all_instrument 2025-09-25.csv
Watchlist changed. Reconnecting the feed...
Disconnected from WebSocket feed.
WebSocket connection error: server rejected WebSocket connection: HTTP 400
Reconnecting Again...
Watchlist changed. Reconnecting the feed...
Disconnected from WebSocket feed.
WebSocket connection error: server rejected WebSocket connection: HTTP 400
Reconnecting Again...
Watchlist changed. Reconnecting the feed...
Disconnected from WebSocket feed.
WebSocket connection error: server rejected WebSocket connection: HTTP 400
Reconnecting Again...
Watchlist changed. Reconnecting the feed...
Disconnected from WebSocket feed.
WebSocket connection error: server rejected WebSocket connection: HTTP 400
Reconnecting Again...
Watchlist changed. Reconnecting the feed...
Disconnected from WebSocket feed.
WebSocket connection error: server rejected WebSocket connection: HTTP 400
Reconnecting Again...
Watchlist changed. Reconnecting the feed...
Disconnected from WebSocket feed.
WebSocket connection error: server rejected WebSocket connection: HTTP 400
Reconnecting Again...
Watchlist changed. Reconnecting the feed...
Disconnected from WebSocket feed.
WebSocket connection error: server rejected WebSocket connection: HTTP 400
Reconnecting Again...
Watchlist changed. Reconnecting the feed...
Disconnected from WebSocket feed.
WebSocket connection error: server rejected WebSocket connection: HTTP 400