Binance WebSocket — market streams vs listing announcements
Searching for the Binance WebSocket lands you in one of two camps: you want live market data (trades, ticker, depth) for symbols that already trade — or you want to fire the instant Binance announces a new listing, a delisting, or a HODLer airdrop. Binance's market streams do the first. They do not do the second. This guide covers both, with runnable code.
Two kinds of socket, two jobs
| Feed | What it streams | Good for |
|---|---|---|
| Binance market / futures streams | Live trades, ticker & depth for existing spot and perpetual symbols | Charts, execution, market making |
| Announcement WebSocket | An event the moment a new listing, delisting or airdrop is published | Reacting before the pair is liquid |
Binance's native market-data WebSocket
Binance spot market streams live at wss://stream.binance.com:9443. You can connect straight to a raw stream path such as /ws/btcusdt@trade, use /stream?streams= for a combined subscription, or send a SUBSCRIBE message after connecting. USD-M futures use wss://fstream.binance.com.
# pip install "websockets>=14" import asyncio, json, websockets async def main(): url = "wss://stream.binance.com:9443/ws" sub = {"method": "SUBSCRIBE", "params": ["btcusdt@trade", "ethusdt@trade"], "id": 1} async with websockets.connect(url) as ws: await ws.send(json.dumps(sub)) async for raw in ws: print(json.loads(raw)) asyncio.run(main())
Perfect for a symbol that already trades. But every stream name (btcusdt@trade) references a symbol that must already exist — which is exactly the problem for a coin that hasn't listed yet.
Why the market streams can't tell you about new listings
A new Binance symbol has no stream until it goes live, so there is nothing to subscribe to ahead of time. Binance publishes its listing, delisting, HODLer-airdrop and Monitoring Tag decisions on its announcement pages and over an announcement WebSocket of its own — a channel entirely separate from the market sockets. That native announcement feed works, but it is not built for latency: it delivers the same notice slower than a dedicated announcement feed. By the time NEWUSDT@trade starts emitting, the fastest movers have already reacted to the announcement. The market WebSocket is downstream of the news, not the news itself.
The announcement WebSocket: catch the listing at publication
CryptoListing.ws runs a dedicated announcement WebSocket that broadcasts a structured JSON event in real time the instant Binance publishes an announcement. It watches Binance's official announcement channel for you and pushes the parsed result.
| Property | Value |
|---|---|
| Endpoint — Tokyo (full feed) | wss://cryptolisting.ws — Binance + Upbit + Bithumb, AWS Tokyo (ap-northeast-1a), same region as Binance |
| Filter to Binance | wss://cryptolisting.ws?cex=binance |
| Auth | X-API-Key header on the upgrade request |
| Format | Binary frames, UTF-8 JSON, microsecond-precision timestamps |
| Binance events | spot_listing, futures_listing, spot_delisting, futures_delisting, hodler_airdrop, monitoring_tag_extend, monitoring_tag_remove, not_listing |
# pip install "websockets>=14" — the header param is additional_headers # (extra_headers was removed in websockets v14+) import asyncio, json, websockets API_KEY = "dsk_your_key_here" WS_URL = "wss://cryptolisting.ws?cex=binance" async def run(): headers = {"X-API-Key": API_KEY} async with websockets.connect(WS_URL, additional_headers=headers) as ws: async for raw in ws: msg = json.loads(raw) if msg["type"] == "announcement": for ticker in msg["ticker"].split(","): print(msg["listingType"], ticker, msg["title"]) asyncio.run(run())
Message format
Every announcement is a single JSON object. A single notice can list several coins, so ticker may be comma-separated — always split it.
{
"type": "announcement",
"title": "Binance Will List TOKEN (TOKEN)",
"ticker": "TOKEN",
"publisher": "binance",
"listingType": "spot_listing",
"detectedTimestampUs": 1710345000005000,
"dispatchTimestampUs": 1710345000006000
}
Route by listing type
Because the feed carries the full Binance event set, your bot can branch on listingType: open a long path on spot_listing / futures_listing / hodler_airdrop, a risk path on spot_delisting / futures_delisting / monitoring_tag_extend, and ignore not_listing. See the message reference for the complete schema.
Use both feeds together
The two sockets complement each other. Subscribe to the announcement WebSocket to learn that a symbol is being listed; the moment the event arrives, open Binance's native <symbol>@trade or @ticker stream to follow the price. One feed is the trigger, the other is the telemetry.
FAQ
What is the Binance WebSocket endpoint?
Spot market streams live at wss://stream.binance.com:9443 (raw /ws/<stream>, combined /stream?streams=, or a SUBSCRIBE message); USD-M futures at wss://fstream.binance.com. They carry data for symbols that already trade.
Can the native Binance WebSocket alert me to new listings?
The market streams can't — you can only subscribe to symbols that already exist. Binance does offer an announcement WebSocket of its own that carries these notices, including listings, but it is slower than CryptoListing.ws's feed. For the fastest structured version of the same announcements, use a dedicated announcement API.
How do I filter the announcement feed to Binance only?
Append ?cex=binance to the Tokyo endpoint: wss://cryptolisting.ws?cex=binance. You can combine exchanges, e.g. ?cex=binance,upbit.
What about Upbit and Bithumb?
The same feed covers Upbit and Bithumb. Korea-based bots trading Upbit can also use the Seoul endpoint.
Get your API key
Contact us on Telegram to start streaming Binance listing announcements. See pricing & tiers, the full documentation, or the Binance listing alert overview.
Get API key on Telegram