{
  "version": "2026-09-04",
  "generatedAt": "2026-09-04",
  "datasets": [
    {
      "id": "spx-gex",
      "name": "SPX dealer gamma exposure",
      "upstreamSource": "CBOE delayed options chain (daily-settled open interest) crossed with Schwab implied volatility when available",
      "kind": "measured",
      "refreshCadence": "25 second server cache on /api/public/gex and /api/v1/gex/spx",
      "vintageSemantics": "Daily-settled Cboe open interest. Settlement session is exposed as oiSettleDate on heatmap payloads and settlementDate on archived OI snapshots under backend/data/oi_snapshots.",
      "publicEndpoints": [
        "/api/public/gex?symbol=SPX",
        "/api/v1/gex/spx"
      ],
      "redistributionLimit": "Anonymous access is rate limited; do not present as real-time."
    },
    {
      "id": "gex-heatmap",
      "name": "SPX gamma heatmap by strike and expiration",
      "upstreamSource": "CBOE delayed options chain",
      "kind": "measured",
      "refreshCadence": "5 minute server cache on /api/public/gex/heatmap",
      "vintageSemantics": "Daily-settled Cboe open interest. oiSettleDate names the settlement session; priorSettleDate names the prior session used for overnight change.",
      "publicEndpoints": [
        "/api/public/gex/heatmap?symbol=SPX"
      ],
      "redistributionLimit": "Open interest is settlement data, not intraday positioning."
    },
    {
      "id": "oi-change",
      "name": "Overnight open interest change by strike",
      "upstreamSource": "Cboe delayed quotes archived at settlement",
      "kind": "measured",
      "refreshCadence": "once per session before the open",
      "vintageSemantics": "Published only when two consecutive archived settlement vintages exist for a symbol; otherwise absent with reason single_vintage, gap, or unreadable.",
      "publicEndpoints": [
        "/api/public/oi-change/{symbol}",
        "/api/public/oi-change/scan"
      ],
      "redistributionLimit": "Open interest change between settlements, not volume or order flow."
    },
    {
      "id": "market-tide",
      "name": "Session-cumulative net options premium",
      "upstreamSource": "Schwab to Cboe delayed options chain, via the unusual activity scanner",
      "kind": "measured",
      "refreshCadence": "one capture every 15 seconds during regular hours",
      "vintageSemantics": "sessionDate names the Pacific-time session the curve covers. The curve resets at the 06:30 America/Los_Angeles open and the last completed session is served after hours.",
      "publicEndpoints": [
        "/api/public/market-tide"
      ],
      "redistributionLimit": "Aggregated from a delayed option chain, not a signed tape. Side is inferred from the quote and mid-market premium is reported separately as unknown."
    },
    {
      "id": "gex-session-log",
      "name": "SPX GEX session event log",
      "upstreamSource": "Archived intraday GEX snapshots written by gex_session_log",
      "kind": "measured",
      "refreshCadence": "5 minute server cache; underlying archive gains a record every 30 minutes during sessions",
      "vintageSemantics": "sessionDate on each payload names the US equity session the log covers.",
      "publicEndpoints": [
        "/api/public/gex/session-log"
      ],
      "redistributionLimit": "Event log only; not a trade record."
    },
    {
      "id": "spx-max-pain",
      "name": "SPX options max pain",
      "upstreamSource": "CBOE delayed SPX options chain",
      "kind": "measured",
      "refreshCadence": "120 second edge cache on /api/public/spx-max-pain",
      "vintageSemantics": "Daily-settled Cboe open interest on the selected expiration; expiration query parameter selects the series.",
      "publicEndpoints": [
        "/api/public/spx-max-pain",
        "/api/v1/options/max-pain/SPX"
      ],
      "redistributionLimit": "Delayed chain; not a price forecast."
    },
    {
      "id": "vix-term-structure",
      "name": "VIX futures term structure",
      "upstreamSource": "CBOE VIX monthly futures settlement CSV",
      "kind": "measured",
      "refreshCadence": "Service-level cache inside vix_term_structure_service",
      "vintageSemantics": "Official delayed CBOE monthly VIX futures settlement curve for the latest available trade date.",
      "publicEndpoints": [
        "/api/public/vix-term-structure",
        "/api/v1/vix/term-structure"
      ],
      "redistributionLimit": "CBOE delayed data; cite capture time when quoting levels."
    },
    {
      "id": "options-flow-unusual",
      "name": "Unusual options activity estimates",
      "upstreamSource": "Delayed official options chain via options_flow_scanner",
      "kind": "measured",
      "refreshCadence": "60 second scan cadence when the cash market is open; last session when closed",
      "vintageSemantics": "Activity is estimated from displayed volume and midpoint premium on the delayed chain, not from exchange-reported prints.",
      "publicEndpoints": [
        "/api/public/options-flow",
        "/api/v1/options/flow/unusual"
      ],
      "redistributionLimit": "Rows are observations, not prints; direction is inferred, not confirmed intent."
    },
    {
      "id": "sector-rotation",
      "name": "US sector rotation dashboard",
      "upstreamSource": "Finnhub quotes and daily history for 11 GICS sector ETFs",
      "kind": "measured",
      "refreshCadence": "60 second stale-while-revalidate cache on /api/sectors",
      "vintageSemantics": "Intraday percent change versus the prior regular-session close for each sector ETF.",
      "publicEndpoints": [
        "/api/sectors",
        "/api/v1/sectors/rotation"
      ],
      "redistributionLimit": "Finnhub delayed quotes; redistribution subject to Finnhub terms."
    },
    {
      "id": "dark-pool-dix",
      "name": "Dark Index (DIX)",
      "upstreamSource": "SqueezeMetrics public DIX.csv",
      "kind": "measured",
      "refreshCadence": "Daily after SqueezeMetrics publishes the CSV",
      "vintageSemantics": "Each row is the published daily DIX reading with its trade date.",
      "publicEndpoints": [
        "/api/darkpool-enhanced/dix"
      ],
      "redistributionLimit": "SqueezeMetrics data; attribute the source."
    },
    {
      "id": "dark-pool-tape",
      "name": "Dark-pool block tape",
      "upstreamSource": "Internal model calibrated from FINRA short-volume statistics; not ADF prints",
      "kind": "modeled",
      "refreshCadence": "WebSocket darkpool events about every 12 seconds in the terminal feed",
      "vintageSemantics": "Synthetic block estimates aggregated by ticker; not individual exchange-reported prints.",
      "publicEndpoints": [
        "/api/darkpool",
        "/api/darkpool-enhanced/orders"
      ],
      "redistributionLimit": "Modeled tape only; never cite as real FINRA ADF prints."
    },
    {
      "id": "lab-paper-record",
      "name": "Lab paper-trading research record",
      "upstreamSource": "D2DT research engines exported to lab_reader",
      "kind": "measured",
      "refreshCadence": "60 second cache on /api/public/lab during regular hours",
      "vintageSemantics": "Each trade is a simulated paper position against live market data; exportedAt timestamps the snapshot.",
      "publicEndpoints": [
        "/api/public/lab",
        "/api/public/lab/scoreboard"
      ],
      "redistributionLimit": "Paper trading only; not executed trades or investment performance."
    },
    {
      "id": "dark-pool-prints-retired",
      "name": "Dark-pool prints API (retired)",
      "upstreamSource": "None; endpoint stub only",
      "kind": "retired",
      "refreshCadence": "Not applicable",
      "vintageSemantics": "Returns available:false since 2026-08-25.",
      "publicEndpoints": [
        "/api/v1/dark-pool/prints"
      ],
      "redistributionLimit": "Do not redistribute; endpoint exists only to explain retirement to existing integrations."
    }
  ]
}