# Short Selling Data Tracker (FINRA) (`scrapemint/short-selling-data-tracker`) Actor

How much of a stock's daily volume was sold short, from FINRA's official consolidated short sale volume files. Track a watchlist over time or screen every US ticker for the highest short volume share on any trading day. No API key.

- **URL**: https://apify.com/scrapemint/short-selling-data-tracker.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Business, News
- **Stats:** 2 total users, 1 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

## Short Selling Data Tracker (FINRA)

How much of a stock's daily volume was sold short. Every US equity trade reported to FINRA is marked short or long, and FINRA publishes the consolidated totals for all 12,000 or so symbols after each session. This actor turns those files into structured rows. No API key, no login, no browser.

It also reads the twice monthly **short interest** report, so both halves of the picture live in one actor. Short volume is how much of a day's trading was sold short, published every session. Short interest is the settled open short position that has not been covered. Volume says what happened today, interest says how big the bet actually is, and a squeeze setup needs both.

### Four modes

**Watchlist** - one row per symbol per trading day, newest first:

```json
{
    "mode": "symbols",
    "symbols": ["TSLA", "NVDA", "GME"],
    "days": 5
}
```

Each row carries the date, symbol, short volume, short exempt volume, total volume, the short share of volume as a percent, and which venue groups reported. Weekends and holidays are skipped automatically, so `days: 5` means five real sessions.

**Market screen** - rank every US ticker for one trading day by the share of volume sold short:

```json
{
    "mode": "screen",
    "minTotalVolume": 2000000,
    "minShortPercent": 60
}
```

**Short interest watchlist** - the settled open short position per symbol per settlement date, with the build or cover against the previous settlement:

```json
{
    "mode": "interest",
    "symbols": ["JPM", "NVDA", "GME"],
    "settlements": 2
}
```

Each row carries the short interest, the previous settlement's figure, the change in shares and percent, a `direction` of build, cover or flat, average daily volume, and days to cover. A live run returned GME at 55,426,276 shares on the 2026-07-15 settlement, down 0.77 per cent, with 16.1 days to cover.

**Short interest screen** - rank the whole tape for one settlement:

```json
{
    "mode": "interest_screen",
    "sortBy": "days_to_cover",
    "minAvgDailyVolume": 500000
}
```

Rank by `short_interest` for the biggest raw positions, `change_percent` for the biggest builds and covers, or `days_to_cover` for crowded shorts relative to liquidity.

### Reading the numbers

Short volume percent is short volume divided by total reported volume. A high reading means most of that day's prints were sold short, which is worth pairing with price action before drawing conclusions.

Two things worth knowing, because they trip people up:

- **A 100% reading is almost always an artifact.** Thinly traded warrants and small caps often show every print marked short, because a market maker took the other side of nearly all of them. That is mechanics, not conviction. The screen defaults to a 2,000,000 share floor, which removes these entirely while still leaving around 500 names.
- **Short volume is not short interest.** A share sold short and covered the same day still counts in the volume modes. Day to day changes there reflect trading activity, not the size of the outstanding short position. That is what the short interest modes are for.

On the short interest side:

- **Days to cover is published as 999.99 when it is undefined**, usually a name with no volume to cover into. That is a sentinel, not a 999 day squeeze, so it is returned as `null` with `daysToCoverUndefined: true`. Ranking by days to cover excludes it at the source.
- **A percent change needs a real denominator.** Without a floor, the biggest change is always a warrant that went from a few hundred shares to a few hundred thousand. One live run put a warrant on top at plus 97,170 per cent off a 239 share base. The `minShortInterest` floor defaults to 100,000 shares and, when ranking by change percent, applies to the previous settlement too.
- **OTC names are excluded from the screen by default.** FINRA's file covers OTC as well as exchange listed securities, and OTC dominates the extremes while being mostly untradeable. Set `includeOtc` to true to see them.

### Who uses this

- **Traders and quants**: a daily selling pressure series per ticker, ready to join with price data.
- **Retail research and newsletters**: screen for the most heavily shorted liquid names each day.
- **Finance media**: sourced, citable numbers straight from FINRA.
- **Risk and compliance teams**: monitor short activity in names you hold or make markets in.

Pairs with our Stock Price History Scraper for prices, Stock Earnings Calendar for catalysts, and SEC Form 4 Insider Tracker for what insiders did over the same window.

### Pricing

A small fee per row returned: per symbol per day in the short volume modes, and per symbol per settlement date in the short interest modes. Days with no session, unknown tickers and empty screens are free note rows, and the first 2 rows of every run are free.

### Notes

