# SEC 10b5-1 Trading Plans: insider plan adoptions, 10-Q and 10-K (`steadydata/sec-10b5-1-trading-plans`) Actor

Rule 10b5-1 trading plans that officers and directors adopted or terminated, from the Item 408 disclosure in 10-Q and 10-K filings: company, ticker, role, plan type, adoption and end date, duration and shares in the plan. By ticker or CIK, or every filing in a date range.

- **URL**: https://apify.com/steadydata/sec-10b5-1-trading-plans.md
- **Developed by:** [Steadydata Team](https://apify.com/steadydata) (community)
- **Categories:** News, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.25 / 1,000 trading plan listeds

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/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 10b5-1 Trading Plans: insider plan adoptions, 10-Q and 10-K

Rule 10b5-1 trading plans that officers and directors adopted or terminated, from the Item 408 disclosure in 10-Q and 10-K filings: company, ticker, role, plan type, adoption and end date, duration and shares in the plan. By ticker or CIK, or every filing in a date range.

### Why this scraper

- **Only delivered results are charged.** Inputs that fail come back as clear error
  records at no cost.
- **The plan when it is announced, not when it trades.** Form 4 and Form 144 show a 10b5-1 plan
  only once a sale happens. A plan must wait out a cooling-off period before its first trade
  (at least 90 days for officers and directors under Rule 10b5-1), and the 10-Q or 10-K that
  discloses the adoption comes out in between. This actor reads that disclosure: who in role
  adopted or terminated a plan, when, until when, and for how many shares.
- **Straight from the SEC's own tags, no text guessing.** Since the SEC's Executive
  Compensation Disclosure taxonomy, Item 408 is tagged in the filing's XBRL (adoption flag,
  termination flag, title, adoption date, expiration date, duration, aggregate shares). The
  actor reads the small page the SEC renders from exactly those tags. Measured on CarGurus'
  10-Q for the quarter to 30 June 2026: four plans from two pages of 8.4 KB together, instead
  of the 3.3 MB report. Every row links to that page in `reportUrl`, so each value can be checked.
- **Two ways in.** A watchlist of tickers or CIKs (the newest reports per company), or a
  filing period such as `last 7 days` that reads every 10-Q and 10-K filed in it, for every
  listed company at once, with a hard ceiling on how many filings are read.
- Rule 10b5-1 plans and non-Rule 10b5-1 arrangements are told apart, and so are adoptions,
  terminations and modifications. When a person has several arrangements, their separate
  share amounts come along in `arrangementShares`.

### Who this is for

Short sellers and quantitative funds who want to know which executives scheduled sales and
how large they are, before the Form 4 sales arrive. Investor-relations and compliance teams
comparing their own disclosure with peers. D\&O underwriters, governance researchers and
journalists who track planned insider selling per company or per quarter. Put tickers or CIKs
in `companies` for a watchlist, or `last 7 days` for a weekly market-wide sweep.

### Who this is not for

