# SEC Form 144 Insider Proposed Sales Scraper (`scrapers_lat/sec-form-144-insider-sales-scraper`) Actor

Scrape SEC Form 144 notices of proposed sale as structured records: insider name, relationship, issuer, ticker, shares to be sold, aggregate market value, approximate sale date and broker. A leading insider-selling signal. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/sec-form-144-insider-sales-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.34 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

[![SEC Form 144 Insider Proposed Sales Scraper](https://scrapers.lat/banners/sec-form-144-insider-sales-scraper.png)](https://console.apify.com/actors/7VUiX1MNgHoxNf7tC/input)

## SEC Form 144 Insider Proposed Sales Scraper

Here is one real result, with every field the actor returns:

```json
{
  "issuerName": "NVIDIA CORPORATION",
  "issuerCik": "1045810",
  "issuerTicker": "NVDA",
  "personName": "DONALD ROBERTSON",
  "personRelationship": "Officer",
  "securitiesClass": "Common",
  "sharesToBeSold": 4594,
  "aggregateMarketValue": 967909.86,
  "approxSaleDate": "06/22/2026",
  "exchangeOrMarket": "NASDAQ",
  "brokerName": "Morgan Stanley Smith Barney LLC Executive Financial Services",
  "natureOfAcquisition": "Restricted Stock Units",
  "acquiredDate": "06/17/2026",
  "unitsOutstanding": 24200000000,
  "amountSoldPast3Months": null,
  "grossProceedsPast3Months": null,
  "remarks": null,
  "signatureName": "/s/ Donald Robertson",
  "noticeDate": "06/22/2026",
  "filedDate": "2026-06-22",
  "accessionNo": "0001950047-26-006396",
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/1045810/000195004726006396/primary_doc.xml",
  "aiSignal": null,
  "aiMagnitude": null,
  "aiContextNote": null,
  "source": "SEC EDGAR (Form 144)",
  "observedAt": "2026-08-21T01:25:08.971Z"
}
```

The most complete SEC Form 144 scraper available. It returns every field the notice of proposed sale exposes: who plans to sell and their relationship to the company, the issuer and ticker, the number of shares to be sold, the aggregate market value, the approximate sale date, the exchange, the broker, how the shares were acquired, and any sales in the prior three months. Form 144 is filed before the sale happens, so it is a leading insider-selling signal that arrives ahead of the Form 4 that later reports the executed trade. Filter by issuer, filing date, and minimum sale value, with an optional AI read that sizes each proposed sale against the company.

**📥 [Input](https://apify.com/scrapers_lat/sec-form-144-insider-sales-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/sec-form-144-insider-sales-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/sec-form-144-insider-sales-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/sec-form-144-insider-sales-scraper/examples)**

[![Platform](https://img.shields.io/badge/platform-Apify-1a1a1a)](https://apify.com/scrapers_lat/sec-form-144-insider-sales-scraper)
![Coverage](https://img.shields.io/badge/coverage-US%20public%20companies-2b6cb0)
![Output](https://img.shields.io/badge/output-JSON%20%7C%20CSV%20%7C%20Excel-2f855a)
![Billing](https://img.shields.io/badge/billing-pay%20per%20result-6b46c1)

### Table of contents

- [What it does](#what-it-does)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)
- [More scrapers at scrapers.lat](#more-scrapers-at-scraperslat)

### What it does

Form 144 is the notice an insider files when they intend to sell restricted or control securities. This scraper turns those notices into clean, structured rows. Each record is one proposed sale: the person selling and their relationship to the issuer, the company and ticker, the class and number of shares, the aggregate market value, the approximate sale date, the exchange, the broker, how the shares were acquired, and any sales reported in the prior three months.

Two modes:

- **recent**: the latest Form 144 notices across the whole market, newest first.
- **byIssuer**: every Form 144 filed against one company, by ticker or CIK.

You can filter by filing date and by a minimum aggregate market value, so you only keep the larger proposed sales. An optional AI add-on reads each notice and returns a signal, a magnitude, and a one-line note sizing the proposed sale against the company.

### Quickstart

Recent large proposed sales across the market:

```json
{
  "mode": "recent",
  "minValue": 1000000,
  "maxResults": 25
}
```

Every proposed insider sale filed against one company:

```json
{
  "mode": "byIssuer",
  "issuerTicker": "NVDA",
  "maxResults": 50
}
```

### Input reference

| Name | Type | Required | Description | Example |
| --- | --- | --- | --- | --- |
| `mode` | string | no | `recent` for market-wide notices, `byIssuer` for one company | `byIssuer` |
| `issuerTicker` | string | no | Ticker of the company (byIssuer mode) | `NVDA` |
| `issuerCik` | string | no | SEC CIK of the company, used instead of a ticker | `1045810` |
| `filedSince` | string | no | Only include notices filed on or after this date (YYYY-MM-DD) | `2026-01-01` |
| `minValue` | integer | no | Keep only proposed sales at or above this aggregate market value in USD | `1000000` |
| `withSaleSignal` | boolean | no | Opt-in AI read of each proposed sale. Paid plans only | `true` |
| `maxResults` | integer | no | Maximum records to return. Free plans are capped at 10 | `50` |

### Output reference

| Name | Type | Description |
| --- | --- | --- |
| `issuerName` | string | Company whose securities are proposed to be sold |
| `issuerCik` | string | SEC CIK of the issuer |
| `issuerTicker` | string | Ticker symbol of the issuer, when available |
| `personName` | string | Person for whose account the securities are to be sold |
| `personRelationship` | string | The insider's relationship to the issuer (officer, director, 10% owner, affiliate) |
| `securitiesClass` | string | Title of the class of securities to be sold |
| `sharesToBeSold` | number | Number of shares to be sold on the notice |
| `aggregateMarketValue` | number | Aggregate market value of the proposed sale in USD |
| `approxSaleDate` | string | Approximate date of the proposed sale |
| `exchangeOrMarket` | string | Exchange or market for the proposed sale |
| `brokerName` | string | Broker or market maker handling the sale |
| `natureOfAcquisition` | string | How the securities were acquired (RSUs, open-market purchase, gift, etc.) |
| `acquiredDate` | string | Date the securities were acquired |
| `unitsOutstanding` | number | Shares outstanding of the class |
| `amountSoldPast3Months` | number | Shares sold by the insider in the past 3 months, if reported |
| `grossProceedsPast3Months` | number | Gross proceeds of sales in the past 3 months in USD, if reported |
| `remarks` | string | Free-text remarks on the notice |
| `signatureName` | string | Name on the notice signature |
| `noticeDate` | string | Date of the notice signature |
| `filedDate` | string | Date the Form 144 was filed |
| `accessionNo` | string | SEC accession number |
| `filingUrl` | string | URL of the Form 144 primary document |
| `aiSignal` | string | AI add-on: sale signal (bearish/neutral/routine) |
| `aiMagnitude` | string | AI add-on: magnitude of the sale (small/moderate/large) |
| `aiContextNote` | string | AI add-on: one-line context on the proposed sale vs the company |
| `source` | string | Data source |
| `observedAt` | string | Timestamp the record was collected |

### Example output record

```json
{
  "issuerName": "NVIDIA CORP",
  "issuerCik": "1045810",
  "issuerTicker": "NVDA",
  "personName": "Dabiri John",
  "personRelationship": "Director",
  "securitiesClass": "Common",
  "sharesToBeSold": 625,
  "aggregateMarketValue": 133750,
  "approxSaleDate": "05/27/2026",
  "exchangeOrMarket": "NASDAQ",
  "brokerName": "Charles Schwab & Co., Inc.",
  "natureOfAcquisition": "Restricted Stock Lapse",
  "acquiredDate": "05/20/2026",
  "unitsOutstanding": 24200000000,
  "amountSoldPast3Months": 3004,
  "grossProceedsPast3Months": 555440,
  "remarks": null,
  "signatureName": "John Dabiri",
  "noticeDate": "05/27/2026",
  "filedDate": "2026-05-27",
  "accessionNo": "0001921094-26-000561",
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/1045810/000192109426000561/primary_doc.xml",
  "aiSignal": null,
  "aiMagnitude": null,
  "aiContextNote": null,
  "source": "SEC EDGAR (Form 144)",
  "observedAt": "2026-08-21T01:25:09.584Z"
}
```

### Run via API and CLI

Start a run with the Apify API:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~sec-form-144-insider-sales-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"byIssuer","issuerTicker":"NVDA","maxResults":50}'
```

Run with the Apify CLI:

```bash
apify call scrapers_lat/sec-form-144-insider-sales-scraper \
  --input '{"mode":"recent","minValue":1000000,"maxResults":25}'
```

### Fetch results

Read the dataset items once the run finishes:

```bash
curl "https://api.apify.com/v2/actor-runs/RUN_ID/dataset/items?token=YOUR_TOKEN&format=json"
```

Swap `format=json` for `format=csv` or `format=xlsx` to export to CSV or Excel.

### Billing and limits

- Pay per result. You are charged for each Form 144 record returned, plus a small fixed fee per run.
- The optional AI sale signal is charged only when it produces a usable analysis, and only on paid Apify plans.
- Empty and failed runs return no billable records. If no notice matches your filters, you are not charged for results.
- Free Apify plans are capped at 10 records per run. Paid plans have no cap beyond `maxResults`.
- A spend cap is respected: once your configured maximum charge is reached, the run stops emitting more results.

### FAQ and troubleshooting

**How is this different from a Form 4 scraper?** Form 4 reports trades that already happened. Form 144 is filed before the sale, when the insider gives notice of an intended sale. It is a leading signal, often days ahead of the Form 4.

**Does every notice have a ticker?** Most US-listed issuers resolve to a ticker. Some do not, in which case `issuerTicker` is null while `issuerName` and `issuerCik` are still present.

**Why are some fields null?** Form 144 layouts vary and older notices carry less structure. Fields that are not present on a given notice are returned as null rather than guessed.

**Do I need an API key or login?** No. The actor handles everything and requires no account on the source.

**What date format do the dates use?** `filedDate` uses YYYY-MM-DD. The notice fields such as `approxSaleDate` and `acquiredDate` are returned as filed (MM/DD/YYYY).

### More scrapers at scrapers.lat

- SEC Form 4 Insider Trading Transactions Scraper
- SEC Schedule 13D 13G Activist Stakes Scraper
- SEC Form D Private Placements Scraper

Built by [scrapers.lat](https://scrapers.lat). Not affiliated with or endorsed by the SEC. Data is sourced from public filings.

# Actor input Schema

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

How to find filings. 'recent' = latest Form 144 proposed-sale notices across the whole market. 'byIssuer' = every Form 144 filed against one company (set issuerTicker or issuerCik).

## `issuerTicker` (type: `string`):

Stock ticker of the company whose insider proposed sales you want, for example NVDA, TSLA or AAPL. Used in byIssuer mode.

## `issuerCik` (type: `string`):

Optional. SEC Central Index Key of the company, used instead of a ticker (for example 1045810 for NVIDIA). If both are set, ticker wins.

## `filedSince` (type: `string`):

Optional. Only include notices filed on or after this date. Leave empty for the newest filings regardless of date.

## `minValue` (type: `integer`):

Optional. Keep only proposed sales at or above this aggregate market value in US dollars (for example 1000000 for sales of one million dollars or more). Notices whose value cannot be parsed are kept.

## `withSaleSignal` (type: `boolean`):

Opt-in. For each notice, add an AI read of the proposed sale: signal (bearish/neutral/routine), magnitude and a one-line context note sizing the sale against the company. Charged per successful analysis. Paid Apify plans only.

## `maxResults` (type: `integer`):

Maximum number of Form 144 proposed-sale records to return. Free Apify plans are capped at 10 per run.

## Actor input object example

```json
{
  "mode": "recent",
  "issuerTicker": "NVDA",
  "withSaleSignal": false,
  "maxResults": 10
}
```

# Actor output Schema

## `results` (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 = {
    "mode": "recent",
    "issuerTicker": "NVDA",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/sec-form-144-insider-sales-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 = {
    "mode": "recent",
    "issuerTicker": "NVDA",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/sec-form-144-insider-sales-scraper").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 '{
  "mode": "recent",
  "issuerTicker": "NVDA",
  "maxResults": 10
}' |
apify call scrapers_lat/sec-form-144-insider-sales-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/sec-form-144-insider-sales-scraper"
        }
    }
}

```

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/7VUiX1MNgHoxNf7tC/builds/XKTvREdTrfSJgdhhA/openapi.json