- Short volume comes from FINRA's public daily file at `cdn.finra.org`, one per trading day, covering consolidated NMS activity.
- Short interest comes from FINRA's consolidated short interest dataset at `api.finra.org`, covering NYSE, Nasdaq, AMEX, ARCA, BZX and OTC. Nasdaq's own per symbol endpoint only carries Nasdaq listed names and answers with an empty body for NYSE tickers, which is why it is not used here.
- Short interest settles twice a month and is published about eight business days later, so the newest settlement is always a little behind. The actor walks back from your start date to the most recent one it can find.
- FINRA publishes short volume after the close, so the current day appears in the evening. Asking for a date with no session, including weekends and holidays, returns a free note rather than an error.
- Volumes come from FINRA as fractional values because they are consolidated across reporting venues. They are rounded to whole shares here.

# Actor input Schema

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

Short volume is how much of a day's trading was sold short, published every session. Short interest is the settled open short position, published twice a month. Watchlist and Market screen cover short volume. Short interest watchlist and Short interest screen cover settled short interest, including the build or cover against the previous settlement and days to cover.

## `settlements` (type: `integer`):

Short interest watchlist only. How many settlement dates of history to return per symbol. Short interest settles twice a month, so 1 is the latest reading and 6 is roughly a quarter.

## `minAvgDailyVolume` (type: `integer`):

Short interest screen only. Ignore symbols trading below this many shares a day. The floor matters because FINRA publishes days to cover as 999.99 when a name has no volume to cover into, and without a floor the ranking fills with untradeable shells.

## `minShortInterest` (type: `integer`):

Short interest screen only. Ignore symbols with an open short position below this many shares. When ranking by change percent this floor also applies to the previous settlement, because a percent change measured against a few hundred shares is arithmetic rather than a signal: a warrant going from 239 to 232,477 shares scores +97,170 per cent.

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

Short interest screen only. Short interest is the raw open position, change percent finds the biggest builds and covers, days to cover finds crowded shorts relative to liquidity.

## `includeOtc` (type: `boolean`):

Short interest screen only. FINRA's file covers OTC as well as exchange listed securities. OTC names dominate the extremes and are mostly untradeable, so they are excluded by default.

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

US equity tickers to track, for example TSLA, NVDA, GME. Used by both watchlist modes. Short interest also covers NYSE and OTC symbols.

## `days` (type: `integer`):

How many trading days of history to return per symbol. Weekends and holidays are skipped automatically.

## `date` (type: `string`):

Start date as 2026-07-20. Leave empty for the most recent published day. In short volume modes FINRA publishes after the close, so today's file appears in the evening. In short interest modes the actor walks back from this date to the most recent settlement, which is published about eight business days after it settles.

## `minTotalVolume` (type: `integer`):

Market screen only. Ignore symbols trading below this many shares. The default keeps roughly 500 liquid names. Drop it toward 100000 to widen the universe, but the ranking then fills with thinly traded warrants showing 100% short volume, which is a reporting artifact rather than a signal.

## `minShortPercent` (type: `integer`):

Market screen only. Only return symbols where at least this share of reported volume was sold short.

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

Maximum rows to return. In market screen mode the highest short percent comes first.

## Actor input object example

```json
{
  "mode": "symbols",
  "settlements": 1,
  "minAvgDailyVolume": 500000,
  "minShortInterest": 100000,
  "sortBy": "short_interest",
  "includeOtc": false,
  "symbols": [
    "TSLA",
    "NVDA",
    "GME"
  ],
  "days": 5,
  "minTotalVolume": 2000000,
  "minShortPercent": 0,
  "maxRows": 50
}
```

# 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 = {
    "mode": "symbols",
    "settlements": 1,
    "minAvgDailyVolume": 500000,
    "minShortInterest": 100000,
    "sortBy": "short_interest",
    "symbols": [
        "TSLA",
        "NVDA",
        "GME"
    ],
    "days": 5,
    "minTotalVolume": 2000000,
    "minShortPercent": 0,
    "maxRows": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/short-selling-data-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 = {
    "mode": "symbols",
    "settlements": 1,
    "minAvgDailyVolume": 500000,
    "minShortInterest": 100000,
    "sortBy": "short_interest",
    "symbols": [
        "TSLA",
        "NVDA",
        "GME",
    ],
    "days": 5,
    "minTotalVolume": 2000000,
    "minShortPercent": 0,
    "maxRows": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/short-selling-data-tracker").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 '{
  "mode": "symbols",
  "settlements": 1,
  "minAvgDailyVolume": 500000,
  "minShortInterest": 100000,
  "sortBy": "short_interest",
  "symbols": [
    "TSLA",
    "NVDA",
    "GME"
  ],
  "days": 5,
  "minTotalVolume": 2000000,
  "minShortPercent": 0,
  "maxRows": 50
}' |
apify call scrapemint/short-selling-data-tracker --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/HTNQMQua9k15YOVWz/builds/eUu50lMRJct9bgtPC/openapi.json
