# sec-edgar-filings (`smartmoney-data/sec-edgar-filings`) Actor

Get SEC EDGAR filings by ticker or CIK from official SEC APIs: 10-K, 10-Q, 8-K and more, with document links, key XBRL financials and optional Risk Factors and MD\&A text.

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

## Pricing

from $4.00 / 1,000 filing fetched (incl. full-text search hit)s

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: 10-K, 10-Q, 8-K, XBRL & Sections

Get **public U.S. SEC EDGAR filings** for any list of companies by ticker or CIK. Filter by form type and filing date and get one clean row per filing with direct document links, 8-K item codes, key XBRL financials (revenue, net income, diluted EPS, total assets) and, optionally, the text of Item 1A (Risk Factors), Item 7 (MD\&A) and Item 8 from 10-K/10-Q filings.

It uses only the SEC's **official** endpoints (`data.sec.gov` submissions and XBRL company facts, the EDGAR Archives, and EDGAR full-text search). No browser, no proxies, no scraping of third-party sites.

Built for investors, analysts, researchers, compliance teams and fintech data pipelines.

### What it does

| Mode | Use it for | Output |
|------|------------|--------|
| **filings** (default) | Filing lists and monitoring for a set of companies | One row per filing: company, form, dates, accession number, document/index/full-text URLs, 8-K item codes, key XBRL financials, optional section text |
| **financialsTimeSeries** | Financial history for charts and models | One row per reported XBRL value over time: revenue, net income, diluted EPS and total assets |
| Full-text search (optional, in filings mode) | Finding filings that mention a phrase | One row per EDGAR full-text search hit |

- Accepts **tickers** (`AAPL`, `BRK-B`) and **CIK numbers** (with or without leading zeros), mixed in one list.
- **Form filters** match amendments too: asking for `10-K` also returns `10-K/A`.
- When you ask for several form types, results are **balanced across them**, so frequent forms like 8-K or Form 4 don't crowd out 10-Ks and 10-Qs.
- Stays within the **SEC fair-access policy**: at most 8 requests per second (the SEC allows 10), automatic retries on `429`/`503`, and a declared User-Agent with **your** contact email.

### Input examples

**Latest annual, quarterly and current reports for five companies**

```json
{
  "tickersOrCiks": ["AAPL", "MSFT", "GOOGL", "AMZN", "META"],
  "formTypes": ["10-K", "10-Q", "8-K"],
  "maxFilings": 25,
  "maxFilingsPerCompany": 5,
  "userAgentContact": "you@yourcompany.com"
}
```

**10-Ks since 2024 with Risk Factors and MD\&A text**

```json
{
  "tickersOrCiks": ["NVDA", "0000789019"],
  "formTypes": ["10-K"],
  "dateFrom": "2024-01-01",
  "extractSections": true,
  "sectionMaxChars": 20000,
  "userAgentContact": "you@yourcompany.com"
}
```

**Financial history (XBRL facts)**

```json
{
  "mode": "financialsTimeSeries",
  "tickersOrCiks": ["AAPL", "MSFT"],
  "maxFilingsPerCompany": 40,
  "userAgentContact": "you@yourcompany.com"
}
```

**Full-text search**

```json
{
  "fullTextQuery": "\"supply chain disruption\"",
  "formTypes": ["8-K"],
  "dateFrom": "2026-01-01",
  "maxFilings": 50,
  "userAgentContact": "you@yourcompany.com"
}
```

#### Input fields

| Field | Default | Notes |
|-------|---------|-------|
| **`userAgentContact`** | **required** | A real email address (or URL) where the SEC can reach you. It's sent in the User-Agent header, as the SEC requires. See "SEC fair access" below |
| `tickersOrCiks` | — | Tickers and/or CIKs. Needed unless you use `fullTextQuery` |
| `formTypes` | all forms | e.g. `10-K`, `10-Q`, `8-K`, `4`, `13F-HR`, `S-1`, `DEF 14A` |
| `dateFrom` / `dateTo` | — | Filing-date range, `YYYY-MM-DD`, inclusive |
| `maxFilings` | `25` | Maximum rows for the whole run in filings mode |
| `maxFilingsPerCompany` | same as `maxFilings` | Per-company cap. In `financialsTimeSeries` mode this is the number of fact rows per company |
| `mode` | `filings` | `filings` or `financialsTimeSeries` |
| `includeXbrlFinancials` | `true` | Attach key XBRL values to each filing row |
| `extractSections` | `false` | Download each 10-K/10-Q document and extract Item 1A, Item 7 and Item 8 text (slower) |
| `sectionMaxChars` | `20000` | Truncate each extracted section to this length |
| `fullTextQuery` | — | EDGAR full-text search phrase (up to 100 hits per run) |
| `maxRequestsPerSecond` | `8` | Request rate toward SEC servers, capped at 8 |

### Output

**Filing row** (filings mode, shortened):

