# SEC Filings Extractor — 10-K/10-Q Financials & AI (EDGAR) (`noniner/sec-filings-extractor`) Actor

Pull a public company's SEC filings and key financials from EDGAR, then get an AI summary of its business, risk factors, MD\&A highlights and year-over-year changes. Free official data, pay per company.

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

## Pricing

$200.00 / 1,000 company analyzeds

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 Filings Extractor — 10-K/10-Q Financials & AI (EDGAR)

**Turn a ticker into a research brief.** Give this Actor a list of tickers, company names or CIK numbers and it pulls each company's **SEC EDGAR filings** (10-K, 10-Q, 8-K…) and **key financials** straight from the official, free SEC APIs — then uses OpenAI to **summarize the business, its risk factors, MD\&A highlights and year-over-year changes**. The numbers come from the government; the narrative comes from AI; you get both in one record.

You bring the tickers. It hands back a fundamentals-ready company brief.

![Input a list of tickers, get SEC filings, XBRL financials and an AI business brief per company](https://datatools-hub.vercel.app/actor-shots/sec-filings-extractor.png)

***

### Quick start

1. **Add your companies** — tickers, company names or CIK numbers in the `companies` field (e.g. `AAPL`, `MSFT`, `320193`).
2. **Pick form types** (optional) — `10-K`, `10-Q`, `8-K`… and optionally a `question` to focus the AI summary.
3. **Click Start** — results stream into the dataset, one record per company. Export to **JSON, CSV or Excel**, or pull them via the API.

***

### The flow

```
1. Give tickers / names / CIK      2. SEC EDGAR does the work          3. Get a research brief
   ["AAPL", "MSFT", "320193"]  →      filings index + XBRL        →     filings · financials
                                       financial facts                   · AI business summary
```

1. **Resolve** — each ticker / name / CIK is matched to its SEC **CIK** via the official company ticker map (fetched once, cached).
2. **Filings** — read `submissions` for the company, filter to the form types you asked for (10-K / 10-Q / 8-K…), and capture the latest N with form, filing date and a direct link to the primary document.
3. **Financials** — pull **US-GAAP XBRL company facts**: revenue, net income, operating income, total assets, total liabilities, stockholders' equity, cash, diluted EPS — each with the **latest annual value, the prior year, and the YoY change**.
4. **AI layer** — OpenAI (`gpt-4o-mini`) reads the financials, the filing list and a trimmed slice of the latest 10-K/10-Q and writes a grounded **business summary, key risks, MD\&A highlights and notable changes** — plus an answer to your optional focus question. It never invents numbers.

***

### What you get per company

1. **`company`, `ticker`, `cik`** — the resolved identity (10-digit zero-padded CIK).
2. **`filings`** — the latest matching filings: `form`, `filingDate`, and a direct `url` to the primary document on `sec.gov`.
3. **`financials`** — eight key metrics, each as `{ latest, prior, yoyChange, unit, fy }`:
   `revenue`, `netIncome`, `operatingIncome`, `assets`, `liabilities`, `equity`, `cash`, `epsDiluted`. Missing facts come back `null` (never fabricated).
4. **`aiSummary`** — `businessSummary` (2–3 sentences), `keyRisks[]` (from the risk-factors section), `mdaHighlights[]` (management discussion), `notableChanges[]` (YoY / recent 8-K-driven), and `answerToQuestion` when you set a `question`.

Everything is grounded strictly in the extracted SEC data. If a fact isn't there, it's `null` or an empty array — nothing is made up.

***

### Three ways people use it

- **Investment research** — go from a watchlist of tickers to a one-glance fundamentals view: revenue and net-income trends, YoY growth, and an AI read on the business and its stated risks. The official **SEC EDGAR API** as structured **financial data**, no manual filing-digging.
- **Competitive & financial due diligence** — profile a target or a competitor's public financials and **10-K**/**10-Q** disclosures, with **XBRL** numbers and the risk factors surfaced for you. A fast **10-K scraper** that also explains what it found.
- **Fundamental analysis & screening** — batch a sector's tickers, compare revenue/EPS/margin trends, and feed the structured output into a model or dashboard. Built for **investor research** at scale on free public data.

***

### Input

| Field | Type | Notes |
|---|---|---|
| `companies` | array | **Required.** Tickers (`AAPL`), company names, or CIK numbers. One per line. |
| `filingTypes` | array | Form types to include. Default `["10-K","10-Q","8-K"]`. |
| `maxFilingsPerCompany` | integer | Latest N matching filings per company. Default `5`. |
| `includeFinancials` | boolean | Pull XBRL financials. Default `true`. |
| `question` | string | Optional. Focuses the AI summary, e.g. "margin trends and competitive risks". Answered only from the extracted data. |
| `maxResults` | integer | Cap how many companies to process. Default `50`. |
| `maxConcurrency` | integer | Companies in parallel. Default `3` — SEC rate-limits aggressive clients. |
| `model` | string | Override the OpenAI model. Default `gpt-4o-mini`. |

#### Minimal input example

```json
{
  "companies": ["AAPL", "MSFT"],
  "maxFilingsPerCompany": 3
}
```

***

### Output example

```json
{
  "company": "Apple Inc.",
  "ticker": "AAPL",
  "cik": "0000320193",
  "filings": [
    {
      "form": "10-K",
      "filingDate": "2024-11-01",
      "url": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/aapl-20240928.htm"
    }
  ],
  "financials": {
    "revenue":        { "latest": 391035000000, "prior": 383285000000, "yoyChange": 0.0202, "unit": "USD", "fy": 2024 },
    "netIncome":      { "latest": 93736000000,  "prior": 96995000000,  "yoyChange": -0.0336, "unit": "USD", "fy": 2024 },
    "operatingIncome":{ "latest": 123216000000, "prior": 114301000000, "yoyChange": 0.078,  "unit": "USD", "fy": 2024 },
    "assets":         { "latest": 364980000000, "prior": 352583000000, "yoyChange": 0.0352, "unit": "USD", "fy": 2024 },
    "epsDiluted":     { "latest": 6.08, "prior": 6.13, "yoyChange": -0.0082, "unit": "USD/shares", "fy": 2024 }
  },
  "aiSummary": {
    "businessSummary": "Apple designs, manufactures and markets smartphones, personal computers, tablets, wearables and accessories, and sells a range of related services. iPhone remains its largest product category, complemented by a growing high-margin Services segment.",
    "keyRisks": [
      "Dependence on the iPhone and on a concentrated set of contract manufacturers and component suppliers.",
      "Exposure to intense competition and rapid technological change across all product categories.",
      "Global macroeconomic, foreign-exchange and regulatory/antitrust risks across major markets."
    ],
    "mdaHighlights": [
      "Services revenue reached a new high and continued to outgrow products.",
      "Gross margin expanded on favorable product mix despite flat unit growth."
    ],
    "notableChanges": [
      "Net income declined year over year, driven in part by a one-time income-tax charge."
    ],
    "answerToQuestion": null
  },
  "success": true
}
```

A company that can't be resolved, or has no XBRL facts, comes back with `success: false` and an `error` (filings/financials null) so your pipeline can skip it cleanly.

***

### Pay-per-event pricing

| Event | Price | Charged when |
|---|---|---|
| `company-analyzed` | **$0.20** | Once per company whose SEC filings and key financials were extracted and summarized with AI. |

The SEC data itself is **free, official public data**. The price covers the OpenAI token cost (typically well under a cent per company on `gpt-4o-mini`); the Actor logs its exact token usage and estimated per-company cost at the end of every run.

***

### Data source

All filings and financials come from the **official SEC EDGAR system** (`sec.gov` and `data.sec.gov`) — free public data published by US registrants. SEC's fair-access policy requires every request to carry a descriptive `User-Agent` with a contact (or it returns `403`), and asks clients to stay under ~10 requests/second; this Actor sends a proper User-Agent, keeps concurrency low and spaces requests out. No login, API key or paid feed is needed for the SEC side.

***

### Setup

The AI summary calls the OpenAI API. Set the environment variable / secret **`OPENAI_API_KEY`** on the Actor. The filings and financials are extracted regardless; without the key the run fails before the AI step, so the key is required.

***

### Use it from an AI agent (Apify MCP server)

This Actor is available through the [Apify MCP server](https://mcp.apify.com), so AI agents (Claude, ChatGPT, or anything that speaks MCP) can call it as a tool — hand it a list of tickers and read back structured filings, financials and an AI summary — with no custom integration code.

***

### Run it locally

```bash
npm install
## put your input in storage/key_value_stores/default/INPUT.json
export OPENAI_API_KEY=sk-...
apify run -p
```

***

### Related actors

- [Equity Analyst](https://apify.com/fuze/equity-analyst) — Deeper AI equity analysis and valuation context for public companies.
- [AI Company Enrichment](https://apify.com/fuze/ai-company-enrichment) — Turn domains into firmographic company profiles with contacts and ICP fit.
- [Google News Scraper](https://apify.com/fuze/google-news-scraper) — Pull the latest news coverage for any company or topic.
- [B2B Account Brief](https://apify.com/fuze/b2b-account-brief) — Build a sales-ready account brief for any target company.

# Actor input Schema

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

Tickers (e.g. AAPL), company names, or 10-digit CIK numbers. One per line.

## `filingTypes` (type: `array`):

Which SEC form types to include (e.g. 10-K, 10-Q, 8-K).

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

Latest N matching filings to capture per company.

## `includeFinancials` (type: `boolean`):

Pull key US-GAAP financials (revenue, net income, assets, etc.) from SEC XBRL company facts.

## `question` (type: `string`):

Focuses the AI summary, e.g. "margin trends and competitive risks". Answered only from the extracted data.

## `maxResults` (type: `integer`):

Max companies to process. One pay-per-event charge per company analyzed.

## `maxConcurrency` (type: `integer`):

Companies processed in parallel. Keep low — SEC EDGAR rate-limits aggressive clients.

## `model` (type: `string`):

Override the model (default gpt-4o-mini).

## Actor input object example

```json
{
  "companies": [
    "AAPL",
    "MSFT"
  ],
  "filingTypes": [
    "10-K",
    "10-Q",
    "8-K"
  ],
  "maxFilingsPerCompany": 5,
  "includeFinancials": true,
  "maxResults": 50,
  "maxConcurrency": 3
}
```

# Actor output Schema

## `companies` (type: `string`):

All analyzed companies in the default dataset.

# 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 = {
    "companies": [
        "AAPL",
        "MSFT"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("noniner/sec-filings-extractor").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 = { "companies": [
        "AAPL",
        "MSFT",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("noniner/sec-filings-extractor").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 '{
  "companies": [
    "AAPL",
    "MSFT"
  ]
}' |
apify call noniner/sec-filings-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,noniner/sec-filings-extractor"
        }
    }
}
```

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/x6ldGYszuCnlJnQ0x/builds/lvV9g4N4G4APxX8VK/openapi.json
