# SEC EDGAR Filings Scraper - 10-K, 8-K, 13F (`darknezz/sec-edgar-filings-scraper`) Actor

Pull SEC EDGAR filings (10-K, 10-Q, 8-K, 13F) for any US-listed ticker and structure them to JSON: filing metadata, sectioned document text, risk factors and LLM-ready summaries. Official SEC full-text search API, no API key required.

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

## Pricing

from $20.00 / 1,000 filing extracteds

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/platform/actors/running/actors-in-store#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 Filings & Financial Corpus Scraper

Pull **SEC EDGAR filings** — 10-K, 10-Q, 8-K and 13F-HR — for any US-listed
ticker and get each filing structured to JSON: filing metadata, **sectioned
document text**, **10-K risk factors** (Item 1A), **13F holdings tables**,
and an optional **LLM-ready summary**. Built on the SEC's official full-text
search API — no API key, no third-party data vendor.

### Why

EDGAR is the canonical source of US public-company disclosures, but the raw
archive is hostile to analysis: filings are HTML documents with table-heavy
layouts, and the full-text search UI is built for humans, not pipelines.
This actor turns a ticker + form-type + date window into a clean corpus of
JSON records — one per filing — ready for financial alt-data pipelines,
sentiment/risk analysis, RAG corpora, or LLM fine-tuning datasets.

### How it works

1. **Ticker → CIK** — resolves the ticker against the official SEC company
   list (`company_tickers.json`); falls back to display-name search for
   delisted or foreign-format tickers.
2. **Full-text search** — queries the official EDGAR full-text search JSON
   API (`efts.sec.gov/LATEST/search-index`) with the ticker, form types and
   date window, paginated at 100 hits per page, deduplicated by accession
   number, and filtered to each filing's primary document (exhibits are
   excluded; their URLs remain reachable via the filing index link).
3. **Document extraction** — fetches each primary document from the SEC
   Archives and converts HTML to clean text (scripts/styles stripped,
   tables preserved, entities decoded, whitespace normalised).
4. **Structuring** — splits documents into Item sections (`Item 1.`,
   `Item 1A.`, `Item 7.`, `Item 2.02`, ...), extracts risk factors from
   10-K/10-Q Item 1A, and parses 13F-HR XML InfoTables into holding records
   (issuer, CUSIP, value, shares, voting authority).
5. **Summary** — when `summarize` is enabled, emits a deterministic
   markdown summary per filing (metadata, section map, risk-factor excerpt,
   holdings preview) designed for direct LLM consumption — no external LLM
   call, no extra cost.

SEC fair-access policy is respected: a descriptive User-Agent
(`Darknezz Research admin@adrianhomelab.com`) and polite pacing (~5
requests/second, well under the 10 rps limit) with 429 backoff.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `ticker` | string | — | Stock ticker, e.g. `AAPL`, `MSFT`, `TSLA` (**required**) |
| `formTypes` | string\[] | `["10-K","10-Q","8-K","13-F"]` | Form types to pull; `13-F` maps to `13F-HR` |
| `period` | string | empty | Date window: `2023-2026`, `2024`, or `2023-01-01:2026-12-31` |
| `summarize` | boolean | `true` | Add the LLM-ready summary per filing |
| `maxItems` | integer | `50` | Max filings to extract (1–500) |

Example:

```json
{
  "ticker": "AAPL",
  "formTypes": ["10-K", "8-K"],
  "period": "2023-2026",
  "summarize": true
}
```

### Output

One dataset item per filing:

- **Metadata** — `accessionNumber`, `ticker`, `companyName`, `cik`,
  `formType`, `filingDate`, `periodEnding`, event `items` (8-K), file
  details, `documentUrl`, `sourceUrl` (filing index).
- **`sections`** — array of `{heading, item, text}` for each Item section
  (per-section cap 60k chars; full text stays at the source URL).
- **`riskFactors`** — 10-K/10-Q Item 1A text (or any "Risk Factors"
  heading), empty for 8-K.
- **`holdings`** — 13F positions: `nameOfIssuer`, `titleOfClass`, `cusip`,
  `value`, `shares`, `sharesType`, `putCall`, `investmentDiscretion`,
  `otherManager`, `votingSole/Shared/None`. Mega-manager filings are capped
  at 20,000 positions with `holdingsCount` + `holdingsTruncated` flags.
