# SEC Form 4 Watchlist Monitor (`apex-nexus/sec-form-4-monitor`) Actor

Monitors SEC tickers/CIKs for new insider-trading and ownership filings (Forms 3, 4, 5, 13F): one alert per new filing. Use cases: compliance watchlist alerting, M\&A screening, quant insider-flow feeds. No new filings means no per-alert charges. Public SEC data only; deterministic; no inference.

- **URL**: https://apify.com/apex-nexus/sec-form-4-monitor.md
- **Developed by:** [Valunex](https://apify.com/apex-nexus) (community)
- **Categories:** Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 alerts

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 Form 4 Watchlist Monitor

Monitors a watchlist of SEC tickers/CIKs for new insider-trading and ownership
filings — Form 4 (default), and optionally Form 3, Form 5 and 13F — and emits
one dataset item (alert) per new filing since the last run.

### Who it is for

Compliance officers, quant/research desks, M\&A professionals and watchdog
analysts who need to know when officers, directors or 10% owners file Form 4
trades, when new insiders file Form 3, when annual Form 5 changes are reported,
or when institutions file 13F holdings — without re-polling SEC EDGAR manually.

### What users run it for

Concrete ways buyers use the Actor. These are example uses of a general
watchlist monitor — not customer claims, and the Actor makes no promises about
any specific filing or outcome.

#### Compliance alerting on an insider watchlist

A compliance officer monitors officers, directors and 10% owners on a firm
watchlist for personal-account-dealing and front-running risk.

- Input: `tickers` = watchlist tickers/CIKs, `formTypes: ["3", "4", "5"]`,
  `lookbackDays: 1`, `deliveryWebhookUrl` = the alert inbox webhook.
- The run POSTs each new Form 3/4/5 to the webhook as it is detected.
- If no one filed, the run emits zero items — there are no per-alert charges.

#### M\&A screening of target-company insiders

An M\&A analyst screens a target company's insiders for abnormal trading ahead
of deal announcements.

- Input: `tickers` = the target company, `formTypes: ["4", "5"]`,
  `lookbackDays: 30`, `transactionCodes: ["P", "S"]`,
  `minTransactionValueUsd: 250000` — large purchases and sales only.

#### Quant desk insider-flow feed

A quant desk feeds insider buys and sells into an alpha model.

- Input: `formTypes: ["4"]`, `transactionCodes: ["P", "S"]`,
  `maxResultsPerTicker: 100`, `deliveryWebhookUrl` = the data pipeline webhook.
- Each alert is POSTed as JSON as it is detected; you pay only on alerts.

#### Default run (no decisions needed)

```json
{ "tickers": ["AAPL", "TSLA", "1651777"] }
```

Monitors Form 4 filings from the last 1 day, up to 10 new filings per ticker.
Repeat runs resume from the per-ticker checkpoint and emit only filings newer
than the last run, so nothing repeats and nothing is missed.

#### Free when nothing changes

The Actor checkpoints the last-checked date and seen accession numbers per
ticker in its key-value store. Repeat runs only emit genuinely new filings, so
no new filings means zero dataset items: you pay the $0.0001 run start, but no
$0.005 per-alert fees. Pay only on signal, not on silence.

### Form types monitored

| Form | What it is | What the Actor emits |
|------|------------|----------------------|
| **3** | Initial statement of beneficial ownership (a new insider) | Reporting person name, title, officer flag, issuer name/CIK |
| **4** | Statement of changes in beneficial ownership (insider trade) | Insider, transaction code (P/S/A/M…), value, shares, ownership after |
| **5** | Annual statement of changes in beneficial ownership | Same trade fields as Form 4 plus issuer name/CIK |
| **13F** | Institutional investment manager holdings report | Manager name, report period, holdings count, total holdings value |

Use the `formTypes` input to select which forms to scan (default: `["4"]`,
which preserves the original Form 4–only behavior exactly).

### What makes it different

Existing Apify Store actors for insider trading are typically on-demand
fetchers: you run them, get a batch, and run again when you want an update.
This Actor keeps a watchlist and remembers what it already reported, so
repeat runs emit only genuinely new filings — free when nothing changes.

### Data source

Public SEC data only, via official SEC endpoints:

- https://www.sec.gov/files/company_tickers.json (ticker -> CIK)
- https://data.sec.gov/submissions/CIK{CIK}.json (company recent filings)
- https://www.sec.gov/Archives/edgar/data/... (filing document text)

No credentials, no proxies, no scraping of rate-limited or anti-bot pages, no
commercial inference (no LLMs) inside the product. SEC rate guidance (~10
requests/s) is respected; a failing ticker never aborts the whole run.

### Pricing (pay-per-event, Apify Store)

- Actor start: $0.0001 per run (one-time)
- New alert (dataset item): $0.005 per alert — any supported form type
- Price changes are limited to no more than once per month, with at least 14 days' notice before they take effect (per Apify Terms).

Apify retains a 20% commission on revenue; payouts are monthly and require
completed identity verification (KYC). See knowledge/decisions.md for the
full margin model and kill test.

### Input

See actor/.actor/input_schema.json. Required: `tickers` (array of SEC tickers
or CIKs, max 50). Example inputs for each use case are the top-level
`examples` in input-schema.json.

- `formTypes`: array of `"3"`, `"4"`, `"5"`, `"13F"`, default `["4"]`.
- `transactionCodes`: optional array of transaction codes (e.g. `["P", "S"]`
  for purchases and sales) — filters Forms 4 and 5 only.
- `minTransactionValueUsd`: optional minimum parsed transaction value in USD
  — filters Forms 4 and 5 only.
- `lookbackDays` (1-30, default 1), `maxResultsPerTicker` (1-100, default 10),
  `deliveryWebhookUrl`: each new alert is POSTed as JSON to that URL as it is
  detected. Webhook failures are logged and never abort the run.

Example:

```json
{ "tickers": ["AAPL", "TSLA", "1651777"], "lookbackDays": 1, "maxResultsPerTicker": 10, "formTypes": ["4", "5"] }
```

### Output

One dataset item per new filing. Common fields are always present;
form-type-specific fields are `null` when not parseable or not applicable:

```json
{
  "ticker": "AAPL",
  "cik": "0000320193",
  "companyName": "Apple Inc.",
  "form": "4",
  "filingDate": "2026-10-28",
  "reportDate": "2026-10-27",
  "accessionNumber": "0000320193-26-000123",
  "primaryDocument": "aapl-20261027.htm",
  "documentUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019326000123/aapl-20261027.htm",
  "newSinceLastRun": true,
  "insiderName": "John Appleseed",
  "insiderTitle": "Chief Executive Officer",
  "insiderCik": null,
  "isOfficer": null,
  "issuerName": null,
  "issuerCik": null,
  "transactionCode": "P",
  "transactionDate": "2026-10-27",
  "transactionValueUsd": 1234567.0,
  "shares": 10000.0,
  "ownershipAfter": 450000.0,
  "managerName": null,
  "managerCik": null,
  "holdingsCount": null,
  "totalValueUsd": null
}
```

Every field is `null` when it could not be parsed from the filing document —
the Actor never guesses. A 13F item instead fills `managerName`,
`holdingsCount` and `totalValueUsd` and leaves the insider/trade fields null.

### Output examples by form type

The items below illustrate the output shape per form type. Values are
examples, not records of actual filings, and every field the Actor cannot
parse is `null`.

#### Form 4 — insider transaction

```json
{
  "ticker": "NVDA",
  "cik": "0001045810",
  "companyName": "NVIDIA Corp.",
  "form": "4",
  "filingDate": "2026-10-27",
  "reportDate": "2026-10-23",
  "accessionNumber": "0001045810-26-000123",
  "primaryDocument": "nvda-20261023.xml",
  "documentUrl": "https://www.sec.gov/Archives/edgar/data/1045810/000104581026000123/nvda-20261023.xml",
  "newSinceLastRun": true,
  "insiderName": "Jane Director",
  "insiderTitle": "Chief Financial Officer",
  "insiderCik": null,
  "isOfficer": true,
  "issuerName": "NVIDIA Corp.",
  "issuerCik": "0001045810",
  "transactionCode": "S",
  "transactionDate": "2026-10-23",
  "transactionValueUsd": 1250000.0,
  "shares": 10000.0,
  "ownershipAfter": 45000.0,
  "managerName": null,
  "managerCik": null,
  "holdingsCount": null,
  "totalValueUsd": null
}
```

#### Form 3 — initial statement of beneficial ownership

```json
{
  "ticker": "AAPL",
  "cik": "0000320193",
  "companyName": "Apple Inc.",
  "form": "3",
  "filingDate": "2026-10-26",
  "reportDate": null,
  "accessionNumber": "0000320193-26-000045",
  "primaryDocument": "form3.xml",
  "documentUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019326000045/form3.xml",
  "newSinceLastRun": true,
  "insiderName": "New Officer",
  "insiderTitle": "EVP, Commercial",
  "insiderCik": null,
  "isOfficer": true,
  "issuerName": "Apple Inc.",
  "issuerCik": "0000320193",
  "transactionCode": null,
  "transactionDate": null,
  "transactionValueUsd": null,
  "shares": null,
  "ownershipAfter": null,
  "managerName": null,
  "managerCik": null,
  "holdingsCount": null,
  "totalValueUsd": null
}
```

#### Form 5 — annual statement of changes in beneficial ownership

```json
{
  "ticker": "JPM",
  "cik": "0000019617",
  "companyName": "JPMorgan Chase & Co.",
  "form": "5",
  "filingDate": "2026-03-27",
  "reportDate": "2025-12-31",
  "accessionNumber": "0000019617-26-000012",
  "primaryDocument": "jpm-20251231.xml",
  "documentUrl": "https://www.sec.gov/Archives/edgar/data/19617/000001961726000012/jpm-20251231.xml",
  "newSinceLastRun": true,
  "insiderName": "Ten Percent Owner",
  "insiderTitle": null,
  "insiderCik": null,
  "isOfficer": null,
  "issuerName": "JPMorgan Chase & Co.",
  "issuerCik": "0000019617",
  "transactionCode": "A",
  "transactionDate": "2025-12-15",
  "transactionValueUsd": 340000.0,
  "shares": 2500.0,
  "ownershipAfter": 180000.0,
  "managerName": null,
  "managerCik": null,
  "holdingsCount": null,
  "totalValueUsd": null
}
```

#### 13F — institutional investment manager holdings report

```json
{
  "ticker": "0001067983",
  "cik": "0001067983",
  "companyName": "Berkshire Hathaway Inc.",
  "form": "13F",
  "filingDate": "2026-02-17",
  "reportDate": "2025-12-31",
  "accessionNumber": "0001104659-26-012345",
  "primaryDocument": "infotable.xml",
  "documentUrl": "https://www.sec.gov/Archives/edgar/data/1067983/000110465926012345/infotable.xml",
  "newSinceLastRun": true,
  "insiderName": null,
  "insiderTitle": null,
  "insiderCik": null,
  "isOfficer": null,
  "issuerName": null,
  "issuerCik": null,
  "transactionCode": null,
  "transactionDate": null,
  "transactionValueUsd": null,
  "shares": null,
  "ownershipAfter": null,
  "managerName": "Berkshire Hathaway Inc.",
  "managerCik": "0001067983",
  "holdingsCount": 55,
  "totalValueUsd": 150000000000.0
}
```

### Limits

- Max 50 tickers per run, 100 alerts per ticker per run.
- Only forms listed in `formTypes` in the company's recent filings feed are
  considered; older filings outside the SEC's recent feed are not scanned.
- Checkpoints persist per ticker in the Actor key-value store; resetting the
  store re-emits filings within the lookback window.

### Verification

Run `pytest actor/tests` before release (builder acceptance criterion).

# Actor input Schema

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

SEC tickers (e.g. AAPL) or CIKs to monitor for new filings. Duplicate tickers are merged and one erroring ticker never aborts the run.

## `formTypes` (type: `array`):

Filing types to scan for each watchlist company: 3 (initial beneficial ownership), 4 (insider transactions), 5 (annual changes) and 13F (institutional holdings). Default monitors Form 4 only, exactly as before.

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

Only emit filings whose transaction code is one of these (e.g. P = purchase, S = sale, A = award, M = option exercise). Applies to Forms 4 and 5; empty means no filter.

## `minTransactionValueUsd` (type: `number`):

Only emit filings with a parsed transaction value at least this high. Applies to Forms 4 and 5; empty means no filter.

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

How far back to look for filings on the first run; repeat runs only emit filings newer than the last checked state.

## `maxResultsPerTicker` (type: `integer`):

Cap the number of new filings emitted per ticker in a single run.

## `deliveryWebhookUrl` (type: `string`):

Optional HTTPS webhook URL each new alert is POSTed to as JSON as it is detected. Webhook failures are logged and never abort the run.

## Actor input object example

```json
{
  "tickers": [
    "AAPL",
    "TSLA",
    "NVDA",
    "MSFT",
    "AMZN",
    "META",
    "GOOGL",
    "NFLX",
    "AMD",
    "COIN",
    "SQ",
    "UBER",
    "ABBV",
    "PFE",
    "JPM",
    "BAC",
    "WMT",
    "HD",
    "DIS",
    "NKE",
    "SBUX",
    "MCD",
    "XOM",
    "CVX"
  ],
  "formTypes": [
    "4"
  ],
  "transactionCodes": [],
  "lookbackDays": 1,
  "maxResultsPerTicker": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

Dataset items filtered by the overview view defined in the dataset schema.

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

All dataset items emitted by the Actor run (newly detected SEC filings).

# 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": [
        "AAPL",
        "TSLA",
        "NVDA",
        "MSFT",
        "AMZN",
        "META",
        "GOOGL",
        "NFLX",
        "AMD",
        "COIN",
        "SQ",
        "UBER",
        "ABBV",
        "PFE",
        "JPM",
        "BAC",
        "WMT",
        "HD",
        "DIS",
        "NKE",
        "SBUX",
        "MCD",
        "XOM",
        "CVX"
    ],
    "formTypes": [
        "4"
    ],
    "transactionCodes": [],
    "lookbackDays": 1,
    "maxResultsPerTicker": 10,
    "deliveryWebhookUrl": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("apex-nexus/sec-form-4-monitor").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": [
        "AAPL",
        "TSLA",
        "NVDA",
        "MSFT",
        "AMZN",
        "META",
        "GOOGL",
        "NFLX",
        "AMD",
        "COIN",
        "SQ",
        "UBER",
        "ABBV",
        "PFE",
        "JPM",
        "BAC",
        "WMT",
        "HD",
        "DIS",
        "NKE",
        "SBUX",
        "MCD",
        "XOM",
        "CVX",
    ],
    "formTypes": ["4"],
    "transactionCodes": [],
    "lookbackDays": 1,
    "maxResultsPerTicker": 10,
    "deliveryWebhookUrl": "",
}

# Run the Actor and wait for it to finish
run = client.actor("apex-nexus/sec-form-4-monitor").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": [
    "AAPL",
    "TSLA",
    "NVDA",
    "MSFT",
    "AMZN",
    "META",
    "GOOGL",
    "NFLX",
    "AMD",
    "COIN",
    "SQ",
    "UBER",
    "ABBV",
    "PFE",
    "JPM",
    "BAC",
    "WMT",
    "HD",
    "DIS",
    "NKE",
    "SBUX",
    "MCD",
    "XOM",
    "CVX"
  ],
  "formTypes": [
    "4"
  ],
  "transactionCodes": [],
  "lookbackDays": 1,
  "maxResultsPerTicker": 10,
  "deliveryWebhookUrl": ""
}' |
apify call apex-nexus/sec-form-4-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apex-nexus/sec-form-4-monitor"
        }
    }
}
```

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/9oq9BkrrkUm8fqF7o/builds/if1nwBa5jJSUX6oJy/openapi.json
