# Stock Options Scraper: Unusual Activity, IV & Open Interest (`scrapemint/stock-options-scraper`) Actor

Keyless US stock and index option chains from Cboe: unusual activity where today's volume dwarfs open interest, the filtered option chain with implied volatility, greeks, open interest and volume, and a per-symbol summary with put/call ratios and 30-day implied vol. Pay per row.

- **URL**: https://apify.com/scrapemint/stock-options-scraper.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Business, News
- **Stats:** 68 total users, 8 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/platform/actors/running/actors-in-store#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

## Stock Options Scraper: Unusual Activity, IV & Open Interest

Keyless **US stock and index option chains** from **Cboe**. No API key, no account, no broker login. Three modes:

- **Unusual activity** — contracts where today's volume dwarfs the open interest that existed going in. This is the scan options traders run every morning to see where new positioning is being built.
- **Chain** — the option chain filtered to what you actually want: expiry, a strike window around spot, minimum volume and open interest, calls or puts. Every row carries implied volatility, delta, gamma, theta, vega, rho, bid/ask, and Cboe's theoretical price.
- **Summary** — one row per symbol: put/call ratios on both volume and open interest, totals, the most active contract, and 30 day implied volatility.

Works on single stocks (`NVDA`, `TSLA`, `BRK.B`), ETFs (`SPY`, `QQQ`), and index roots (`SPX`, `VIX`, `NDX`, `RUT`).

### Who uses it

- **Options traders** — find unusual flow, read the put/call ratio, pull a clean chain into a spreadsheet without paying for a data terminal.
- **Swing and momentum traders** — unusual call buying in a name you already follow is a positioning signal ahead of the move.
- **Quants and dashboard builders** — schedule it and store the snapshots to build your own history of IV, open interest, and flow.
- **Newsletters and analysts** — "someone bought 40,000 NVDA calls today" is a recurring story, and this is where you find it.

