# Insider Cluster Buy Scorer: SEC Form 4 Buying Signals (`mrdoe/insider-cluster-buy-scorer`) Actor

Finds stocks where several insiders (CEO, CFO, directors) bought within days of each other and scores each cluster 0-100. Built on SEC Form 4 filings with a published formula. No API key.

- **URL**: https://apify.com/mrdoe/insider-cluster-buy-scorer.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 cluster scoreds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![Insider Cluster Buy Scorer: SEC Form 4 Buying Signals - Insider cluster buy scorer using SEC Form 4 filings with a transparent 0-100 score](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/insider-cluster-buy-scorer--hero.png)

### What does Insider Cluster Buy Scorer: SEC Form 4 Buying Signals do?

Insider Cluster Buy Scorer scans SEC Form 4 filings for the tickers you give it and returns every cluster of insiders buying the same stock within a short window. A cluster row lists each insider with role, shares and dollar value, the total value, how tightly the buying is packed in time, and a cluster score from 0 to 100. The score is a published formula that weights CEOs and CFOs above plain directors, so you can see exactly why a cluster ranks where it does. Only open-market purchases count; grants, option exercises and sales are ignored.

### Why use Insider Cluster Buy Scorer: SEC Form 4 Buying Signals?

- A ready-made composite signal instead of another raw Form 4 feed.
- The score formula is public and every part is returned, so it is not a black box.
- Seniority matters: a CEO and CFO buying counts for more than two directors.
- Bulk watchlists in one run, and delta mode that reports a cluster again when it grows.
- Official SEC EDGAR data with links to every filing; no API key.

### What makes this different

Raw Form 4 scrapers list every filing. This Actor filters to real open-market purchases, groups them into clusters by time window, scores them by seniority, dollars, breadth and tightness, and shows the maths.

### Who can use the Insider Cluster Buy Scorer and how?

- **Swing and position traders:** screen for stocks where management is buying with its own money.
- **Retail investors:** watch your holdings for insider buying clusters.
- **Newsletter writers:** publish a weekly list of the highest-scoring clusters with sources.
- **Quant teams:** use cluster score and components as features in models.
- **Analysts and journalists:** find and cite the filings behind insider buying stories.
- **Fintech developers:** add an insider-buying alert to an app through the API.
- **Fund managers:** monitor insider conviction in portfolio names.
- **Compliance teams:** track insider activity in names you cover.

### How it works

![Insider Cluster Buy Scorer: SEC Form 4 Buying Signals workflow: your input, collection, output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/insider-cluster-buy-scorer--how-it-works.png)

1. **Your input** — enter the tickers to watch, a lookback and a minimum cluster size.
2. **The Actor collects it** — the Actor reads each company's recent Form 4 filings from SEC EDGAR and keeps open-market purchases.
3. **Your output** — you get clusters ranked by score, with the insiders and links to the filings.

### What data can you extract?

The dataset has 20 fields per row:

| Field                    | Type    | Description                                                                                              |
| ------------------------ | ------- | -------------------------------------------------------------------------------------------------------- |
| `ticker`                 | string  | Stock ticker.                                                                                            |
| `company_name`           | string  | Company name from the filing.                                                                            |
| `cik`                    | string  | SEC CIK of the company.                                                                                  |
| `cluster_id`             | string  | Stable id: ticker, first purchase date and number of insiders.                                           |
| `insiders`               | array   | Each insider: name, role, shares, value_usd, transaction_date, last_transaction_date, average_price_usd. |
| `cluster_size`           | number  | Number of different insiders in the cluster.                                                             |
| `cluster_score`          | number  | Score from 0 to 100.                                                                                     |
| `score_components`       | object  | seniority, size, breadth and tightness points.                                                           |
| `total_value_usd`        | number  | Combined purchase value in US dollars.                                                                   |
| `total_shares`           | number  | Combined shares bought.                                                                                  |
| `first_transaction_date` | string  | Date of the first purchase (YYYY-MM-DD).                                                                 |
| `last_transaction_date`  | string  | Date of the last purchase (YYYY-MM-DD).                                                                  |
| `span_days`              | number  | Days between the first and last purchase.                                                                |
| `first_filed_at`         | string  | Date the first Form 4 of the cluster was filed.                                                          |
| `includes_c_suite`       | boolean | True when a CEO or CFO is in the cluster.                                                                |
| `source_document_urls`   | array   | Links to the Form 4 filings.                                                                             |
| `fetch_path`             | string  | How the row was read: edgar_xml.                                                                         |
| `source`                 | string  | Data source.                                                                                             |
| `scraped_at`             | string  | Collection time (ISO 8601).                                                                              |
| `actor_version`          | string  | Output schema version.                                                                                   |

