Upbit WebSocket — market data vs listing announcements
If you searched for the Upbit WebSocket, you are probably after one of two very different things: live market data (ticker, order book, trades) for pairs that already trade — or a heads-up the instant Upbit announces a brand-new listing. Upbit's native socket does the first. It does not do the second. This guide covers both, with code that runs.
Two sockets, two jobs
| Feed | What it streams | Good for |
|---|---|---|
| Upbit native WebSocket | Live ticker, order book & trades for existing KRW / BTC / USDT markets | Charts, execution, market making |
| Announcement WebSocket | An event the moment a new listing, caution release or delisting is published | Reacting to the listing before the pair is liquid |
Upbit's native market-data WebSocket
Upbit exposes a public market-data WebSocket at wss://api.upbit.com/websocket/v1. You subscribe by sending a JSON array: a ticket object, one or more type objects (ticker, trade, orderbook), and an optional format object. Market codes look like KRW-BTC. Responses come back as UTF-8 JSON inside binary frames.
# pip install "websockets>=14" import asyncio, json, websockets async def main(): url = "wss://api.upbit.com/websocket/v1" sub = [ {"ticket": "demo"}, {"type": "ticker", "codes": ["KRW-BTC", "KRW-ETH"]}, {"format": "DEFAULT"}, ] async with websockets.connect(url) as ws: await ws.send(json.dumps(sub)) async for raw in ws: msg = json.loads(raw) # frames are UTF-8 JSON print(msg["code"], msg["trade_price"]) asyncio.run(main())
That is the right tool for tracking a coin that is already listed. But notice the constraint hiding in plain sight: you have to name the market codes up front.
Why the native feed can't tell you about new listings
A new Upbit listing does not exist as a market code until the moment it goes live — so there is nothing to subscribe to in advance. The decision to list is published as a notice on Upbit's announcement board, which is a separate channel from the market-data socket. By the time KRW-XYZ shows up in the ticker stream, the first and largest part of the move is often already gone. The native WebSocket is a consequence of a listing, not a signal of one.
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 Upbit publishes a new listing, a caution release, or a delisting. It watches Upbit's official announcement channel for you and pushes the result — you never poll a page.
| Property | Value |
|---|---|
| Endpoint — Seoul (Upbit-only) | wss://kr.cryptolisting.ws — AWS Seoul (ap-northeast-2c). Fastest end-to-end for Korea-based bots trading Upbit. |
| Endpoint — Tokyo (full feed) | wss://cryptolisting.ws — Binance + Upbit + Bithumb, AWS Tokyo (ap-northeast-1a). |
| Auth | X-API-Key header on the upgrade request (same key on both endpoints) |
| Format | Binary frames, UTF-8 JSON, microsecond-precision timestamps |
| Upbit events | spot_listing, caution_released, spot_delisting |
# 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://kr.cryptolisting.ws" # Seoul, Upbit-only 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" and msg["publisher"] == "upbit": for ticker in msg["ticker"].split(","): print(msg["listingType"], ticker, msg["title"]) asyncio.run(run())
Message format
Every announcement is a single JSON object. ticker may be comma-separated when a single notice covers several coins, so always split it.
{
"type": "announcement",
"title": "[Trade] New Listing of TOKEN (TOKEN) KRW Market",
"ticker": "TOKEN",
"publisher": "upbit",
"listingType": "spot_listing",
"detectedTimestampUs": 1710345000005000,
"dispatchTimestampUs": 1710345000006000
}
Use both feeds together
The two sockets complement each other. Subscribe to the announcement WebSocket to learn that a KRW pair is being listed; the moment the event arrives, open Upbit's native ticker stream on the new market code to follow the price. One feed is the trigger, the other is the telemetry.
FAQ
What is the Upbit WebSocket endpoint?
The public market-data socket is wss://api.upbit.com/websocket/v1. You send a JSON array (ticket + type + codes) and receive UTF-8 JSON frames for markets that already exist.
Can the native Upbit WebSocket alert me to new listings?
No — you can only subscribe to markets that already exist, and listing decisions are published on Upbit's notice board, not the market socket. For that you need an announcement API.
Is there a lower-latency endpoint for Korea-based bots?
Yes. wss://kr.cryptolisting.ws runs in AWS Seoul and streams Upbit announcements only, removing the Seoul→Tokyo network hop for bots co-located in Korea. The Tokyo endpoint carries the full multi-exchange feed.
What about Bithumb and Binance?
The same announcement feed also covers Bithumb and Binance. Use the Tokyo endpoint (or the ?cex= filter) to pick exchanges.
Get your API key
Contact us on Telegram to start streaming Upbit listing announcements. See pricing & tiers, the full documentation, or the Upbit listing alert overview.
Get API key on Telegram