Docs menu
Endpoint reference

Largest options activity cells from full-chain captures

GET/api/v1/options/flow/unusual

Options activity as ticker x expiry x call/put cells of full options chain captures, largest estimated premium first. Schema version 3 (2026-10-08): `data` is an object with `schemaVersion` and `cells`; each cell holds at least 3 traded contracts and is published at least 15 minutes after the capture it describes (`asOf`). No per-contract quote, volume or open interest is returned, and nothing is derived from a flagged subset of contracts.

Parameters

NameLocationTypeDescription
limitqueryintegerMaximum cells returned

Examples

curl

curl 'https://api.squawkflow.com/api/v1/options/flow/unusual?limit=25' -H "X-API-Key: $SQUAWKFLOW_API_KEY"

python

import os
import requests

response = requests.get(
    "https://api.squawkflow.com/api/v1/options/flow/unusual?limit=25",
    headers={"X-API-Key": os.environ["SQUAWKFLOW_API_KEY"]},
    timeout=15,
)
response.raise_for_status()
print(response.json()["data"])

javascript

const response = await fetch("https://api.squawkflow.com/api/v1/options/flow/unusual?limit=25", {
  headers: { "X-API-Key": process.env.SQUAWKFLOW_API_KEY },
});

if (!response.ok) throw new Error(`SquawkFlow ${response.status}`);
const { data, meta, usage } = await response.json();
console.log({ data, meta, usage });

go

package main

import (
  "fmt"
  "io"
  "net/http"
  "os"
)

func main() {
  req, _ := http.NewRequest("GET", "https://api.squawkflow.com/api/v1/options/flow/unusual?limit=25", nil)
  req.Header.Set("X-API-Key", os.Getenv("SQUAWKFLOW_API_KEY"))
  res, err := http.DefaultClient.Do(req)
  if err != nil { panic(err) }
  defer res.Body.Close()
  body, _ := io.ReadAll(res.Body)
  fmt.Println(string(body))
}

rust

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let client = reqwest::Client::new();
    let body = client
        .get("https://api.squawkflow.com/api/v1/options/flow/unusual?limit=25")
        .header("X-API-Key", std::env::var("SQUAWKFLOW_API_KEY").unwrap())
        .send().await?
        .error_for_status()?
        .text().await?;
    println!("{body}");
    Ok(())
}

Response

Successful responses use the standard success, data, meta, and usage envelope. See the live OpenAPI schema for generated response definitions.

Changelog

  • 2026-10-08, schema version 3. `data` is now `{ schemaVersion: 3, unit, minTradedContracts, publicationDelayMinutes, cells, cellCount, hasMore, suppressedCells, symbols, sessions, sessionDate, servedPreviousSession, asOf, oldestAsOf, method }`. Each cell is one ticker x expiry x call/put of a FULL options chain capture (every captured strike, not a flagged subset) with tradedContracts (at least 3; thinner cells are withheld and counted in suppressedCells), totalVolume, totalOpenInterest, volumeOiRatio, estimatedPremium, putCallRatio (null unless both the call and put cells are published), sessionDate and asOf (the capture time; every cell is published at least 15 minutes after it). Removed from version 2: groups, contractsFlagged, maxUnusualScore, flowTypes and topStrike, which described a flagged subset of contracts. `limit` counts cells.
  • 2026-10-08, schema version 2. `data` is now an object `{ schemaVersion: 2, unit, minGroupContracts, groups, groupCount, suppressedGroups, contractsFlagged, hasMore }`. Each group is one ticker x expiry x call/put of at least three flagged contracts (smaller groups are withheld and counted in suppressedGroups), built from the full flagged set before `limit` is applied, with contractsFlagged, totalVolume, totalOpenInterest, volumeOiRatio, estimatedPremium, putCallRatio (null unless both the call and put groups are published), maxUnusualScore, flowTypes and topStrike ({ strike, volumeOiBand }, a band such as "3-5x", never an exact ratio). Version 1 returned a bare list of per-contract rows with bid, ask, last, volume and open interest; SquawkFlow now publishes derived aggregates only. `limit` counts groups.