Skip to content

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_dex for CEX-vs-DEX comparison or dex_dex to compare two DEX pools. Defaults to cex_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, and Bitunix.

  • Name
    includeFundingLeg
    Type
    boolean
    Description

    Set to true to include funding-leg context when the scanner can match a relevant perpetual market.

Request

GET
/v1/arbitrage/dex-scanner/preview
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.

Was this page helpful?