The name of the officer or director is not delivered, although the filing states it; a row
says "Chief Financial Officer of Intapp adopted a Rule 10b5-1 plan for 80,000 shares", and
the filing behind `documentUrl` says who. If you need rows keyed to a named person, this is
the wrong tool. The actor reads only what the filer TAGGED: a company that describes a plan in
the text but leaves the XBRL tags out, or tags no share amount, gives an empty field rather
than a guess (some filers state the amount only in words, then `aggregateShares` is empty).
Reports from before a filer started tagging Item 408 (the tagging was phased in during 2024
and 2025) give no rows. 8-K disclosures
of plans and the later Form 4 trades are not read here; for the trades use
[sec-insider-trading](https://apify.com/steadydata/sec-insider-trading). A period row reads
every 10-Q and 10-K filed in it, including the many that report no plan; you pay only for
the plans, but a long period takes time (the SEC allows at most ten requests per second, and
this actor stays at eight).

### Input fields

| Field | Type | Required or default | What it does |
|---|---|---|---|
| `companies` | list of text | required | One per row, up to 100: a ticker (CARG), a CIK (1494259), an EDGAR company URL, or a filing period for every company at once: '2026-10-20..2026-10-27' or 'last 7 days' (at most 31 days per row). |
| `forms` | list of text | \["10-Q", "10-K"] | Which reports to read. 10-Q and 10-K carry the Item 408 disclosure; add 10-Q/A or 10-K/A for amendments. |
| `sinceDate` | text |  | Company rows only: read filings filed on or after this date (YYYY-MM-DD). Empty means the newest filings up to the maximum below. |
| `maxFilingsPerCompany` | number | 4 | Company rows only, newest first. 4 is one year of quarterly and annual reports; the disclosure exists since 2023. |
| `maxFilingsPerPeriod` | number | 300 | Period rows only: a hard ceiling on the number of 10-Q and 10-K filings read per period row, newest day first. On 27 October 2026 the SEC received 72 of them. |

### Input example

```json
{
    "companies": [
        "CARG",
        "INTA",
        "last 3 days"
    ],
    "forms": [
        "10-Q",
        "10-K"
    ],
    "maxFilingsPerCompany": 4,
    "maxFilingsPerPeriod": 300
}
```

### Output example

| Field | Type | What it holds | Example |
|---|---|---|---|
| `companyName` | text | The company that filed the report, as the SEC names it. | `CarGurus, Inc.` |
| `ticker` | text | The company's ticker symbol; the first one when the company has several share classes. | `CARG` |
| `cik` | text | The SEC's own number for the filer, the key that stays the same when a company changes its name. | `1494259` |
| `form` | text | The report the disclosure comes from: 10-Q (quarterly) or 10-K (annual), or an amendment when asked for. | `10-Q` |
| `filingDate` | text | The date the report was filed with the SEC, the day the plan became public. | `2026-08-06` |
| `periodOfReport` | text | The quarter or fiscal year end the report covers; the plan was adopted or terminated within that period. | `2026-06-30` |
| `accessionNumber` | text | The SEC's id for this filing, the key to find the document back. | `0001193125-26-338067` |
| `action` | text | What happened to the arrangement in the period: Adopted, Terminated, Modified, or a combination such as Adopted and terminated, read from the flags the filer tagged. | `Adopted` |
| `planType` | text | Rule 10b5-1 for a plan meant to satisfy the affirmative defence of Rule 10b5-1(c), Non-Rule 10b5-1 for any other written trading arrangement. | `Rule 10b5-1` |
| `isRule10b51` | true/false | True for a Rule 10b5-1 plan, false for a non-Rule 10b5-1 arrangement; empty when the filer reports both in one entry. | `True` |
| `role` | text | The title of the officer or director as the filing states it, for example Chief Financial Officer or member of our Board of Directors. The person's name is not delivered; it is in the filing behind documentUrl. | `Executive Chair and Chair of the Board of Directors` |
| `isDirector` | true/false | Derived from the title text: it names a director, the board or a chair. | `True` |
| `isOfficer` | true/false | Derived from the title text: it names an officer, chief, president, executive, counsel, treasurer, secretary or controller. | `True` |
| `adoptionDate` | text | The date the arrangement was adopted, as tagged by the filer (YYYY-MM-DD). | `2026-05-29` |
| `terminationDate` | text | The date the arrangement was terminated, only for terminated arrangements. |  |
| `expirationDate` | text | The date the arrangement ends by its own terms, as tagged; some filers describe the end in words only, then it is empty. | `2027-02-26` |
| `durationDays` | number | The duration of the arrangement in days, as tagged by the filer; empty when the filer states it otherwise. | `274` |
| `durationText` | text | The duration exactly as the filing renders it, for example 367 days. | `274 days` |
| `aggregateShares` | number | The maximum number of securities that may be sold or bought under the arrangement, as tagged; when the filer tags only the separate arrangements, their sum. | `1493200` |
| `arrangementShares` | list | The amounts of the separate arrangements this person has under the plan, when the filer tags them separately; often empty. | `[150000]` |
| `arrangementIndex` | number | The position of this arrangement within its filing, counting from 1; with accessionNumber it identifies the row. | `3` |
| `documentUrl` | text | The 10-Q or 10-K itself; the full Item 408 text, including the person's name, is there. | `https://www.sec.gov/Archives/edgar/data/1494259/000119312...` |
| `reportUrl` | text | The page the SEC renders from the filing's Item 408 XBRL tags, where every value of this row can be checked. | `https://www.sec.gov/Archives/edgar/data/1494259/000119312...` |
| `indexUrl` | text | The SEC index page of the filing with every document in it. | `https://www.sec.gov/Archives/edgar/data/1494259/000119312...` |

Error codes: `INVALID_COMPANY`, `INVALID_PERIOD`, `INVALID_INPUT`, `NOT_FOUND`, `NO_FILINGS`, `NO_ARRANGEMENTS`, `DUPLICATE_INPUT`, `BLOCKED`.

One delivered row looks like this (CarGurus, 10-Q for the quarter to 30 June 2026, read from
the SEC on 28 October 2026):

```json
{
  "companyName": "CarGurus, Inc.",
  "ticker": "CARG",
  "cik": "1494259",
  "form": "10-Q",
  "filingDate": "2026-08-06",
  "periodOfReport": "2026-06-30",
  "accessionNumber": "0001193125-26-338067",
  "documentUrl": "https://www.sec.gov/Archives/edgar/data/1494259/000119312526338067/carg-20260630.htm",
  "indexUrl": "https://www.sec.gov/Archives/edgar/data/1494259/000119312526338067/0001193125-26-338067-index.htm",
  "reportUrl": "https://www.sec.gov/Archives/edgar/data/1494259/000119312526338067/R10.htm",
  "action": "Adopted",
  "planType": "Rule 10b5-1",
  "isRule10b51": true,
  "role": "Executive Chair and Chair of the Board of Directors",
  "isDirector": true,
  "isOfficer": true,
  "adoptionDate": "2026-05-29",
  "terminationDate": null,
  "expirationDate": "2027-02-26",
  "durationDays": 274,
  "durationText": "274 days",
  "aggregateShares": 1493200,
  "arrangementShares": [150000],
  "arrangementIndex": 3,
  "status": "ok"
}
```

### Related actors from steadydata

- [sec-insider-trading](https://apify.com/steadydata/sec-insider-trading): the Form 4 sales and purchases that follow once a plan starts trading
- [sec-edgar-filings](https://apify.com/steadydata/sec-edgar-filings): every filing of the same company, 10-K to 8-K, with links
- [google-finance-quotes](https://apify.com/steadydata/google-finance-quotes): the share price of the same company, live

### Pricing

Pay per event: one `plan-listed` event per delivered result. No charge for inputs
that fail, no separate platform-usage surcharge.

**Free Apify plan:** this actor delivers up to 25 rows per run for accounts on the Apify free
plan, and then stops with a message. That limit is set by us, not by Apify. It exists so the
actor keeps paying for itself for the people who do pay. Any paid Apify plan runs it at full
size, billed per delivered row, with failed rows never charged.

### FAQ

**Is personal data collected?**
No. The filing names the person three times (a name tag, the label of the person's entry and
the text of the material terms) and sometimes names a relative in the label of a joint
arrangement. None of that is read into the dataset, and a title that happens to contain the
name is cleaned. A row carries the company, the role as filed and the plan; the name stays in
the filing behind `documentUrl`.

**How do I get every new plan each week?**
Schedule a run with `last 7 days` in `companies`. It reads every 10-Q and 10-K filed in those
seven days and delivers only the plans. Filings without a plan are not charged, and a period
in which no filing reports one comes back as one free `NO_ARRANGEMENTS` row.

**What is the difference between a Rule 10b5-1 plan and a non-Rule 10b5-1 arrangement?**
A Rule 10b5-1 plan is a written plan adopted without inside information that is meant to
satisfy the affirmative defence of Rule 10b5-1(c). A non-Rule 10b5-1 trading arrangement is
any other written trading arrangement the SEC asks companies to disclose. `planType` and
`isRule10b51` say which one a row is.

**Why is `aggregateShares` empty or different from the sum of `arrangementShares`?**
Because the actor delivers what the filer tagged. Some filers tag one total per person, some
only the separate arrangements (then the total is their sum), some describe a plan in dollars
or in words. CarGurus tags a total of 1,493,200 shares for its executive chair and one
separate arrangement of 150,000; both are delivered as filed.

**What does a run cost when a company has no plan?**
Nothing. `NO_ARRANGEMENTS`, `NO_FILINGS`, `NOT_FOUND`, `INVALID_COMPANY`, `INVALID_PERIOD` and
`BLOCKED` rows are free; only delivered plans are charged.

**How far back does it go?**
As far as the tagging goes. The Item 408 disclosure exists since 2023; the XBRL tagging this
actor reads was phased in during 2024 and 2025. `maxFilingsPerCompany` reads up to 40 reports per company, which
is ten years of quarterly reports, but older reports simply give no rows.

**What happens when the source changes?**
Sources change from time to time; that is the nature of this work. The actor is
monitored daily and fixed fast, and while it is broken you are not charged, because
only delivered results cost anything.

**Can I call it from my own code, like an API?**
Yes. Every run is available through the Apify API: start it with one HTTP request, then read
the results as JSON, CSV or Excel from the dataset endpoint, or use the official Python and
JavaScript clients. The input is the same JSON as in the input example above, so a scheduled
script, a Make or Zapier step or an AI agent can call it without any changes.

# Changelog

This Actor's version history is a separate document: https://apify.com/steadydata/sec-10b5-1-trading-plans/changelog.md

# Actor input Schema

## `companies` (type: `array`):

One per row, up to 100: a ticker (CARG), a CIK (1494259), an EDGAR company URL, or a filing period for every company at once: '2026-10-20..2026-10-27' or 'last 7 days' (at most 31 days per row).

## `forms` (type: `array`):

Which reports to read. 10-Q and 10-K carry the Item 408 disclosure; add 10-Q/A or 10-K/A for amendments.

## `sinceDate` (type: `string`):

Company rows only: read filings filed on or after this date (YYYY-MM-DD). Empty means the newest filings up to the maximum below.

## `maxFilingsPerCompany` (type: `integer`):

Company rows only, newest first. 4 is one year of quarterly and annual reports; the disclosure exists since 2023.

## `maxFilingsPerPeriod` (type: `integer`):

Period rows only: a hard ceiling on the number of 10-Q and 10-K filings read per period row, newest day first. On 27 October 2026 the SEC received 72 of them.

## Actor input object example

```json
{
  "companies": [
    "CARG",
    "INTA",
    "last 3 days"
  ],
  "forms": [
    "10-Q",
    "10-K"
  ],
  "maxFilingsPerCompany": 4,
  "maxFilingsPerPeriod": 300
}
```

# 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 = {
    "companies": [
        "CARG",
        "INTA",
        "last 3 days"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadydata/sec-10b5-1-trading-plans").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 = { "companies": [
        "CARG",
        "INTA",
        "last 3 days",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("steadydata/sec-10b5-1-trading-plans").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 '{
  "companies": [
    "CARG",
    "INTA",
    "last 3 days"
  ]
}' |
apify call steadydata/sec-10b5-1-trading-plans --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadydata/sec-10b5-1-trading-plans"
        }
    }
}
```

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/i3s7bbI17Iwz9LqzY/builds/Qlv8v6086QmjLBy8g/openapi.json
