DEX Arbitrage Scanner
The DEX scanner preview endpoint resolves one or two GeckoTerminal liquidity pool URLs, verifies token identity, and returns gross quote-spread candidates against selected centralized exchange spot books or another DEX pool. These are discovery signals, not executable net profit. 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 quote-spread percentage to mark a validated row as a candidate. It is not a net-profit threshold. 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. Both pools must resolve to the same canonical network and target-token contract; mismatches return400.
- Name
tier2Exchanges- Type
- string
- Description
Deprecated compatibility parameter. Extended exchanges do not yet have verified live price providers; requested values return explicit unsupported-provider warnings and no rows.
- Name
includeFundingLeg- Type
- string
- Description
Set to
trueorfalseto 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
Response
{
"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",
"priceType": "bid-ask-vs-dex-mid",
"identityVerified": true,
"dataFresh": true,
"executable": false,
"status": "opportunity",
"warnings": [
"Gross quote spread only; DEX slippage, trading fees, gas, and transfer time are not included."
]
}
],
"warnings": [
"Gross quote spread only; DEX slippage, trading fees, gas, and transfer time are not included."
],
"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 gross quote spread, not executable net profit.
- Name
Buy DEX / Sell CEX- Type
- direction
- Description
Returned when the selected CEX bid is above the DEX pool mid.
- Name
Buy CEX / Sell DEX- Type
- direction
- Description
Returned when the DEX pool mid is above the selected CEX ask.
- Name
spreadPct- Type
- number
- Description
(sellQuote - buyQuote) / buyQuote * 100. CEX legs use bid/ask when available; DEX legs remain pool mids.
- Name
status- Type
- string
- Description
opportunitymeans identity, freshness, bid/ask, liquidity, volume, and saved-route checks passed.blockedmeans one of those prerequisites is unavailable.below-thresholdis reserved for otherwise-valid data below the gross threshold.
- Name
warnings- Type
- string[]
- Description
Stale, missing, unsupported, non-executable, or identity-unverified data is surfaced explicitly instead of being promoted to an alertable row.
Saved scanners add ownership, Telegram chat configuration, run history, and step notification rules. Public transfer-route metadata is currently verified for Bitget and HTX. Other shown CEX venues can provide preview books, but their saved rows fail closed and cannot alert until a verified transfer provider is available. Use the terminal product for those user-specific workflows.