Skip to content

Perp vs Dated Carry

Compare expected perpetual funding over the dated contract holding window against locked dated-futures basis. Positive carry edge favors the perp carry leg; negative edge favors dated cash-and-carry.


GET/v1/arbitrage/perp-dated-carry

List perp-dated carry rows

The main scanner grid shows Rank, Coin, Venues, Dated Contract, Expiry, Funding APR, Dated Basis, fee-adjusted Net APR, Best Leg, Liquidity, and Updated. Row details include expected funding to expiry, gross and net carry through expiry, next funding, funding stability, executable dated depth, minimum open interest, and the oldest contributing timestamp.

Query parameters

  • Name
    coin
    Type
    string
    Description
    Optional base coin.
  • Name
    exchanges
    Type
    string
    Description
    Comma-separated exchange filter applied to funding and dated-futures venues.
  • Name
    minApr
    Type
    number
    Description
    Minimum fee-adjusted netCarryAprPct in percentage points.
  • Name
    minOiUsd
    Type
    number
    Description
    Minimum open interest in USD when available.
  • Name
    minVolumeUsd
    Type
    number
    Description
    Minimum 24h futures volume in USD when available.
  • Name
    minDepthUsd
    Type
    number
    Description
    Minimum executable depth in USD when depth is available.
  • 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 dated-leg 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/perp-dated-carry
curl -G https://www.sharpe.ai/api/v1/arbitrage/perp-dated-carry \
  -H "Authorization: Bearer sk_live_your_key_here" \
  -d coin=SOL

Response

{
  "data": {
    "rows": [
      {
        "rank": 1,
        "coin": "SOL",
        "perpVenue": "Bybit",
        "datedVenue": "Binance",
        "datedContract": "SOLUSDT_260626",
        "expiry": "2026-06-26T08:00:00.000Z",
        "days": 34,
        "perpFundingAprPct": 18.25,
        "expectedFundingToExpiryPct": 1.7,
        "datedBasisPct": 1.1,
        "carryEdgePct": 0.6,
        "netCarryEdgePct": 0.41,
        "grossCarryAprPct": 6.4412,
        "netCarryAprPct": 4.4029,
        "bestLeg": "Perp Carry",
        "nextFunding": "2026-05-23T16:00:00.000Z",
        "funding7dStabilityPct": 0.3,
        "executableDepthUsd": 64000,
        "minOpenInterestUsd": 21000000,
        "oiDepthUsd": 64000,
        "executionStatus": "executable",
        "updatedAt": "2026-05-23T10:30:00.000Z"
      }
    ],
    "scannerMeta": {
      "kind": "perp-dated-carry",
      "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": 16
  }
}

Formula

perpFundingAprPct = fundingRate * (24 / intervalHours) * 365 * 100

expectedFundingToExpiryPct = perpFundingAprPct * daysToExpiry / 365

carryEdgePct = expectedFundingToExpiryPct - datedBasisPct

netCarryEdgePct = abs(carryEdgePct) - roundTripFeePct

netCarryAprPct = netCarryEdgePct * 365 / daysToExpiry

The best-direction return may be negative when fees exceed the gross edge. minApr and ranking use netCarryAprPct; the to-expiry field is never mislabeled as APR. executableDepthUsd measures the spot/dated-futures top-of-book capacity, while minOpenInterestUsd covers the dated and perpetual contracts. oiDepthUsd remains only as a backward-compatible mixed fallback. Perpetual entry basis, borrow cost, and market impact beyond displayed dated quotes are not modeled and must be checked 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?