Kimchi Premium
What it is
The "kimchi premium" is the persistent price gap between BTC (and other major assets) quoted in KRW on Korean exchanges — primarily Upbit and Bithumb — and the same asset quoted in USD/USDT on global venues such as Binance, OKX, or Bybit. When Korean retail demand outpaces the ability to move USD into KRW (and vice versa), Korean prices drift above global prices. The gap is typically 0.5–3% but has historically spiked above 20% in extreme regimes (early 2018, May 2021).
The strategy: buy the asset cheap on a global exchange, withdraw it to a Korean exchange, sell into KRW, then recycle KRW back to USD through banking or stablecoin channels — repeat. The price gap is the gross spread; the round-trip cost of moving fiat between currency zones is what makes the trade hard.
When it works
- KRW deposits/withdrawals are operational on the Korean exchange (not all stablecoin off-ramps are open at all times).
- Retail risk-on sentiment is high in Korea — the premium widens with local FOMO.
- USD-to-KRW conversion isn't bottlenecked by daily/monthly bank-transfer caps or KYC review.
- You have working capital on both sides already deployed; the strategy is mostly profitable in the recycling step, not the one-shot transfer.
It does not work as a single round-trip from cold when the premium is below ~1.5%. Transfer time (10–60 min), exchange fees (0.05–0.25% each side), and FX spreads usually eat thinner gaps.
Data you need
- Premium snapshot —
/api/v1/premium— cross-exchange price differentials in unified format. Filter byfromMarket=binanceandtoMarket=upbit(or similar). - Premium markets list —
/api/v1/premium/markets— which exchange pairs are supported. - Premium symbols —
/api/v1/premium/symbols— which assets are quoted on both sides. - Wallet status —
/api/v1/wallet-status— is deposit/withdrawal currently enabled, on which network, and what is the withdrawal fee. Critical: a 4% premium with a frozen wallet is zero. - Trading fees —
/api/v1/cex/fees— taker/maker fees per venue. - Real-time price stream —
ws/v1/cex/premium— push updates for premium changes if you're running a watcher.
API recipe
Pull the current Binance→Upbit premium snapshot, filtered to transferable opportunities only.
- cURL
- Python
- Go
- TypeScript
curl -G 'https://api.datamaxiplus.com/api/v1/premium' \
-H 'X-DTMX-APIKEY: '"$YOUR_API_KEY" \
--data-urlencode 'fromMarket=binance' \
--data-urlencode 'toMarket=upbit' \
--data-urlencode 'sort=desc' \
--data-urlencode 'key=premium'
import os
import requests
resp = requests.get(
"https://api.datamaxiplus.com/api/v1/premium",
headers={"X-DTMX-APIKEY": os.environ["DTMX_API_KEY"]},
params={
"fromMarket": "binance",
"toMarket": "upbit",
"sort": "desc",
"key": "premium",
},
timeout=10,
)
resp.raise_for_status()
for row in resp.json().get("data", [])[:10]:
print(row["symbol"], row["premium"], row["fromPrice"], row["toPrice"])
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
)
func main() {
q := url.Values{}
q.Set("fromMarket", "binance")
q.Set("toMarket", "upbit")
q.Set("sort", "desc")
q.Set("key", "premium")
req, _ := http.NewRequest("GET",
"https://api.datamaxiplus.com/api/v1/premium?"+q.Encode(), nil)
req.Header.Set("X-DTMX-APIKEY", os.Getenv("DTMX_API_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
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) }
}
import axios from "axios";
const { data } = await axios.get("https://api.datamaxiplus.com/api/v1/premium", {
headers: { "X-DTMX-APIKEY": process.env.DTMX_API_KEY! },
params: {
fromMarket: "binance",
toMarket: "upbit",
sort: "desc",
key: "premium",
},
});
console.log(data.data.slice(0, 10));
Then check withdrawal status for the asset you'd actually transfer:
curl -G 'https://api.datamaxiplus.com/api/v1/wallet-status' \
-H 'X-DTMX-APIKEY: '"$YOUR_API_KEY" \
--data-urlencode 'exchange=binance' \
--data-urlencode 'asset=XRP'
Risks & caveats
- Fiat round-trip is the real bottleneck. The KRW leg of the cycle is gated by Korean bank rules, exchange KYC tier, and travel-rule reporting. Closing the loop can take days.
- Settlement timing. Premium can compress 30–60% during the network transfer window. Use fast networks (XRP, TRX, BSC) — not BTC or ETH mainnet — for the asset leg.
- Withdrawal freezes. Korean exchanges periodically suspend withdrawals on specific assets, especially during volatility. A 3% premium with a frozen wallet is unrealized forever.
- Regulatory. Korean VASP rules and travel-rule enforcement (
100만원thresholds) require name-matched bank accounts; cross-jurisdiction transfers attract review. - Reverse premium. During bearish regimes the premium goes negative ("backwardation"). You'd need a position on the Korean side already to harvest it — most operators don't.
- Tax. Korea taxes crypto gains separately from FX gains; book the FX leg correctly.
Further reading
- Arbitrage page guide (Spot) — UI-level explanation of how the platform surfaces these opportunities.
- Home page · Korea Premium Chart — Upbit-vs-Binance BTC premium index for context.
- Premium endpoint reference — full schema and pagination details.
- Wallet status reference — pre-trade transfer feasibility check.