# SEC EDGAR Filings Scraper – 10-K, 10-Q, 8-K (`sfoln/sec-edgar-filings`) Actor

SEC EDGAR filings by ticker, CIK or company name: form, filing and report dates, 8-K items, accession number and document links, filtered by form and date, or by EDGAR full-text search. Optional XBRL snapshot: revenue, net income, EPS, assets. $2 per 1,000 filings.

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

## Pricing

from $2.00 / 1,000 sec filings

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

Get **SEC EDGAR filings for any company** by ticker, CIK or name: one clean row per filing with the form (10-K, 10-Q, 8-K, S-1, DEF 14A, 13F, Form 4 and every other form), filing and report dates, accession number, 8-K item numbers with their titles, and links to the primary document and the filing index. Filter by form type and date range, or run an **EDGAR full-text search** across all filers. An optional **company snapshot** adds key XBRL financials (revenue, net income, EPS, assets, liabilities, cash, shares outstanding) for the latest annual and quarterly periods. Built for investors, analysts, compliance teams, journalists and AI agents.

- **What you get:** form, filing date, period of report, accession number, 8-K items, document and index URLs, plus a company profile (CIK, tickers, exchange, SIC industry, state of incorporation, fiscal year end, addresses).
- **Price:** $0.002 per filing ($2 per 1,000) and $0.004 per company snapshot; unknown companies, failed lookups and summaries are free.
- **Works everywhere:** API, MCP for AI agents, Make, Zapier, n8n, schedules and webhooks.

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `companies` | string\[] | – | Tickers (`AAPL`, `BRK.B`), CIKs (`320193`) or company names (`Apple`), one per line. A ticker wins over a name; use the CIK for an exact match. |
| `searchQuery` | string | – | Optional EDGAR full-text search (filings since 2001; exact phrases in double quotes). With companies it narrows their filings; alone it searches every filer. |
| `forms` | string\[] | all | Form types to keep, e.g. `10-K`, `10-Q`, `8-K`, `S-1`, `DEF 14A`, `4`. Case, spaces, hyphens and a leading "Form" do not matter (`10k` and `Form 10-K` mean `10-K`); a summary warns when an unusual form type matched nothing. |
| `includeAmendments` | boolean | true | Also return amendments (`10-K/A` for `10-K`). |
| `dateFrom` / `dateTo` | string | – | Filing-date window: `YYYY-MM-DD` or a span back from today such as `30 days`, `6 months`, `1 year`. |
| `maxFilingsPerCompany` | integer | 20 | Filings per company, newest first (1–2,000). For a search without companies: filings in total. |
| `includeCompanySnapshot` | boolean | false | Paid add-on: key XBRL financials in each company's summary record. |
| `maxCompanies` | integer | 100 | Safety cap on companies per run; extra inputs are reported as `inputItemsDropped`. |
| `concurrency` | integer | 3 | Companies processed in parallel (1–5). All requests share SEC's rate limit. |
| `includeRaw` | boolean | false | Attach the filing as EDGAR lists it to each row. |

```json
{
  "companies": ["AAPL", "MSFT", "1018724"],
  "forms": ["10-K", "10-Q", "8-K"],
  "dateFrom": "1 year",
  "maxFilingsPerCompany": 20,
  "includeCompanySnapshot": true
}
```

Full-text search example (8-K earnings releases that mention tariffs, last 30 days):

```json
{ "searchQuery": "\"tariff\"", "forms": ["8-K"], "dateFrom": "30 days", "maxFilingsPerCompany": 100 }
```

### Output

Each filing is one row (`recordType: "filing"`, charged); each company (or search) also gets one summary record (`recordType: "summary"`, never charged) with the company profile and, with the add-on, the `companySnapshot`.

```json
[
  {
    "input": "AAPL",
    "recordType": "filing",
    "position": 1,
    "cik": 320193,
    "companyName": "Apple Inc.",
    "ticker": "AAPL",
    "form": "10-K",
    "filingDate": "2025-10-31",
    "reportDate": "2025-09-27",
    "acceptanceDateTime": "2025-10-31T14:01:26.000Z",
    "accessionNumber": "0000320193-25-000079",
    "fileNumber": "001-36743",
    "filmNumber": "251437791",
    "items": [],
    "itemDescriptions": [],
    "size": 9392337,
    "isXBRL": true,
    "isInlineXBRL": true,
    "documentName": "aapl-20250927.htm",
    "documentDescription": "10-K",
    "documentUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/aapl-20250927.htm",
    "filingIndexUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/0000320193-25-000079-index.htm",
    "status": "ok",
    "charged": true,
    "chargedEvent": "filing",
    "source": "sec-edgar",
    "fetchedAt": "2026-10-14T10:00:00.000Z"
  },
  {
    "input": "AAPL",
    "query": "AAPL",
    "cik": 320193,
    "companyName": "Apple Inc.",
    "ticker": "AAPL",
    "tickers": ["AAPL"],
    "exchanges": ["Nasdaq"],
    "matchedBy": "ticker",
    "sic": "3571",
    "sicDescription": "Electronic Computers",
    "entityType": "operating",
    "filerCategory": "Large accelerated filer",
    "stateOfIncorporation": "CA",
    "fiscalYearEnd": "09-26",
    "ein": "942404110",
    "lei": null,
    "phone": "(408) 996-1010",
    "website": null,
    "businessAddress": { "street1": "ONE APPLE PARK WAY", "street2": null, "city": "CUPERTINO", "stateOrCountry": "CA", "zipCode": "95014", "country": null },
    "mailingAddress": { "street1": "ONE APPLE PARK WAY", "street2": null, "city": "CUPERTINO", "stateOrCountry": "CA", "zipCode": "95014", "country": null },
    "formerNames": [{ "name": "APPLE INC", "from": "2007-01-10", "to": "2019-08-05" }],
    "companySnapshot": {
      "cik": 320193,
      "entityName": "Apple Inc.",
      "taxonomy": "us-gaap",
      "sharesOutstanding": 14594180000,
      "sharesOutstandingAsOf": "2026-07-17",
      "publicFloat": 3253431000000,
      "publicFloatAsOf": "2025-03-28",
      "latestAnnual": { "periodType": "annual", "fiscalYear": 2025, "fiscalPeriod": "FY", "periodStart": "2024-09-29", "periodEnd": "2025-09-27", "form": "10-K", "filed": "2025-10-31", "accessionNumber": "0000320193-25-000079", "currency": "USD", "revenue": 416161000000, "grossProfit": 195201000000, "operatingIncome": 133050000000, "netIncome": 112010000000, "epsBasic": 7.49, "epsDiluted": 7.46, "assets": 359241000000, "liabilities": 285508000000, "stockholdersEquity": 73733000000, "cash": 35934000000, "sourceTags": { "revenue": "us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax", "netIncome": "us-gaap:NetIncomeLoss" } },
      "latestQuarter": { "periodType": "quarterly", "fiscalYear": 2026, "fiscalPeriod": "Q3", "periodStart": "2026-03-29", "periodEnd": "2026-06-27", "form": "10-Q", "filed": "2026-07-31", "accessionNumber": "0000320193-26-000020", "currency": "USD", "revenue": 109417000000, "grossProfit": 54770000000, "operatingIncome": 35695000000, "netIncome": 29789000000, "epsBasic": 2.03, "epsDiluted": 2.02, "assets": 383266000000, "liabilities": 275746000000, "stockholdersEquity": 107520000000, "cash": 39544000000, "sourceTags": { "revenue": "us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax", "netIncome": "us-gaap:NetIncomeLoss" } }
    },
    "recordType": "summary",
    "resultsDelivered": 20,
    "stopReason": "limit",
    "status": "ok",
    "charged": false,
    "source": "sec-edgar",
    "fetchedAt": "2026-10-14T10:00:00.000Z"
  }
]
```

