# SEC EDGAR Extractor — Financials, Insider Trades & Filings (`fiqryq/sec-edgar-extractor`) Actor

Extract normalized financial statements, Form 4 insider trades, filing history and full-text search results from SEC EDGAR.

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

## Pricing

from $2.00 / 1,000 insider transactions

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/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 Extractor — Financials, Insider Trades & Filings

### What does SEC EDGAR Extractor do?

**SEC EDGAR Extractor turns the SEC's [EDGAR](https://www.sec.gov/edgar) database into clean, analysis-ready tables.** EDGAR holds every filing from every US public company, but getting usable numbers out of it means dealing with XBRL taxonomies, ten-digit CIK codes, inconsistent tagging between filers, and raw ownership XML. This Actor does that work and hands back flat rows you can open in a spreadsheet.

It runs in four modes:

- **Financials** — normalized income statement, balance sheet and cash flow figures for every reporting period, with fiscal years labelled correctly even for companies whose year does not end in December.
- **Insiders** — Form 4 executive and director trades, with the SEC's transaction codes decoded and genuine open-market buys and sells separated from vesting and tax withholding.
- **Filings** — recent filing history filtered by form type and date, with direct links to every document. Covers each company's most recent 1,000 filings.
- **Search** — EDGAR full-text search across every filing since 2001.

Because it runs on Apify you also get scheduling, an API, monitoring, and integrations with Google Sheets, Slack, Zapier, Make and n8n.

### Why use SEC EDGAR Extractor?

- **Fundamental analysis** — pull ten years of revenue, margins, cash flow and balance sheet data for a whole watchlist in one run.
- **Insider-trading signals** — track when executives actually buy or sell with their own money, filtered away from routine share grants.
- **Compliance and risk monitoring** — full-text search for phrases like "material weakness", "going concern" or "restatement" across recent filings.
- **Investor tools and dashboards** — a dependable structured feed of US public company fundamentals.
- **Academic and market research** — reproducible datasets straight from the primary source.

### How to use SEC EDGAR Extractor

1. Click **Try for free** at the top of this page.
2. Set **Your contact details** to something like `Your Company you@email.com`. **The SEC requires this** and rejects requests without it.
3. Pick a **mode**.
4. Enter **Companies** as tickers, CIK numbers or names — `AAPL`, `MSFT`, `0000320193` all work. Search mode uses a query instead.
5. Set **Maximum rows**, then click **Start**.
6. Download the results as JSON, CSV or Excel, or pull them through the Apify API.

### Input

| Field | Type | Description |
|---|---|---|
| `mode` | select | `financials`, `insiders`, `filings` or `search`. |
| `companies` | array | Tickers, CIKs or company names. Required except in Search mode. |
| `searchQuery` | string | Search mode only. Quote a phrase for an exact match. |
| `formTypes` | array | Restrict Filings/Search to forms such as `10-K`, `8-K`, `13F-HR`. |
| `periodType` | select | Financials mode: `annual` or `quarterly`. |
| `openMarketOnly` | boolean | Insiders mode: keep only real purchases and sales. |
| `since` / `until` | string | `YYYY-MM-DD` date bounds. |
| `maxItems` | integer | Total rows for the run. `0` means unlimited. |
| `userAgent` | string | **Required by the SEC.** Your name and email. |

```json
{
  "mode": "financials",
  "companies": ["AAPL", "MSFT", "NVDA"],
  "periodType": "annual",
  "since": "2019-01-01",
  "maxItems": 100,
  "userAgent": "Your Company you@email.com"
}
```

### Output

One row per period, per trade or per filing depending on mode. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Financials:

```json
{
  "cik": "0000320193",
  "ticker": "AAPL",
  "companyName": "Apple Inc.",
  "periodType": "annual",
  "reportingCurrency": "USD",
  "periodEnd": "2025-09-27",
  "fiscalYear": 2025,
  "fiscalPeriod": "FY",
  "revenue": 416161000000,
  "grossProfit": 195201000000,
  "operatingIncome": 133050000000,
  "netIncome": 112010000000,
  "epsDiluted": 7.46,
  "assets": 359241000000,
  "equity": 73733000000,
  "operatingCashFlow": 111482000000,
  "capitalExpenditure": 12715000000,
  "freeCashFlow": 98767000000,
  "netMargin": 0.269151,
  "sourceForm": "10-K",
  "sourceFiled": "2025-10-31"
}
```

Insiders:

