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.
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, orboth.
- Name
notional- Type
- number
- Description
- Position notional echoed in scanner metadata. Defaults to 10000; use
minDepthUsdto 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
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.