### How to use Insider Cluster Buy Scorer: SEC Form 4 Buying Signals

![Insider Cluster Buy Scorer: SEC Form 4 Buying Signals input form](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/insider-cluster-buy-scorer--input.png)

1. Open the Actor and go to the **Input** tab.
2. Enter **Tickers**, set the **Lookback (days)** and **Minimum insiders in a cluster**, and run. Sort the result by `cluster_score`.
3. Optionally set filters and a **Max results** limit.
4. Click **Start**. A default run finishes in under a minute.
5. Open the **Output** tab, then download the dataset or connect it to your tools.

### Input Parameters

| Parameter            | Type    | Required | Default                   | Description                                                                                                                                           |
| -------------------- | ------- | -------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `tickers`            | array   | No       | `[]`                      | Stock tickers to scan for insider buying clusters, one per line.                                                                                      |
| `minClusterSize`     | integer | No       | `2`                       | A cluster needs at least this many different insiders buying in the same window. Use 1 to also see single-insider purchases.                          |
| `minDollarValue`     | number  | No       | `0`                       | Skip clusters whose combined purchases are below this value.                                                                                          |
| `lookbackDays`       | integer | No       | `30`                      | How far back to read Form 4 filings.                                                                                                                  |
| `clusterWindowDays`  | integer | No       | `14`                      | Purchases belong to the same cluster while each one is at most this many days after the previous one.                                                 |
| `deltaMode`          | boolean | No       | `false`                   | Return and bill only clusters not delivered before, or clusters that grew (more insiders or more dollars) since the last run with the same delta key. |
| `deltaStateKey`      | string  | No       | `"default"`               | Name of the tracked stream. Use a different key per watchlist.                                                                                        |
| `proxyConfiguration` | object  | No       | `{"useApifyProxy":false}` | Optional proxy. SEC EDGAR works without one.                                                                                                          |

### Output Data

![Insider Cluster Buy Scorer: SEC Form 4 Buying Signals dataset table](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/insider-cluster-buy-scorer--output.png)

`cluster_score` is 0 to 100 (see how it is calculated below). `insiders` lists each buyer with `role`, `shares`, `value_usd` and dates. `includes_c_suite` is true when a CEO or CFO is in the cluster. `span_days` is the days between the first and last purchase. Values are shares times the reported purchase price.

![Insider Cluster Buy Scorer: SEC Form 4 Buying Signals field map of one record](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/insider-cluster-buy-scorer--fields.png)

A real dataset item:

```json
{
    "ticker": "PFE",
    "company_name": "PFIZER INC",
    "cik": "78003",
    "cluster_id": "PFE-2026-08-05-3",
    "insiders": [
        {
            "name": "BLAYLOCK RONALD E",
            "role": "Director",
            "shares": 39231,
            "value_usd": 998821,
            "transaction_date": "2026-08-05",
            "last_transaction_date": "2026-08-05",
            "average_price_usd": 25.46
        },
        {
            "name": "Buckley Mortimer J",
            "role": "Director",
            "shares": 37632,
            "value_usd": 960369,
            "transaction_date": "2026-08-05",
            "last_transaction_date": "2026-08-05",
            "average_price_usd": 25.52
        },
        {
            "name": "BOURLA ALBERT",
            "role": "Chairman & CEO",
            "shares": 38000,
            "value_usd": 1000920,
            "transaction_date": "2026-08-12",
            "last_transaction_date": "2026-08-12",
            "average_price_usd": 26.34
        }
    ],
    "cluster_size": 3,
    "cluster_score": 74,
    "score_components": {
        "seniority": 26.7,
        "size": 30,
        "breadth": 10,
        "tightness": 7.5
    },
    "total_value_usd": 2960110,
    "total_shares": 114863,
    "first_transaction_date": "2026-08-05",
    "last_transaction_date": "2026-08-12",
    "span_days": 7,
    "first_filed_at": "2026-08-05",
    "includes_c_suite": true,
    "source_document_urls": [
        "https://www.sec.gov/Archives/edgar/data/78003/000122520826006944/doc4.xml",
        "https://www.sec.gov/Archives/edgar/data/78003/000122520826006943/doc4.xml",
        "https://www.sec.gov/Archives/edgar/data/78003/000122520826007083/doc4.xml"
    ],
    "fetch_path": "edgar_xml",
    "source": "sec_edgar",
    "scraped_at": "2026-09-26T02:33:40.502Z",
    "actor_version": "1.0.0"
}
```

