# SEC 8-K Material Events — item codes, exhibits, severity (`johnveds15/sec-8k-material-events`) Actor

Every 8-K on EDGAR in your window with the SEC's own item codes (2.02 earnings, 5.02 officer changes, 1.05 cyber, 4.02 restatement), typed exhibit links (EX-99.1 press release, EX-10 agreements), event vs filed date, category, severity, tickers. No browser, no proxy, no paid data.

- **URL**: https://apify.com/johnveds15/sec-8k-material-events.md
- **Developed by:** [John Vedovino II](https://apify.com/johnveds15) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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 Material Events — item codes, exhibits, severity

**Every 8-K filed on EDGAR in your window, with the SEC's own item codes, a typed list of exhibits with direct links, the event date next to the filed date, a category and a severity — for a fraction of a cent per filing.** Plain HTTP against sec.gov at the SEC's rate limit. No browser, no proxy, no paid data, no API key.

### What you get that a summary-table scraper doesn't

| Field | Why it matters |
|---|---|
| `items` — `["5.02","9.01"]` | The 8-K item **codes**, read from the SEC's own filing header (the `ITEM INFORMATION` lines), not guessed from prose. 2.02 = earnings, 5.02 = officer/director change, 1.05 = cybersecurity incident, 4.02 = restatement, 3.01 = delisting notice, 1.03 = bankruptcy. |
| `exhibits` | Every exhibit with **type, description and a direct EDGAR URL** — `EX-99.1` press release, `EX-10.x` agreements, `EX-2.1` merger agreement. XBRL plumbing is filtered out. `pressReleaseUrl` is the first EX-99 link, ready to fetch. |
| `eventDate` vs `filedDate`, `lagDays` | The event happened on the *period of report*; the filing came later. A 4-day lag on a 5.02 is a different story from a same-day one. |
| `category`, `severity` | earnings · leadership · deal · distress · cyber · capital · governance · disclosure · other, with severity 0–5 from the most serious item. Filter on it. |
| `tickers` | From the SEC's `company_tickers.json`, so the CIK-to-ticker mapping is the SEC's, not a third party's. |
| `acceptedAt` | EDGAR's acceptance timestamp — after-hours filings are visible as such. |

### A real record

Produced from live EDGAR data on 2026-09-21. A pharmaceutical company filed a delisting notice the day after the event:

```json
{
  "type": "event",
  "form": "8-K",
  "isAmendment": false,
  "cik": "0001677940",
  "company": "BeyondSpring Inc.",
  "tickers": ["BYSI"],
  "accession": "0001171843-26-006116",
  "filedDate": "2026-09-18",
  "eventDate": "2026-09-17",
  "acceptedAt": "2026-09-18T16:30:17",
  "lagDays": 1,
  "items": ["3.01"],
  "itemTitles": ["Notice of Delisting or Failure to Satisfy a Continued Listing Rule or Standard; Transfer of Listing"],
  "category": "distress",
  "severity": 4,
  "sic": "PHARMACEUTICAL PREPARATIONS",
  "sicCode": "2834",
  "exhibits": [
    {"type": "8-K", "description": "FORM 8-K", "url": "https://www.sec.gov/Archives/edgar/data/1677940/000117184326006116/f8k_091826.htm"}
  ],
  "pressReleaseUrl": null,
  "filingIndexUrl": "https://www.sec.gov/Archives/edgar/data/1677940/000117184326006116/0001171843-26-006116-index.htm",
  "scanEndDate": "2026-09-21"
}
```

In the same 40-filing sample: 9 deals (1.01 / 2.01), 6 leadership changes (5.02), 5 capital events (2.03 / 3.02), 2 distress, 1 earnings — 19 with a press-release link, 34 with a ticker.

### How to use it

- **Watch a list:** `tickers: ["NVDA","AAPL"]`, `lookbackDays: 2`, run daily. You get every 8-K those companies filed, classified, with the press release linked.
- **Screen the whole market for one thing:** `items: ["1.05"]` (cyber incidents) or `["4.02"]` (restatements) or `minSeverity: 4` across the full window.
- **Feed an agent:** the dataset is JSON; `pressReleaseUrl` and each exhibit URL are direct documents your own tool can read.

### Inputs

| Input | Default | Notes |
|---|---|---|
| `secContactEmail` | *(required)* | The SEC's fair-access policy requires automated requests to identify their sender; EDGAR returns 403 without it. Sent only to sec.gov in the User-Agent. |
| `lookbackDays` | 5 | Calendar days back from `endDate`. Weekends and federal holidays have no index and are skipped. |
| `endDate` | today | |
| `tickers` / `items` / `categories` / `minSeverity` | none | Filters. Empty = everything. |
| `includeAmendments` | true | 8-K/A carried with `isAmendment: true`. |
| `includeExhibits` | true | One extra request per filing for the exhibit inventory. |
| `maxFilings` | 100 | Newest first. Bounds runtime and cost. The default finishes in about a minute on the platform and costs at most $0.20. |

### Pricing (pay per event)

No start fee. You pay a tenth of a cent per filing parsed and a tenth of a cent per record delivered, so the bill tracks what the run actually did:

| Event | Price | Charged when |
|---|---|---|
| 8-K filing | $0.001 | per filing whose header and exhibit index were fetched and parsed. Errors are not charged. |
| 8-K event record delivered | $0.001 | per record that passes your filters into the dataset — the output you came for. |

**Worked examples, in cents.**

- **Click Start with the defaults** (100 newest filings, every one kept): 100 × 0.1¢ + 100 × 0.1¢ = **20¢**.
- **A full business day** (400 filings, every one kept): 400 × 0.1¢ + 400 × 0.1¢ = **80¢**. Run it every trading day and a month is about **$17**.
- **A five-ticker watch list over a week** (about 1,500 filings scanned, 6 records match): 1,500 × 0.1¢ + 6 × 0.1¢ = **$1.51** — the records are almost free; you pay for the scan.
- **Severity ≥ 3 only, one day** (400 parsed, 40 kept): 40¢ + 4¢ = **44¢**.

For comparison, the incumbent 8-K tracker on this Store charges 2.5¢ per row: the full-business-day run above costs **$10** there and 80¢ here. Apify platform usage is billed separately and is small: this is a plain Python container with no browser.

### Rate limits and compliance

The Actor sends your contact address to the SEC, holds about 7.5 requests per second (the SEC's ceiling is 10), and there is no input that can raise it. It fetches only the daily index, each filing's header (streamed, stopped at the header's end) and each filing's index page. It never fetches exhibit bodies — that's your call, with the URLs it gives you.

### Limits, stated

- Items come from the SEC header. A filer that mislabels an item is reported as filed.
- `tickers` covers issuers in the SEC's ticker file; some small filers and non-issuers have none.
- No full-text of the 8-K body is returned — the point is the structured fields and the links.

# Actor input Schema

## `secContactEmail` (type: `string`):

The SEC's fair-access policy requires every automated request to identify its sender. This address is placed in the User-Agent header and is sent ONLY to sec.gov — never stored, never shared. EDGAR returns 403 without it. Defaults to the Actor owner's address so the platform's automated daily test can run; replace it with your own when you run this yourself.

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

How many calendar days of EDGAR daily indices to sweep, counting back from End date. EDGAR publishes no index on weekends or federal holidays; those days are skipped. Default 5 guarantees at least one business day even across a long weekend.

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

Last day of the window. Defaults to today.

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

Restrict to issuers whose ticker (per the SEC's company\_tickers.json) is in this list. Empty = every filer.

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

8-K item codes to keep, e.g. 2.02 (earnings), 5.02 (officer/director changes), 1.05 (cybersecurity incident), 4.02 (restatement), 1.01 (material agreement). Empty = all items.

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

earnings · leadership · deal · distress · cyber · capital · governance · disclosure · other. Derived from the most severe item in the filing. Empty = all.

## `minSeverity` (type: `integer`):

5 = bankruptcy / restatement; 4 = cyber incident, default triggers, delisting notice, change of control; 3 = acquisitions, impairments, officer changes, auditor change; 2 = earnings, agreements, financing; 1 = governance and Reg FD; 0 = everything.

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

Also return amended filings (form 8-K/A). Each record carries isAmendment so you can tell them apart.

## `includeExhibits` (type: `boolean`):

Fetch each filing's index page to list its exhibits (type, description, URL) and the press-release link. One extra request per filing.

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

Hard cap on filings fetched this run (newest first). Bounds runtime and pay-per-event cost. Default 100 costs at most $0.20 (100 filings + 100 records at $0.001 each) and finishes in about a minute on the platform, well inside the 5-minute automated-test window. Raise it for a full business day (typically 150–400 8-Ks).

## Actor input object example

```json
{
  "secContactEmail": "you@example.com",
  "lookbackDays": 2,
  "tickers": [
    "NVDA",
    "AAPL",
    "TSLA"
  ],
  "items": [
    "5.02",
    "1.05",
    "4.02"
  ],
  "categories": [],
  "minSeverity": 3,
  "includeAmendments": true,
  "includeExhibits": true,
  "maxFilings": 500
}
```

# Actor output Schema

## `events` (type: `string`):

One record per 8-K kept by the filters: item codes from the SEC header, typed exhibit list with URLs, press-release link, event date vs filed date, category, severity, tickers. Field shapes in dataset\_schema.json.

## `summary` (type: `string`):

filingsIndexed, filingsParsed, parseOutcomes, recordsPushed, and the pay-per-event counts charged this run.

# 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 = {
    "secContactEmail": "you@example.com",
    "lookbackDays": 2,
    "tickers": [
        "NVDA",
        "AAPL",
        "TSLA"
    ],
    "items": [
        "5.02",
        "1.05",
        "4.02"
    ],
    "minSeverity": 3,
    "maxFilings": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnveds15/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 = {
    "secContactEmail": "you@example.com",
    "lookbackDays": 2,
    "tickers": [
        "NVDA",
        "AAPL",
        "TSLA",
    ],
    "items": [
        "5.02",
        "1.05",
        "4.02",
    ],
    "minSeverity": 3,
    "maxFilings": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("johnveds15/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 '{
  "secContactEmail": "you@example.com",
  "lookbackDays": 2,
  "tickers": [
    "NVDA",
    "AAPL",
    "TSLA"
  ],
  "items": [
    "5.02",
    "1.05",
    "4.02"
  ],
  "minSeverity": 3,
  "maxFilings": 500
}' |
apify call johnveds15/sec-8k-material-events --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,johnveds15/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/UMnxFpNe5MSztgmOF/builds/ierLY9wdfwZZwYpWY/openapi.json
