Skip to content

Futures WebSocket: Multiple stream types return successful SUBSCRIBE ACK but send zero data frames #526

Closed

Description

@uibeka

Several Futures WebSocket stream types accept subscriptions and return {"result":null,"id":99} (successful ACK) but never send any data frames. This has been ongoing for approximately 6 hours as of this report.
Affected streams (zero data after successful subscribe):

btcusdt@aggTrade
btcusdt@kline_1m
btcusdt@markPrice@1s
!forceOrder@arr

Unaffected streams (working normally):

btcusdt@depth20@500ms
btcusdt@trade

Reproduction steps:
pythonimport asyncio, json, websockets

async def test():
async with websockets.connect("wss://fstream.binance.com/ws") as ws:
# This stream works:
await ws.send(json.dumps({"method": "SUBSCRIBE", "params": ["btcusdt@trade"], "id": 1}))
print(await asyncio.wait_for(ws.recv(), timeout=5)) # ACK
print(await asyncio.wait_for(ws.recv(), timeout=5)) # Data frame received

    # This stream does NOT work:
    await ws.send(json.dumps({"method": "SUBSCRIBE", "params": ["btcusdt@aggTrade"], "id": 2}))
    print(await asyncio.wait_for(ws.recv(), timeout=5))  # ACK received
    print(await asyncio.wait_for(ws.recv(), timeout=10)) # TimeoutError — no data

asyncio.run(test())
Environment:

Endpoint: wss://fstream.binance.com/ws
Location: Tokyo (Vultr VPS)
Tested via URL-based (/ws/), combined (/stream?streams=...), and method-based SUBSCRIBE — all behave identically
websockets Python library, but the issue is server-side — the connection and subscription succeed, the server simply never sends data frames for the affected stream types

Impact: Any application relying on aggTrade, kline, markPrice, or forceOrder streams via Futures WebSocket is silently receiving no data despite successful subscription. There is no error message or disconnect — the connection remains alive, making this difficult to detect without explicit data-frame-level monitoring.
Notes:

The @trade stream (non-aggregated) works for the same symbols where @aggTrade does not
The @depth20 stream works normally
This appears to be a server-side regression, not a client issue

Activity

  1. uibeka commented on Apr 24, 2026

    @uibeka
    Author

    Update: The outage has expanded. In addition to the originally reported aggTrade and forceOrder streams, kline_1m and markPrice@1s are now also affected. These streams were initially working on pre-existing connections, but after those connections expired (24h lifetime), new subscriptions exhibit the same behavior — successful ACK, zero data frames.
    Current state (~14 hours into the incident):

    DEAD (ACK but zero data): aggTrade, kline_1m, markPrice@1s, forceOrder
    ALIVE: depth20@500ms, trade

    4 of 6 Futures WebSocket stream types are now non-functional despite successful subscriptions. Only depth20 and trade continue to deliver data.

  2. alplabin commented on Apr 27, 2026

    @alplabin
    Contributor

    Hey @uibeka, Have you seen that new entry points have been added to call these endpoints?

    If you want to retrieve WebSocket data using this library, we suggest looking at the example provided or testing it using the following code:

    import asyncio
    import logging
    
    from binance_sdk_derivatives_trading_usds_futures.derivatives_trading_usds_futures import (
        DerivativesTradingUsdsFutures,
    )
    
    logging.basicConfig(level=logging.INFO)
    client = DerivativesTradingUsdsFutures()
    
    async def usds_streams():
        connection = None
        try:
            connection = await client.websocket_streams.create_connection()
            await connection.subscribe(streams=["btcusdt@markPrice@1s", "btcusdt@aggTrade", "btcusdt@kline_1m", "!forceOrder@arr"], stream_url="market")
    
            connection.on("message", lambda data: print(f"Mark Price: {data}"), stream="btcusdt@markPrice@1s")
            connection.on("message", lambda data: print(f"Aggregate Trade: {data}"), stream="btcusdt@aggTrade")
            connection.on("message", lambda data: print(f"Kline 1m: {data}"), stream="btcusdt@kline_1m")
            connection.on("message", lambda data: print(f"Force Order:{data}"), stream="!forceOrder@arr")
    
            await asyncio.sleep(5)
            await connection.unsubscribe(streams=["btcusdt@markPrice@1s", "btcusdt@aggTrade", "btcusdt@kline_1m", "!forceOrder@arr"])
        except Exception as e:
            logging.error(f"usds_streams() error: {e}")
        finally:
            if connection:
                await connection.close_connection(close_session=True)
    
    if __name__ == "__main__":
        asyncio.run(usds_streams())
  3. pinned and unpinned a comment on Apr 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions