# SEC EDGAR Scraper — Filings, Full-Text Search & Financials (`fabrikit/sec-edgar-filings-scraper`) Actor

SEC EDGAR scraper: list 10-K, 10-Q, 8-K, S-1, 20-F and other filings by ticker or CIK, run full-text search across all filings, and pull XBRL financials (revenue, net income, assets). Official data, no API key. From US$1.00 per 1,000 filings.

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

## Pricing

from $1.00 / 1,000 filing or search hits

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 EDGAR Scraper — Filings, Full-Text Search & Financials

Pull official U.S. SEC EDGAR data without an API key, in three modes:

1. **Filings** — list a company's filings by ticker, CIK or name, filtered by form type (10-K, 10-Q, 8-K, S-1, 20-F, DEF 14A, 13F-HR, 424B5...) and date range. Every record has a direct link to the primary document and to the EDGAR filing index.
2. **Full-text search** — search the text of every filing since 2001 (exact phrases, boolean OR), filter by form, date and company.
3. **Financials (XBRL)** — revenue, net income, assets, liabilities, equity, EPS or any other XBRL concept, per fiscal period, or a cross-company snapshot ("frame") of one concept for every filer.

Data is public, official SEC data. The Actor covers **companies only**: insider forms (Forms 3, 4, 5, 144, Schedule 13D/G) and individual filers are never returned.

### Input examples

Latest annual and quarterly reports of two companies:

```json
{ "mode": "filings", "companies": ["AAPL", "MSFT"], "formTypes": ["10-K", "10-Q"], "maxFilingsPerCompany": 10 }
```

Full-text search for going-concern warnings in 10-Ks filed in 2026:

```json
{ "mode": "search", "searchQuery": "\"going concern\"", "searchForms": ["10-K"], "startDate": "2026-01-01", "maxItems": 500 }
```

Annual revenue, net income and assets since 2018:

```json
{ "mode": "financials", "companies": ["NVDA", "TSLA"], "concepts": ["Revenues", "NetIncomeLoss", "Assets"], "fromFiscalYear": 2018 }
```

Top 200 companies by total assets at end of 2023:

```json
{ "mode": "financials", "frame": "CY2023Q4I", "frameConcept": "Assets", "maxItems": 200 }
```

### Output example (filing)

```json
{
  "recordType": "filing", "cik": "0000320193", "ticker": "AAPL", "companyName": "Apple Inc.",
  "form": "10-Q", "filingDate": "2026-07-31", "reportDate": "2026-06-27",
  "accessionNumber": "0000320193-26-000020",
  "documentUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019326000020/aapl-20260627.htm",
  "filingIndexUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019326000020/0000320193-26-000020-index.htm",
  "sic": "3571", "industry": "Electronic Computers", "exchange": "Nasdaq", "isXbrl": true
}
```

Financial facts carry `concept`, `label`, `unit`, `value`, `periodStart`, `periodEnd`, `fiscalYear`, `fiscalPeriod`, `form`, `filedDate`, `accessionNumber`.

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| `filing-result` | US$1.00 / 1,000 | each filing record or full-text search hit |
| `financial-fact` | US$0.50 / 1,000 | each XBRL fact |

Plus the standard tiny Actor start event. Set a max budget in the run options and the Actor stops cleanly when it is reached.

### FAQ

**Do I need an API key?** No. SEC EDGAR is open. The Actor identifies itself with a User-Agent (editable in the input; put your own contact e-mail there, as the SEC asks) and keeps below 8 requests per second, under the SEC's 10/s fair-access limit.

**How far back does it go?** Filings: everything EDGAR holds (older pages are fetched only when your date range needs them). Full-text search: 2001 onwards, up to 10,000 hits per query (split by date range or form for more). Financials: XBRL era (2009+).

**Why did a ticker not resolve?** Only currently listed tickers are in the SEC ticker file. For delisted or private filers pass the CIK.

**Revenue is empty for some companies.** Companies use different tags; the default concepts include both `Revenues` and `RevenueFromContractWithCustomerExcludingAssessedTax`.

**Use cases:** B2B lead lists of public companies and recent filers, earnings and event monitoring (8-K items), risk-factor research, datasets for LLM / RAG pipelines, screening by financial size.

***

### En español

Extrae datos oficiales de la SEC (EE. UU.) sin API key: lista de informes (10-K, 10-Q, 8-K, S-1, 20-F...) por ticker o CIK, búsqueda de texto completo en todos los informes desde 2001 y datos financieros XBRL (ingresos, utilidad neta, activos). Solo empresas: no se devuelven formularios de insiders ni personas naturales. US$1,00 por 1.000 informes y US$0,50 por 1.000 datos financieros.

# Actor input Schema

## `mode` (type: `string`):

