Skip to content

Dated Futures Basis

Buy spot, sell dated futures, and rank cash-and-carry opportunities by fee-adjusted annualized basis. The main grid stays compact while each row exposes the full execution and formula breakdown in the detail panel.


GET/v1/arbitrage/dated-futures-basis

List dated futures basis rows

The main scanner grid shows Rank, Coin, Venues, Contract, Expiry, Spot Ask, Future Bid, Basis, Net APR, Liquidity, and Updated. Row details include annualized basis, fees, volume, open interest, depth, source timestamps, and the heatmap breakdown.

Query parameters

  • Name
    coin
    Type
    string
    Description
    Optional base coin. Supported launch coins: BTC, ETH, SOL, XRP, DOGE, MNT, XAUT.
  • Name
    exchanges
    Type
    string
    Description
    Comma-separated exchanges such as Binance,Bybit,OKX,Deribit.
  • Name
    minApr
    Type
    number
    Description
    Minimum netAprPct in percentage points.
  • Name
    minOiUsd
    Type
    number
    Description
    Minimum open interest in USD.
  • Name
    minVolumeUsd
    Type
    number
    Description
    Minimum 24h futures volume in USD.
  • Name
    minDepthUsd
    Type
    number
    Description
    Minimum executable depth in USD. Rows without depth are filtered out when this is set.
  • Name
    marginType
    Type
    string
    Description
    Futures margin filter: linear, inverse, or both.
  • Name
    notional
    Type
    number
    Description
    Position notional echoed in scanner metadata. Defaults to 10000; use minDepthUsd to enforce executable capacity.
  • Name
    limit
    Type
    integer
    Description
    Rows per page. Defaults to 100.
  • Name
    cursor
    Type
    string
    Description
    Opaque cursor from the previous page.

Request

GET
/v1/arbitrage/dated-futures-basis
curl -G https://www.sharpe.ai/api/v1/arbitrage/dated-futures-basis \
  -H "Authorization: Bearer sk_live_your_key_here" \
  -d coin=BTC \
  -d minApr=5

Response

{
  "data": {
    "rows": [
      {
        "rank": 1,
        "coin": "BTC",
        "spotVenue": "Binance",
        "futuresVenue": "Binance",
        "contract": "BTCUSDT_260626",
        "expiry": "2026-06-26T08:00:00.000Z",
        "days": 34.25,
        "spotAsk": 109000,
        "futureBid": 110250,
        "basisPct": 1.1468,
        "annualizedBasisPct": 12.309,
        "netAprPct": 10.16,
        "volume24hUsd": 120000000,
        "openInterestUsd": 90000000,
        "depthUsd": 75000,
        "executionStatus": "executable",
        "feesPct": 0.2,
        "updatedAt": "2026-05-23T10:30:00.000Z"
      }
    ],
    "scannerMeta": {
      "kind": "dated-futures-basis",
      "status": "ok",
      "source": "supabase",
      "notionalUsd": 10000
    },
    "pagination": { "cursor": null, "has_more": false, "total": 1 }
  },
  "meta": {
    "request_id": "req_abc123def456ghij",
    "timestamp": "2026-05-23T10:30:00.000Z",
    "elapsed_ms": 18
  }
}

Formula

basisPct = (futureBid - spotAsk) / spotAsk * 100

netAprPct = (basisPct - feesPct) * 365 / daysToExpiry

daysToExpiry preserves fractional days. Reference/last prices remain available to the futures charts, but the arbitrage row is emitted only when spotAsk and futureBid are present. depthUsd is the smaller normalized top-level notional when both legs expose size; otherwise it is null. Market impact beyond the displayed top level is not included in netAprPct; set minDepthUsd and re-check the full books before execution.

executionStatus is executable when the row's snapshot is inside the freshness SLA and indicative when it is not. An indicative row keeps every figure — the quote was real when it was taken — but it is too old to act on, so indicative rows sort below executable ones and should not be treated as a live opportunity. Cross-check updatedAt and isStale.

Was this page helpful?