Open Interest Diff API - Day-Over-Day OI Changes by Contract - FlashAlpha Lab API
Lab API OI Diff

Open Interest Diff API

Day-over-day open-interest deltas: per-contract changes (today's OI minus the prior trading day's OI), the top-N changes sorted by absolute magnitude, and call/put aggregate totals.

Endpoint

GET /v1/exposure/oi-diff/{symbol}
Auth required (X-Api-Key) Rate Limited: Yes Growth plan+

Parameters

Name In Required Default Description
symbol path yes - Underlying symbol
topN query no 10 Clamped to [1, 100]
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://lab.flashalpha.com/v1/exposure/oi-diff/SPY?topN=5"
import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/exposure/oi-diff/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"},
    params={"topN": 5}
)
data = resp.json()
print(f"Net call OI change: {data['total_call_oi_change']:,}")
const resp = await fetch(
  "https://lab.flashalpha.com/v1/exposure/oi-diff/SPY?topN=5",
  { headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
console.log("Net call OI change: " + data.total_call_oi_change.toLocaleString());

Response

{
  "symbol": "SPY",
  "underlying_price": 597.50,
  "as_of": "2026-05-30T15:30:00Z",
  "prior_snapshot_available": true,
  "total_call_oi_change": 124000,
  "total_put_oi_change": -38000,
  "top_oi_changes": [
    { "strike": 600.0, "type": "C", "expiry": "2026-06-18", "today_oi": 35000, "prior_oi": 30000, "oi_change": 5000 }
  ]
}

Key Response Fields

Field Description
prior_snapshot_availablefalse when no prior-day OI data has been written to the source table yet; total_*_oi_change are then 0 and top_oi_changes is empty.
total_call_oi_changeSum of per-contract deltas across all call contracts that have a prior-day match.
total_put_oi_changeSame for puts.
top_oi_changes[]Sorted by |oi_change| descending. Each row carries the contract's strike, type, expiry, today's OI, prior OI, and the signed delta.

Errors

Status Description
403Requires Growth plan or higher
404Symbol not found or no data

About

The OI diff endpoint reports day-over-day open-interest changes per contract, filling the gap behind the top_oi_changes: [] placeholder in /v1/exposure/narrative. It computes today's OI minus the prior trading day's OI for each contract, returns the top-N rows by absolute magnitude, and reports call and put aggregate change totals.

Contracts present today with no prior-day entry are excluded from the top-N because no delta is computable. The prior-day OI lookup currently points at a stub source; once the ExposureStrikeSnapshots writer pipeline ships, prior_snapshot_available flips to true and deltas populate with no client change. For point-in-time historical OI diffs, use historical.flashalpha.com with two ?at= calls (today's date and the prior trading day).

Common Use Cases

  • Spot overnight positioning shifts - the per-contract OI delta shows where dealers added or unwound exposure since yesterday, the first read on a fresh build
  • Rank the biggest builds and unwinds - top_oi_changes surfaces the largest absolute OI moves so you can focus on the strikes that actually moved positioning
  • Gauge net call vs put flow - the aggregate change totals separate call-side from put-side OI growth to read directional bias in new positioning
  • Confirm GEX shifts have a cause - pair an OI build at a strike with that strike's gamma to tell a real wall forming from a same-day repricing artifact
  • Filter computable contracts only - rows with no prior-day entry are excluded, so the delta set is limited to contracts where a true day-over-day change exists
  • Run point-in-time historical diffs - until prior_snapshot_available flips true, use two ?at= calls on historical.flashalpha.com for exact two-date OI deltas

Related reading

Complementary endpoints

Ready to build?

Get your free API key and start pulling live options data in 30 seconds.