Flow OI API - Raw OI Simulator State | FlashAlpha
  1. Open Interest Simulator

Open Interest Simulator API

Raw OI simulator state: official, simulated, and effective open interest, plus intraday delta and the simulator's confidence weight.

Endpoint

GET /v1/flow/oi/{symbol}
Auth required (X-Api-Key) Rate Limited: Yes Plan: Alpha+

Parameters

Name In Type Required Default Description
symbol path string required - Underlying symbol
expiry query date all expiries Filter chain to a single expiry (yyyy-MM-dd). Omit to aggregate across all expiries. Invalid values return 400 invalid_expiry.

Request

curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://lab.flashalpha.com/v1/flow/oi/SPY"
import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/flow/oi/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
resp.raise_for_status()
data = resp.json()
print(f"Official OI:  {data['official_oi']:,}")
print(f"Effective OI: {data['effective_oi']:,}")
print(f"Intraday delta: {data['intraday_oi_delta']:,}")
const resp = await fetch(
  "https://lab.flashalpha.com/v1/flow/oi/SPY",
  { headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();
console.log(`Official OI:  ${data.official_oi.toLocaleString()}`);
console.log(`Effective OI: ${data.effective_oi.toLocaleString()}`);
console.log(`Intraday delta: ${data.intraday_oi_delta.toLocaleString()}`);

Try it live

Runs on live market data and uses 1 request from your daily quota.

GET

Response

{
  "symbol": "SPY",
  "as_of": "2026-10-30T13:45:49.7452098Z",
  "expiry": null,
  "official_oi": 18161399,
  "simulated_oi": 18186080,
  "intraday_oi_delta": 24681,
  "oi_delta_confidence": 0.43,
  "effective_oi": 18187654,
  "contracts_total": 12318,
  "contracts_with_flow": 1382,
  "endpoint_version": "2026.09.30",
  "data_as_of": {
    "node": "fa5",
    "equity_feed": "2026-10-30T13:45:49.435Z",
    "equity_options_feed": "2026-10-30T13:45:48Z",
    "index_feed": "2026-10-30T13:45:47.104Z",
    "index_options_feed": "2026-10-30T13:45:45Z",
    "futures_feed": "2026-10-30T13:45:48.621Z",
    "futures_options_feed": "2026-10-30T13:45:49.081Z",
    "flow_feed": "2026-10-30T13:45:00Z",
    "oi_feed": "2026-10-29T20:00:00Z",
    "macro_feed": "2026-10-29T21:00:20Z"
  }
}

Sending request…

See this endpoint on live data

Send this exact request and the real response shows up here, right next to the example.

Response Fields

Field Type Description
official_oinumberSum of morning OPRA-broadcast OI across the chain
simulated_oinumberofficial + intraday_oi_delta aggregated (unclamped, surfaces overshoot)
intraday_oi_deltanumberSum of the simulator's signed per-contract delta. Never reconstructed from (effective - official) - that loses magnitude when a per-contract value overshot zero and got clamped
oi_delta_confidencenumberPer-trade confidence weight applied by the upstream simulator (currently 0.43)
effective_oinumberSum of per-contract max(0, official + delta) - what the analytics endpoints actually consume
contracts_with_flownumberNumber of contracts where intraday_delta != 0
symbolstringUnderlying symbol
as_ofstringTimestamp of the data (ISO 8601, UTC)
expirystring | nullThe expiry filter from the request, null when it was omitted
contracts_totalnumberContracts total
endpoint_version, data_as_ofstring, objectResponse envelope, see Response envelope.

effective_oi can differ from max(0, simulated_oi) because the clamp is applied per-contract before aggregation.

Errors

Status Error When
400invalid_expiryexpiry is not a valid yyyy-MM-dd date.
401-Missing or invalid X-Api-Key. The body is empty; check the status code before parsing JSON.
403tier_restrictedYour plan is below Alpha. The body includes current_plan and required_plan.
404no_dataNo data for the symbol.
429Quota exceededDaily quota used up. Retry-After gives the seconds until the reset at 00:00 UTC. Rejected requests (including 403) count toward the quota.

About Flow OI

Flow OI exposes the raw simulator state that powers the rest of the /v1/flow/* family. official_oi matches the morning OPRA-broadcast OI used by the settled /v1/exposure/* endpoints. effective_oi is the per-contract clamped quantity the live analytics consume, and simulated_oi is the unclamped aggregate, which can deviate when sell pressure overshoots a contract's OI to zero. The intraday_oi_delta is the true signed sum from the simulator and intentionally cannot be reconstructed from (effective - official) - use this field if you're building your own analytics on top of the simulator.

Common Use Cases

  • Build custom analytics - drive your own GEX/DEX or pin-risk variants off effective_oi, the same per-contract clamped quantity the live Flow endpoints consume
  • Audit and reconcile - surface the gap between official_oi, simulated_oi, and effective_oi to catch overshoot or clamping artefacts before they reach exposure numbers
  • Read directional flow - the sign of intraday_oi_delta shows whether the day is net opening or net closing interest, the input to opening-vs-closing bias
  • Weight by confidence - scale signal size by oi_delta_confidence and de-rate the read when the simulator is less certain about the intraday delta
  • Gauge session breadth - contracts_with_flow / contracts_total is a rough activity-heat measure for how much of the chain is repositioning
  • Power research workflows - pair with historical exposure snapshots to study how intraday OI flow predicts end-of-day positioning

Related reading

Complementary endpoints

  • OI Diff - day-over-day open-interest changes by strike
  • Flow Live Bundle - the raw real-time tape feeding the simulator
  • Flow GEX - live flow-adjusted gamma built on this effective OI

Ready to build with FlashAlpha?

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

No credit card required Setup in 60 seconds Secure & reliable