# SEC EDGAR 8-K Material Events Scraper (`jungle_synthesizer/sec-edgar-8k-material-events-scraper`) Actor

Turn every 8-K into a structured record: reported Item numbers with SEC's own labels, narrative text per Item, and full exhibit text (EX-99 press releases, EX-10/EX-2 agreements). Boolean flags for cyber incidents, restatements, bankruptcy and more. Full historical backfill, not a live feed.

- **URL**: https://apify.com/jungle\_synthesizer/sec-edgar-8k-material-events-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 record scrapeds

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

## SEC EDGAR 8-K Material Events Scraper

Turn every SEC Form 8-K into a structured material-event record. Most 8-K feeds stop at the
filing metadata and a document URL — this actor opens the filing. You get the reported Item
numbers with SEC's own labels, the narrative text under each Item, and the full text of every
attached exhibit, including the EX-99 press release that carries the actual earnings numbers
and the EX-2/EX-10 agreements that carry the deal terms. Item-code-to-category mapping and
boolean flags for the Items that drive alerting (cyber incidents, restatements, bankruptcy,
delisting, auditor changes, officer departures) ship as first-class fields, so you can filter
on `cyber_incident` or `restatement` without maintaining your own Item lookup.

Coverage runs back to EDGAR's modern per-document filing system (~2001) via the quarterly
master index, not just a live/recent feed.

### What it does

1. Fetches the quarterly master index of every filing for the requested year range and filters
   to Form 8-K and 8-K/A