| Field | Description |
| --- | --- |
| `form`, `filingDate`, `reportDate`, `acceptanceDateTime` | Form type, filing date, period of report (or event date), EDGAR acceptance time. |
| `accessionNumber`, `fileNumber`, `filmNumber` | EDGAR identifiers of the filing. |
| `items`, `itemDescriptions` | 8-K item numbers and their titles (e.g. `2.02 Results of Operations and Financial Condition`). |
| `documentName`, `documentDescription`, `documentUrl` | The primary document (for search results: the document that matched). |
| `filingIndexUrl` | EDGAR index page with every document and exhibit of the filing. |
| `isXBRL`, `isInlineXBRL`, `size` | Whether the filing has (inline) XBRL data; its size in bytes. Null for search results. |
| `matchedBy` | How the input was matched: `cik`, `ticker`, `name` (exact) or `name-search` (EDGAR's company search, best match). |
| `companySnapshot` | Add-on: the latest annual and quarterly periods with revenue, gross profit, operating income, net income, EPS, assets, liabilities, equity and cash, each from the most recently filed figure for that exact period; `sourceTags` names the XBRL tag of each value. |
| `resultsDelivered`, `stopReason` | Summary records only: filings delivered for the input and why delivery stopped (`limit`, `end`, `free_plan`, `budget`, …). |

`status`: filing rows are always `ok`. A summary is `ok` (also when no filing matched the filters), `not_found` when no SEC registrant matches the input (not charged), `error` when EDGAR failed (not charged), and `skipped_budget` / `skipped_free_plan` when a cap was reached.

### Pricing

Pay-per-event, charged only for delivered results:

| Event | Price | When |
| --- | --- | --- |
| `filing` | $0.002 ($2 / 1,000) | once per filing row delivered |
| `company-snapshot` | $0.004 | once per company with XBRL financials, when `includeCompanySnapshot` is on (paid plans) |

Set **Maximum cost per run** to cap spend: the Actor sizes each company's filings to the remaining budget (leaving room for the snapshot when requested) and stops cleanly when it is reached. Accounts on the Apify free plan can process up to 10 companies per run and 20 filings per company, without the snapshot add-on; further companies are returned with `status: "skipped_free_plan"` and are not charged. Upgrade to any paid Apify plan for full batches.

### Use with AI agents (MCP)

Use this Actor from Claude, ChatGPT, Cursor, VS Code or any other MCP client through the [Apify MCP server](https://mcp.apify.com). Add this server URL to your client and sign in with your Apify account when asked:

```text
https://mcp.apify.com?tools=sfoln/sec-edgar-filings
```

To run the MCP server locally instead, start `npx -y @apify/actors-mcp-server --tools sfoln/sec-edgar-filings` with your `APIFY_TOKEN` in the environment.

Example prompt:

> List Apple's five most recent 10-K, 10-Q and 8-K filings from SEC EDGAR with links to the documents.

Runs started by an agent are billed like any other run (see Pricing). Agents can cap what a run may spend with `maxTotalChargeUsd`.

### API usage

Run the Actor and get its dataset items in one call (the call waits up to 5 minutes for the run to finish):

```bash
curl -X POST "https://api.apify.com/v2/acts/sfoln~sec-edgar-filings/run-sync-get-dataset-items" \
  -H "Authorization: Bearer <APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["AAPL"], "forms": ["10-K", "10-Q", "8-K"], "maxFilingsPerCompany": 5}'
```

For large inputs, start the run asynchronously and download the dataset when it has finished:

```bash
## 1. Start a run: the response holds the run ID (data.id) and its dataset ID (data.defaultDatasetId)
curl -X POST "https://api.apify.com/v2/acts/sfoln~sec-edgar-filings/runs" \
  -H "Authorization: Bearer <APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["AAPL"], "forms": ["10-K", "10-Q", "8-K"], "maxFilingsPerCompany": 5}'
## 2. Repeat until data.status is SUCCEEDED (each call waits up to 60 s)
curl "https://api.apify.com/v2/actor-runs/<runId>?waitForFinish=60" -H "Authorization: Bearer <APIFY_TOKEN>"
## 3. Download the results (format=json, csv or xlsx)
curl "https://api.apify.com/v2/datasets/<defaultDatasetId>/items?format=json" -H "Authorization: Bearer <APIFY_TOKEN>"
```

Python ([apify-client](https://pypi.org/project/apify-client/)):

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("sfoln/sec-edgar-filings").call(run_input={"companies": ["AAPL"], "forms": ["10-K", "10-Q", "8-K"], "maxFilingsPerCompany": 5})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

Instead of polling, you can attach a webhook to the run (see Integrations). The API tab of this page shows the same calls for JavaScript and the Apify CLI.

### Integrations

- **Make, Zapier and n8n:** run `sfoln/sec-edgar-filings` with the Apify app (in n8n, the Apify node) and pass the dataset items to the next step of your workflow.
- **Google Sheets:** add the items to a sheet with the Google Sheets step of Make, Zapier or n8n, or download them as CSV or Excel from the run's Storage tab or the API (`format=csv` or `format=xlsx`).
- **Webhooks:** get a POST request when a run succeeds or fails: add a webhook in the Actor's Integrations tab, or pass `webhooks` when you start a run through the API.
- **Schedules:** run it hourly, daily or weekly with the same input from Apify Schedules; every run keeps its results in its own dataset.
- **More:** Slack, Google Drive, GitHub, LangChain, LlamaIndex and other [Apify integrations](https://docs.apify.com/platform/integrations).

### Related Actors

- [SEC Insider Trading Tracker – Form 4](https://apify.com/sfoln/sec-insider-trading)
- [SEC Form D Startup Funding Leads](https://apify.com/sfoln/sec-form-d-leads)
- [Website Contact Details Scraper](https://apify.com/sfoln/company-contacts-finder)
- [LinkedIn Company Details Scraper (No Login)](https://apify.com/sfoln/linkedin-company-lookup)

See [all our Actors](https://apify.com/sfoln) on Apify Store.

### FAQ

#### How much does it cost, and am I charged for failed items?

You pay per event at the prices under Pricing above, plus a run start fee of $0.00005 per GB of memory, with no subscription; platform usage is included. Errors and skipped items (`skipped_…` statuses) are never charged; a lookup that finds nothing is charged only where Pricing says so, and every record's `charged` field shows whether it was billed. Set **Maximum cost per run** to cap what a single run can spend.

#### How fresh is the data?

Each run queries its source while it runs, so you get what the source returns at that moment. Source-specific details, such as how often a provider refreshes its own database, are under Limits & notes.

#### What are the limits?

Per-run caps (for example the maximum number of items) are listed under Input, source limits under Limits & notes, and the free-plan limit under Pricing. For big batches, start the run asynchronously (see API usage) and read the dataset when it has finished.

#### Can I schedule runs or get results by webhook?

Yes. Create a schedule in Apify Console to run it hourly, daily or weekly with the same input, and add a webhook to get a POST request when a run finishes (see Integrations).

#### What does this Actor record about my runs?

This Actor records operational metrics about each run (item counts, duration, charges, error codes and a pseudonymous hash of your Apify user ID) to monitor reliability and costs. It never stores your input or results.

#### Which companies and forms are covered?

Every EDGAR filer (listed companies, funds, individuals filing Forms 3/4/5) and every form type, from the company's full filing history. Tickers come from SEC's ticker list; companies without a ticker can be found by CIK or name.

#### What is in the company snapshot?

XBRL figures from SEC's company facts: revenue, gross profit, operating income, net income, basic and diluted EPS, assets, liabilities, equity and cash for the latest annual (10-K, 20-F, 40-F) and quarterly (10-Q) periods, plus shares outstanding and public float, each with the XBRL tag it came from.

#### How do I get help?

Open an issue in the Actor's Issues tab and include the link to the run, so we can reproduce the problem. Feature requests are welcome there too.

### Limits & notes

- Data comes live from SEC EDGAR (data.sec.gov submissions, XBRL company facts and EDGAR full-text search): new filings appear within minutes of acceptance.
- SEC allows about 10 requests per second per client; the Actor stays at 8 per second for all companies of a run, so very large batches take a few minutes.
- Full-text search covers filings since 2001 and returns at most 10,000 documents per search; one row is delivered per filing even when several of its documents match.
- The snapshot uses facts reported without dimensions: companies with several share classes may report shares outstanding only per class (then the balance-sheet count is used), and some banks and insurers do not tag gross profit or operating income.
- Filings are returned newest first; up to 2,000 per company per run.

# Actor input Schema

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

Tickers (AAPL, BRK.B), CIKs (320193 or 0000320193) or company names (Apple), one per line. A ticker wins over a name; use the CIK for an exact match. Leave empty to run only the full-text search below. Accounts on the Apify free plan can process up to 10 companies per run and 20 filings per company.

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

Optional EDGAR full-text search (filings since 2001; put exact phrases in double quotes, e.g. "artificial intelligence"). With companies: only their filings that match. Without companies: matching filings of every filer.

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

Only these forms, e.g. 10-K, 10-Q, 8-K, S-1, DEF 14A, 13F-HR, 4, SC 13D (case, spaces and hyphens do not matter: 10k means 10-K). Empty: every form.

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

Also return amendments of the selected forms (10-K/A for 10-K, …).

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

Earliest filing date: YYYY-MM-DD, or a span back from today such as "30 days", "6 months" or "2 years".

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

Latest filing date (YYYY-MM-DD or a span such as "7 days"). Empty: today.

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

Filings returned per company, newest first (for a search without companies: filings returned in total).

## `includeCompanySnapshot` (type: `boolean`):

Add key XBRL financials to each company's summary record: revenue, gross profit, operating and net income, EPS, assets, liabilities, equity and cash for the latest annual and quarterly periods, plus shares outstanding. Charged once per company (company-snapshot), only when the company reports XBRL financials. Paid Apify plans only.

## `maxCompanies` (type: `integer`):

Safety cap on companies processed in this run; the rest are ignored and counted as inputItemsDropped in the OUTPUT record.

## `concurrency` (type: `integer`):

Companies processed in parallel. All requests share SEC's rate limit (8 requests per second).

## `includeRaw` (type: `boolean`):

Attach the filing as EDGAR lists it (submissions columns or the search hit) to each filing row.

## Actor input object example

```json
{
  "companies": [
    "AAPL"
  ],
  "forms": [
    "10-K",
    "10-Q",
    "8-K"
  ],
  "includeAmendments": true,
  "maxFilingsPerCompany": 5,
  "includeCompanySnapshot": false,
  "maxCompanies": 100,
  "concurrency": 3,
  "includeRaw": false
}
```

# Actor output Schema

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

No description

## `summary` (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"
    ],
    "forms": [
        "10-K",
        "10-Q",
        "8-K"
    ],
    "maxFilingsPerCompany": 5
};

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

# Run the Actor and wait for it to finish
run = client.actor("sfoln/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 '{
  "companies": [
    "AAPL"
  ],
  "forms": [
    "10-K",
    "10-Q",
    "8-K"
  ],
  "maxFilingsPerCompany": 5
}' |
apify call sfoln/sec-edgar-filings --silent --output-dataset

```

## MCP server setup

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