# SEC 8-K Scraper: Material Events (Earnings, M\&A, Exec Changes) (`cprussin/sec-8k-material-events`) Actor

Every SEC 8-K current report from EDGAR as a daily feed or per ticker, coded by item: earnings (2.02), executive changes (5.02), material agreements (1.01), M\&A, cybersecurity incidents (1.05). Optional item text and exhibit links. $3 per 1,000 filings.

- **URL**: https://apify.com/cprussin/sec-8k-material-events.md
- **Developed by:** [Connor Prussin](https://apify.com/cprussin) (community)
- **Categories:** Business, News
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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.

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 8-K Scraper: material events feed from EDGAR (earnings, M\&A, executive changes)

**SEC 8-K Material Events** returns **Form 8-K** current reports from SEC EDGAR. Public companies must file an 8-K within four business days of a material event, so this is the official, near-real-time feed of **corporate news**: earnings releases, CEO and CFO departures, material agreements, acquisitions, bankruptcies, auditor changes, delisting notices and cybersecurity incidents. Each filing comes back as one clean JSON record with the company, tickers, the **item codes** reported and their titles, the event date and links, plus (optionally) the item text and exhibit links such as the press release.

- ✅ **Official SEC data**, read straight from EDGAR. No login, CAPTCHA, proxy or API key needed.
- ✅ **Coded by 8-K item**: filter on 2.02 (earnings), 5.02 (executive changes), 1.01 (agreements), 2.01 (M\&A), 1.05 (cyber), 4.02 (restatements) and every other item.
- ✅ **Daily feed of every 8-K**, or **per ticker** (AAPL, TSLA…) for any date range.
- ✅ **Optional text and exhibits**: the item text (ready for an LLM) and links to EX-99.1 press releases and other exhibits.
- ✅ **Delta mode** returns only filings you haven't received yet, for a scheduled news alert.
- ✅ You pay per filing returned. Filtered-out filings are free.

### Start in one minute

Click **Start** with the prefilled input:

```json
{
  "items": ["2.02", "5.02"],
  "lastNDays": 2,
  "maxResults": 20
}
```

You get: up to 20 8-Ks from the last 2 days reporting earnings (2.02) or executive changes (5.02), with `companyName`, `tickers`, `items`, `itemTitles`, `eventDate` and `documentUrl`.

**Cost:** up to $0.06: 20 filings × $0.003, plus the $0.00005 actor-start fee.

### Use with an AI assistant

Connect the [Apify MCP server](https://mcp.apify.com) to Claude, ChatGPT, Cursor or any MCP client (`https://mcp.apify.com?tools=cprussin/sec-8k-material-events` loads only this actor), then paste:

```text
Use the Apify actor cprussin/sec-8k-material-events to list 8-K filings from the last 7 days reporting executive departures or appointments (item 5.02), with company, ticker, event date and the item text, then summarize who left or joined which company.
```

### Recipes

#### Executive changes this week, with text

CEO, CFO and director departures and appointments, with the item text for summarizing.

```json
{
  "items": ["5.02"],
  "lastNDays": 7,
  "includeDetails": true,
  "maxResults": 50
}
```

#### Every 8-K for a watchlist

All current reports from these companies in the last 90 days.

```json
{
  "tickers": ["AAPL", "NVDA", "TSLA"],
  "lastNDays": 90,
  "maxResults": 100
}
```

#### Red-flag monitor

Bankruptcies, delisting notices, auditor changes, restatements and cybersecurity incidents.

```json
{
  "items": ["1.03", "3.01", "4.01", "4.02", "1.05"],
  "lastNDays": 7,
  "maxResults": 100
}
```

#### Daily M\&A and material-agreement alert

Schedule it daily: after the first run you get (and pay for) only filings not returned before.

```json
{
  "items": ["1.01", "2.01", "5.01"],
  "lastNDays": 2,
  "maxResults": 200,
  "onlyNew": true
}
```

### Who uses 8-K data?

- **Traders, quants and analysts** react to earnings, guidance and executive changes the moment they hit EDGAR, and build event-driven signals.
- **Financial news, newsletters and AI agents** turn new 8-Ks into summaries and alerts.
- **Sales and recruiting teams** spot new executives, funding, acquisitions and restructurings as trigger events.
- **Credit, risk and compliance teams** watch for bankruptcies, debt triggers, delisting notices, restatements and cyber incidents.
- **Researchers** build datasets of corporate events by item type and date.

### How does the 8-K scraper work?

1. Pick a filing-date window (default: the last 3 days), optional tickers and items.
2. **Daily feed:** the actor lists 8-K and 8-K/A filings from EDGAR full-text search one day at a time, newest first, with their item codes. State filters run on the server.
3. **Tickers:** each ticker is resolved to its SEC CIK and the company's filing history (with item codes and acceptance times) is read from `data.sec.gov` submissions.
4. Item and amendment filters are applied to the index, so non-matching filings cost nothing and need no download.
5. With `includeDetails`, the main 8-K document is downloaded for the item text and exhibit links.

The actor follows the [SEC's fair-access policy](https://www.sec.gov/os/accessing-edgar-data): it sends a declared User-Agent, stays under 10 requests per second and backs off on HTTP 429/503. Without details it returns hundreds of filings per second; with details about 6 per second.

### How do I filter 8-K filings?

| Field                   | Description                                                             | Example            |
| ----------------------- | ----------------------------------------------------------------------- | ------------------ |
| `tickers`               | Company tickers or numeric CIKs (empty = every company)                 | `["AAPL", "MSFT"]` |
| `items`                 | Keep filings reporting at least one of these items (empty = all)        | `["2.02", "5.02"]` |
| `lastNDays`             | Filed in the last N calendar days, including today (UTC)                | `3`                |
| `startDate` / `endDate` | Exact filing-date range (YYYY-MM-DD); `startDate` overrides `lastNDays` | `"2026-09-01"`     |
| `states`                | Two-letter codes of the company's business-address state (empty = all)  | `["CA", "NY"]`     |
| `includeAmendments`     | Also return 8-K/A amendments                                            | `true`             |
| `includeDetails`        | Add the item text (up to 20,000 characters) and exhibit links; slower   | `false`            |
| `maxResults`            | Maximum filings to return                                               | `100`              |
| `onlyNew`               | Delta mode: skip filings returned by earlier runs with the same filters | `true`             |

**Common items:** `1.01` material agreement, `1.02` agreement terminated, `1.03` bankruptcy, `1.05` cybersecurity incident, `2.01` acquisition or disposition completed, `2.02` earnings, `2.03` new debt, `2.05` restructuring or layoffs, `2.06` impairment, `3.01` delisting notice, `3.02` unregistered equity sale, `4.01` auditor change, `4.02` restatement, `5.01` change in control, `5.02` executive or director change, `5.03` bylaws or fiscal-year change, `5.07` shareholder vote results, `7.01` Regulation FD, `8.01` other events, `9.01` financial statements and exhibits.

### What data do you get for each 8-K?

One dataset item per filing:

```json
{
  "accessionNumber": "0002105965-26-000040",
  "formType": "8-K",
  "isAmendment": false,
  "filingDate": "2026-10-27",
  "acceptedAt": null,
  "eventDate": "2026-10-27",
  "cik": "2105965",
  "companyName": "West Coast Community Bancorp",
  "tickers": ["WCCB"],
  "items": ["2.02", "7.01", "9.01"],
  "itemTitles": [
    "Results of Operations and Financial Condition",
    "Regulation FD Disclosure",
    "Financial Statements and Exhibits"
  ],
  "state": "CA",
  "location": "Santa Cruz, CA",
  "stateOfIncorporation": "CA",
  "sic": "6022",
  "fileNumber": "001-43470",
  "text": "Item 2.02 Results of Operations and Financial Condition\nOn October 27, 2026, West Coast Community Bancorp issued a press release announcing its results for the quarter ended September 30, 2026…",
  "exhibits": [
    {
      "number": "99.1",
      "description": "Press Release, dated October 27, 2026",
      "url": "https://www.sec.gov/Archives/edgar/data/2105965/000210596526000040/q32026earningsrelease-ex991.htm"
    }
  ],
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/2105965/000210596526000040/0002105965-26-000040-index.htm",
  "documentUrl": "https://www.sec.gov/Archives/edgar/data/2105965/000210596526000040/wccb-20261027.htm"
}
```

(Shortened: `text` and `exhibits` appear with `includeDetails`; otherwise they are `null`.)

**Field notes**

- `items` are the official 8-K item codes the company checked; `itemTitles` spells them out. Most filings also list `9.01` (exhibits).
- `eventDate` is the date of the earliest event reported, which can be a few days before `filingDate`.
- `acceptedAt` (exact acceptance time) is filled for per-ticker queries; the daily feed has `filingDate` only.
- `exhibits[].number` is read from the exhibit's file name (for example `99.1` for a press release) and is `null` when the name doesn't say.
- `tickers` is empty for companies without listed stock (funds, private issuers of public debt).

### How much does 8-K data cost?

This actor is priced **per result** (pay-per-event):

| Event                                | Price      |
| ------------------------------------ | ---------- |
| 8-K filing (one item in the dataset) | **$0.003** |

For example, 1,000 filings cost $3.00. Every 8-K filed on a typical business day (about 300–600) costs $1–2; a daily alert for a few item codes costs cents. Filings skipped by filters or delta mode are free. If you set a **maximum cost per run**, the actor stops cleanly when it reaches that limit.

### Tips for tracking material events

- **Earnings season:** item `2.02` filings carry the earnings press release as exhibit 99.1; turn on `includeDetails` to get its link.
- **LLM summaries:** `includeDetails` gives clean item text; send it to an AI model to summarize executive changes or deal terms.
- **Watchlists:** use `tickers` with a long `lastNDays` for a company's full 8-K history.
- Send results to Google Sheets, Slack, email or a webhook through Apify integrations.
- To identify your own organization to the SEC, set a `SEC_USER_AGENT` environment variable, such as `"Your Company admin@yourcompany.com"`.

### SEC 8-K scraper FAQ

**Is this data official?** Yes. Every record comes from EDGAR, and `filingUrl` links to the original filing.

**How fresh is it?** Filings appear on EDGAR within minutes of acceptance, and the actor searches through today. EDGAR accepts filings on business days only.

**Does it include the exhibits' full text?** No, it links to them. The press release and other exhibits are separate documents at `exhibits[].url`.

**Can I use it through the API or with AI agents?** Yes. Call it through the Apify API, the MCP server or any Apify integration.

**Disclaimer:** This actor is not affiliated with the U.S. Securities and Exchange Commission, and its output is not investment advice.

### Related actors

- [SEC Form D Funding](https://apify.com/cprussin/sec-form-d-funding?fpr=to54nm): New SEC Form D filings: startup funding rounds and private placements from EDGAR.
- [Federal Recompete Radar](https://apify.com/cprussin/federal-recompete-radar?fpr=to54nm): US federal contracts nearing expiry, with incumbent and value, for recompete pipelines.

# Actor input Schema

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

Only 8-Ks filed by these companies (stock tickers such as AAPL or numeric SEC CIKs). Leave empty for the daily feed of every 8-K filed.

## `items` (type: `array`):

Only filings that report at least one of these items, e.g. 2.02 (earnings), 5.02 (executive changes), 1.01 (material agreements), 1.05 (cybersecurity incidents). Empty = all.

## `lastNDays` (type: `integer`):

Filings from the last N calendar days, including today (UTC). Ignored when a start date is set.

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

Filed on or after this date (YYYY-MM-DD). Overrides 'last N days'.

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

Filed on or before this date (YYYY-MM-DD). Defaults to today.

## `states` (type: `array`):

Only companies with a business address in these states (two-letter codes such as CA, NY). Empty = all.

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

Also return 8-K/A amendments.

## `includeDetails` (type: `boolean`):

Download each filing's main document and add the item text (up to 20,000 characters) and links to exhibits such as press releases (EX-99.1). Slower: one extra request per filing.

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

Maximum number of filings to return. Each filing is billed as one event.

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

Skip filings already returned by earlier runs with the same filters (dates excluded). Ideal for scheduled daily runs.

## Actor input object example

```json
{
  "items": [
    "2.02",
    "5.02"
  ],
  "lastNDays": 2,
  "includeAmendments": true,
  "includeDetails": false,
  "maxResults": 20,
  "onlyNew": false
}
```

# 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 = {
    "items": [
        "2.02",
        "5.02"
    ],
    "lastNDays": 2,
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("cprussin/sec-8k-material-events").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 = {
    "items": [
        "2.02",
        "5.02",
    ],
    "lastNDays": 2,
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("cprussin/sec-8k-material-events").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 '{
  "items": [
    "2.02",
    "5.02"
  ],
  "lastNDays": 2,
  "maxResults": 20
}' |
apify call cprussin/sec-8k-material-events --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cprussin/sec-8k-material-events"
        }
    }
}
```

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/I2apZhhq7IrsVf5Ns/builds/1WhXIJC8t8uQdnWfK/openapi.json