2. For each filing, fetches the EDGAR filing-index page for the authoritative Item list
   (code + SEC's own label), Period of Report, Accepted timestamp, filer SIC/state, and the
   list of attached documents
3. Fetches the primary document and slices out the narrative text reported under each Item
4. Fetches every exhibit (HTML, legacy `.txt`, or PDF) and extracts its full text

### Input

| Field             | Type          | Default    | Description |
|--------------------|---------------|------------|-------------|
| `yearFrom`         | integer       | current year | Start year of the filing range |
| `yearTo`           | integer       | current year | End year (inclusive) |
| `cikList`          | string list   | *(blank = all)* | Restrict to specific issuer CIKs (e.g. `0000320193` for Apple) |
| `eventCategories`  | multi-select  | *(blank = all)* | Restrict to filings tagged with at least one of the listed event categories |
| `maxItems`         | integer       | `10`       | Maximum number of 8-K records to return |

`eventCategories` accepts one or more of: `earnings`, `exec_change`, `m_and_a`, `bankruptcy`,
`delisting`, `auditor_change`, `material_agreement`, `impairment`, `cyber_incident`,
`restatement`, `debt`, `other`.

### Output schema

Each record represents one 8-K (or 8-K/A) filing.

| Field                       | Description |
|------------------------------|-------------|
| `accession_number`           | SEC EDGAR accession number |
| `cik`                        | Issuer CIK, zero-padded to 10 digits |
| `company_name`                | Issuer name as filed |
| `ticker`                      | Exchange ticker, when resolvable |
| `sic_code` / `sic_label`      | SEC industry code and label |
| `state_of_incorporation`      | Issuer's state or foreign jurisdiction of incorporation |
| `form_type`                   | `8-K` or `8-K/A` |
| `filed_date`                  | Date received by EDGAR |
| `period_of_report`            | Date of the reported event |
| `acceptance_datetime`         | EDGAR acceptance timestamp |
| `filing_index_url`            | URL to the EDGAR filing-index page |
| `primary_document_url`        | URL to the primary 8-K document |
| `item_codes` / `item_labels`  | Reported Item numbers and SEC's own labels, in matching order |
| `event_category`              | One or more category tags derived from `item_codes` |
| `item_body_text`              | Narrative text sliced from the primary document, per reported Item |
| `exhibits`                    | `[{ exhibit_type, description, url, text, byte_size, parse_status }]` |
| `press_release_text`          | Extracted text of the first EX-99.x exhibit, when present |
| `is_amendment`                | `true` when `form_type` is `8-K/A` |
| `amends_accession`            | Best-effort accession number of the original 8-K this amendment supersedes (blank when unresolvable — never guessed) |
| `has_financial_statements`    | `true` when Item 9.01 was reported |
| `cyber_incident_flag`         | Item 1.05 — SEC's cyber-disclosure rule |
| `auditor_change_flag`         | Item 4.01 |
| `restatement_flag`            | Item 4.02 |
| `bankruptcy_flag`             | Item 1.03 |
| `delisting_flag`              | Item 3.01 |
| `officer_departure_flag`      | Item 5.02 |

### Notes

- **Coverage**: roughly 40,000 8-K/8-K-A filings per year across all reporting issuers. The
  quarterly master index (form.idx) is a single flat file per quarter — there is no per-issuer
  or per-category partitioning to work around, so a year range covers everything filed in it.
- **Exhibit text**: HTML and legacy `.txt` exhibits return full text. PDF exhibits are extracted
  locally for born-digital PDFs; a scanned/image-only PDF returns `parse_status:
  "pdf_no_extractable_text"` rather than a fabricated body.
- **Rate compliance**: the actor stays comfortably under SEC EDGAR's published fair-access
  request-rate ceiling and sends the required declared identification header on every request —
  without it, EDGAR returns 403 on every path.
- **Historical boundary**: item/exhibit extraction depends on EDGAR's per-document filing-index
  page, a feature of the modern (~2001+) filing system. Pre-2001 accessions enumerated from the
  master index but lacking a filing-index page are skipped rather than parsed from the legacy
  compound submission format.
- **Amendment linkage** (`amends_accession`) is best-effort: EDGAR carries no formal "amends"
  pointer on an 8-K/A, so the actor looks up the issuer's recent filing history and takes the
  most recent prior 8-K filed before the amendment. Left blank when unresolvable.

### Use cases

- **Event-driven funds**: Screen for M\&A, restatements, or debt triggers the moment they're filed
- **Third-party risk / vendor monitoring**: Alert on Item 1.05 material cybersecurity incidents
  across a vendor or portfolio company list
- **M\&A trackers**: Pull the full text of merger agreements and press releases, not just the
  filing metadata
- **Financial newsrooms**: Get the earnings press release text (EX-99.x) as soon as it's filed
- **Compliance teams**: Track auditor changes, delistings, and bankruptcy disclosures across a
  watchlist of issuers

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `yearFrom` (type: `integer`):

Start year for the 8-K filing range (e.g. 2024). EDGAR's quarterly master index goes back to 1994; full per-document item/exhibit extraction is reliable from ~2001 on.

## `yearTo` (type: `integer`):

End year for the 8-K filing range (inclusive). Leave equal to yearFrom for a single year.

## `cikList` (type: `array`):

Restrict extraction to specific issuer CIKs (e.g. \["0000320193"] for Apple). Leave blank to scrape all 8-K filers in the year range.

## `eventCategories` (type: `array`):

Restrict results to filings tagged with at least one of these event categories. Leave blank to return all 8-K/8-K-A filings regardless of which Items they report.

## `maxItems` (type: `integer`):

Maximum number of 8-K filing records to return. Each record may involve several requests (filing index, primary document, exhibits) under SEC's 10 req/sec ceiling — set to 5-10 for a quick test run.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "yearFrom": 2026,
  "yearTo": 2026,
  "cikList": [],
  "eventCategories": [],
  "maxItems": 10
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "yearFrom": 2026,
    "yearTo": 2026,
    "cikList": [],
    "eventCategories": [],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/sec-edgar-8k-material-events-scraper").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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "yearFrom": 2026,
    "yearTo": 2026,
    "cikList": [],
    "eventCategories": [],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/sec-edgar-8k-material-events-scraper").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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "yearFrom": 2026,
  "yearTo": 2026,
  "cikList": [],
  "eventCategories": [],
  "maxItems": 10
}' |
apify call jungle_synthesizer/sec-edgar-8k-material-events-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/S7oajaWM6t7H6rqVF/builds/ftMigZ7lGHa0huwBH/openapi.json