- **`summary`** — LLM-ready markdown when `summarize` is true.
- `charCount`, `scrapedAt`.

### Use cases

- **Financial alt-data** — monitor 8-K event items (2.02 results, 1.01
  agreements, 9.01 exhibits) across a watchlist.
- **Risk analysis** — 10-K Item 1A risk-factor corpus for sector risk
  benchmarking or LLM risk-extraction pipelines.
- **13F tracking** — institutional holdings snapshots (quarterly) for
  fund-flow and positioning analysis.
- **Vertical AI corpus** — clean, sectioned regulatory text for
  fine-tuning, RAG, or evaluation datasets.
- **Fundamental screening** — 10-Q/10-K MD\&A text for narrative trend
  analysis over time.

### Run from the API

```bash
curl -X POST "https://api.apify.com/v2/acts/darknezz~sec-edgar-filings-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"ticker":"AAPL","formTypes":["8-K"],"period":"2024-2026","summarize":true,"maxItems":5}'
```

### Pricing

Pay-per-event — charged per filing extracted (`result` event).
Pricing is finalised at publication; this actor is currently held private.

### FAQ

**Do I need an API key?** No — EDGAR is a free public API. Only a
descriptive User-Agent is required, which the actor sets automatically.

**Rate limits?** SEC's fair-access policy allows 10 requests/second; the
actor stays at ~5 and backs off on 429s.

**Why are exhibits missing from `sections`?** Each filing yields its primary
document only; exhibit files (EX-99.1 press releases, EX-10 contracts) are
one click away via `sourceUrl` (the filing index).

**Amendments?** `/A` variants are included when the form-type filter matches
(e.g. `10-K/A`); use the exact form code to narrow.

**What about delisted tickers?** If the ticker is absent from the SEC
company list, the actor falls back to display-name full-text search, which
covers most historical filers.

# Actor input Schema

## `ticker` (type: `string`):

Stock ticker symbol, e.g. AAPL, MSFT, TSLA. Resolved to its SEC CIK via the official SEC company list.

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

SEC form types to pull (10-K, 10-Q, 8-K, 13-F). 13-F is mapped to 13F-HR (the official EDGAR code for quarterly holdings reports).

## `period` (type: `string`):

Filing date window. Accepts 'YYYY-YYYY' (e.g. 2023-2026), a single year, or 'YYYY-MM-DD:YYYY-MM-DD'. Leave empty for all time.

## `summarize` (type: `boolean`):

Add a deterministic markdown summary per filing (metadata, section map, risk-factor excerpt, holdings preview) ready for direct LLM consumption.

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

Maximum number of filings to extract.

## Actor input object example

```json
{
  "ticker": "AAPL",
  "formTypes": [
    "10-K",
    "8-K"
  ],
  "period": "2023-2026",
  "summarize": true,
  "maxItems": 50
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `accessionNumber` (type: `string`):

No description

## `ticker` (type: `string`):

No description

## `companyName` (type: `string`):

No description

## `cik` (type: `string`):

No description

## `formType` (type: `string`):

No description

## `filingDate` (type: `string`):

No description

## `periodEnding` (type: `string`):

No description

## `items` (type: `string`):

No description

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

No description

## `riskFactors` (type: `string`):

No description

## `holdings` (type: `string`):

No description

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

No description

## `documentUrl` (type: `string`):

No description

## `scrapedAt` (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 = {
    "ticker": "AAPL",
    "formTypes": [
        "10-K",
        "8-K"
    ],
    "period": "2023-2026"
};

// Run the Actor and wait for it to finish
const run = await client.actor("darknezz/sec-edgar-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 = {
    "ticker": "AAPL",
    "formTypes": [
        "10-K",
        "8-K",
    ],
    "period": "2023-2026",
}

# Run the Actor and wait for it to finish
run = client.actor("darknezz/sec-edgar-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 '{
  "ticker": "AAPL",
  "formTypes": [
    "10-K",
    "8-K"
  ],
  "period": "2023-2026"
}' |
apify call darknezz/sec-edgar-filings-scraper --silent --output-dataset

```

## MCP server setup

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