# Unusual Options Activity Scanner (Vol/OI, CBOE) (`gochujang/unusual-options-tracker`) Actor

Scans CBOE free delayed-quote API for unusual options: volume/OI ratio > threshold. Covers 80+ S\&P500 + major ETFs by default. Outputs strike, expiry, DTE, volume, OI, ratio, IV%, notional, moneyness, greeks. Filter by calls/puts, IV, DTE. No API key required.

- **URL**: https://apify.com/gochujang/unusual-options-tracker.md
- **Developed by:** [Hojun Lee](https://apify.com/gochujang) (community)
- **Categories:** Developer tools, Automation, News
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Unusual Options Activity Scanner (Vol/OI Ratio, CBOE)

> Scan **80+ S\&P 500 stocks and major ETFs** for unusual options activity — contracts where **Volume > 3× Open Interest**, a classic signal of informed institutional or insider positioning. Powered by **CBOE's free public delayed-quote API** (~15-20 min delay). No API key required.

### What it detects

When options volume suddenly far exceeds open interest on a specific strike/expiry, it signals that new money is entering the market — often before a major price move, earnings beat/miss, M\&A rumor, or macro event.

Classic signal: `Vol/OI ratio ≥ 3.0`

***

### ⚡ Run in 30 seconds

Click **Start** with defaults. The actor scans 80+ symbols concurrently and returns all options with abnormal volume.

To narrow the scan:

```json
{
  "optionType": "calls",
  "minVolume": 1000,
  "volOiThreshold": 5.0,
  "maxDte": 30
}
```

***

### Output fields

| Field | Description |
|---|---|
| `symbol` | Underlying stock/ETF ticker |
| `option_ticker` | OCC option ticker (e.g. `AAPL260819C00150000`) |
| `opt_type` | `C` (call) or `P` (put) |
| `strike` | Strike price |
| `expiry` | Expiration date (YYYY-MM-DD) |
| `dte` | Days to expiry |
| `volume` | Today's contracts traded |
| `open_interest` | Existing open contracts |
| `vol_oi_ratio` | Volume ÷ Open Interest (the signal metric) |
| `iv_pct` | Implied volatility % |
| `notional_usd` | Total notional value (volume × mid × 100) |
| `underlying_price` | Current stock price |
| `moneyness` | `ITM` / `OTM` / `ATM` (±5% threshold) |
| `delta` | Options delta |
| `gamma` | Options gamma |
| `theta` | Options theta (daily decay) |

***

### Input parameters

| Parameter | Default | Description |
|---|---|---|
| `symbols` | 80+ S\&P500+ETFs | Custom ticker list (leave empty for default scan) |
| `volOiThreshold` | `3.0` | Min Vol/OI ratio to flag as unusual |
| `minVolume` | `500` | Minimum contracts traded today |
| `minOpenInterest` | `100` | Minimum existing open contracts |
| `optionType` | `both` | `both`, `calls`, or `puts` |
| `minIvPct` | `0` | Min IV filter (e.g. `20` = exclude sub-20% IV) |
| `maxDte` | `0` | Max days to expiry (0 = no limit; `7` = weeklies only) |
| `sortBy` | `vol_oi_ratio_desc` | Sort by ratio, volume, notional, or IV |
| `limit` | `200` | Max results returned |
| `concurrency` | `8` | Parallel CBOE requests |

***

### Data source

CBOE's free delayed-quote CDN: `cdn.cboe.com/api/global/delayed_quotes/options/{SYMBOL}.json`

- **Delay**: ~15-20 minutes
- **Requires**: No API key, no login
- **Coverage**: All optionable US stocks and ETFs listed on CBOE

***

### Pricing

**Pay-Per-Event**:

- `$0.005` — per actor start (one-time)
- `$0.0001` — per unusual option row returned

| Run | Symbols scanned | Unusual results | Cost |
|---|---|---|---|
| Default scan (80 symbols) | 80 | ~50 results | $0.010 |
| Full S\&P 500 scan | 500 | ~300 results | $0.035 |
| Daily scheduled run | 80/day × 20 days | ~50/day | $0.20/mo |

***

### Automated daily scan example

Schedule this actor daily (e.g. 9:45 AM ET after market open) via Apify Schedules. Combine with a webhook to Slack or Telegram to get unusual options alerts every morning.

***

### Use cases

1. **Pre-earnings positioning** — Spot call sweeps on a stock 2-5 days before earnings
2. **M\&A speculation** — Unusual call volume on small/mid-caps often precedes acquisition rumors
3. **Macro hedging signals** — Heavy put buying on SPY/QQQ signals institutional concern
4. **Volatility plays** — High IV + unusual volume = possible IV expansion trade
5. **Dark pool correlation** — Cross-reference with dark pool prints for confirmation
6. **Daily morning scan** — Start every trading day with an unusual options briefing

***

### Limitations

- 15-20 minute delay (CBOE free tier) — not suitable for scalping or HFT
- CBOE data only; does not include all exchanges (AMEX, ISE, C2 excluded)
- Volume resets daily at market open
- Greeks (delta/gamma/theta) sourced from the same CBOE feed — use for directional context, not precision

***

### Related actors (same author)

- [SEC 13F Institutional Holdings QoQ Tracker](https://apify.com/gochujang/sec-13f-tracker) — See what institutions actually hold
- [Economic Calendar Tracker](https://apify.com/gochujang/economic-calendar-tracker) — Time your options trades around macro events
- [Stock Earnings Calendar](https://apify.com/gochujang/stock-earnings-tracker) — Pre-earnings unusual options are common setups

***

### Feedback

If this scanner helped you spot a trade, a quick review helps others find it: [Leave a review](https://apify.com/gochujang/unusual-options-tracker#reviews)

# Actor input Schema

## `symbols` (type: `array`):

Stock/ETF tickers to scan. Leave empty to use default list of 80+ S\&P500 stocks + major ETFs.

## `volOiThreshold` (type: `number`):

Minimum Volume-to-Open-Interest ratio to flag as unusual. 3.0 = volume at least 3x OI.

## `minVolume` (type: `integer`):

Skip options with volume below this threshold (filters noise).

## `minOpenInterest` (type: `integer`):

Skip options with fewer existing open contracts (filters thinly-traded options).

## `optionType` (type: `string`):

Filter to calls only, puts only, or both.

## `minIvPct` (type: `number`):

Only return options with IV above this percentage. 0 = no filter.

## `maxDte` (type: `integer`):

Only include options expiring within this many days. 0 = no limit. Set 7 for weekly options.

## `sortBy` (type: `string`):

Sort order for results.

## `limit` (type: `integer`):

Maximum number of unusual options to return.

## `concurrency` (type: `integer`):

Number of parallel CBOE requests. Higher = faster but more likely to get rate-limited.

## Actor input object example

```json
{
  "symbols": [],
  "volOiThreshold": 3,
  "minVolume": 500,
  "minOpenInterest": 100,
  "optionType": "both",
  "minIvPct": 0,
  "maxDte": 0,
  "sortBy": "vol_oi_ratio_desc",
  "limit": 200,
  "concurrency": 8
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("gochujang/unusual-options-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("gochujang/unusual-options-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call gochujang/unusual-options-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gochujang/unusual-options-tracker"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CBuGlyMzubJO73eRS/builds/3JIBMORyaSwxfnamu/openapi.json
