CEX-CEX Spread (Premium)
What it is
The same crypto asset trades simultaneously on dozens of centralized exchanges, and at any moment its price differs across venues. The CEX-CEX spread strategy — surfaced on the platform as the Premium dashboard — buys the asset where it's cheap and sells where it's expensive. When you can hold inventory on both exchanges, you don't even need to transfer per trade: you flip-flop the position and rebalance only when one side runs low.
Variants:
- Spot-spot — same asset, two spot books. Easiest to reason about, lowest carry cost.
- Spot-perp — long spot one venue, short perp another. Capturing the basis plus funding.
- Perp-perp — long one venue's perp, short another's. Net P&L = price-gap arb + net funding (see Arbitrage across Perpetuals).
This is the foundational arb strategy crypto inherited from FX and equities. The premium has compressed dramatically over the years — most majors sit inside 5 bps across top venues — so the alpha now lives in mid-cap and long-tail assets, in fast networks (sub-minute transfers), and in inventory-pre-positioned operations.
When it works
- The asset is liquid on both legs — order-book depth at top-of-book ≥ your target size × 5 (so you don't move price during execution).
- A transferable network exists between the two venues and is operational right now (not in maintenance, no congestion-driven fee spike).
- Combined taker fees + withdrawal fee + slippage < spread. For majors at 0.1%/side fees, you need >25 bps net to clear after slippage.
- For inventory-balanced ops: 24h volume ratio between the two venues is roughly stable, so you don't accumulate one-sided inventory.
Data you need
- Premium snapshot —
/api/v1/premium— the canonical cross-exchange price-gap table. Filter by source/target market. - Premium markets —
/api/v1/premium/markets— supported(fromMarket, toMarket)pairs. - Premium symbols —
/api/v1/premium/symbols— supported asset universe. - Real-time premium WS —
ws/v1/cex/premium— push updates when the gap moves. - Trading fees —
/api/v1/cex/fees— per-venue maker/taker for accurate net spread. - Wallet status —
/api/v1/wallet-status— withdrawal-enabled flag and fee per network for rebalancing. - 24h volume per exchange —
/api/v1/cex/symbol/per-exchange-24-h-volume— confirm the venue can actually absorb your size. - Ticker —
/api/v1/ticker— last-trade/mid as a sanity check against the premium feed.
API recipe
Pull the top spot-spot opportunities between Binance and Bybit, sorted by premium magnitude:
- 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=bybit' \
--data-urlencode 'sort=desc' \
--data-urlencode 'key=premium' \
--data-urlencode 'limit=25'
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": "bybit",
"sort": "desc",
"key": "premium",
"limit": 25,
},
timeout=10,
)
for row in resp.json().get("data", []):
print(f"{row['symbol']:<14} premium={row['premium']:.3%} "
f"from={row['fromPrice']} to={row['toPrice']}")
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
)
func main() {
q := url.Values{
"fromMarket": {"binance"},
"toMarket": {"bybit"},
"sort": {"desc"},
"key": {"premium"},
"limit": {"25"},
}
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, _ := 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) }
}
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: "bybit",
sort: "desc",
key: "premium",
limit: 25,
},
});
console.log(data.data);
Before sizing up, confirm transferability of the source asset over a fast network:
curl -G 'https://api.datamaxiplus.com/api/v1/wallet-status' \
-H 'X-DTMX-APIKEY: '"$YOUR_API_KEY" \
--data-urlencode 'exchange=binance' \
--data-urlencode 'asset=USDT'
Risks & caveats
- Transfer time kills the trade. A 40 bps gross spread evaporates in 30 minutes of network congestion. Use TRC20/BSC/SOL for stables, not ERC20. For non-stables, pre-balance inventory and never transfer per trade.
- Withdrawal-fee math. Withdrawal fee is a fixed amount, not a percentage. On small sizes it dominates the spread; you need a minimum trade size to be profitable.
- Maintenance windows. Exchanges occasionally pause deposits/withdrawals for chain upgrades. Always poll wallet status before committing.
- Adverse selection on quote feeds. The premium you see at REST poll time is stale by 1+ second. Use the WS feed if you're aiming to compete on speed.
- API rate limits and order-fill latency. Lower-tier API access can mean 200–500ms round-trip on order placement. The spread may close in that window.
- Stuck inventory. A network outage (Solana stalls, Ethereum gas spikes) can leave you holding the wrong side for hours.
Further reading
- Arbitrage across Spots (UI) — visual walk-through with PnL math.
- Premium page (UI) — full premium dashboard explanation.
- Premium API reference — endpoint schemas and pagination.
- Premium WebSocket reference — real-time premium push stream.
- Wallet status reference — pre-trade transfer check.