```json
{
  "issuerTicker": "NVDA",
  "insiderName": "Robertson Donald F Jr",
  "officerTitle": "Principal Accounting Officer",
  "transactionDate": "2026-03-20",
  "transactionCode": "S",
  "transactionMeaning": "Open market or private sale",
  "isOpenMarketTrade": true,
  "shares": 2100,
  "pricePerShare": 175.7948,
  "transactionValue": 369169.08,
  "sharesOwnedAfter": 337720
}
```

### Data fields

#### Financials

| Field | Description |
|---|---|
| `periodEnd`, `periodStart`, `periodType` | Period covered |
| `reportingCurrency` | Currency the figures are reported in — always read the numbers against this |
| `fiscalYear`, `fiscalPeriod` | Fiscal labels derived from the period and the company's own year end |
| `revenue`, `costOfRevenue`, `grossProfit` | Top of the income statement |
| `operatingIncome`, `netIncome`, `netMargin` | Profitability |
| `researchAndDevelopment`, `sellingGeneralAdministrative` | Operating expenses |
| `epsBasic`, `epsDiluted` | Per-share earnings |
| `assets`, `liabilities`, `equity`, `cash`, `inventory`, `longTermDebt` | Balance sheet |
| `operatingCashFlow`, `investingCashFlow`, `financingCashFlow` | Cash flow |
| `capitalExpenditure`, `freeCashFlow`, `dividendsPaid` | Capital returns |
| `sourceForm`, `sourceFiled`, `sourceAccession` | The filing each figure came from |

#### Insiders

| Field | Description |
|---|---|
| `insiderName`, `officerTitle`, `isDirector`, `isOfficer`, `isTenPercentOwner` | Who traded |
| `transactionCode`, `transactionMeaning` | SEC code and its plain-English meaning |
| `isOpenMarketTrade` | `true` only for codes P and S — a real buy or sell |
| `shares`, `pricePerShare`, `transactionValue`, `sharesOwnedAfter` | The trade |
| `securityType`, `securityTitle` | Non-derivative or derivative, and the instrument |

### How much does it cost?

Billed **per event**, so each mode costs what it is actually worth rather than one flat rate per row. Current prices are shown at the top of this page.

| You are charged for | When |
|---|---|
| A financial period | Each period returned in Financials mode, carrying about 30 metrics |
| An insider trade | Each Form 4 transaction returned |
| A filing record | Each filing returned in Filings mode |
| A search result | Each hit returned in Search mode |

Rows are always stored before they are charged, so a run that fails partway never bills you for data you did not receive.

Every mode reads JSON or XML endpoints directly, with no browser, so runs are fast and cheap. Financials costs two requests per company no matter how many years you pull. Insiders costs one request per Form 4, so it scales with the number of trades. The Actor stays under the SEC's published rate ceiling by design.

Two ways to control spend: set **Maximum rows** (a total for the run, not per company), or set a maximum cost for the run in the Console — the Actor stops cleanly when that limit is reached rather than running up a bill.

### Tips

- **Use `openMarketOnly` for insider signals.** Most Form 4 rows are grants, vesting and tax withholding. Codes P and S are where the actual conviction is.
- **Annual versus quarterly.** Quarterly mode filters out year-to-date stubs so each row is a genuine single quarter rather than a running total.
- **Restatements are handled.** When a period has been reported more than once, the most recently filed figure is used, and `sourceFiled` tells you which filing that was.
- **Search needs both date bounds to work.** The Actor fills in the missing one automatically, so setting just one is safe.
- **Search is capped at 10,000 results** by EDGAR itself. Narrow by form type or date range to get beneath that ceiling.

### FAQ and legal

**Do I need an SEC account or API key?**
No. EDGAR is open. The SEC only asks that automated clients identify themselves, which is what the `userAgent` field is for.

**Is this legal?**
Yes. EDGAR filings are works of the US federal government and are **public domain** — 17 U.S.C. §105 places them outside copyright, and the SEC publishes them expressly so they can be reused, including commercially. Unlike most commercial data sources, there is no licence restricting redistribution. The only obligations are operational: identify yourself in the User-Agent and stay under ten requests per second. Both are enforced by this Actor automatically.

**Why is a figure missing for some years?**
Filers change XBRL tags over time and some do not report every line item. The Actor tries several standard tags per metric and merges them across the history, but a genuinely unreported figure comes back as `null` rather than being estimated.

