Skip to content

Cross-Exchange Arbitrage

Cross-exchange arbitrage exploits funding rate differentials for the same asset across two venues. The scanner pairs every funding venue (33, CEXs and perp DEXs) across every asset class — crypto plus RWA perps (tokenized equities, commodities, FX, indices) — ranks by the gross annualized funding differential, and prices the spread from real order books where both legs expose one, falling back to reference prices and reporting unknown market data as null rather than zero. Pairs never cross asset classes.


GET/v1/arbitrage/cross-exchange

List cross-exchange opportunities

Returns cross-exchange funding differentials ranked by gross annualized APR. An asset needs current funding with a verified per-market settlement interval on at least two selected venues; the best pair per asset is returned. Rows are never dropped for missing market data — spread, open interest and volume degrade to null. Stale funding rates older than 6 hours are excluded.

Query parameters

  • Name
    exchanges
    Type
    string
    Description

    Comma-separated list of venues to include. Accepts every funding-tracker venue (33), e.g. Binance, OKX, Bybit, Hyperliquid, WhiteBIT, Kraken, dYdX. Omit to include all venues.

  • Name
    minOiUsd
    Type
    number
    Description

    Minimum open interest in USD on the smaller leg. Defaults to 0 (no floor). A leg with unknown OI fails a positive floor.

  • Name
    minVolUsd
    Type
    number
    Description

    Minimum 24h perp volume in USD on the smaller leg. Defaults to 0 (no floor). A leg with unknown volume fails a positive floor.

  • Name
    assetClass
    Type
    string
    Description

    Underlying filter. One of all (default), crypto, or rwa — the latter covering equity, commodity, FX and index perps. Pairing always stays within one asset class.

Request

GET
/v1/arbitrage/cross-exchange
curl -G https://www.sharpe.ai/api/v1/arbitrage/cross-exchange \
  -H "Authorization: Bearer sk_live_your_key_here" \
  -d exchanges=Binance,OKX,Bybit

Response

{
  "data": [
    {
      "symbol": "DOGE",
      "assetClass": "crypto",
      "longExchange": "Gate.io",
      "shortExchange": "Binance",
      "longRate": -0.00025,
      "shortRate": 0.00035,
      "netFundingRate": 0.0006,
      "apr": 0.657,
      "grossApr": 0.657,
      "netApr": 0.608358,
      "spreadRate": 0.001998,
      "spreadSource": "book",
      "longAsk": 0.1002,
      "shortBid": 0.1000,
      "executableDepthUsd": 25000,
      "holdingDays": 30,
      "executionStatus": "executable",
      "oiLong": 4200000,
      "oiShort": 9800000,
      "volumeLong24hUsd": 5200000,
      "volumeShort24hUsd": 88000000,
      "nextSettlement": "2026-03-28T08:00:00Z",
      "intervalHours": 8
    }
  ],
  "meta": {
    "request_id": "req_def456ghi789jklm",
    "timestamp": "2026-03-28T07:45:00Z",
    "elapsed_ms": 12
  }
}

Response fields

Each object in the data array represents the best long/short exchange pair for a single asset.

  • Name
    symbol
    Type
    string
    Description

    The base asset ticker (e.g., BTC, ETH, TSLA).

  • Name
    assetClass
    Type
    string
    Description

    Underlying category: crypto, equity, commodity, fx, or index. A pair's two legs always share it.

  • Name
    longExchange
    Type
    string
    Description

    The exchange where you open the long position (receiving funding or paying the least).

  • Name
    shortExchange
    Type
    string
    Description

    The exchange where you open the short position (receiving the most funding).

  • Name
    longRate
    Type
    number
    Description

    Current funding rate on the long exchange as a decimal.

  • Name
    shortRate
    Type
    number
    Description

    Current funding rate on the short exchange as a decimal.

  • Name
    netFundingRate
    Type
    number
    Description

    Funding differential you collect per intervalHours period, as a decimal. Each leg's raw rate is normalized to hourly before subtracting, so mixed intervals (1h/4h/8h) compare correctly; the result is expressed at the pair's faster cadence.

  • Name
    apr
    Type
    number
    Description

    Gross annualized funding differential as a decimal: |netFundingRate| × (8760 / intervalHours). Entry spread and fees are one-time costs surfaced separately, not baked in.

  • Name
    grossApr
    Type
    number
    Description

    Deprecated alias of apr, retained for one release.

  • Name
    netApr
    Type
    number | null
    Description

    Spread- and fee-adjusted APR over holdingDays. Present only when spreadSource is book; null on reference-priced or unpriced rows, where a net figure would overstate precision.

  • Name
    spreadRate
    Type
    number | null
    Description

    Signed venue price gap. From (longAsk − shortBid) / midpoint when both books exist; from last/mark prices when only reference pricing exists; null when either leg has no price source.

  • Name
    spreadSource
    Type
    string | null
    Description

    book (executable quotes), reference (last/mark prices), or null.

  • Name
    longAsk
    Type
    number | null
    Description

    Best ask on the long leg when the venue exposes a book; otherwise null.

  • Name
    shortBid
    Type
    number | null
    Description

    Best bid on the short leg when the venue exposes a book; otherwise null.

  • Name
    executableDepthUsd
    Type
    number | null
    Description

    Smaller top-level quote notional when both providers expose correctly normalized size; otherwise null.

  • Name
    holdingDays
    Type
    number
    Description

    Cost-amortization horizon for netApr. Currently 30.

  • Name
    executionStatus
    Type
    string
    Description

    executable when the spread comes from real books, indicative otherwise.

  • Name
    oiLong
    Type
    number | null
    Description

    Open interest in USD on the long exchange, from live tickers with a stored-snapshot fallback. null when the venue did not report — never 0.

  • Name
    oiShort
    Type
    number | null
    Description

    Open interest in USD on the short exchange. null when unknown, never 0.

  • Name
    volumeLong24hUsd
    Type
    number | null
    Description

    24h perp turnover in USD on the long exchange, or null when the venue does not report it.

  • Name
    volumeShort24hUsd
    Type
    number | null
    Description

    24h perp turnover in USD on the short exchange, or null when unknown.

  • Name
    nextSettlement
    Type
    string | null
    Description

    ISO 8601 timestamp of the next known funding settlement, or null when neither venue reports it. Unknown time is never replaced with the request time.

  • Name
    intervalHours
    Type
    number
    Description

    Settlement cadence netFundingRate is expressed at — the faster of the two legs' funding intervals. longRate and shortRate remain in their exchanges' native per-interval terms.

Single opportunity

{
  "symbol": "BTC",
  "assetClass": "crypto",
  "longExchange": "KuCoin",
  "shortExchange": "Binance",
  "longRate": -0.00003,
  "shortRate": 0.00012,
  "netFundingRate": 0.00015,
  "apr": 0.16425,
  "grossApr": 0.16425,
  "netApr": 0.13505,
  "spreadRate": 0.0004,
  "spreadSource": "book",
  "longAsk": 104500.5,
  "shortBid": 104458.7,
  "executableDepthUsd": null,
  "holdingDays": 30,
  "executionStatus": "executable",
  "oiLong": 4200000,
  "oiShort": 9800000,
  "volumeLong24hUsd": 310000000,
  "volumeShort24hUsd": 9400000000,
  "nextSettlement": "2026-03-28T16:00:00Z",
  "intervalHours": 8
}

Was this page helpful?