# SEC Filings Scraper — EDGAR 8-K, 10-K & Earnings Feed (`inovaflow/sec-filings-scraper`) Actor

SEC EDGAR filings as a clean, typed feed: 8-K material events with the Ex-99.1 earnings press release, 10-K / 10-Q risk factors and MD\&A, S-1, Form 4 insider trades, 13D/G stakes — one row per filing, verbatim section text, optional XBRL financials, new-since-last-run delta.

- **URL**: https://apify.com/inovaflow/sec-filings-scraper.md
- **Developed by:** [inovaflow](https://apify.com/inovaflow) (community)
- **Categories:** Business, Lead generation, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 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

**Every SEC filing of the companies you track — 8-K events, earnings releases, 10-K risk factors, insider trades — as one clean, typed row each, with the text copied word for word.**

If you sell to, invest in or cover US public companies, their SEC filings are the most honest thing they publish. An 8-K Item 5.02 tells you the CFO is leaving before the press does. Item 2.02 comes with the earnings press release. The 10-K's risk factors and MD\&A spell out, in the company's own legally reviewed words, what it is worried about and where the money goes. The problem is getting at it: every filing is a bundle of HTML documents in a different layout, the section you want is buried after a table of contents, and "what's new since yesterday" means checking every company by hand.

So we built the feed we wanted for our own account research. Give it tickers (or nothing, for the whole market) and it returns **one row per filing**. Each row is typed by form and 8-K item, with exact dates and the accession number, and carries the key sections **copied verbatim**. Form 4 insider trades and 13D/13G stakes come as structured fields, and the financials can come straight from XBRL. Schedule it and it returns **only what was filed since the last run**. There is no AI summarising anything in between: you (or your agent) get the source text, clean.

### Who it's for

- **AI and GTM agents**: one call, no login or key, a flat typed dataset. *"What did our top 50 accounts file this week, and which 8-Ks were exec changes?"*
- **Account executives and account planners**: the risk factors and MD\&A of a target before the QBR. *"What does Snowflake's 10-K say about AI spend?"*
- **Investors and analysts**: earnings releases, insider buying and activist 13Ds as they land. *"Every Form 4 purchase over the last 30 days at my watchlist."*
- **Compliance, research and data teams**: a deduplicated, incremental filings table to join onto a CRM or warehouse.

### What you get per filing

- **Exact metadata**: company, ticker(s), CIK, form (`8-K`, `10-K/A`…), filed date, acceptance timestamp, period of report, industry (SIC), state of incorporation, links to the filing and its main document, and the list of exhibits.
- **8-K items with EDGAR's official labels**: `2.02 Results of Operations and Financial Condition`, `5.02 Departure of Directors or Certain Officers…`, `1.01 Entry into a Material Definitive Agreement` and the rest.
- **Verbatim sections**, each with its name, source document, length, and whether it was cut:

| Form | Sections copied word for word |
|---|---|
| 8-K | every reported item, plus the **Ex-99.1 earnings press release** (and other Ex-99 exhibits) |
| 10-K | Item 1 Business · 1A Risk Factors · 1C Cybersecurity · 7 MD\&A · 7A Market Risk |
| 10-Q | Part I Item 2 MD\&A · Item 3 Market Risk · Part II Item 1A Risk Factors |
| 20-F / 6-K | Items 3–5 (risk factors, the company, operating review) / the report and its Ex-99 exhibits |
| S-1 | Prospectus Summary · Risk Factors · Use of Proceeds |
| Form 4 | each transaction and holding: owner, role, code (P buy, S sell, A grant, M exercise…), shares, price, holdings after, 10b5-1 flag |
| Schedule 13D / 13G | each holder: shares, percent of class, voting power, plus the 13D **purpose of the transaction** |
| DEF 14A | the proxy statement text |

- **XBRL financials (optional)**: revenue, net income, EPS, assets, cash, operating cash flow and more, exactly as the 10-K / 10-Q reported them for its own period, with units and dates.
- **Monitoring fields**: `isNewSinceLastRun` and `firstSeenAt`, keyed on the accession number (EDGAR's permanent filing ID), so the same filing is never delivered twice to a watch that asks for new ones only.

### How to use it

1. **Pick companies.** Tickers (`AAPL`), CIKs (`320193`) or names (`Microsoft`). Leave the list empty to get the newest filings across the whole market. A name that fits several companies is never guessed: the run summary lists the candidates.
2. **Pick forms and a window.** The default is 8-K, 10-K and 10-Q from the last 90 days. Narrow 8-Ks to the items you care about (2.02 earnings, 5.02 exec changes, 1.01 deals), or add a full-text phrase such as `"artificial intelligence"`.
3. **Run it, or schedule it** with *Only filings new since the last run* switched on and a *Watch ID* per schedule. Each scheduled run then returns just the new filings, ready for Slack, a CRM or your agent.

And that's it. Want metadata only, fast? Switch off *Extract key sections*. Want the numbers? Switch on *XBRL financial facts*.

A row, trimmed:

```json
{
  "company": "Apple Inc.", "ticker": "AAPL", "cik": "0000320193",
  "formType": "8-K", "filedAt": "2026-07-30", "acceptedAt": "2026-07-30T16:30:28-04:00",
  "itemCodes": ["2.02", "9.01"],
  "items": [{ "code": "2.02", "label": "Results of Operations and Financial Condition" }, { "code": "9.01", "label": "Financial Statements and Exhibits" }],
  "accessionNumber": "0000320193-26-000018",
  "sections": [
    { "key": "8-K:2.02", "name": "8-K Item 2.02 Results of Operations and Financial Condition", "text": "Item 2.02 Results of Operations and Financial Condition.\nOn July 30, 2026, Apple Inc. (“Apple”) issued a press release…", "chars": 638, "truncated": false },
    { "key": "EX-99.1", "name": "Ex-99.1 earnings press release", "text": "Apple reports third quarter results…", "chars": 10446, "truncated": false }
  ],
  "isNewSinceLastRun": true
}
```

### Pricing

You pay **per filing delivered**. Empty runs, filings already delivered to a watch that asks for new ones only, and anything filtered out are never charged. A daily watch of 20 companies usually returns a handful of filings a day, so a few cents. A 90-day backfill of the same 20 companies is roughly 100–150 filings. Plus Apify's small start fee.

> **Tip:** for a scheduled watch, switch on *Only filings new since the last run*. You then pay only for what is new, never for the same 10-K twice.

### Notes

- The data comes from the SEC's EDGAR system, exactly as filed. Section text is the filing's own words; only whitespace is tidied. Sections are found by their headings, so the rare filing with non-standard headings reports the missing section under `sectionsNotFound` instead of returning a wrong one.
- Earnings-call transcripts are not SEC filings and are not included. The official earnings text is the 8-K Ex-99.1 press release, which is.
- Requests follow the SEC's fair-access rules (declared User-Agent, at most 10 requests per second).
- Found a filing it reads wrong, or need another form or section? Open an issue on the Issues tab. We fix fast and take custom work.

# Actor input Schema

## `companies` (type: `array`):

One per line: a ticker (`AAPL`), a CIK (`320193`) or a registrant name (`Microsoft`). Names are matched against SEC's official ticker list; a name that fits several registrants is not guessed — the run summary lists the candidates. Leave empty for market-wide discovery.

## `formTypes` (type: `array`):

Which filings to return. Amendments (8-K/A, 10-K/A…) are included with their form unless you switch them off under Limits.

## `filedWithinDays` (type: `integer`):

How far back to look, counting today. 90 days covers one full earnings cycle (one 10-Q or 10-K plus the earnings 8-K per company).

## `items8K` (type: `array`):

Only return 8-Ks that report one of these items — e.g. 2.02 for earnings, 5.02 for executive and board changes, 1.01 for material agreements. Empty = every 8-K. Other form types are not affected.

## `searchQuery` (type: `string`):

Only filings whose text contains this phrase (EDGAR full-text search). Use quotes for an exact phrase: `"artificial intelligence"`, `"going concern"`, `tariff`. Works market-wide or restricted to the companies above.

## `extractSections` (type: `boolean`):

Copy the key sections into the row, word for word: each 8-K item, the Ex-99.1 earnings press release, 10-K Items 1 / 1A / 1C / 7 / 7A, 10-Q MD\&A and risk factors, 20-F Items 3–5, S-1 summary / risk factors / use of proceeds, 13D purpose of transaction. Off = metadata, Form 4 trades and 13D/G holders only (faster).

## `maxCharsPerSection` (type: `integer`):

Long sections (a 10-K's risk factors run to 60,000+ characters) are cut at this length on a line boundary; the row says the full length and that it was cut.

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

For 8-K and 6-K filings, also copy the Ex-99 exhibits — the earnings press release of an Item 2.02 8-K, investor presentations, deal announcements.

## `includeXbrlFacts` (type: `boolean`):

For 10-K, 10-Q and 20-F rows, add the headline financials the filing reported for its own period — revenue, net income, EPS, assets, cash, operating cash flow… — straight from SEC's XBRL data, with unit and period. One extra request per company.

## `onlyNewSinceLastRun` (type: `boolean`):

Skip every filing this watch has delivered before (matched on the accession number, EDGAR's permanent filing ID). The first run is the baseline and returns everything in the window. Skipped filings are never charged.

## `watchId` (type: `string`):

Name of this watch's memory. Use a different ID per schedule (e.g. `portfolio-8k`, `ai-ipo-watch`) so two schedules don't share what they've seen.

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

Most filings to return in one run, newest first. You are charged per filing delivered.

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

Keeps one prolific filer from filling the whole run.

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

Return amended filings (8-K/A, 10-K/A, SCHEDULE 13D/A…) together with originals. Every row says whether it is an amendment.

## `periodicSections` (type: `array`):

Which 10-K / 10-Q / 20-F items to copy. Empty = all of them.

## `maxExhibitsPerFiling` (type: `integer`):

How many Ex-99 exhibits to copy from one 8-K / 6-K (Ex-99.1, Ex-99.2…).

## `requestsPerSecond` (type: `integer`):

SEC allows at most 10 requests per second; the default of 8 leaves headroom. Lower it if you run several copies at once.

## `maxConcurrency` (type: `integer`):

How many filings are read at the same time (all requests share the per-second limit above).

## Actor input object example

```json
{
  "companies": [
    "AAPL",
    "MSFT",
    "NVDA"
  ],
  "formTypes": [
    "8-K",
    "10-K",
    "10-Q"
  ],
  "filedWithinDays": 90,
  "items8K": [],
  "extractSections": true,
  "maxCharsPerSection": 20000,
  "includeExhibits": true,
  "includeXbrlFacts": false,
  "onlyNewSinceLastRun": false,
  "watchId": "default",
  "maxResults": 15,
  "maxFilingsPerCompany": 5,
  "includeAmendments": true,
  "periodicSections": [],
  "maxExhibitsPerFiling": 3,
  "requestsPerSecond": 8,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `filings` (type: `string`):

One row per filing, newest first: company, ticker, form, 8-K items, dates, accession number, links and the verbatim sections.

## `sections` (type: `string`):

The extracted sections of each filing — 8-K items, the Ex-99.1 earnings press release, 10-K / 10-Q risk factors and MD\&A — copied word for word.

## `insiderTrades` (type: `string`):

Form 4 transactions (owner, role, code, shares, price, holdings after) and Schedule 13D/G holders (shares, percent of class).

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

Counts by form, 8-K item and company, how each company input was matched (with candidates for ambiguous names), what is new since the last run, and request statistics.

# 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 = {
    "companies": [
        "AAPL",
        "MSFT",
        "NVDA"
    ],
    "formTypes": [
        "8-K",
        "10-K",
        "10-Q"
    ],
    "filedWithinDays": 90,
    "maxResults": 15,
    "maxFilingsPerCompany": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("inovaflow/sec-filings-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 = {
    "companies": [
        "AAPL",
        "MSFT",
        "NVDA",
    ],
    "formTypes": [
        "8-K",
        "10-K",
        "10-Q",
    ],
    "filedWithinDays": 90,
    "maxResults": 15,
    "maxFilingsPerCompany": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("inovaflow/sec-filings-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 '{
  "companies": [
    "AAPL",
    "MSFT",
    "NVDA"
  ],
  "formTypes": [
    "8-K",
    "10-K",
    "10-Q"
  ],
  "filedWithinDays": 90,
  "maxResults": 15,
  "maxFilingsPerCompany": 5
}' |
apify call inovaflow/sec-filings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,inovaflow/sec-filings-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/ZXSw3DWWXiEVnVof5/builds/6fMqZXqRHEvOjtJHc/openapi.json
