Listing Arbitrage
What it is
Korean retail investors disproportionately trade on Upbit and Bithumb, and these venues' KRW-pair listings act as price-moving events. When a token already trading on global exchanges (Binance, OKX, etc.) is newly listed on a Korean exchange, the KRW order book often opens at a significant premium to the global price — sometimes 10–100% above the global mark — before settling within minutes to hours. The Korean-language term for the pattern is 상장빔 ("listing beam") and the trade around it is sometimes called 원상따리 (chasing the won-listing).
The trade: pre-position the token on a wallet you can deposit to Upbit/Bithumb, monitor the listing announcement feed, deposit and sell into the opening KRW liquidity before the premium decays. Alternatively, run the inverse: short global perp the moment the listing premium appears, expecting convergence.
When it works
- The token is already withdrawable from a global venue so you can pre-stage inventory before the announcement.
- Deposits on the Korean side open at or near the listing moment (some listings have a "trade-only" window where deposits lag).
- The asset has low free float on the Korean side at open — that's what creates the gap.
- You can act inside minutes. Premium half-life is usually 5–60 minutes; major-cap listings sometimes converge in seconds.
The trade structurally fails when the Korean exchange opens deposits hours before trading (price has already converged) or when the listing is a re-listing/network swap (no excitement premium).
Data you need
- Historical Korean listings —
/api/v1/listings/historical— Upbit/Bithumb KRW-market listing history for backtesting and regime detection. - Exchange announcements —
/api/v1/cex/announcements— listing/delisting/notice feed across CEXs. Filtercategory=listingandexchange=upbit,bithumb. - Real-time listing stream —
ws/v1/announcement/listing— push notification the moment a listing post is detected. This is the latency-critical input for live trading; polling REST gives up the alpha. - Token updates —
/api/v1/cex/token-updates— wallet status/network changes that precede some listings. - Symbol metadata —
/api/v1/cex/symbol/metadata— confirm the asset is supported on your global venue and which networks it ships on. - Premium snapshot —
/api/v1/premium— measure the live gap between the Korean and global venue once trading opens. - Wallet status —
/api/v1/wallet-status— confirm withdrawal is enabled for the network you plan to bridge over. - Symbol cautions / delisting schedule —
/api/v1/cex/symbol/active-symbol-cautions,/api/v1/cex/symbol/delisting-schedule— avoid trading into a token flagged for delisting (Upbit's유의종목warning).
API recipe
Monitor the listing announcement feed and filter by Korean exchange:
- cURL
- Python
- Go
- TypeScript
curl -G 'https://api.datamaxiplus.com/api/v1/cex/announcements' \
-H 'X-DTMX-APIKEY: '"$YOUR_API_KEY" \
--data-urlencode 'exchange=upbit,bithumb' \
--data-urlencode 'category=listing' \
--data-urlencode 'sort=desc' \
--data-urlencode 'limit=20'
import os
import requests
resp = requests.get(
"https://api.datamaxiplus.com/api/v1/cex/announcements",
headers={"X-DTMX-APIKEY": os.environ["DTMX_API_KEY"]},
params={
"exchange": "upbit,bithumb",
"category": "listing",
"sort": "desc",
"limit": 20,
},
timeout=10,
)
for row in resp.json().get("data", []):
print(row["timestamp"], row["exchange"], row["title"])
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
)
func main() {
q := url.Values{
"exchange": {"upbit,bithumb"},
"category": {"listing"},
"sort": {"desc"},
"limit": {"20"},
}
req, _ := http.NewRequest("GET",
"https://api.datamaxiplus.com/api/v1/cex/announcements?"+q.Encode(), nil)
req.Header.Set("X-DTMX-APIKEY", os.Getenv("DTMX_API_KEY"))
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var out struct{ Data []map[string]any `json:"data"` }
json.NewDecoder(resp.Body).Decode(&out)
for _, r := range out.Data { fmt.Println(r["timestamp"], r["title"]) }
}
import axios from "axios";
const { data } = await axios.get(
"https://api.datamaxiplus.com/api/v1/cex/announcements",
{
headers: { "X-DTMX-APIKEY": process.env.DTMX_API_KEY! },
params: {
exchange: "upbit,bithumb",
category: "listing",
sort: "desc",
limit: 20,
},
},
);
data.data.forEach((a: any) => console.log(a.timestamp, a.exchange, a.title));
For live trading the REST poll is too slow — subscribe to the listing WebSocket:
websocat 'wss://api.datamaxiplus.com/ws/v1/announcement/listing' \
-H 'X-DTMX-APIKEY: '"$YOUR_API_KEY"
Risks & caveats
- Deposit-vs-trading gap. Many Upbit listings open trading before deposits (or vice versa). If you can't deposit your pre-staged inventory in time, you can't sell into the spike. Read the exact announcement timing, not just the headline.
- Listing dump risk. Pre-existing holders use the new KRW liquidity to exit. Even if the price spikes 30%, you may be selling into the same wall.
- Withdrawal freeze on the source venue. Global exchanges sometimes pause withdrawals on the asset right before a Korean listing — confirm
/api/v1/wallet-statusbefore assuming you can move. - Latency tail risk. The announcement-to-quote window is sub-second for the top market makers. Without colo or a low-latency WS feed, you're the exit liquidity, not the alpha.
유의종목(caution) tagging. Tokens placed on Upbit's investment-caution list can dump 30–70% in minutes. Cross-check/api/v1/cex/symbol/active-symbol-cautions.- Regulatory. Upbit/Bithumb listings have, historically, been investigated for selective-disclosure. Front-running announcements with off-exchange information is legally risky in Korea.
This playbook's tactics (timing patterns, caution-tag behavior, deposit-vs-trade gap quirks) reflect Korean-exchange conventions current as of mid-2026. Exchange policies change. Always validate against the live announcement text and the venue's current rule book before sizing up.
Further reading
- Arbitrage page (UI) — broader arbitrage context.
- Premium page (UI) — measure the post-listing gap once trading opens.
- Announcements API reference — schema and filter options.
- Listing API reference — historical listing data for backtesting.
- Listing WebSocket reference — push feed for live trading.