SEC EDGAR Filings Scraper
Pull SEC EDGAR filings as clean rows: form, company, date, accession number, and a direct document link. Search all filings or fetch by ticker/CIK.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
mode,query,forms(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Inputs
| Field | What it does | Type |
|---|---|---|
mode | How to find filings. "search" runs an EDGAR full-text search across all filings using your query. "company" pulls a company's recent filing history by ticker or CIK. | string |
query | Full-text query for "search" mode (e.g. "artificial intelligence"). Matched as a phrase across filing documents. Required when mode is "search"; ignored in "company" mode. Note: SEC's full-text index is sparse — "search" rows often have null ticker, reportDate, and description (see README). Use "company" mode for more complete records. | string |
forms | Comma-separated SEC form types to filter by, e.g. "10-K,8-K". Leave empty for all forms. Applies to both modes. | string |
tickers | For "company" mode: one or more stock tickers (e.g. AAPL, TSLA) or numeric CIKs. Each company's filing history is fetched. Ignored in "search" mode. | array |
startDate | Only include filings filed on or after this date (YYYY-MM-DD). Optional. | string |
endDate | Only include filings filed on or before this date (YYYY-MM-DD). Optional. | string |
maxItems | Maximum number of filings to return across the WHOLE run (a total budget shared by all companies/queries, not a per-company cap). In "company" mode the run stops once this total is hit, so earlier tickers in the list can consume the budget before later ones. Full-text search itself caps at 10000 results. | integer |
notionConnector | Optional. Write each item as a page into your Notion when the run finishes. Authorize a Notion connector once in Settings → API & Integrations → MCP connectors, then pick it here. Leave empty to skip (default) — results are always saved to the dataset regardless. | string |
notionParentId | Optional. The Notion data source ID of the database to write into (only used if a Notion connector is set). Leave empty to create the pages privately in your workspace instead. | string |
What you get
A structured dataset — each result includes fields like:
accessionNumbercikcompanyNamedescriptionfilingDatefilingUrlformprimaryDocumentreportDatetickerExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
2 ready-to-run use cases
Apple (AAPL) SEC Filings Scraper - EDGAR by Ticker
Apple's EDGAR filings pulled by ticker: every 10-K, 10-Q, and 8-K with filing date, accession number, and a direct link to each document.
EDGAR Full-Text Search: AI Across SEC Filings
Which companies mention artificial intelligence? Run a full-text search across EDGAR filings to find every 10-K and 8-K, with company and filing links.
SEC EDGAR Filings Scraper
Pull filings from the U.S. SEC's EDGAR system through its official public APIs — no API key, no login, no anti-bot to fight. Two modes:
- Full-text search — search the text of every filing for a phrase (e.g.
artificial intelligence), optionally narrowed to specific form types and a date window. - Company filings — give one or more tickers or CIKs (e.g.
AAPL,TSLA) and get that company's recent filing history.
Both modes return the same normalized shape, including a direct link to the primary filing document.
What you get per filing
form, companyName, cik, ticker, filingDate, reportDate, accessionNumber, primaryDocument, description, and filingUrl (a direct link to the document in https://www.sec.gov/Archives/...).
Which fields can be null. SEC's full-text search index does not return every field for every hit, so search-mode rows are sparser than company-mode rows. In particular, ticker, reportDate, and description are often null in search mode (EDGAR's full-text engine doesn't index a ticker for many filers, and report/period dates and document descriptions are inconsistently present). company mode (driven by the submissions API) is more complete, but reportDate, description, and ticker can still be null for some filings. filingUrl is null only when SEC didn't supply enough identifiers (cik + accession + primary document) to build a canonical Archives link. Treat these fields as best-effort, not guaranteed.
Input
| Field | Notes |
|---|---|
mode | search (full-text) or company (by ticker/CIK). Default search. |
query | Phrase for search mode, e.g. "artificial intelligence". Required in search mode. |
forms | Comma-separated form types, e.g. 10-K,8-K. Optional; applies to both modes. |
tickers | Array of tickers or CIKs for company mode, e.g. ["AAPL","TSLA"]. |
startDate / endDate | Optional YYYY-MM-DD filing-date window. |
maxItems | Cap on total rows across the whole run (a shared budget, not per-company). In company mode, earlier tickers can use up the budget before later ones. Full-text search itself caps at 10000 results. |
proxyConfiguration | Optional. SEC's public API has no anti-bot, so a proxy gives no scraping benefit and this actor does no IP rotation. Off by default; enable only for anonymity, geolocation, or your own network's rate limits. |
Output
One dataset row per filing, deduplicated by accessionNumber + primaryDocument. Empty results return a single diagnostic row and are not charged.
Examples
Full-text search:
{ "mode": "search", "query": "artificial intelligence", "forms": "10-K", "maxItems": 50 }
Company filings:
{ "mode": "company", "tickers": ["AAPL", "TSLA"], "forms": "10-K,8-K", "maxItems": 50 }
Sample output row
{
"ok": true,
"form": "10-K",
"companyName": "Example Corp",
"cik": "0000320193",
"ticker": "EXMP",
"filingDate": "2024-02-01",
"reportDate": "2023-12-31",
"accessionNumber": "0000320193-24-000006",
"primaryDocument": "exmp-20231231.htm",
"description": "10-K",
"filingUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000006/exmp-20231231.htm"
}
In search mode, ticker, reportDate, and description are frequently null (EDGAR's full-text index is sparse). See "Which fields can be null" above.
Pricing
Pay-per-result: you are charged once per filing row returned. Empty runs, blocked/error runs, and diagnostic rows (ok:false) are never charged — only genuine filing rows (ok:true) bill. Bad input (e.g. an empty query in search mode, or no tickers in company mode) returns a single uncharged BAD_INPUT diagnostic row rather than failing the run.
Troubleshooting
- Sparse rows / null ticker or dates — expected in
searchmode; SEC's full-text index omits these for many filers. Usecompanymode for richer records. - Some tickers returned nothing in company mode — the run pushes a
NOT_FOUNDdiagnostic row listing exactly which ticker(s)/CIK(s) failed to resolve or had no matching filings. - A
BLOCKED/RATE_LIMITEDdiagnostic — SEC has no anti-bot, so this almost always means your own network or a misconfigured proxy is being throttled; the actor already backs off and retries. Try again, or turn the proxy off if you enabled one.
Notes
This actor follows SEC's fair-access policy: every request carries a descriptive contact-style User-Agent (required — SEC returns 403 without one), uses gzip, and keeps a polite gap between requests. Full-text search covers filings indexed by EDGAR's full-text engine and is limited to 10000 results per query — split large jobs by form type or date window. Company mode returns the most recent ~1000 filings per company from the submissions API.