# SEC 8-K Material Event & Change Monitor (`luminar/sec-8k-material-event-monitor`) Actor

Find official SEC 8-K and 8-K/A material events by ticker, CIK, or whole market, classify SEC items, link amendments, and track verified accession changes.

- **URL**: https://apify.com/luminar/sec-8k-material-event-monitor.md
- **Developed by:** [Luka](https://apify.com/luminar) (community)
- **Categories:** Automation, Business, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.90 / 1,000 8-k filings

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Find official SEC Form 8-K and 8-K/A filings, understand which SEC items were reported, and rerun the same scope to receive only new or source-metadata-updated accessions.

![SEC 8-K monitor input with workflow, company, date, event, and safety controls](https://api.apify.com/v2/key-value-stores/DJgPR6wwS2tIaLDQW/records/sec_8k_material_event_monitor--e9f46a53473ea8d0-sec-8k-monitor-input.png)

### Start in 60 seconds

1. Keep **Get current 8-K events** and **Whole US market** selected.
2. Start the safe 7-day run; it returns up to 25 of the newest qualifying official filings.
3. Open **Material-event overview — mixed rows** to review SEC item codes, event categories, accession numbers, and filing links.
4. Switch to **Ticker / CIK watchlist** only when you want named companies instead of the complete daily market feed.

```json
{
  "mode": "baseline",
  "searchScope": "whole_market",
  "includeAmendments": true,
  "lookbackDays": 7,
  "maxFilings": 25
}
```

### Choose the workflow

| Workflow | Use it for | Delivered rows |
|---|---|---|
| **Get current 8-K events** | A current watchlist or whole-market export | One `filing` row per official accession-and-registrant pair |
| **Track new and updated events** | Repeat monitoring for the same exact scope | `NEW` or source-metadata `UPDATED` change rows; optional `UNCHANGED` audit rows are free |

The first run in Changes mode emits the accessions currently inside the requested scope as `NEW`. Repeat runs of the same scope compare against the last safely delivered state. Run the same scope sequentially. SEC filing history is treated as append-only: a filing leaving a rolling date window is never reported as ended.

### What you get

The example below is a synthetic fixture. It uses a synthetic accession and issuer and does not represent a live filing.

```json
{
  "recordType": "filing",
  "stableId": "sec8k:0000000001-26-000001:0000000001",
  "accessionNumber": "0000000001-26-000001",
  "form": "8-K",
  "isAmendment": false,
  "amendmentLinkStatus": "NOT_AMENDMENT",
  "companyName": "Synthetic Example Issuer, Inc.",
  "cik": "0000000001",
  "coFiledRegistrantCount": 1,
  "coFiledRegistrants": [
    { "cik": "0000000001", "companyName": "Synthetic Example Issuer, Inc." }
  ],
  "ticker": "EXMPL",
  "filingDate": "2026-08-28",
  "reportDate": "2026-08-27",
  "items": ["2.02", "9.01"],
  "itemClassifications": [
    {
      "code": "2.02",
      "section": "Financial Information",
      "title": "Results of Operations and Financial Condition",
      "eventCategory": "EARNINGS_FINANCIAL_RESULTS",
      "source": "OFFICIAL_SEC_FORM_8K_ITEM_TABLE"
    }
  ],
  "eventCategories": ["EARNINGS_FINANCIAL_RESULTS", "FINANCIAL_STATEMENTS_EXHIBITS"],
  "filingIndexUrl": "https://www.sec.gov/Archives/edgar/data/1/000000000126000001/0000000001-26-000001-index.htm",
  "sourceRoute": "SEC_SUBMISSIONS_API",
  "observedAt": "2026-08-28T12:00:00.000Z"
}
```

Every result keeps the canonical SEC accession and is uniquely keyed by accession plus registrant CIK. When one official filing is co-filed for multiple registrants, every issuer remains visible and each row lists the complete co-filed registrant set found in the requested scope. Item categories are deterministic labels derived from official Form 8-K item codes; the Actor does not score importance, sentiment, or likely stock-price impact.

### Ticker, CIK, and whole-market search

#### Watch a company list

Mix up to 500 ticker symbols and CIK numbers. Tickers are resolved through the official SEC ticker/CIK directory and duplicate issuers are fetched once.

```json
{
  "mode": "changes",
  "searchScope": "watchlist",
  "tickers": ["AAPL", "MSFT", "NVDA"],
  "ciks": ["0001652044"],
  "itemCodes": ["1.01", "2.02", "5.02", "8.01"],
  "lookbackDays": 7,
  "maxFilings": 500,
  "maxTrackedItems": 1000
}
```

#### Scan the whole market

Whole-market mode reads the SEC daily master indexes for every requested filing date, then checks the official filing detail for every candidate 8-K/8-K/A. A date range can cover up to 31 calendar days per run. When dates are omitted, the rolling whole-market window ends on the last completed calendar day because SEC daily indexes are finalized nightly; weekend dates are recorded as confirmed non-filing days without requesting nonexistent index files.

```json
{
  "mode": "baseline",
  "searchScope": "whole_market",
  "startDate": "2026-08-27",
  "endDate": "2026-08-27",
  "includeAmendments": true,
  "maxFilings": 1000
}
```

Optional filing-body keywords are matched against the official primary filing document and return a short source snippet. They add one SEC archive request per candidate filing; they do not convert the filing to Markdown or provide an AI summary.

### SEC item classification

The Actor expands every official item code into its current SEC title, section, and a deterministic automation category. Common examples include:

| SEC item | Official event | Category |
|---|---|---|
| `1.01` | Material definitive agreement | `BUSINESS_AGREEMENT` |
| `1.05` | Material cybersecurity incident | `CYBERSECURITY_INCIDENT` |
| `2.01` | Acquisition or disposition of assets | `M_AND_A_ASSET_TRANSACTION` |
| `2.02` | Results of operations and financial condition | `EARNINGS_FINANCIAL_RESULTS` |
| `4.02` | Non-reliance on prior financial statements | `FINANCIAL_RESTATEMENT_NON_RELIANCE` |
| `5.02` | Director or officer changes | `LEADERSHIP_BOARD_CHANGE` |
| `8.01` | Other events | `OTHER_MATERIAL_EVENT` |

If SEC metadata publishes no item codes, the row says `OFFICIAL_NO_ITEM_CODES`. No code is guessed from prose.

### 8-K/A amendment links

An amendment is always a separate accession. `amendsAccessionNumber` is filled only when one of these official-evidence rules yields a unique original 8-K:

1. the same CIK and same official period-of-report date; or
2. an explicit original 8-K filing date in the amendment document followed by one unique official-history match.

Multiple candidates produce `AMBIGUOUS`; no supported candidate produces `UNRESOLVED`. The Actor never picks the nearest filing merely because it looks plausible.

### Input guide

| Input | Limit | Effect |
|---|---:|---|
| `tickers` + `ciks` | 500 issuers combined | Watchlist targets; ignored in whole-market mode |
| `startDate` / `endDate` | 31 whole-market days; 10 watchlist years | Fixed inclusive filing window |
| `lookbackDays` | 1–31 | Rolling window when explicit dates are empty |
| `itemCodes` | 40 | Filters by official SEC item codes after classification |
| `keywords` | 10 | Searches the official primary document; adds source work |
| `maxFilingsPerCompany` | 1–1,000 | Watchlist-only per-issuer cap |
| `maxFilings` | 1–20,000 | Global delivered filing/change ceiling |
| `maxTrackedItems` | 1–20,000 | Changes state ceiling; must be at least `maxFilings` |
| `maxBuyerChargeUsd` | $0.001–$100 | Stops before source work if the worst-case Actor charge for the selected limits is higher |

Every result-set-affecting limit and filter participates in the Changes state scope. Changing one starts an independent comparison history.

### Pricing

Each usable completion follows one of two mutually exclusive formulas:

- one or more paid rows: result-bearing run start + delivered filing or change rows;
- no paid row: one verified-empty-scope event only.

| Buyer tier | Result-bearing run | Baseline filing | Verified empty scope | New or updated event |
|---|---:|---:|---:|---:|
| All buyer tiers | `$0.00095` | `$0.00190` | `$0.00180` | `$0.00190` |

Unchanged rows, coverage, summaries, warnings, duplicates, failed source work, and suppressed rows are free.

### Dataset view

The Dataset keeps the stable accession, filing type, SEC items, event categories, amendment evidence, source route, and official filing link visible in one row.

![SEC 8-K Dataset overview with stable accession and official event fields](https://api.apify.com/v2/key-value-stores/DJgPR6wwS2tIaLDQW/records/sec_8k_material_event_monitor--615b4a3cd7b0c1f6-sec-8k-dataset.png)

### Coverage you can trust

Every run stores a free coverage receipt:

- `COMPLETE` — every requested official source branch was exhausted;
- `EMPTY_CONFIRMED` — every required branch was reached and proved no matching 8-K/8-K/A;
- `FILTERED` — traversal completed but buyer filters bounded the returned set;
- `CAPPED` — a declared filing/request/byte/runtime cap stopped traversal;
- `PARTIAL` — useful rows exist but one or more requested branches failed;
- `BLOCKED` or `FAILED` — the expected official source shape was not reached and is never presented as empty.

A missing current-day daily index, failed filing detail, or blocked SEC response is visible in the receipt. Whole-market completeness is claimed only inside the exact requested dates and limits.

#### Price examples

Complete run charge:

`result-bearing run start + delivered filing/change rows`, or `$0.00180` when the official scope is confirmed usable but has no paid row.

| Event | Price | Charged when |
|---|---:|---|
| SEC run with results | `$0.00095` per run | At least one paid filing/change row is ready for delivery |
| Baseline filing | `$0.00190` each | One unique 8-K/8-K/A filing row is delivered |
| Verified empty SEC scope | `$0.00180` per completion | Usable official evidence confirms no paid filing/change row; the result-bearing start is not charged |
| New or updated event | `$0.00190` each | One `NEW` or source-metadata `UPDATED` change is delivered |

Examples on every buyer tier:

- Baseline with 10 filings: `$0.00095 + (10 x $0.00190) = $0.01995`.
- Changes with no new or updated filing: `$0.00180`.
- Changes with 5 new or updated filings: `$0.00095 + (5 x $0.00190) = $0.01045`.

### Automation and API

Save one tested Changes input as an Apify Task, then schedule that Task. Keep one same-scope run sequential; use a different Monitoring scope name for an independent state history. Dataset export supports JSON, CSV, Excel, and API access. Webhooks can forward successful runs to a database, spreadsheet, queue, Slack, or another downstream system.

### Official-source and fair-access policy

The Actor uses only official `www.sec.gov` and `data.sec.gov` endpoints, identifies itself with a descriptive User-Agent, shares one paced client across the run, and stays below two requests per second. It fails closed immediately on an SEC access block or rate limit and fails closed on source-contract drift. Source extraction runs in Apify Cloud; automated validation uses clearly labeled fixtures.

### FAQ

#### Does this determine whether an event is important for an investment decision?

No. It reports official SEC item classifications and source links. It does not provide investment, legal, accounting, or compliance advice.

#### Does it download full filings or XBRL financial statements?

No. It returns event metadata, official item classifications, direct links, and optional keyword snippets. Full-document conversion and XBRL financial analysis are separate workflows.

#### Can an amendment be linked incorrectly?

The Actor refuses heuristic nearest-filing links. Ambiguous and unresolved relationships remain explicit so a buyer can review the official filings.

#### Why can a run be CAPPED?

The buyer selected a filing, request, byte, runtime, or state limit before every matching official row was reached. Increase the relevant supported limit or narrow the date/filter scope, then rerun.

#### Support

For a reproducible issue, share the Apify run ID, sanitized input, expected accession/date, and the coverage status. Never send account tokens or private credentials.

# Actor input Schema

## `mode` (type: `string`):

Baseline returns current filing rows. Changes compares the exact same scope with its previous successful state and returns NEW or source-metadata UPDATED accession events.

## `searchScope` (type: `string`):

Watchlist uses official company submission history. Whole market exhausts official SEC daily master indexes for the requested date range.

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

Watchlist ticker symbols resolved through the official SEC ticker/CIK directory. Tickers and CIKs are deduplicated to at most 500 issuers.

## `ciks` (type: `array`):

Watchlist CIKs. Use CIK for private/non-ticker filers or to bypass ticker resolution.

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

Includes 8-K/A as separate accession rows and links each amendment to an original 8-K only when official SEC history supplies a unique match.

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

Used when explicit dates are empty. Whole-market rolling scans end on the last completed calendar day because SEC daily indexes are finalized nightly; watchlists can include today. Repeat Changes runs keep this value stable; filings leaving the rolling window are never treated as ended.

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

Optional inclusive filing start date. Set both dates for a fixed historical or repeatable same-day scope.

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

Optional inclusive filing end date. If omitted with Filed from, the end is today.

## `itemCodes` (type: `array`):

Optional official item-code filter such as 2.02 (results), 5.02 (directors/officers), or 1.05 (material cybersecurity incidents). Every delivered code also includes its official title and deterministic event category.

## `categories` (type: `array`):

Optional shortcuts that expand to official SEC item codes and combine with SEC 8-K items. For example, earnings maps to 2.02, cyber to 1.05, and exec\_changes to 5.02.

## `companyNameContains` (type: `string`):

Optional case-insensitive issuer-name filter. It never substitutes for exact ticker/CIK matching in Watchlist mode.

## `keywords` (type: `array`):

Optional keyword or exact-phrase matching against the official primary filing document. Adds one official SEC source request per candidate filing and more runtime. The filing price is unchanged; unmatched filings are not delivered or charged.

## `keywordMode` (type: `string`):

Used only when Filing body keywords are supplied.

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

Watchlist-only newest-first cap for each issuer. If otherwise matching history remains, coverage is CAPPED.

## `maxFilings` (type: `integer`):

Global unique filing limit. Reaching it while more qualifying official rows exist reports CAPPED rather than complete coverage.

## `maxTrackedItems` (type: `integer`):

Changes-only state limit. It must be at least Maximum filings. Up to 20,000 complete accession snapshots are committed in bounded atomic generations; rows that cannot fit are never delivered as paid changes.

## `includeUnchanged` (type: `boolean`):

Changes-only. It adds no source call or source runtime, but adds Dataset delivery work for free UNCHANGED audit rows. These rows are included without a paid change charge.

## `watchlistName` (type: `string`):

Optional stable label that isolates Changes state for otherwise identical inputs.

## `maxBuyerChargeUsd` (type: `number`):

Stops before source work if the requested limits could exceed this Actor charge. Your Apify account may apply an additional Maximum cost per run.

## `maxRequests` (type: `integer`):

Run-wide infrastructure safety limit for official SEC/EDGAR requests and bounded retries.

## `maxSourceBytes` (type: `integer`):

Run-wide official-source transfer limit.

## `maxRuntimeSecs` (type: `integer`):

Run-wide source-work runtime limit.

## `_luminarQaFaultStage` (type: `string`):

Internal fault-injection control accepted only by the registered private QA Actor on this exact immutable build. Buyer and positive workload inputs omit this field.

## Actor input object example

```json
{
  "mode": "baseline",
  "searchScope": "whole_market",
  "tickers": [],
  "includeAmendments": true,
  "lookbackDays": 7,
  "keywordMode": "any",
  "maxFilingsPerCompany": 100,
  "maxFilings": 25,
  "maxTrackedItems": 1000,
  "includeUnchanged": false,
  "maxBuyerChargeUsd": 1,
  "maxRequests": 1200,
  "maxSourceBytes": 50000000,
  "maxRuntimeSecs": 600
}
```

# Actor output Schema

## `dataset` (type: `string`):

Mixed Dataset of filing, change, and optional unchanged rows. Use recordType to distinguish them.

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

Buyer-focused columns for mixed filing/change rows; recordType remains visible.

## `runSummary` (type: `string`):

Requested scope, coverage, source receipts, billing simulation, and state outcome.

# 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 = {
    "mode": "baseline",
    "searchScope": "whole_market",
    "tickers": [],
    "includeAmendments": true,
    "lookbackDays": 7,
    "keywordMode": "any",
    "maxFilingsPerCompany": 100,
    "maxFilings": 25,
    "maxTrackedItems": 1000,
    "includeUnchanged": false,
    "maxBuyerChargeUsd": 1,
    "maxRequests": 1200,
    "maxSourceBytes": 50000000,
    "maxRuntimeSecs": 600
};

// Run the Actor and wait for it to finish
const run = await client.actor("luminar/sec-8k-material-event-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 = {
    "mode": "baseline",
    "searchScope": "whole_market",
    "tickers": [],
    "includeAmendments": True,
    "lookbackDays": 7,
    "keywordMode": "any",
    "maxFilingsPerCompany": 100,
    "maxFilings": 25,
    "maxTrackedItems": 1000,
    "includeUnchanged": False,
    "maxBuyerChargeUsd": 1,
    "maxRequests": 1200,
    "maxSourceBytes": 50000000,
    "maxRuntimeSecs": 600,
}

# Run the Actor and wait for it to finish
run = client.actor("luminar/sec-8k-material-event-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 '{
  "mode": "baseline",
  "searchScope": "whole_market",
  "tickers": [],
  "includeAmendments": true,
  "lookbackDays": 7,
  "keywordMode": "any",
  "maxFilingsPerCompany": 100,
  "maxFilings": 25,
  "maxTrackedItems": 1000,
  "includeUnchanged": false,
  "maxBuyerChargeUsd": 1,
  "maxRequests": 1200,
  "maxSourceBytes": 50000000,
  "maxRuntimeSecs": 600
}' |
apify call luminar/sec-8k-material-event-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,luminar/sec-8k-material-event-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/MOgk9RpRFpfc8AuNo/builds/b93W2mTXEgih7p6LI/openapi.json
