# Upcoming Insider Stock Sales: SEC Form 144 Notices (`scrapemint/insider-planned-stock-sales`) Actor

Keyless SEC Form 144 data: company insiders must file a notice before selling restricted stock, so this shows who plans to sell, how many shares, what it is worth, and roughly when. Includes where the shares came from and what the same person already sold in the last three months. Pay per row.

- **URL**: https://apify.com/scrapemint/insider-planned-stock-sales.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

$5.00 / 1,000 notice rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## 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

## Upcoming Insider Stock Sales: SEC Form 144 Notices

Keyless **SEC Form 144** data. No API key, no account.

Before a company insider sells restricted stock, they have to file a notice with the SEC saying **how many shares they intend to sell, roughly what it is worth, and approximately when**. This reads those notices.

**This is the sale before it happens.** Our [SEC Form 4 Insider Trading Tracker](https://apify.com/scrapemint/sec-form4-insider-tracker) reports insider transactions *after* they execute, filed within two business days. Form 144 is filed *beforehand*. Same event, seen from the other side.

- **Notices** — recent filings across the whole market, newest first, filterable by dollar value.
- **Company** — every planned sale for the tickers you name.
- **Insiders** — grouped per person, showing what they have already sold in the last three months next to what they are now filing to sell.

### Why the filing is worth reading, not just counting

Two fields turn a bare number into something interpretable:

**Where the shares came from.** `acquisitionNature` says whether they came from restricted stock units vesting, an option exercise, or a purchase. An executive selling RSUs the week they vest is doing payroll admin. An executive selling shares they have held for three years is making a decision.

**What they have already sold.** Every filing lists the same person's sales over the previous three months with dates and proceeds. So a row can read "already sold $696,000 this quarter, now filing to sell $202,000 more" instead of showing you one isolated figure.

### Who uses it

- **Equity investors and traders** — a cluster of insiders filing to sell into strength is a signal, and this is the earliest public form it takes.
- **Financial newsletters and screeners** — "executives at X filed to sell $12m this week" is a story that writes itself from one row.
- **Investor relations and compliance teams** — monitor your own filers, or a peer group's.
- **Research and quant desks** — a clean structured feed of planned selling pressure, per name and per person.

### Input

| Field | Description |
|-------|-------------|
| `mode` | `notices`, `company`, or `insiders`. |
| `tickers` | Limit to these symbols in company mode. |
| `daysBack` | How far back to search. Default 7. |
| `minValueUsd` | Skip notices below this dollar value. |
| `maxFilings` | How many filings to open. Each is a request, so this is the cost lever. |
| `newOnly` | Emit only filings previous runs have not already returned. |
| `userAgent` | The SEC requires a contact email here. |
| `maxRows` | Row cap per run. |

### Output

- **Notices and company**: `ticker`, `issuerName`, `issuerCik`, `insiderName`, `relationships`, `relationshipSummary`, `sharesToBeSold`, `aggregateMarketValueUsd`, `percentOfSharesOutstanding`, `sharesOutstanding`, `approxSaleDate`, `securitiesClass`, `exchange`, `broker`, `acquisitionNature`, `acquiredDate`, `acquiredFrom`, `isGift`, `soldPast3MonthsCount`, `soldPast3MonthsShares`, `soldPast3MonthsProceedsUsd`, `totalRecentAndPlannedUsd`, `recentSales`, `remarks`, `filedDate`, `noticeDate`, `accessionNumber`, `filingUrl`.
- **Insiders**: `insiderName`, `ticker`, `issuerName`, `relationshipSummary`, `filingsInWindow`, `plannedShares`, `plannedValueUsd`, `soldPast3MonthsCount`, `soldPast3MonthsProceedsUsd`, `totalRecentAndPlannedUsd`, `acquisitionNatures`, `earliestFiledDate`, `latestFiledDate`, `filingUrls`.

### Notes on the data

- **A Form 144 is a statement of intent, not a completed trade.** The insider may sell less than filed, or not at all. `approxSaleDate` is their estimate. Treat it as planned selling pressure rather than as an executed transaction, and use Form 4 for what actually happened.
- **The three month sale history repeats on every filing by the same person**, so in `insiders` mode it is taken as the largest value seen rather than summed, which would invent proceeds that do not exist.
- **The SEC requires a descriptive User-Agent with a contact email** or it returns 403. Replace the default with your own.
- **EDGAR answers a throttled request with an empty result set rather than an error.** An empty first page is therefore ambiguous by design, and the run says so in the log instead of quietly reporting "no filings". Requests are spaced to stay inside the 10 per second limit.
- Only filings that carry the modern structured XML are parsed. Filers using older formats will appear in discovery but yield no detail row.
- `percentOfSharesOutstanding` is usually a very small number. For most large companies even a multi million dollar sale is a rounding error against the float, which is context worth keeping in view.

### Pricing

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

Data source: SEC EDGAR full text search and filing archives (`sec.gov`).

# Actor input Schema

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

notices = recent filings across the whole market, newest first. company = every planned sale for the tickers you name. insiders = grouped per person, with what they already sold in the last three months next to what they are now filing to sell.

## `tickers` (type: `array`):

Limit to these ticker symbols, e.g. NVDA, TSLA. Leave empty in notices mode to see the whole market.

## `daysBack` (type: `integer`):

How far back to search filings. 7 covers a week of notices.

## `minValueUsd` (type: `integer`):

Skip notices below this dollar value. Raise it to see only sales large enough to matter. 0 = every filing.

## `maxFilings` (type: `integer`):

Each filing is a separate request to fetch its detail, so this is the main cost and runtime lever.

## `newOnly` (type: `boolean`):

Remember which filings previous runs returned and emit only new ones. Turn this on for a scheduled alert feed so you are not billed for the same notice twice.

## `userAgent` (type: `string`):

The SEC requires a descriptive User-Agent containing a contact email, or it returns 403. Replace the default with your own name and email.

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

Cap on rows returned. Controls total cost.

## Actor input object example

```json
{
  "mode": "notices",
  "tickers": [],
  "daysBack": 7,
  "minValueUsd": 0,
  "maxFilings": 60,
  "newOnly": false,
  "userAgent": "Scrapemint Research (admin@scrapemint.com)",
  "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 = {
    "daysBack": 7
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/insider-planned-stock-sales").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 = { "daysBack": 7 }

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/insider-planned-stock-sales").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 '{
  "daysBack": 7
}' |
apify call scrapemint/insider-planned-stock-sales --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapemint/insider-planned-stock-sales"
        }
    }
}

```

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/slwzc1MKB8t7IvZsn/builds/XtjILkcnIsHJCEaSF/openapi.json
