# SEC EDGAR Filings Scraper (`foo121/sec-edgar-scraper`) Actor

Export SEC filings (10-K, 8-K, 10-Q and more) for any US public company by ticker or CIK: form type, dates, accession, document links, plus XBRL financial facts. For fintech, research and compliance. Pay per result.

- **URL**: https://apify.com/foo121/sec-edgar-scraper.md
- **Developed by:** [ziv shay](https://apify.com/foo121) (community)
- **Categories:** Business
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 result items

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 Filings Scraper

**The SEC EDGAR scraper that pulls 10-K, 8-K, 10-Q and all other SEC filings by ticker — straight from the official SEC EDGAR API, with optional XBRL financials bundled in.**

Built for fintech, equity research, compliance, and data teams who need clean SEC filings data keyed by ticker instead of wrangling CIK numbers and raw index files. Give it a list of tickers and form types and get back structured filing rows — optionally append one financials row per company with revenue, net income, EPS, and balance-sheet figures.

Data comes from the **official SEC EDGAR API** — **no API key required**. This SEC filings scraper resolves each **ticker to its CIK** automatically via the official SEC ticker map, so you query by the symbol you already know.

### What you get

This scraper emits two row types, distinguished by `rowType`.

#### `rowType: "filing"` — one row per filing

| Field | Description |
|-------|-------------|
| `form` | Filing form type (e.g. "10-K", "8-K", "10-Q") |
| `cik` | SEC Central Index Key for the company |
| `company` | Company name |
| `ticker` | Ticker symbol the filing was matched to |
| `filingDate` | Date the filing was filed with the SEC |
| `reportDate` | Period-of-report date |
| `acceptanceDateTime` | Timestamp the SEC accepted the filing |
| `primaryDocDescription` | Description of the primary document |
| `fileNumber` | SEC file number |
| `items` | 8-K item codes (where applicable) |
| `size` | Filing size in bytes |
| `isXBRL` | Whether the filing includes XBRL data |
| `filingUrl` | Link to the primary filing document |
| `filingIndexUrl` | Link to the filing index page |

#### `rowType: "companyFacts"` — one row per company (only if `includeCompanyFacts: true`)

| Field | Description |
|-------|-------------|
| `company` | Company name |
| `cik` | SEC Central Index Key |
| `ticker` | Ticker symbol |
| `sic` | Standard Industrial Classification code |
| `fiscalYearEnd` | Fiscal year-end (MMDD) |
| `revenue` | Most recent reported revenue (USD) |
| `revenueFiscalYear` | Fiscal year of the revenue figure |
| `revenuePeriodEnd` | Period-end date for the revenue figure |
| `netIncome` | Most recent net income (USD) |
| `totalAssets` | Total assets (USD) |
| `totalLiabilities` | Total liabilities (USD) |
| `stockholdersEquity` | Total stockholders' equity (USD) |
| `cashAndEquivalents` | Cash and cash equivalents (USD) |
| `earningsPerShareDiluted` | Diluted EPS |
| `factsUrl` | Link to the company facts (XBRL) endpoint |

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `tickers` | array | `[]` | Ticker symbols to fetch, e.g. `["AAPL","MSFT"]` |
| `ciks` | array | *(optional)* | CIKs to fetch directly, if you prefer |
| `formTypes` | array | `[]` | Form types to keep, e.g. `["10-K","8-K","10-Q"]` (empty = all) |
| `maxFilingsPerCompany` | integer | `50` | Cap on filings returned per company |
| `includeCompanyFacts` | boolean | `false` | Append one `companyFacts` row per company with XBRL financials |

#### Example input

```json
{
  "tickers": ["AAPL", "MSFT"],
  "formTypes": ["10-K", "8-K", "10-Q"],
  "maxFilingsPerCompany": 50,
  "includeCompanyFacts": true
}
```

### Example run output

A `filing` row:

```json
{
  "rowType": "filing",
  "form": "10-K",
  "cik": "0000320193",
  "company": "Apple Inc.",
  "ticker": "AAPL",
  "filingDate": "2024-11-01",
  "reportDate": "2024-09-28",
  "acceptanceDateTime": "2024-11-01T18:01:14.000Z",
  "primaryDocDescription": "10-K",
  "fileNumber": "001-36743",
  "items": "",
  "size": 8123456,
  "isXBRL": true,
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/aapl-20240928.htm",
  "filingIndexUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/0000320193-24-000123-index.htm"
}
```

A `companyFacts` row (only when `includeCompanyFacts: true`):

```json
{
  "rowType": "companyFacts",
  "company": "Apple Inc.",
  "cik": "0000320193",
  "ticker": "AAPL",
  "sic": "3571",
  "fiscalYearEnd": "0928",
  "revenue": 391035000000,
  "revenueFiscalYear": 2024,
  "revenuePeriodEnd": "2024-09-28",
  "netIncome": 93736000000,
  "totalAssets": 364980000000,
  "totalLiabilities": 308030000000,
  "stockholdersEquity": 56950000000,
  "cashAndEquivalents": 29943000000,
  "earningsPerShareDiluted": 6.08,
  "factsUrl": "https://data.sec.gov/api/xbrl/companyfacts/CIK0000320193.json"
}
```

### Use cases

- **Fintech & data teams** — ingest SEC filings data keyed by ticker into your product without managing CIK lookups.
- **Equity research** — pull 10-K, 10-Q, and 8-K filings plus bundled XBRL fundamentals for a coverage list in one run.
- **Compliance teams** — monitor a watchlist of issuers for new filings by form type.
- **Quant & analytics teams** — build a clean financials dataset (revenue, net income, EPS, balance sheet) straight from official XBRL.

### Why this SEC EDGAR scraper

- **Official source, no key** — pulls directly from the official SEC EDGAR API; no key, no scraping HTML.
- **Ticker-keyed** — resolves ticker → CIK via the official SEC ticker map, so you query by symbol.
- **XBRL financials bundled** — flip `includeCompanyFacts` and get fundamentals alongside the filing index in one dataset, instead of paying a separate fundamentals API.
- **Pay-per-result** — no seat license; pay only for filings and facts rows returned.

### Pricing

Pay per result — you are billed only for the filing and company-facts rows returned to your dataset.

### Keywords

SEC EDGAR scraper, SEC filings scraper, 10-K 8-K data by ticker, SEC EDGAR API, 10-Q scraper, XBRL financials, company facts API, SEC filings by ticker, equity research data, fundamentals scraper

# Actor input Schema

## `tickers` (type: `array`):

Stock ticker symbols to fetch filings for, e.g. \["AAPL", "MSFT"]. Resolved to CIK via the official SEC ticker map. Provide tickers and/or CIKs.

## `ciks` (type: `array`):

SEC Central Index Keys (CIK) to fetch, e.g. \["320193"] or \["0000320193"]. Zero-padding is handled automatically. Use instead of, or alongside, tickers.

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

Optional filter of SEC form types to include, e.g. \["10-K", "8-K", "10-Q"]. Leave empty to include every form.

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

Maximum number of filings to return for each company (most recent first).

## `includeCompanyFacts` (type: `boolean`):

If enabled, append one extra row per company summarizing key XBRL financials (revenue, net income, total assets, equity, EPS, etc.) from the latest annual report.

## Actor input object example

```json
{
  "tickers": [
    "AAPL",
    "MSFT"
  ],
  "formTypes": [
    "10-K",
    "8-K",
    "10-Q"
  ],
  "maxFilingsPerCompany": 50,
  "includeCompanyFacts": false
}
```

# 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 = {
    "tickers": [
        "AAPL",
        "MSFT"
    ],
    "formTypes": [
        "10-K",
        "8-K",
        "10-Q"
    ]
};

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

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

```

## MCP server setup

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