### How to read and use the results

1. **Sort by cluster_score** and start with 70 and above.
2. **Check includes_c_suite**: CEO or CFO buying carries the most weight.
3. **Read insiders** for who bought, how much and when.
4. **Look at span_days**: a tight cluster (a few days) is stronger than a spread-out one.
5. **Open source_document_urls** to verify each Form 4.
6. **Automate**: schedule daily with delta mode and alert on new or grown clusters.

### Usage Examples

#### Scan a watchlist for clusters

```json
{
    "tickers": ["PFE", "BAC", "INTC", "F"],
    "lookbackDays": 90,
    "minClusterSize": 2
}
```

#### Only large clusters with a C-suite buyer window of 7 days

```json
{
    "tickers": ["PFE", "BAC"],
    "lookbackDays": 180,
    "clusterWindowDays": 7,
    "minDollarValue": 250000
}
```

#### Only new or grown clusters since last run

```json
{
    "tickers": ["PFE", "BAC", "INTC"],
    "lookbackDays": 60,
    "deltaMode": true,
    "deltaStateKey": "insider-watch"
}
```

### Tips for Best Results

- Use a 90 to 180 day lookback for quiet stocks; most companies have no clusters in 30 days.
- Set minimum insiders to 1 to also see single large insider purchases.
- Combine with earnings dates: clusters before earnings are more informative than after.
- Schedule daily with delta mode; a cluster is reported again when it grows.
- Default is 5 results for a fast test. Set the max to 0 to return everything available.

### How the cluster score is calculated

The score is the sum of four parts, each returned in `score_components`:

| Part      | Max points | How it is calculated                                                                                                                                                                   |
| --------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Seniority | 40         | Each insider has a weight: CEO 1.0, CFO 0.9, chair, president or COO 0.8, other officer 0.6, director 0.5, 10% owner 0.4, other 0.3. Points = 40 × (sum of weights ÷ 3), capped at 40. |
| Size      | 30         | Total dollars bought. $10,000 or less scores 0, $1,000,000 or more scores 30, in between on a log scale.                                                                               |
| Breadth   | 15         | Number of different insiders: 2 insiders score 5, 3 score 10, 4 or more score 15.                                                                                                      |
| Tightness | 15         | 15 × (1 − days between first and last purchase ÷ cluster window). Purchases on the same day score 15.                                                                                  |

A cluster is a run of purchases in which each purchase is at most the **cluster window** (14 days by default) after the previous one. A single insider buying repeatedly is not a cluster. Change the window, the minimum number of insiders and the minimum value in the input.

The score ranks clusters against each other; it is not a prediction of price moves.

### Reliability by mode

| Mode                                | Status | Needs login or key? | Notes                             |
| ----------------------------------- | ------ | ------------------- | --------------------------------- |
| Insider open-market purchases       | ✅     | No                  | Form 4 code P.                    |
| Cluster scoring                     | ✅     | No                  | Formula is published.             |
| Sales and option exercises          | ❌     | -                   | Ignored on purpose.               |
| Foreign issuers without Form 4      | ❌     | -                   | Not covered.                      |
| Small companies with sparse filings | 🟡     | No                  | Often no cluster in the lookback. |

✅ works as described, 🟡 works with caveats, ❌ not supported.

### Only new records (delta mode)

Turn on **Only new or grown clusters (delta mode)** and set a **Delta key**. A scheduled run then returns, and bills, only clusters not delivered before or clusters that grew, meaning more insiders or more dollars since the last run.

### Known Limitations

- Only open-market purchases (Form 4 transaction code P) are counted; grants, option exercises, gifts and sales are ignored.
- Form 4 must be filed within two business days, so data is one to three days behind the trade.
- The score ranks clusters; it does not predict returns.
- Insiders' purchases can be small relative to their wealth; check the dollar value.
- Purchases through some trusts or entities appear under the filing owner's name.
- Companies that changed ticker or have no SEC ticker mapping are not found.

