DEX Arbitrage Scanner
The DEX scanner preview endpoint resolves one or two GeckoTerminal liquidity pool URLs, compares DEX pool prices against selected centralized exchange spot markets or another DEX pool, and returns gross spread opportunities. Saved scanners and Telegram delivery live in the authenticated terminal app at /arbitrage/dex-scanner.
Preview a DEX scanner pool
Use this endpoint before creating a saved scanner. It accepts the same GeckoTerminal pool URL workflow as the terminal product, resolves pool metadata from GeckoTerminal or CoinGecko Onchain with Codex fallback, then checks selected CEX spot venues for a matching USDT market or compares against a second DEX pool.
Query parameters
- Name
poolUrl- Type
- string
- Description
Required GeckoTerminal pool URL, such as
https://www.geckoterminal.com/eth/pools/0x....
- Name
exchanges- Type
- string
- Description
Optional comma-separated CEX list. Supported values:
Binance,OKX,Bybit,Gate.io,MEXC,KuCoin,Bitget,HTX,BingX,CoinEx. Defaults to the core new-listing venues.
- Name
minProfitPct- Type
- number
- Description
Minimum gross spread percentage to mark a row as an opportunity. Defaults to
1.
- Name
mode- Type
- string
- Description
Scanner mode. Use
cex_dexfor CEX-vs-DEX comparison ordex_dexto compare two DEX pools. Defaults tocex_dex.
- Name
secondPoolUrl- Type
- string
- Description
Required when
mode=dex_dex. GeckoTerminal pool URL for the comparison pool.
- Name
tier2Exchanges- Type
- string
- Description
Optional comma-separated extended CEX list for broader coverage. Supported values include
Kraken,Coinbase,Bitfinex,Bitstamp,BitMart,LBank,Phemex,AscendEX,Crypto.com,Bitrue,WhiteBIT,Poloniex,P2B,XT,DigiFinex,BTSE,LATOKEN,Pionex,Toobit, andBitunix.
- Name
includeFundingLeg- Type
- boolean
- Description
Set to
trueto include funding-leg context when the scanner can match a relevant perpetual market.
Request
curl -G https://www.sharpe.ai/api/v1/arbitrage/dex-scanner/preview \
-H "Authorization: Bearer sk_live_your_key_here" \
--data-urlencode "poolUrl=https://www.geckoterminal.com/eth/pools/0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640" \
-d exchanges=Binance,OKX,Bybit,MEXC \
-d minProfitPct=1 \
-d mode=cex_dex
{
"data": {
"pool": {
"source": "GeckoTerminal",
"poolUrl": "https://www.geckoterminal.com/eth/pools/0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640",
"network": "eth",
"poolAddress": "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640",
"dexName": "Uniswap V3",
"targetToken": {
"symbol": "WETH",
"name": "Wrapped Ether",
"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
},
"priceUsd": 2027.45,
"liquidityUsd": 1000000,
"volume24hUsd": 250000
},
"opportunities": [
{
"token": "WETH",
"spreadPct": 1.6,
"buyVenue": "GeckoTerminal",
"sellVenue": "Binance",
"cexPrice": 2060,
"dexPrice": 2027.45,
"direction": "buy-dex-sell-cex",
"status": "opportunity"
}
],
"warnings": [],
"fetchedAt": "2026-05-23T11:00:00Z"
},
"meta": {
"request_id": "req_abc123def456ghij",
"timestamp": "2026-05-23T11:00:00Z",
"elapsed_ms": 86
}
}
Spread logic
The scanner reports clone-style gross spread, not guaranteed executable profit.
- Name
Buy DEX / Sell CEX- Type
- direction
- Description
Returned when the selected CEX spot price is above the DEX pool price.
- Name
Buy CEX / Sell DEX- Type
- direction
- Description
Returned when the DEX pool price is above the selected CEX spot price.
- Name
spreadPct- Type
- number
- Description
abs(sellPrice - buyPrice) / buyPrice * 100.
- Name
warnings- Type
- string[]
- Description
Stale, missing, or unavailable upstream data is surfaced as warnings instead of fabricated rows.
Saved scanners add ownership, Telegram chat configuration, run history, and step notification rules. Use the terminal product for those user-specific workflows.