# SEC EDGAR Scraper — 10-K/10-Q Filings & XBRL Data (`bovi/sec-edgar-scraper`) Actor

Scrape SEC EDGAR company filings (10-K, 10-Q, 8-K and more), structured XBRL financial facts (Assets, Revenue, Net Income), and full-text search across all SEC filings. Uses official SEC JSON APIs — no proxy, no auth required. Supports ticker symbols and CIK numbers. Pay per result.

- **URL**: https://apify.com/bovi/sec-edgar-scraper.md
- **Developed by:** [Vitalii Bondarev](https://apify.com/bovi) (community)
- **Categories:** Business, Developer tools, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.60 / 1,000 filing items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 — Financial Reports & XBRL Data

Used by quant analysts building financial factor databases, compliance officers monitoring 8-K filings for material events, and AI agents answering questions like "What was Apple's revenue in Q3 2023?"

Scrape SEC EDGAR company filings (10-K, 10-Q, 8-K, and more), structured XBRL financial facts (Assets, Revenue, Net Income, 500+ concepts), and perform full-text search across all SEC filing text — all via the official SEC JSON APIs. No proxy needed. No authentication required.

**$2.00/1K filing records** · **$5.00/1K XBRL financial facts** · **$3.00/1K full-text search hits**. First 10 results free per mode. No subscription needed. Official SEC data. 500+ XBRL financial concepts. Zero proxy cost.

#### What you can do

- **Get all 10-K/10-Q/8-K filings** for any US public company by ticker symbol (AAPL, MSFT, TSLA) or CIK number
- **Extract structured financial data** (XBRL): Assets, Revenues, Net Income, EPS, LongTermDebt, and 500+ other GAAP concepts — one row per reporting period
- **Full-text search** across all SEC filings to find companies mentioning specific topics (e.g. "climate risk", "supply chain disruption", "artificial intelligence")

#### Quick start

**Scrape Apple and Microsoft annual/quarterly reports:**

```json
{
  "mode": "filings",
  "tickers": ["AAPL", "MSFT"],
  "formTypes": ["10-K", "10-Q"],
  "maxItems": 20
}
```

**Get Apple's financial facts (Assets, Revenue, Net Income):**

```json
{
  "mode": "companyFacts",
  "tickers": ["AAPL"],
  "concepts": ["Assets", "Revenues", "NetIncomeLoss"]
}
```

**Search for 10-K filings mentioning "climate risk":**

```json
{
  "mode": "searchFilings",
  "searchQueries": ["climate risk"],
  "formTypes": ["10-K"],
  "maxItems": 100
}
```

#### Output schema

Each result contains:

| Field | Type | Description |
|---|---|---|
| `cik` | string | 10-digit zero-padded SEC CIK |
| `company_name` | string | Company name from SEC |
| `ticker` | string | Stock ticker (e.g. "AAPL") |
| `form_type` | string | SEC form type (10-K, 10-Q, 8-K, etc.) |
| `filing_date` | string | Date filed (ISO: YYYY-MM-DD) |
| `accession_number` | string | Unique filing ID with dashes |
| `primary_document` | string | Main filing document filename |
| `report_date` | string | Period covered (ISO: YYYY-MM-DD) |
| `filing_url` | string | Direct HTTPS URL to the filing document |
| `items` | array | Form items listed (e.g. \["1A", "7A"] for 8-K) |
| `parse_confidence` | float | Data quality score (0.0–1.0; 1.0 = all fields present) |
| `warnings` | array | List of quality warning codes |

For `companyFacts` mode, additional fields: `concept`, `label`, `namespace`, `unit`, `value`, `period_end`, `fiscal_year`, `fiscal_period`, `frame`.

For `searchFilings` mode, additional fields: `query`, `file_description`.

#### Why this scraper?

- **Official SEC APIs** — not HTML scraping. Zero fragility. No class-name changes break it.
- **Ticker→CIK auto-lookup** — just provide AAPL, MSFT, TSLA; no need to look up CIK numbers manually
- **Direct filing URLs** — each row includes the full HTTPS URL to the primary filing document (10-K PDF/HTML)
- **parse\_confidence** field — machine-readable quality score in every row (unique to this actor)
- **Zero proxy cost** — SEC APIs are public and accessible from anywhere
- **XBRL structured data** — 500+ financial concepts extracted as clean rows (no parsing required)

#### Common form types

| Form | Description |
|---|---|
| 10-K | Annual report (comprehensive financial statements) |
| 10-Q | Quarterly report (financial statements) |
| 8-K | Current report (material events: earnings, mergers, leadership changes) |
| DEF 14A | Proxy statement (shareholder meeting, executive compensation) |
| S-1 | IPO registration statement |
| 4 | Insider trading report |
| 13F | Institutional investment manager holdings |

#### Rate limits and fair use

The SEC Fair-Access Policy requires a descriptive `User-Agent` header on every request (included automatically). The SEC allows up to 10 requests/second. This actor stays well below that limit with built-in throttling.

#### Pricing

**Pay-per-result (PPE) — charged per item returned, not per run:**

| Mode | Event | Rate | Example |
|---|---|---|---|
| filings | `filing-item` | **$2.00/1K** | 1,000 10-K records = **$2.00** |
| companyFacts | `xbrl-facts-record` | **$5.00/1K** | 500 XBRL concept rows = **$2.50** |
| searchFilings | `search-hit` | **$3.00/1K** | 200 full-text hits = **$0.60** |

First 10 results free per mode. Compute time billed separately to your Apify account.

**Worked examples:**

- 5 tickers × 10 years of 10-Q filings (40 rows each) = 200 records = **$0.40**
- Apple financials, 3 XBRL concepts × 20 quarters = 60 rows = **$0.30**
- Full-text search "climate risk" in 10-K filings, 500 hits = **$1.50**

#### FAQ

**Do I need an API key or proxy?**
No. The SEC EDGAR APIs are fully public — no authentication, no proxy, no signup. This actor includes the required SEC-compliant `User-Agent` header automatically.

**What ticker symbols work?**
Any US exchange ticker (NYSE, NASDAQ, etc.). The actor auto-resolves tickers to CIK numbers using the SEC's official `company_tickers.json`. For private companies or foreign filers, provide a CIK directly.

**What output formats are available?**
JSON, CSV, Excel — download from the Apify dataset. `filing_url` links directly to the SEC EDGAR filing document.

**What if a ticker isn't found?**
The record is logged as failed and the run continues. Check that the ticker is a current US exchange listing — delisted tickers may not resolve.

#### vs. Competitors

| Feature | This Actor | Financial data vendors |
|---|---|---|
| Data source | Official SEC EDGAR API | Vendor aggregation |
| Auth required | No | Paid subscription |
| Ticker → CIK auto-resolve | Yes | Usually |
| XBRL structured data | 500+ concepts | Varies |
| Full-text filing search | Yes (EFTS) | Rare/expensive |
| parse\_confidence | Yes | No |
| Cost | $2-5/1K | $50-200/1K typical |

#### Use with AI agents (MCP)

An agent calls this tool to **look up SEC filings, financial facts, and full-text filing search mid-conversation** — e.g. "Get Apple's net income for the last 5 years", "Find all 8-K filings for TSLA in 2024", or "Search 10-K filings mentioning 'climate risk'."

Point your MCP client at this tool:

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://mcp.apify.com/?tools=bovi/sec-edgar-scraper",
        "--header",
        "Authorization: Bearer <YOUR_APIFY_TOKEN>"
      ]
    }
  }
}
```

Minimal agent input (XBRL financial facts):

```json
{
  "mode": "companyFacts",
  "tickers": ["AAPL"],
  "concepts": ["Assets", "Revenues", "NetIncomeLoss"]
}
```

#### Integrations

Built for quant analysts, fintech builders, and compliance teams extracting structured financials and filings from public companies — the JSON/dataset output drops into the tools you already run, no glue code:

- **n8n / Make / Zapier** — trigger a run or pipe every new dataset item into 500+ apps (Google Sheets, Airtable, Slack, HubSpot, your database) with no code: [n8n](https://docs.apify.com/platform/integrations/n8n), [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier).
- **Webhooks** — fire your own endpoint the moment a run finishes, to push results straight into your pipeline ([docs](https://docs.apify.com/platform/integrations/webhooks)).
- **MCP server** — expose this actor as a tool to Claude, Cursor, or any [MCP client](https://mcp.apify.com) so an AI agent can pull this data mid-conversation ([guide](https://blog.apify.com/how-to-use-mcp/)).
- **API & SDKs** — fetch the dataset as JSON, CSV, or Excel through the Apify REST API or the Python / JS SDKs.

See all [Apify integrations](https://apify.com/integrations).

#### Legal notice

This actor accesses publicly available SEC EDGAR data as permitted by the Securities Exchange Act. EDGAR is a public service of the U.S. Securities and Exchange Commission. This actor is not affiliated with or endorsed by the SEC.

# Actor input Schema

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

What to scrape. filings: list of company filings from submissions API (10-K, 10-Q, 8-K, etc). companyFacts: structured XBRL financial data (Assets, Revenue, Net Income, etc). searchFilings: full-text search across all SEC filings.

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

US stock ticker symbols — resolved automatically to SEC CIK numbers. Used in filings and companyFacts modes. Examples: AAPL, MSFT, TSLA, NVDA. Provide tickers OR ciks (or both).

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

SEC CIK numbers (Central Index Keys). Zero-padded (0000320193) or plain integer (320193) both work — the actor normalises automatically. Used alongside or instead of tickers in filings and companyFacts modes.

## `searchQueries` (type: `array`):

Full-text search terms used when mode=searchFilings. Each query runs separately. Supports quoted phrases and Boolean operators. Examples: 'climate risk', '"artificial intelligence"', 'supply chain disruption'.

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

Filter by SEC form types. Common values: 10-K (annual report), 10-Q (quarterly report), 8-K (current report/material events), DEF 14A (proxy statement), S-1 (IPO registration). Leave empty for all forms.

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

Maximum total items to return across all companies/queries. 0 = no limit. Default 50.

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

For mode=companyFacts: XBRL concept names to include. Examples: Assets, Revenues, NetIncomeLoss, EarningsPerShareBasic, LongTermDebt. Leave empty to fetch all available concepts (can be 500+).

## `includeOlderFilings` (type: `boolean`):

For mode=filings: also fetch filings older than the most-recent 1000. Requires an extra API call per company. Default false.

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

Filter filings filed on or after this date (ISO format: YYYY-MM-DD). Applies to filings and searchFilings modes.

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

Filter filings filed on or before this date (ISO format: YYYY-MM-DD). Applies to filings and searchFilings modes.

## Actor input object example

```json
{
  "mode": "filings",
  "tickers": [
    "AAPL",
    "MSFT"
  ],
  "ciks": [],
  "searchQueries": [
    "climate risk"
  ],
  "formTypes": [
    "10-K",
    "10-Q"
  ],
  "maxItems": 50,
  "concepts": [
    "Assets",
    "Revenues",
    "NetIncomeLoss"
  ]
}
```

# Actor output Schema

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

Dataset containing Sec Edgar Scraper records (ticker, company\_name, form\_type, filing\_date, report\_date, accession\_number, primary\_document, filing\_url, items, cik, parse\_confidence, warnings).

# 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",
    "tickers": [
        "AAPL",
        "MSFT"
    ],
    "ciks": [],
    "searchQueries": [
        "climate risk"
    ],
    "formTypes": [
        "10-K",
        "10-Q"
    ],
    "maxItems": 50,
    "concepts": [
        "Assets",
        "Revenues",
        "NetIncomeLoss"
    ],
    "includeOlderFilings": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/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 = {
    "mode": "filings",
    "tickers": [
        "AAPL",
        "MSFT",
    ],
    "ciks": [],
    "searchQueries": ["climate risk"],
    "formTypes": [
        "10-K",
        "10-Q",
    ],
    "maxItems": 50,
    "concepts": [
        "Assets",
        "Revenues",
        "NetIncomeLoss",
    ],
    "includeOlderFilings": False,
}

# Run the Actor and wait for it to finish
run = client.actor("bovi/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 '{
  "mode": "filings",
  "tickers": [
    "AAPL",
    "MSFT"
  ],
  "ciks": [],
  "searchQueries": [
    "climate risk"
  ],
  "formTypes": [
    "10-K",
    "10-Q"
  ],
  "maxItems": 50,
  "concepts": [
    "Assets",
    "Revenues",
    "NetIncomeLoss"
  ],
  "includeOlderFilings": false
}' |
apify call bovi/sec-edgar-scraper --silent --output-dataset

```

## MCP server setup

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