```json
{
  "record_type": "filing",
  "company_name": "Apple Inc.",
  "cik": "0000320193",
  "ticker": "AAPL",
  "sic_description": "Electronic Computers",
  "form": "10-K",
  "filed_date": "2025-10-31",
  "period_end": "2025-09-27",
  "accession_number": "0000320193-25-000079",
  "document_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/aapl-20250927.htm",
  "index_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/0000320193-25-000079-index.html",
  "filing_txt_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/0000320193-25-000079.txt",
  "item_codes": null,
  "financials": {
    "revenue": 416161000000,
    "revenue_tag": "RevenueFromContractWithCustomerExcludingAssessedTax",
    "net_income": 112010000000,
    "eps_diluted": 7.46,
    "assets": 359241000000
  },
  "sections": null,
  "error": null
}
```

| Field | Description |
|-------|-------------|
| `company_name`, `cik`, `ticker`, `sic`, `sic_description`, `exchanges` | Issuer details |
| `form`, `filed_date`, `period_end`, `acceptance_datetime` | Form type and dates |
| `accession_number`, `file_number`, `film_number`, `size` | EDGAR identifiers |
| `document_url`, `index_url`, `filing_txt_url`, `index_json_url` | Direct links to SEC Archives |
| `items`, `item_codes` | 8-K item numbers, e.g. `["2.02", "9.01"]` |
| `is_xbrl`, `is_inline_xbrl` | Whether the filing has XBRL data |
| `financials` | `revenue`, `net_income`, `eps_diluted`, `assets`, plus the XBRL tag used (`*_tag`) and the reporting period and source filing (`*_unit_period`) |
| `sections` | `item_1a_risk_factors`, `item_7_mda`, `item_8_financial_statements` (only with `extractSections`) |
| `error` | `null` on success |

About `financials`: for 10-K and 10-Q rows the values are matched to that filing's accession number when the SEC data allows it. For other forms (for example 8-K or Form 4) the row shows the company's most recently reported values. Always check `*_unit_period`: 10-Q values can be year-to-date rather than a single quarter.

**Financial fact row** (`financialsTimeSeries` mode): `metric` (revenue, net\_income, eps\_diluted, assets), `tag`, `value`, `start`, `end`, `fy`, `fp`, `form`, `filed_date`, `accession_number`, `frame`, plus company identifiers. Quarterly filings often report both a three-month and a year-to-date value for the same end date; use `start` and `end` to tell them apart.

**Full-text hit row**: `form`, `accession_number`, `filed_date`, `period_end`, `ciks`, `display_names`, `items`, `file_type`, `file_description`, `score`.

If a ticker can't be resolved or a company fails, you get a row with `record_type: "error"` and a message. Run statistics are saved in the `RUN_STATS` key-value record.

### Pricing

This Actor uses pay-per-event pricing. You pay only for the events below; Apify platform usage is included.

| Event | When it's charged | Price |
|-------|-------------------|-------|
| `filing-fetched` | Each filing row, and each full-text search hit | **$0.004** |
| `xbrl-fact-fetched` | Each fact row in `financialsTimeSeries` mode | **$0.001** |

Error rows are never charged. Section extraction and XBRL financials on filing rows don't cost extra.

**Worked examples**

- The default run (5 companies × 5 filings = 25 filings): 25 × $0.004 = **$0.10**.
- 10-K, 10-Q and 8-K filings for 40 companies, 10 each: 400 × $0.004 = **$1.60**.
- Financial history for 20 companies, 40 facts each: 800 × $0.001 = **$0.80**.

You can cap your spend with the maximum-cost-per-run setting in Apify Console.

### SEC fair access

