# SEC Insider Buying Tracker - Form 4 Purchases & Clusters (`tinylabs/sec-insider-buys`) Actor

Find stocks that company insiders are buying with their own money. Reads official SEC Form 4 filings and returns open-market purchases with dollar value, role, ownership change, 10b5-1 flag and multi-insider cluster counts. No API key.

- **URL**: https://apify.com/tinylabs/sec-insider-buys.md
- **Developed by:** [Tiny Labs](https://apify.com/tinylabs) (community)
- **Categories:** Business, Developer tools, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 insider trade returneds

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

## SEC Insider Buying Tracker: Form 4 Open-Market Purchases & Cluster Buys

**See which stocks company insiders are buying with their own money.** This Actor reads official SEC Form 4 filings from EDGAR and returns clean, flat rows of insider trades. By default it keeps only **open-market purchases** (transaction code P), which is the classic insider-buying signal, and it skips pre-planned 10b5-1 trades and small trades. Every row includes the dollar value, the insider's role, how much the purchase grew their stake, and how many *other* insiders bought the same stock in the same window (**cluster buying**).

No API key, no login, no third-party websites. Only the SEC's public EDGAR data.

### Why insider buys?

Insiders sell for many reasons, like taxes, a new house or diversification. They usually **buy** for one reason. Purchases are rare (a few dozen a day across the whole US market), and purchases by several insiders at once are rarer still. This Actor finds them for you every day.

### What you get for each trade

| Field | Example |
|---|---|
| `ticker`, `issuerName` | TTMI, TTM TECHNOLOGIES INC |
| `insiderName`, `officerTitle`, `insiderRoles` | Roks Edwin, President and CEO, \[Director, Officer] |
| `transactionDate`, `filedDate`, `filingDelayDays` | trade date, SEC filing date, days between them |
| `transactionCode`, `transactionType` | P, Open-market or private purchase |
| `shares`, `pricePerShare`, `valueUsd` | 5000, 88.07, 440350 |
| `sharesOwnedBefore`, `sharesOwnedAfter`, `ownershipChangePct`, `isNewPosition` | how much the stake grew |
| `clusterInsiderCount`, `clusterValueUsd` | number of different insiders with a matching trade in this stock in the window, and their total |
| `is10b5_1Plan` | whether the trade was made under a pre-scheduled plan |
| `directOrIndirect`, `indirectOwnershipNature` | held directly, or via a trust or fund |
| `dataQualityFlags` | e.g. `value_over_500m_verify_in_filing` when the filer likely mistyped the price |
| `filingUrl` | the original filing on sec.gov |

A run also saves a **CLUSTERS** record in the key-value store: every stock with 2 or more insiders buying, ranked by number of insiders and total dollars. It's free with every run.

#### Sample results table

The largest open-market purchases in one run on Oct 29, 2026 (filed Oct 26-28). Rows with a likely filer typo are flagged instead of hidden.

| Ticker | Company | Insider role | Purchase value | Insiders buying (cluster) |
|---|---|---|---|---|
| LYCA | Lycia Therapeutics | 10% owner (VC fund) | $34,999,992 | 1 |
| MSM | MSC Industrial Direct | Director, 10% owner | $15,620,119 | 1 |
| LRN | Stride, Inc. | Director | $7,126,745 | 1 |
| SRRK | Scholar Rock | Director | $4,075,071 | 1 |
| ACN | Accenture | Chair and CEO | $2,486,318 | 2 |
| STC | Stewart Information Services | CEO | $133,350 | **5** |
| BBT | Beacon Financial Corp | Director | $104,984 | **5** |

#### Example output (JSON, real rows from a run on Oct 29, 2026)

Shortened: a few fields are left out here. In this window, 5 different Stewart Information Services (STC) insiders bought shares, which is a cluster.

```json
[
  {
    "ticker": "STC",
    "issuerName": "STEWART INFORMATION SERVICES CORP",
    "issuerCik": "94344",
    "insiderName": "EPPINGER FREDERICK H",
    "insiderRoles": [
      "Director",
      "Officer"
    ],
    "officerTitle": "Chief Executive Officer",
    "transactionDate": "2026-10-26",
    "filedDate": "2026-10-27",
    "filingDelayDays": 1,
    "transactionCode": "P",
    "transactionType": "Open-market or private purchase",
    "shares": 3000.0,
    "pricePerShare": 44.45,
    "valueUsd": 133350.0,
    "sharesOwnedAfter": 173675.0,
    "ownershipChangePct": 1.76,
    "isNewPosition": false,
    "directOrIndirect": "Direct",
    "is10b5_1Plan": false,
    "dataQualityFlags": [],
    "accessionNumber": "0001628280-26-067616",
    "filingUrl": "https://www.sec.gov/Archives/edgar/data/1261155/000162828026067616/0001628280-26-067616-index.htm",
    "clusterInsiderCount": 5,
    "clusterValueUsd": 460970.0
  },
  {
    "ticker": "ACN",
    "issuerName": "Accenture plc",
    "issuerCik": "1467373",
    "insiderName": "Sweet Julie Spellman",
    "insiderRoles": [
      "Director",
      "Officer"
    ],
    "officerTitle": "Chair and CEO",
    "transactionDate": "2026-10-26",
    "filedDate": "2026-10-28",
    "filingDelayDays": 2,
    "transactionCode": "P",
    "transactionType": "Open-market or private purchase",
    "shares": 10100.0,
    "pricePerShare": 246.1701,
    "valueUsd": 2486318.01,
    "sharesOwnedAfter": 48910.0,
    "ownershipChangePct": 26.02,
    "isNewPosition": false,
    "directOrIndirect": "Direct",
    "is10b5_1Plan": false,
    "dataQualityFlags": [],
    "accessionNumber": "0001487630-26-000022",
    "filingUrl": "https://www.sec.gov/Archives/edgar/data/1467373/000148763026000022/0001487630-26-000022-index.htm",
    "clusterInsiderCount": 2,
    "clusterValueUsd": 3200889.0
  }
]
```

### Try it free in one click

The input is prefilled: the last 3 days of open-market purchases of $25,000 or more, capped at 100 rows (at most $0.30). Click **Start** and the results appear in about a minute. Apify's free plan includes monthly credit, which covers this test run.

### Use cases

- **Daily insider-buying screen:** schedule it each morning and get yesterday's purchases above $50k by officers and directors.
- **Cluster-buy alerts:** set *Minimum insiders in cluster* to 2 or 3 to see only stocks where several insiders are buying together.
- **Watchlist monitoring:** add your tickers and get every insider trade in them, buys and sells (codes P and S).
- **Quant research:** export months of clean Form 4 transactions to CSV or a database for backtests.
- **Newsletters and content:** a weekly "biggest insider buys" table writes itself.

### How to use it

1. Set **Days back** (default 3) or a **Start date** / **End date**.
2. Keep **Transaction types** = `P` for purchases. Add `S` for sales, or other codes, if you want them.
3. Set **Minimum trade value** (default $10,000) and, optionally, **Officers and directors only**.
4. Optional: add **Watchlist tickers**.
5. Click **Start** and export results to CSV, Excel, JSON or Google Sheets, or send them to Slack, Zapier or Make.

**Monitor mode:** turn on **Only new since my last run** and add a daily Schedule. You only receive, and pay for, trades you haven't seen.

### Pricing

Pay per result: **$0.003 per insider trade returned** ($3 per 1,000). Filtered-out transactions are free, and there is no start fee. A typical daily run of purchases over $10k returns 30-60 rows, about $0.10-0.20.

### Input example

```json
{
  "daysBack": 1,
  "transactionCodes": ["P"],
  "minValueUsd": 50000,
  "officersAndDirectorsOnly": true,
  "excludePlanTrades": true,
  "minClusterInsiders": 1,
  "onlyNew": true
}
```

### FAQ

**Where does the data come from?** The SEC's EDGAR system, from the daily form index, the "latest filings" feed for today, and the structured XML in each Form 4. The Actor identifies itself to the SEC with a User-Agent and contact email, and stays under the SEC's 10 requests/second fair-access limit.

**How fast after a trade does it show up?** Insiders must file within 2 business days of the trade. Filings appear here the day they are filed.

**What about derivative trades (options)?** This version returns non-derivative transactions (common stock and similar). Option exercises show up as code M in the non-derivative table when shares are acquired.

**How is this different from OpenInsider, Finviz or a paid insider API?** You get the same SEC Form 4 data as clean JSON/CSV you own, with 10b5-1 plan filtering, ownership-change % and cluster counts built in, for $3 per 1,000 trades and no subscription.

**Can I get alerts?** Yes. Schedule the Actor daily with **Only new since my last run** on, and connect a Slack, email, Discord or webhook integration in Apify.

**Can I call it from code or an AI agent?** Yes, through the Apify API, the Python/JS clients, or the Apify MCP server.

**Is this investment advice?** No. The data is provided for information and research only. Insider purchases are not a recommendation to buy any security.

**Why is a value huge or zero?** Filers sometimes make mistakes in the price field. Such rows are flagged in `dataQualityFlags`. Always check the linked filing before acting.

### Notes

- Not affiliated with or endorsed by the U.S. Securities and Exchange Commission.
- Insider home addresses are not included in the output.

### Keywords

insider trading tracker, insider buying, SEC Form 4 scraper, Form 4 API, cluster buying, insider purchases screener, OpenInsider alternative, EDGAR insider transactions, stock insider alerts, CEO stock purchases.

### Related Actors (Tiny Labs SEC data suite)

- [Recently Funded Companies: SEC Form D Funding Leads](https://apify.com/tinylabs/sec-form-d-funding-leads): private companies that just raised money, with amount, executives and phone.
- [New CEO & Executive Changes: SEC 8-K Item 5.02](https://apify.com/tinylabs/sec-executive-changes): new CEOs, CFOs and board members at public companies, as sales triggers and investor alerts.
- [IPO Pipeline Tracker: New SEC S-1 & F-1 Filings](https://apify.com/tinylabs/sec-ipo-pipeline): companies that just filed to go public, with proposed ticker, price range and underwriters.

### Support

Open an issue on the Issues tab. Feature requests (for example 13D/13G stakes or Form 144 planned sales) are welcome.

# Actor input Schema

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

How many days of Form 4 filings to read, counting back from today (or from End date). Ignored when Start date is set. Several hundred filings arrive each business day.

## `startDate` (type: `string`):

Optional. First filing date to include (YYYY-MM-DD).

## `endDate` (type: `string`):

Optional. Last filing date to include (YYYY-MM-DD). Defaults to today.

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

Optional. Only return trades in these stocks, for example AAPL, TSLA. Leave empty to scan the whole market.

## `transactionCodes` (type: `array`):

SEC transaction codes to keep. P = open-market purchase (the classic insider-buying signal). S = sale. A = grant, M = option exercise, F = tax withholding, G = gift.

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

Skip trades smaller than this (shares x price).

## `excludePlanTrades` (type: `boolean`):

Drop trades made under a pre-scheduled Rule 10b5-1 plan. These are planned in advance, so they carry less signal.

## `officersAndDirectorsOnly` (type: `boolean`):

Keep only trades by officers (CEO, CFO, ...) and directors. Drops funds that are only 10% owners.

## `minClusterInsiders` (type: `integer`):

Only return stocks where at least this many different insiders made a matching trade in the date window. Set to 2 or 3 to find cluster buying.

## `includeAmendments` (type: `boolean`):

Also read Form 4/A amendments.

## `onlyNew` (type: `boolean`):

Remember which filings you already received and return only new ones. Turn this on when you schedule the Actor.

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

Return at most this many transactions (largest clusters and biggest trades first). You are only charged for results returned.

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

The SEC asks every client to identify itself with a name and contact email. Leave empty to use the Actor's default.

## Actor input object example

```json
{
  "daysBack": 3,
  "transactionCodes": [
    "P"
  ],
  "minValueUsd": 25000,
  "excludePlanTrades": true,
  "officersAndDirectorsOnly": false,
  "minClusterInsiders": 1,
  "includeAmendments": false,
  "onlyNew": false,
  "maxResults": 100
}
```

# Actor output Schema

## `results` (type: `string`):

One row per SEC Form 4 transaction that passed your filters: ticker, issuer, insider, role, shares, price, value, ownership change, 10b5-1 flag and cluster counts.

## `clusters` (type: `string`):

JSON record CLUSTERS in the default key-value store: stocks where two or more different insiders traded in the window, with insider count and total value.

## `summary` (type: `string`):

JSON record SUMMARY in the default key-value store: date range, filings read, transactions returned, number of 2+ insider clusters and SEC requests made.

# 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": 3,
    "transactionCodes": [
        "P"
    ],
    "minValueUsd": 25000,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("tinylabs/sec-insider-buys").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": 3,
    "transactionCodes": ["P"],
    "minValueUsd": 25000,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("tinylabs/sec-insider-buys").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": 3,
  "transactionCodes": [
    "P"
  ],
  "minValueUsd": 25000,
  "maxResults": 100
}' |
apify call tinylabs/sec-insider-buys --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tinylabs/sec-insider-buys"
        }
    }
}
```

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/9RftlKhAkVIgd1E7d/builds/KtccbCEFrgqTD2pdu/openapi.json
