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

FeedWhat it streamsGood for
Upbit native WebSocketLive ticker, order book & trades for existing KRW / BTC / USDT marketsCharts, execution, market making
Announcement WebSocketAn event the moment a new listing, caution release or delisting is publishedReacting 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.

PropertyValue
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).
AuthX-API-Key header on the upgrade request (same key on both endpoints)
FormatBinary frames, UTF-8 JSON, microsecond-precision timestamps
Upbit eventsspot_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