Pairs with our [Stock Market Movers & Screener](https://apify.com/scrapemint/stock-market-movers) for the underlying move and [Stock Analyst Ratings](https://apify.com/scrapemint/stock-analyst-ratings) for the catalyst behind it. For crypto options, see the [Deribit Options Tracker](https://apify.com/scrapemint/deribit-options-tracker).

### Input

| Field | Description |
|-------|-------------|
| `mode` | `unusual`, `chain`, or `summary`. |
| `symbols` | Tickers to pull, e.g. `NVDA`, `TSLA`, `SPY`. Index roots work with or without the caret. Max 25 per run. |
| `optionType` | `both` / `call` / `put`. |
| `minVolume` | Volume floor. Keeps one lot noise out of the unusual scan. |
| `minVolumeOiRatio` | How many times volume must exceed open interest to count as unusual (default 5). |
| `minOpenInterest` | Skip thin contracts. |
| `expiries` | Filter to specific expiry dates, `YYYY-MM-DD` (empty = all). |
| `maxDaysToExpiry` | Focus on near dated flow. 0 = no limit. |
| `moneynessPercent` | Keep strikes within this percent of spot. The main lever for cutting chain row counts. |
| `sortBy` | `volume` / `openInterest` / `volumeOiRatio` / `impliedVolatility`. |
| `maxRows` | Row cap per run. |

### Output

- **Unusual and chain**: `symbol`, `underlyingPrice`, `underlyingChangePercent`, `iv30`, `contract`, `optionType`, `strike`, `expiry`, `daysToExpiry`, `moneyness`, `inTheMoney`, `bid`, `ask`, `mid`, `lastPrice`, `lastTradeTime`, `changePercent`, `volume`, `openInterest`, `volumeOiRatio`, `newContract`, `impliedVolatility`, `delta`, `gamma`, `theta`, `vega`, `rho`, `theoreticalPrice`.
- **Summary**: `symbol`, `underlyingPrice`, `iv30`, `iv30ChangePercent`, `totalContracts`, `callVolume`, `putVolume`, `putCallVolumeRatio`, `callOpenInterest`, `putOpenInterest`, `putCallOiRatio`, `expiryCount`, `nearestExpiry`, `furthestExpiry`, `mostActiveContract`, `mostActiveVolume`, `unusualContractCount`.

`volumeOiRatio` is null when open interest is zero, since there is nothing to divide by. Those contracts are flagged `newContract: true` and qualify for the unusual scan on volume alone, which is usually the most interesting case: a strike nobody held this morning that is suddenly trading.

### Notes on the data

- Quotes are **delayed roughly 15 minutes**, which is what Cboe publishes without a subscription.
- Greeks, implied volatility, and `theoreticalPrice` are Cboe's own published values, passed through unchanged rather than recomputed.
- Deep in the money contracts often publish `impliedVolatility: 0` with delta near 1. That is the source's value for a contract with no meaningful optionality left, not a gap in the scrape.
- Volume and open interest reset and settle on the exchange's schedule, so open interest reflects yesterday's close while volume is intraday. That difference is exactly what makes the ratio informative.
- A symbol with no listed options returns a free note row rather than an error.
- `daysToExpiry` is 0 for a contract expiring today, so same day expiries are easy to isolate or exclude.
- `maxRows` is filled symbol by symbol in the order you list them, with the highest `sortBy` values first within each symbol. Put the names you care about most at the front of `symbols`, or raise the cap.

This is a live snapshot feed. Schedule it to build your own history.

### Pricing

Pay per event: **$0.004 per row**. The first 2 rows of every run are free.

Data source: Cboe delayed quotes (`cdn.cboe.com`).

# Actor input Schema

## `mode` (type: `string`):

unusual = contracts trading far above their open interest (the daily scan). chain = the option chain filtered by expiry, moneyness, and size. summary = one row per symbol with put/call ratios, totals, and 30-day implied vol.

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

US tickers to pull option chains for, e.g. NVDA, TSLA, SPY. Index roots work with or without the caret: SPX, ^SPX, VIX, NDX, RUT. Maximum 25 per run.

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

Return calls only, puts only, or both.

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

Skip contracts trading fewer than this many times today. In unusual mode this is the floor that keeps one-lot noise out of the scan.

## `minVolumeOiRatio` (type: `number`):

How many times today's volume must exceed existing open interest to count as unusual. 5 means five times more contracts traded today than were open going in. Contracts with zero open interest always qualify on volume alone.

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

Skip contracts with open interest below this. 0 = no minimum.

## `expiries` (type: `array`):

Filter to specific expiry dates in YYYY-MM-DD form, e.g. 2026-08-21. Empty = every listed expiry.

## `maxDaysToExpiry` (type: `integer`):

Drop contracts expiring further out than this many days. 0 = no limit. Useful for focusing on near-dated flow.

## `moneynessPercent` (type: `integer`):

Keep only strikes within this percentage of the underlying price, e.g. 10 = strikes within 10% either side. 0 = every strike. The main lever for cutting chain-mode row counts.

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

Order contracts before the row cap is applied.

## `maxRows` (type: `integer`):

Cap on rows returned across all symbols. Controls total cost.

## Actor input object example

```json
{
  "mode": "unusual",
  "symbols": [
    "NVDA",
    "TSLA",
    "SPY"
  ],
  "optionType": "both",
  "minVolume": 500,
  "minVolumeOiRatio": 5,
  "minOpenInterest": 0,
  "expiries": [],
  "maxDaysToExpiry": 0,
  "moneynessPercent": 0,
  "sortBy": "volume",
  "maxRows": 200
}
```

# 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 = {
    "symbols": [
        "NVDA",
        "TSLA",
        "SPY"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/stock-options-scraper").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 = { "symbols": [
        "NVDA",
        "TSLA",
        "SPY",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/stock-options-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "symbols": [
    "NVDA",
    "TSLA",
    "SPY"
  ]
}' |
apify call scrapemint/stock-options-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapemint/stock-options-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ENvwnBPJ8UgvbCqsi/builds/mxFpvDGvER7hdLTYr/openapi.json
