# SEC EDGAR Filings Scraper — Companies & Full-Text Search (`eltociear/sec-edgar-filings`) Actor

Get SEC EDGAR filings by ticker or CIK, or full-text search every document filed since 2001. Download 10-K and 10-Q reports, monitor 8-K material events, track insider trading Form 4 filings. Returns form, dates, accession number, item codes and a direct document link.

- **URL**: https://apify.com/eltociear/sec-edgar-filings.md
- **Developed by:** [Ikko Eltociear Ashimine](https://apify.com/eltociear) (community)
- **Categories:** Business, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 filing returneds

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 Scraper — Companies & Full-Text Search

Every SEC filing for any US public company, by ticker or CIK — or a full-text search across
the text of every document filed since 2001. Each row carries the company, CIK, form type,
filing and report dates, the accession number, 8-K item codes, and a **direct link to the
primary document** that actually resolves.

No API key. No browser. No proxy. Straight against the SEC's own `data.sec.gov` and EDGAR
full-text search endpoints, at a request rate inside the SEC's fair-access policy.

**You pay per filing returned** — $0.004. Duplicates and filings your filters reject are
**not** charged.

***

### What you can do with it

**Get SEC EDGAR filings by ticker or CIK.** Tickers and CIKs, mixed freely.

```
companies: ["AAPL", "MSFT", "320193", "CIK0000789019"]
forms: ["10-K", "10-Q"]
```

**Download 10-K and 10-Q filing documents.** Every row carries a direct link to the primary
document, so the annual and quarterly reports are one fetch away.

```
companies: ["NVDA"],  forms: ["10-K"],  maxFilings: 20
```

**Monitor 8-K material events on a schedule.** Run every morning with a rolling date window
and you have a material-events feed for your watchlist.

```
companies: ["TSLA", "NVDA"],  forms: ["8-K"],  dateFrom: "2026-08-01"
```

**Full-text search SEC filings.** Search the document bodies, not just the metadata — find
every company that said a thing. Quote a phrase to match it exactly.

```
query: "material weakness",  forms: ["8-K"],  dateFrom: "2026-01-01"
```

**Track insider trading — Form 4 filings.** Form 4 is filed on every insider transaction:
buys, sells and option exercises by officers, directors and 10% owners.

```
companies: ["AAPL"],  forms: ["4"],  maxFilings: 500
```

**Pull 13F-HR institutional holdings**, S-1 registration statements, proxy statements, or
any other EDGAR form code — the `forms` filter takes all of them.

Put another way, this Actor answers:

- **company financial filings by ticker** — give it `AAPL`, get Apple's filing history
- **annual report 10-K download** — the direct document link is on every row
- **quarterly earnings filings** — `forms: ["10-Q"]`, optionally with a date window
- **a regulatory filings monitor** — run it on a schedule with a rolling `dateFrom`
- **a public company disclosure feed** — 8-K material events as they are filed
- **13F institutional holdings** — `forms: ["13F-HR"]` for the quarterly position reports

***

### Sample output

```json
{
  "company": "Apple Inc.",
  "cik": 320193,
  "ticker": "AAPL",
  "all_tickers": ["AAPL"],
  "sic_description": "Electronic Computers",
  "form": "10-Q",
  "filing_date": "2026-07-31",
  "report_date": "2026-06-27",
  "accession_number": "0000320193-26-000020",
  "items": [],
  "primary_document": "aapl-20260627.htm",
  "document_description": "10-Q",
  "document_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019326000020/aapl-20260627.htm",
  "filing_index_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019326000020/0000320193-26-000020-index.htm",
  "size_bytes": 8123456,
  "is_xbrl": true,
  "source": "submissions"
}
```

***

### Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `companies` | string\[] | — | Tickers (`AAPL`) or CIKs (`320193`, `CIK0000320193`). Takes priority over `query`. |
| `query` | string | — | Full-text search over document bodies since 2001. Quote a phrase for an exact match. |
| `forms` | string\[] | — | EDGAR form codes: `10-K`, `10-Q`, `8-K`, `4`, `S-1`, `13F-HR`… Empty means all. |
| `dateFrom` | string | — | `YYYY-MM-DD`, filed on or after. |
| `dateTo` | string | — | `YYYY-MM-DD`, filed on or before. |
| `maxFilings` | integer | 100 | Hard cap on rows — and therefore your spending cap. |

***

### Things this Actor is careful about

These are all cases where a wrong answer still *looks* like a valid filing row.

- **`dateFrom` on its own actually works here.** EDGAR's full-text search silently ignores
  `startdt` unless `enddt` is sent with it — asking for "since January" returns filings back
  to 2004, with no error. On a pay-per-row product that is a billing bug, so this Actor
  closes the window itself.
- **Amendments are not dropped.** EDGAR filters on the *root* form, so asking for `8-K` also
  returns `8-K/A`. This Actor matches that, because an amendment is often the whole point —
  the restatement, the correction. A stricter local filter would silently discard what the
  SEC deliberately included.
- **Misaligned data is refused, not guessed.** `data.sec.gov` returns a company's filings as
  parallel arrays, one per column. If those columns ever disagree in length the row-to-row
  alignment is unknowable, so the company is skipped and logged rather than emitting filings
  with one row's date and another's accession number.
- **Document links resolve.** The URL needs the CIK with leading zeros stripped and the
  accession number with its dashes removed, while every citation keeps the dashes. Both
  forms are produced correctly, and verified against live filings.
- **You are never charged twice for one filing.** Rows are de-duplicated on
  (CIK, accession number) before anything is billed.

### Limits

- Full-text search reaches documents filed **2001 onward** and will not page past EDGAR's
  10,000-result ceiling; narrow the date range to get past it.
- The company path returns the most recent ~1,000 filings per company, which is what
  `data.sec.gov` serves in one response.
- Search rows have no ticker or SIC attached — EDGAR's search index does not carry them.

# Actor input Schema

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

Tickers like AAPL, or CIKs like 320193 / CIK0000320193. Returns each company's filing history. Takes priority over Search. Omit it and the actor runs on this default so a caller with nothing to supply still gets real output rather than an empty dataset.

## `query` (type: `string`):

Search the text of every document filed since 2001, e.g. 'artificial intelligence' or 'material weakness'. Used only when Companies is empty. Quote a phrase to match it exactly.

## `forms` (type: `array`):

Restrict to these EDGAR form codes, e.g. 10-K, 10-Q, 8-K, 4, S-1, 13F-HR. Leave empty for all forms.

## `dateFrom` (type: `string`):

Earliest filing date to include.

## `dateTo` (type: `string`):

Latest filing date to include.

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

Hard cap on rows returned. You pay per filing returned, so this is also your spending cap.

## Actor input object example

```json
{
  "companies": [
    "AAPL",
    "MSFT"
  ],
  "maxFilings": 100
}
```

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("eltociear/sec-edgar-filings").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",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("eltociear/sec-edgar-filings").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"
  ]
}' |
apify call eltociear/sec-edgar-filings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,eltociear/sec-edgar-filings"
        }
    }
}

```

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/TGyi8eZcHrE3EKPoA/builds/yRynZ6UQUFHXcJZRD/openapi.json