filings = list filings of companies; search = full-text search across all filings; financials = XBRL financial facts (revenue, net income, assets...).

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

Tickers (AAPL), CIK numbers (320193) or company names (Microsoft). Non-listed filers: use the CIK.

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

Company forms to keep, e.g. 10-K, 10-Q, 8-K, S-1, 20-F, DEF 14A, 13F-HR, 424B5. Leave empty for all company forms. Insider forms (3, 4, 5, 144, Schedule 13D/G) are never returned.

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

Also return amended versions such as 10-K/A when their base form is selected.

## `startDate` (type: `string`):

Filing date, YYYY-MM-DD (filings and search modes).

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

Filing date, YYYY-MM-DD (filings and search modes).

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

Newest first. Applies to filings mode.

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

Full-text search over the text of all filings since 2001. Use quotes for exact phrases, e.g. "going concern" OR "supply chain".

## `searchForms` (type: `array`):

Only search inside these forms, e.g. 10-K, 8-K. Empty = all company forms.

## `searchCompanies` (type: `array`):

Optional tickers / CIKs / names to restrict full-text search.

## `concepts` (type: `array`):

US-GAAP / IFRS / dei tag names, e.g. Revenues, RevenueFromContractWithCustomerExcludingAssessedTax, NetIncomeLoss, Assets, Liabilities, StockholdersEquity, OperatingIncomeLoss, EarningsPerShareDiluted, CashAndCashEquivalentsAtCarryingValue, EntityCommonStockSharesOutstanding.

## `periods` (type: `string`):

annual = full fiscal years (10-K/20-F/40-F); quarterly = interim periods; all = everything reported.

## `fromFiscalYear` (type: `integer`):

Financials mode, e.g. 2020.

## `toFiscalYear` (type: `integer`):

Financials mode.

## `latestValueOnly` (type: `boolean`):

Keep one row per concept and period (the most recently filed, i.e. restated, value). Turn off to get every filing's value.

## `frame` (type: `string`):

Financials mode: instead of companies, get one concept for ALL filers in a period, e.g. CY2023 (annual), CY2023Q4I (balance-sheet date), CY2023Q4. Largest values first.

## `frameConcept` (type: `string`):

Concept used with a frame, e.g. Assets, Revenues, NetIncomeLoss.

## `frameUnit` (type: `string`):

USD, shares, USD-per-shares, pure...

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

Total records saved (each is charged). Default run is 50.

## `userAgent` (type: `string`):

The SEC asks automated clients to identify themselves, ideally with a contact e-mail. Requests without an e-mail-like contact are rejected.

## `proxyConfiguration` (type: `object`):

The SEC API is open and rate-limited to 10 requests/second per IP; the Actor paces itself at 8/s. Proxy is only used as a fallback if the SEC throttles the IP.

## Actor input object example

```json
{
  "mode": "filings",
  "companies": [
    "AAPL",
    "MSFT"
  ],
  "formTypes": [
    "10-K",
    "10-Q",
    "8-K"
  ],
  "includeAmendments": false,
  "maxFilingsPerCompany": 25,
  "concepts": [
    "Revenues",
    "RevenueFromContractWithCustomerExcludingAssessedTax",
    "NetIncomeLoss",
    "Assets"
  ],
  "periods": "annual",
  "latestValueOnly": true,
  "frameConcept": "Assets",
  "frameUnit": "USD",
  "maxItems": 50,
  "userAgent": "Fabrikit SEC actor (apify.com/fabrikit) flippystudios1990@gmail.com",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `records` (type: `string`):

All records collected during the 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 = {
    "mode": "filings",
    "companies": [
        "AAPL",
        "MSFT"
    ],
    "formTypes": [
        "10-K",
        "10-Q",
        "8-K"
    ],
    "concepts": [
        "Revenues",
        "RevenueFromContractWithCustomerExcludingAssessedTax",
        "NetIncomeLoss",
        "Assets"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabrikit/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 = {
    "mode": "filings",
    "companies": [
        "AAPL",
        "MSFT",
    ],
    "formTypes": [
        "10-K",
        "10-Q",
        "8-K",
    ],
    "concepts": [
        "Revenues",
        "RevenueFromContractWithCustomerExcludingAssessedTax",
        "NetIncomeLoss",
        "Assets",
    ],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fabrikit/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 '{
  "mode": "filings",
  "companies": [
    "AAPL",
    "MSFT"
  ],
  "formTypes": [
    "10-K",
    "10-Q",
    "8-K"
  ],
  "concepts": [
    "Revenues",
    "RevenueFromContractWithCustomerExcludingAssessedTax",
    "NetIncomeLoss",
    "Assets"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fabrikit/sec-edgar-filings-scraper --silent --output-dataset

```

## MCP server setup

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