# SEC 13D/13G Issuer Watchlist Monitor (`frankycheese/sec-ownership-change`) Actor

Monitor official SEC Schedule 13D and 13G filings by issuer-name term. Receive newly observed matching filings and changed indexed source records with bounded per-run charges.

- **URL**: https://apify.com/frankycheese/sec-ownership-change.md
- **Developed by:** [franklin mccheese](https://apify.com/frankycheese) (community)
- **Categories:** Automation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $400.00 / 1,000 new ownership filings

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 13D/13G Issuer Watchlist Monitor

Monitor official SEC Schedule 13D, 13D/A, 13G, and 13G/A filings by issuer-name term. Receive newly observed matching filings and changed indexed source records while unchanged replays create no Actor event charge.

- **Buyer:** investor-relations, activist-investor research, legal/compliance, and public-company monitoring teams
- **Result:** one source-linked row per newly observed matching filing or changed indexed source record
- **Official source:** SEC EDGAR daily master index and the linked SEC filing
- **First useful run:** at most one current filing whose issuer name contains `inc`
- **Maximum charge:** **$0.40** for the prefilled run
- **Source records inspected:** at most **100**
- **Unchanged replay:** **$0** in Actor event charges
- **Not included:** stake extraction, filer classification, ownership-percentage parsing, activist/passive scoring, legal conclusions, or investment advice

[Open the bounded issuer preview](https://apify.com/frankycheese/sec-ownership-change/examples/monitor-sec-ownership-filings) or use the prefilled input in **Run**. Inspect the linked SEC filing before using a row in legal, compliance, trading, or investor-relations decisions.

### fastest test

The Store input checks up to seven recent calendar days, scans at most 100 ownership-form index rows, returns at most one issuer-name match, and cannot create more than `$0.40` in Actor event charges.

```json
{
  "watchlistId": "sec-ownership-preview",
  "issuerKeywords": ["inc"],
  "forms": [
    "SCHEDULE 13D",
    "SCHEDULE 13D/A",
    "SCHEDULE 13G",
    "SCHEDULE 13G/A"
  ],
  "lookbackDays": 7,
  "baselineMode": "emit_matches",
  "maxEvents": 1,
  "maxTotalChargeUsd": 0.4,
  "maxSourceRecords": 100,
  "stateStoreName": "sec-ownership-preview-state",
  "resetState": false,
  "qualityTestMode": false
}
```

`inc` is deliberately broad for a one-row preview. Replace it with the issuer names you actually monitor before scheduling production runs.

### illustrative output shape

**Direct SEC source check—not an Actor run receipt.** On November 1, 2026, the bounded preview found this official filing in the October 30 EDGAR master index:

```json
{
  "eventType": "NEW_OWNERSHIP_FILING",
  "watchlistId": "sec-ownership-preview",
  "sourceId": "0002100121-26-001033",
  "title": "ESTEE LAUDER COMPANIES INC",
  "publishedAt": "20261030",
  "summary": "SCHEDULE 13G/A",
  "metadata": {
    "form": "SCHEDULE 13G/A",
    "cik": "1001250"
  },
  "sourceDataset": "SEC EDGAR daily master index",
  "sourceRecordUrl": "https://www.sec.gov/Archives/edgar/data/1001250/0002100121-26-001033.txt"
}
```

A delivered Actor row also includes an event ID, observation time, source fingerprint, and disclaimer. `publishedAt` uses the EDGAR index format `YYYYMMDD`.

### matching and state behavior

- `issuerKeywords` uses case-insensitive substring matching against indexed issuer text, form text, and metadata.
- `forms` limits collection to the selected official EDGAR master-index form names.
- `baselineMode=emit_matches` returns current matches; `silent` records current fingerprints without paid initial events.
- Keep `watchlistId`, filters, and `stateStoreName` stable between scheduled runs to suppress unchanged replays.
- A changed indexed representation of the same source ID emits `SOURCE_CORRECTION`; amendments normally have separate accessions and appear as new filings.
- Rows blocked by `maxEvents` or `maxTotalChargeUsd` remain eligible for a later run; they are not silently marked delivered.
- `resetState=true` re-baselines this watchlist for the run and can make previously observed filings eligible again.
- `qualityTestMode` is unbilled diagnostics only. It does not query SEC data or return business results; leave it off for buyer runs.

### pricing

Pricing is for delivered monitoring events, not every filing scanned. Apify platform usage is not charged separately for this Actor.

- newly observed matching filing — **$0.40**
- changed indexed source record — **$0.05**
- silent baseline, unmatched row, unchanged replay, empty result, or source failure before settlement — **$0** in Actor event charges
- bounded preview — at most **$0.40**

Bulk SEC extraction Actors can have substantially lower per-row prices. This Actor is positioned for persistent issuer watchlists, replay suppression, source-linked deltas, and bounded scheduled delivery—not bulk filing export.

### scheduled workflow

1. preview the broad `inc` term with one event and a `$0.40` cap;
2. replace it with target issuer names and choose stable, unique state identifiers;
3. run a production baseline with `baselineMode=silent`;
4. schedule daily; empty weekend and holiday windows are expected;
5. consume rows through webhooks, REST, Python or JavaScript clients, Sheets, Slack, email, or a review queue;
6. inspect the linked SEC filing before acting;
7. inspect `REPORT` for source URLs, source-record counts, replay suppression, cap-blocked rows, receipts, and delivery status.

### source and legal limitations

The daily master index provides filing metadata—not normalized filer identity, stake percentage, shares, stated purpose, activist/passive classification, or investment interpretation. Daily indexes can be unavailable on weekends, holidays, or during SEC publication delays. Only the newest `maxSourceRecords` selected-form rows inside the lookback window are considered. Broad terms may have additional matches outside that bounded set, and a no-match result does not prove no relevant filing exists.

Filings are filer-submitted records and can be amended. This Actor does not independently verify a filing’s accuracy or assess whether an indexed change is legally material. It is unofficial, is not affiliated with or endorsed by the SEC, and provides neither legal nor investment advice.

For reproducible support, open an Apify issue with the run ID, non-secret input, expected issuer term, and official filing URL. Never include credentials or confidential watchlists.

# Actor input Schema

## `watchlistId` (type: `string`):

Stable identifier used to isolate this watchlist and its replay state.

## `issuerKeywords` (type: `array`):

Case-insensitive issuer-name substrings used to select matching SEC filings.

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

Official EDGAR master-index form names to include.

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

Number of recent calendar days to inspect. Empty weekend and holiday indexes are skipped.

## `baselineMode` (type: `string`):

Silently establish a safe baseline by default; emit current matches only when charges are intended.

## `maxEvents` (type: `integer`):

Maximum paid events this run may emit.

## `maxTotalChargeUsd` (type: `number`):

Hard ceiling for this run’s event charges in US dollars.

## `maxSourceRecords` (type: `integer`):

Maximum source records fetched and evaluated per run.

## `stateStoreName` (type: `string`):

Persistent replay state and settlement receipts. Keep this name unchanged between scheduled runs.

## `resetState` (type: `boolean`):

Ignore prior watchlist state for this run. Existing store records are not physically deleted.

## `qualityTestMode` (type: `boolean`):

Apify Store automated smoke-test mode. It validates runtime and input startup, emits one unbilled summary, and does not query sources, mutate state, deliver business events, or charge.

## Actor input object example

```json
{
  "watchlistId": "sec-ownership-preview",
  "issuerKeywords": [
    "inc"
  ],
  "forms": [
    "SCHEDULE 13D",
    "SCHEDULE 13D/A",
    "SCHEDULE 13G",
    "SCHEDULE 13G/A"
  ],
  "lookbackDays": 7,
  "baselineMode": "emit_matches",
  "maxEvents": 1,
  "maxTotalChargeUsd": 0.4,
  "maxSourceRecords": 100,
  "stateStoreName": "sec-ownership-preview-state",
  "resetState": false,
  "qualityTestMode": false
}
```

# Actor output Schema

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

No description

## `report` (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 = {
    "watchlistId": "sec-ownership-preview",
    "issuerKeywords": [
        "inc"
    ],
    "forms": [
        "SCHEDULE 13D",
        "SCHEDULE 13D/A",
        "SCHEDULE 13G",
        "SCHEDULE 13G/A"
    ],
    "lookbackDays": 7,
    "baselineMode": "emit_matches",
    "maxEvents": 1,
    "maxTotalChargeUsd": 0.4,
    "maxSourceRecords": 100,
    "stateStoreName": "sec-ownership-preview-state",
    "qualityTestMode": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("frankycheese/sec-ownership-change").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 = {
    "watchlistId": "sec-ownership-preview",
    "issuerKeywords": ["inc"],
    "forms": [
        "SCHEDULE 13D",
        "SCHEDULE 13D/A",
        "SCHEDULE 13G",
        "SCHEDULE 13G/A",
    ],
    "lookbackDays": 7,
    "baselineMode": "emit_matches",
    "maxEvents": 1,
    "maxTotalChargeUsd": 0.4,
    "maxSourceRecords": 100,
    "stateStoreName": "sec-ownership-preview-state",
    "qualityTestMode": False,
}

# Run the Actor and wait for it to finish
run = client.actor("frankycheese/sec-ownership-change").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 '{
  "watchlistId": "sec-ownership-preview",
  "issuerKeywords": [
    "inc"
  ],
  "forms": [
    "SCHEDULE 13D",
    "SCHEDULE 13D/A",
    "SCHEDULE 13G",
    "SCHEDULE 13G/A"
  ],
  "lookbackDays": 7,
  "baselineMode": "emit_matches",
  "maxEvents": 1,
  "maxTotalChargeUsd": 0.4,
  "maxSourceRecords": 100,
  "stateStoreName": "sec-ownership-preview-state",
  "qualityTestMode": false
}' |
apify call frankycheese/sec-ownership-change --silent --output-dataset

```

## MCP server setup

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

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/zNugCCAFw9FsUvI13/builds/NvuWYoWwzNdleOexA/openapi.json