The SEC provides EDGAR data free of charge and asks automated tools to follow its [fair-access rules](https://www.sec.gov/os/accessing-edgar-data):

- **Declare who you are.** Every request must carry a User-Agent with a contact. This Actor builds it from your `userAgentContact`, so please enter **your own real email address**. The prefilled `example.com` address is only a placeholder; replace it before real use. If the contact still looks like a placeholder (for example an `example.com` address), the run logs a warning at start. The SEC may block traffic that doesn't identify a reachable contact.
- **Stay under 10 requests per second.** The Actor is capped at 8 and backs off on `429`/`503` responses.
- The Actor has no hardcoded contact details and doesn't share your contact with anyone except the SEC, in the request header.

### Data source and licensing

- Data comes directly from the U.S. Securities and Exchange Commission's public EDGAR system (`www.sec.gov`, `data.sec.gov`, `efts.sec.gov`). Filings are public records.
- The Actor is **not affiliated with or endorsed by the SEC**.
- Output is provided as-is for research and information. It is **not investment advice**. Verify important numbers against the original filing (every row links to it).

### Limitations

- **History depth:** the Actor reads the SEC's "recent filings" list for each company, which covers at least the last year or the last 1,000 filings, whichever is more. Very old filings of very active filers (for example, decades of Form 4s) may not be included.
- **Section extraction is best-effort.** Filings are formatted differently; a section can come back empty (`null`) or include some neighbouring text. Only 10-K and 10-Q documents are parsed.
- **XBRL values** are taken from the SEC's company-facts data using common US-GAAP tags. Companies using unusual tags, IFRS, or no XBRL may have missing values.
- **Full-text search** depends on the SEC's `efts.sec.gov` service and returns up to 100 hits per run.
- Rows are capped by `maxFilings` / `maxFilingsPerCompany`, so large requests stop at the cap.

### Privacy

The Actor collects public company filings. Some filings (for example, Form 3/4/5 insider reports) name individuals because the law requires it; the Actor returns that data as published by the SEC and adds nothing to it. Use it in line with the privacy laws that apply to you.

### FAQ

**Why do I need to enter an email?** The SEC requires every automated client to identify itself with a contact. Your email only goes to the SEC in the request header.

**Can I use CIK numbers instead of tickers?** Yes, with or without leading zeros. You can mix both.

**Does `10-K` include amendments?** Yes. `10-K/A` is returned when you ask for `10-K`.

**How fast is it?** In our tests, about 90 filings for 12 companies (without section extraction) took around 4 seconds of processing time. Section extraction downloads each document, so it's much slower.

**Is there an API?** Yes. Like every Apify Actor, you can run it through the Apify API, schedule it, or connect it to Make, Zapier or webhooks.

# Actor input Schema

## `tickersOrCiks` (type: `array`):

Company ticker symbols (e.g. AAPL, BRK-B) and/or SEC CIK numbers (with or without leading zeros). Required unless you use full-text search.

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

SEC form types to include (e.g. 10-K, 10-Q, 8-K, 4, 13F-HR, S-1, DEF 14A). Amendments match their root (requesting 10-K also returns 10-K/A). Leave empty for all forms.

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

Inclusive lower bound on filing date.

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

Inclusive upper bound on filing date.

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

Maximum number of rows for the whole run in filings mode (full-text hits included). In financialsTimeSeries mode, this is used as the per-company fact limit when 'Max filings per company' is empty.

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

Maximum filings per ticker/CIK, so one company doesn't use up the whole run limit. In financialsTimeSeries mode: number of fact rows per company. Defaults to Max filings.

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

filings = one row per SEC filing (default). financialsTimeSeries = key XBRL metrics over time from companyfacts (revenue, net income, EPS, assets).

## `includeXbrlFinancials` (type: `boolean`):

Attach revenue, net income, diluted EPS and total assets from the SEC's XBRL company facts (matched to the filing's accession number when possible). Not charged extra.

## `extractSections` (type: `boolean`):

Download the primary 10-K/10-Q document and extract Item 1A (Risk Factors), Item 7 (MD\&A) and Item 8 text (best effort). Slower, but not charged extra. Default off.

## `sectionMaxChars` (type: `integer`):

Truncate extracted section text to this many characters.

## `fullTextQuery` (type: `string`):

Optional EDGAR full-text search phrase (efts.sec.gov), e.g. "supply chain disruption". Returns up to 100 matching filings as fulltext\_hit rows. Can be combined with tickers.

## `userAgentContact` (type: `string`):

The SEC requires every automated tool to identify itself with a real contact. Enter your own email address (e.g. you@yourcompany.com) or a URL where you can be reached. It is sent only to the SEC, in the User-Agent header of each request. The prefilled example.com address is a placeholder: replace it with your real email before real use, or the SEC may block the requests.

## `maxRequestsPerSecond` (type: `number`):

Request rate toward SEC servers. Capped at 8 per second (the SEC's fair-access limit is 10). Default 8.

## Actor input object example

```json
{
  "tickersOrCiks": [
    "AAPL",
    "MSFT",
    "GOOGL",
    "AMZN",
    "META"
  ],
  "formTypes": [
    "10-K",
    "10-Q",
    "8-K"
  ],
  "maxFilings": 25,
  "maxFilingsPerCompany": 5,
  "mode": "filings",
  "includeXbrlFinancials": true,
  "extractSections": false,
  "sectionMaxChars": 20000,
  "userAgentContact": "your-bot@example.com",
  "maxRequestsPerSecond": 8
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of company, ticker, form, filed date, accession, and document URL.

# 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 = {
    "tickersOrCiks": [
        "AAPL",
        "MSFT",
        "GOOGL",
        "AMZN",
        "META"
    ],
    "formTypes": [
        "10-K",
        "10-Q",
        "8-K"
    ],
    "maxFilingsPerCompany": 5,
    "userAgentContact": "your-bot@example.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("smartmoney-data/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 = {
    "tickersOrCiks": [
        "AAPL",
        "MSFT",
        "GOOGL",
        "AMZN",
        "META",
    ],
    "formTypes": [
        "10-K",
        "10-Q",
        "8-K",
    ],
    "maxFilingsPerCompany": 5,
    "userAgentContact": "your-bot@example.com",
}

# Run the Actor and wait for it to finish
run = client.actor("smartmoney-data/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 '{
  "tickersOrCiks": [
    "AAPL",
    "MSFT",
    "GOOGL",
    "AMZN",
    "META"
  ],
  "formTypes": [
    "10-K",
    "10-Q",
    "8-K"
  ],
  "maxFilingsPerCompany": 5,
  "userAgentContact": "your-bot@example.com"
}' |
apify call smartmoney-data/sec-edgar-filings --silent --output-dataset

```

## MCP server setup

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