Largest options activity cells from full-chain captures
/api/v1/options/flow/unusualOptions 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
| Name | Location | Type | Description |
|---|---|---|---|
limit | query | integer | Maximum 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.