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

Extract SEC EDGAR filings, full-text search hits, and XBRL financial facts via the official public API. No API key, no browser, no proxy.

- **URL**: https://apify.com/aurenic/sec-edgar-scraper.md
- **Developed by:** [Aurenic](https://apify.com/aurenic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 results

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

Extract SEC EDGAR filings, full-text search hits, and XBRL financial facts via the official public API. No API key, no browser, no proxy.

### What does SEC EDGAR Scraper do?

Scrape every U.S. public company filing from the SEC's official EDGAR system in three modes:

- **Company filings** — pass tickers or CIKs, get every filing with form type, filing date, report date, accession number, XBRL flags, and direct document URLs. Filter by form type (10-K, 10-Q, 8-K, S-1, Form 4, 13F-HR, DEF 14A, and hundreds more) and date range.
- **Full-text search** — search across every EDGAR filing since 1993. Filter by form type and date. Returns filing metadata, company name, ticker, CIK, SIC codes, and direct SEC archive URLs.
- **XBRL financial facts** — pull every reported financial concept (revenue, net income, assets, EPS, and thousands more) as discrete facts with values, units, periods, and accession references.

The SEC exposes all of this through **free, public, unauthenticated REST APIs** at `data.sec.gov` and `efts.sec.gov` — the same endpoints the SEC's own website uses.

### Output fields

#### Filings

| Field | Description |
|---|---|
| cik | Central Index Key |
| ticker | Stock ticker |
| companyName | Registered entity name |
| formType | Form type (10-K, 10-Q, 8-K, 4, etc.) |
| filingDate | Date filed |
| reportDate | Period end date |
| acceptanceDateTime | SEC acceptance timestamp |
| accessionNumber | Unique filing identifier |
| primaryDocument | Primary document filename |
| isXBRL / isInlineXBRL | XBRL format flags |
| isAmendment | /A filing flag |
| sizeBytes | Submission size |
| items | 8-K item numbers |
| filingUrl | Direct SEC archive index |
| primaryDocumentUrl | Direct document URL |

#### Search hits

| Field | Description |
|---|---|
| accessionNumber | Filing accession |
| formType / fileType | Form and document type |
| filingDate / periodEnding | Filing and period dates |
| companyName / ticker / ciks | Filer identity |
| sic / states / locations | Classification |
| documentUrl | Direct SEC archive URL |

#### XBRL facts

| Field | Description |
|---|---|
| cik / entityName | Filer identity |
| taxonomy | us-gaap, ifrs-full, dei, srt |
| concept | Financial concept tag |
| label / description | Human-readable name |
| unit | USD, shares, pure, etc. |
| value | Reported value |
| startDate / endDate | Period |
| filedDate / fiscalYear / fiscalPeriod | Reporting context |
| form / frame | Form and XBRL frame |
| accessionNumber | Source filing |

### Who is it for?

- **Quant and fundamental analysts** building financial-statement datasets
- **Compliance and audit teams** tracking filings by company, form type, and date
- **M\&A and due-diligence teams** pulling complete filing histories for target companies
- **Corporate governance researchers** analyzing insider trades, proxy statements, and 13F holdings
- **AI and RAG builders** ingesting regulatory filings for retrieval pipelines
- **Investment platforms** powering earnings calendars and filing alerts

### Pricing

**$1.80 per 1,000 results.** No subscription.

| Results | Cost |
|---|---|
| 100 | $0.18 |
| 1,000 | $1.80 |
| 10,000 | $18.00 |

### How to use it

1. Pick a **Mode**.
2. Enter **Tickers** and/or **CIKs** (filings and facts modes), or a **Search Query** (search mode).
3. Optionally filter by **Form Types** and **Date Range**.
4. Set **Max Items** (default 200).
5. Click **Start**.

### Output example

```json
{
  "recordType": "filing",
  "cik": "0000320193",
  "ticker": "AAPL",
  "companyName": "Apple Inc.",
  "formType": "10-K",
  "filingDate": "2024-11-01",
  "reportDate": "2024-09-28",
  "acceptanceDateTime": "2024-11-01T06:01:36.000Z",
  "accessionNumber": "0000320193-24-000123",
  "primaryDocument": "aapl-20240928.htm",
  "isXBRL": true,
  "isInlineXBRL": true,
  "isAmendment": false,
  "sizeBytes": 15823456,
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/0000320193-24-000123-index.htm",
  "primaryDocumentUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/aapl-20240928.htm",
  "scrapedAt": "2026-09-23T12:00:00.000Z"
}
```

### Technical details

- **Official SEC public APIs, no API key.** Uses `data.sec.gov/submissions/CIK{cik}.json`, `data.sec.gov/api/xbrl/companyfacts/CIK{cik}.json`, `efts.sec.gov/LATEST/search-index`, and `sec.gov/files/company_tickers.json`.
- **Descriptive User-Agent** — the SEC requires a User-Agent identifying the requester. The default includes contact info; replace it before publishing.
- **Rate-limited to 150 ms between requests** — SEC fair access policy caps at 10 req/sec. The default stays well under.
- **Ticker→CIK resolution** — the actor downloads SEC's canonical ticker map (50,000+ entries) once per run and caches it in memory.
- **No proxy needed.** SEC APIs accept datacenter IPs.
- **No browser.** Pure JSON.

### Known limits

- **SEC rate limit is 10 req/sec.** The actor throttles to ~6.7 req/sec by default. Large runs against many CIKs will take proportional time.
- **Full-text search caps at 10,000 hits.** For very broad queries, split by date range or form type.
- **Submissions API returns ~1,000 recent filings per company.** Older filings are listed as additional files referenced in the response; pagination across them is not yet exposed in the input.
- **Ticker resolution only covers SEC-registered tickers.** OTC, pink-sheet, and foreign-only issuers may need a CIK.
- **XBRL facts are large.** A single large company can produce 50,000+ fact records. Use `maxItems` to cap.

### FAQ

**Do I need an API key?** No. SEC EDGAR APIs are free and unauthenticated. The only requirement is a descriptive User-Agent header.

**Do I need a proxy?** No. SEC APIs accept datacenter IPs.

**What is a CIK?** The Central Index Key — a 10-digit number the SEC assigns to every filer. Find it at `sec.gov/cgi-bin/browse-edgar`.

**What form types are supported?** All of them. The input suggests common ones, but you can pass any SEC form type: 10-K, 10-Q, 8-K, S-1, 4, 13F-HR, DEF 14A, N-PORT, 20-F, 40-F, 6-K, and hundreds more.

**How do I export data?** After a run, go to Storage → Export as JSON, CSV, Excel.

### Support

Open an issue on the Actor's page for bugs or feature requests.

# Actor input Schema

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

What to extract from SEC EDGAR.

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

Stock tickers (e.g. AAPL, MSFT, TSLA). Resolved to CIKs automatically via SEC's ticker map.

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

SEC Central Index Keys (zero-padded or raw digits). Used in filings and facts modes.

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

Filter by form type (10-K, 10-Q, 8-K, S-1, 4, 13F-HR, DEF 14A, etc.). Leave empty for all forms.

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

Earliest filing date (YYYY-MM-DD).

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

Latest filing date (YYYY-MM-DD).

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

Full-text search query. Used only in search mode.

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

Include /A (amendment) filings. Off by default to avoid duplicates.

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

Hard cap on records per run.

## `requestDelayMs` (type: `integer`):

Delay between SEC requests. SEC fair access limit is 10 req/sec — default 150 ms stays well under.

## Actor input object example

```json
{
  "mode": "filings",
  "tickers": [
    "AAPL",
    "MSFT"
  ],
  "ciks": [],
  "forms": [
    "10-K",
    "10-Q"
  ],
  "dateFrom": "",
  "dateTo": "",
  "searchQuery": "",
  "includeAmendments": false,
  "maxItems": 200,
  "requestDelayMs": 150
}
```

# Actor output Schema

## `results` (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 = {
    "tickers": [
        "AAPL",
        "MSFT"
    ],
    "ciks": [],
    "forms": [
        "10-K",
        "10-Q"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aurenic/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",
    ],
    "ciks": [],
    "forms": [
        "10-K",
        "10-Q",
    ],
}

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

```

## MCP server setup

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