**Why does the fiscal year differ from the calendar year?**
Many companies do not end their year in December — Apple's FY2025 ended in September 2025 and NVIDIA's FY2026 ended in January 2026. Fiscal labels are derived from each company's own year end so they match the company's own reporting.

**Why is there no Q4 in quarterly mode?**
US companies do not file a 10-Q for their fourth quarter — it is covered by the annual 10-K instead — so EDGAR contains no standalone Q4 figure to report. Derive it by subtracting Q1–Q3 from the annual row, which you can pull in the same run using `periodType: annual`.

**Does it cover foreign or private companies?**
Only companies that file with the SEC, and only those reporting under **US GAAP**. Many foreign private issuers — Sony and Toyota among them — report under the IFRS taxonomy instead, and Financials mode returns no rows for them. Filings, Insiders and Search modes work for any SEC filer regardless of accounting standard. Private companies are not covered at all.

**What currency are the figures in?**
Whatever the company reports in. Every row carries `reportingCurrency`, so always read the figures against that field rather than assuming US dollars — a filer reporting in JPY or CNY produces numbers that are not comparable to a USD filer without conversion.

**How far back does filing history go?**
Filings and Insiders modes read each company's most recent 1,000 filings, which for an active large-cap company is roughly the last five to ten years. Older filings live in separate EDGAR index files that this Actor does not currently read. Financials mode is unaffected and returns the full XBRL history, which generally starts around 2009.

### Support

Found a bug or need another metric or form type? Open a ticket on the **Issues** tab and it will be picked up.

# Actor input Schema

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

Financials returns normalized income statement, balance sheet and cash flow figures per period. Insiders returns Form 4 executive trades. Filings returns filing history with document links. Search runs EDGAR full-text search across every filing.

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

Tickers, CIK numbers or company names, for example AAPL, MSFT, 0000320193. Required for every mode except Search.

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

Only used in Search mode. Wrap a phrase in double quotes for an exact match, e.g. "material weakness".

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

Restrict Filings or Search mode to specific forms, for example 10-K, 10-Q, 8-K, S-1, 13F-HR, DEF 14A. Leave empty for all forms.

## `periodType` (type: `string`):

Financials mode only. Annual uses figures covering a full year; quarterly uses single-quarter figures with year-to-date stubs filtered out.

## `openMarketOnly` (type: `boolean`):

Insiders mode only. Keeps just purchases and sales (codes P and S), filtering out option exercises, vesting and tax withholding. This is usually the signal you want.

## `since` (type: `string`):

Only include periods or filings on or after this date, in YYYY-MM-DD format.

## `until` (type: `string`):

Search mode only. Only include filings on or before this date, in YYYY-MM-DD format.

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

Stop after this many rows in total across the whole run, not per company. Companies are processed in the order listed, so raise this when requesting several. Set to 0 for no limit. Search mode is capped at 10,000 by EDGAR itself.

## `userAgent` (type: `string`):

The SEC requires automated clients to identify themselves with a real contact address, and returns 403 without one. Use the form "Your Company your@email.com".

## `proxyConfiguration` (type: `object`):

Proxy settings. EDGAR does not require a proxy, so the default is no proxy.

## Actor input object example

```json
{
  "mode": "financials",
  "companies": [
    "AAPL",
    "MSFT"
  ],
  "searchQuery": "\"artificial intelligence\"",
  "formTypes": [
    "10-K",
    "10-Q"
  ],
  "periodType": "annual",
  "openMarketOnly": false,
  "since": "2020-01-01",
  "maxItems": 200,
  "userAgent": "Your Company your@email.com",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "companies": [
        "AAPL",
        "MSFT"
    ],
    "searchQuery": "\"artificial intelligence\"",
    "formTypes": [
        "10-K",
        "10-Q"
    ],
    "since": "2020-01-01",
    "userAgent": "Your Company your@email.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("fiqryq/sec-edgar-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",
    ],
    "searchQuery": "\"artificial intelligence\"",
    "formTypes": [
        "10-K",
        "10-Q",
    ],
    "since": "2020-01-01",
    "userAgent": "Your Company your@email.com",
}

# Run the Actor and wait for it to finish
run = client.actor("fiqryq/sec-edgar-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"
  ],
  "searchQuery": "\\"artificial intelligence\\"",
  "formTypes": [
    "10-K",
    "10-Q"
  ],
  "since": "2020-01-01",
  "userAgent": "Your Company your@email.com"
}' |
apify call fiqryq/sec-edgar-extractor --silent --output-dataset

```

## MCP server setup

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