### Integrations

Run it from the Apify API, on a schedule, or from a webhook. Send results straight to Google Sheets, Make, Zapier, Slack or your own database with Apify's built-in integrations.

### Export Formats

Download the dataset as JSON, CSV, Excel, XML, HTML table or RSS from the **Output** tab or the API.

### Frequently Asked Questions

#### Where does the data come from?

SEC EDGAR: the list of Form 4 filings from data.sec.gov and the Form 4 documents themselves. It is an official public source, not a scraped website, and requests stay under the SEC limit of 10 per second.

#### Does it need an API key?

No.

#### What counts as a cluster?

Two or more different insiders (you can change the minimum) whose open-market purchases follow each other within the cluster window, 14 days by default.

#### Is the score a buy signal?

It is a ranking of how unusual and how senior the insider buying is. It is research data, not advice.

#### How do I find insider buying at a stock?

Enter its ticker and a 90-day lookback; a row is returned for every cluster found.

#### Am I charged for failed results?

No. You are only charged for clusters that are written to the dataset.

#### Do I need an account or login?

No. The Actor reads public SEC filings and needs no account or API key.

#### Am I charged for failed runs or empty results?

You are only charged for results that are actually written to the dataset.

#### Can I run it on a schedule?

Yes. Create a Task with your input and add a schedule in Apify Console. With monitor mode on, each scheduled run returns only what changed since the previous one.

### Changelog

- **2026-09-26:** First release: Form 4 cluster detection with a published 0-100 score, delta mode and bulk tickers.

### Enterprise and custom work

Need higher volumes, a custom output schema, dedicated scheduling or a no-breaking-changes commitment for a production pipeline? Open an issue on the Actor page and describe your use case. Bulk terms and custom builds are available.

### Support

Questions or a missing field? Open an issue from the **Issues** tab on this Actor's page and it will be looked at.

### Legal / Responsible Use

This Actor reads public filings from SEC EDGAR. You are responsible for how you use the data. It is not investment advice and is not affiliated with the SEC.

# Actor input Schema

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

Stock tickers to scan for insider buying clusters, one per line.

## `minClusterSize` (type: `integer`):

A cluster needs at least this many different insiders buying in the same window. Use 1 to also see single-insider purchases.

## `minDollarValue` (type: `number`):

Skip clusters whose combined purchases are below this value.

## `lookbackDays` (type: `integer`):

How far back to read Form 4 filings.

## `clusterWindowDays` (type: `integer`):

Purchases belong to the same cluster while each one is at most this many days after the previous one.

## `deltaMode` (type: `boolean`):

Return and bill only clusters not delivered before, or clusters that grew (more insiders or more dollars) since the last run with the same delta key.

## `deltaStateKey` (type: `string`):

Name of the tracked stream. Use a different key per watchlist.

## `proxyConfiguration` (type: `object`):

Optional proxy. SEC EDGAR works without one.

## Actor input object example

```json
{
  "tickers": [
    "PFE",
    "BAC",
    "F",
    "INTC",
    "T",
    "AAPL"
  ],
  "minClusterSize": 1,
  "minDollarValue": 0,
  "lookbackDays": 180,
  "clusterWindowDays": 14,
  "deltaMode": false,
  "deltaStateKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "tickers": [
        "PFE",
        "BAC",
        "F",
        "INTC",
        "T",
        "AAPL"
    ],
    "minClusterSize": 1,
    "lookbackDays": 180,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/insider-cluster-buy-scorer").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 = {
    "tickers": [
        "PFE",
        "BAC",
        "F",
        "INTC",
        "T",
        "AAPL",
    ],
    "minClusterSize": 1,
    "lookbackDays": 180,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/insider-cluster-buy-scorer").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 '{
  "tickers": [
    "PFE",
    "BAC",
    "F",
    "INTC",
    "T",
    "AAPL"
  ],
  "minClusterSize": 1,
  "lookbackDays": 180,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call mrdoe/insider-cluster-buy-scorer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/insider-cluster-buy-scorer"
        }
    }
}
```

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/bRbvuVrKWbBxVr1U7/builds/jUuj3yflbXeygwRVh/openapi.json
