SEC EDGAR Filings Scraper - 10-K, 8-K, 13F
Pricing
from $20.00 / 1,000 filing extracteds
SEC EDGAR Filings Scraper - 10-K, 8-K, 13F
Pull SEC EDGAR filings (10-K, 10-Q, 8-K, 13F) for any US-listed ticker and structure them to JSON: filing metadata, sectioned document text, risk factors and LLM-ready summaries. Official SEC full-text search API, no API key required.
Pricing
from $20.00 / 1,000 filing extracteds
Rating
0.0
(0)
Developer
Oaida Adrian
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
SEC EDGAR Filings & Financial Corpus Scraper
Pull SEC EDGAR filings β 10-K, 10-Q, 8-K and 13F-HR β for any US-listed ticker and get each filing structured to JSON: filing metadata, sectioned document text, 10-K risk factors (Item 1A), 13F holdings tables, and an optional LLM-ready summary. Built on the SEC's official full-text search API β no API key, no third-party data vendor.
Why
EDGAR is the canonical source of US public-company disclosures, but the raw archive is hostile to analysis: filings are HTML documents with table-heavy layouts, and the full-text search UI is built for humans, not pipelines. This actor turns a ticker + form-type + date window into a clean corpus of JSON records β one per filing β ready for financial alt-data pipelines, sentiment/risk analysis, RAG corpora, or LLM fine-tuning datasets.
How it works
- Ticker β CIK β resolves the ticker against the official SEC company
list (
company_tickers.json); falls back to display-name search for delisted or foreign-format tickers. - Full-text search β queries the official EDGAR full-text search JSON
API (
efts.sec.gov/LATEST/search-index) with the ticker, form types and date window, paginated at 100 hits per page, deduplicated by accession number, and filtered to each filing's primary document (exhibits are excluded; their URLs remain reachable via the filing index link). - Document extraction β fetches each primary document from the SEC Archives and converts HTML to clean text (scripts/styles stripped, tables preserved, entities decoded, whitespace normalised).
- Structuring β splits documents into Item sections (
Item 1.,Item 1A.,Item 7.,Item 2.02, ...), extracts risk factors from 10-K/10-Q Item 1A, and parses 13F-HR XML InfoTables into holding records (issuer, CUSIP, value, shares, voting authority). - Summary β when
summarizeis enabled, emits a deterministic markdown summary per filing (metadata, section map, risk-factor excerpt, holdings preview) designed for direct LLM consumption β no external LLM call, no extra cost.
SEC fair-access policy is respected: a descriptive User-Agent
(Darknezz Research admin@adrianhomelab.com) and polite pacing (~5
requests/second, well under the 10 rps limit) with 429 backoff.
Input
| Field | Type | Default | Description |
|---|---|---|---|
ticker | string | β | Stock ticker, e.g. AAPL, MSFT, TSLA (required) |
formTypes | string[] | ["10-K","10-Q","8-K","13-F"] | Form types to pull; 13-F maps to 13F-HR |
period | string | empty | Date window: 2023-2026, 2024, or 2023-01-01:2026-12-31 |
summarize | boolean | true | Add the LLM-ready summary per filing |
maxItems | integer | 50 | Max filings to extract (1β500) |
Example:
{"ticker": "AAPL","formTypes": ["10-K", "8-K"],"period": "2023-2026","summarize": true}
Output
One dataset item per filing:
- Metadata β
accessionNumber,ticker,companyName,cik,formType,filingDate,periodEnding, eventitems(8-K), file details,documentUrl,sourceUrl(filing index). sectionsβ array of{heading, item, text}for each Item section (per-section cap 60k chars; full text stays at the source URL).riskFactorsβ 10-K/10-Q Item 1A text (or any "Risk Factors" heading), empty for 8-K.holdingsβ 13F positions:nameOfIssuer,titleOfClass,cusip,value,shares,sharesType,putCall,investmentDiscretion,otherManager,votingSole/Shared/None. Mega-manager filings are capped at 20,000 positions withholdingsCount+holdingsTruncatedflags.summaryβ LLM-ready markdown whensummarizeis true.charCount,scrapedAt.
Example record (Apple 8-K, fields trimmed):
{"accessionNumber": "0000320193-26-000045","ticker": "AAPL","companyName": "APPLE INC","formType": "8-K","filingDate": "2026-01-29","items": ["2.02", "9.01"],"sections": [{"heading": "Item 2.02", "item": "2.02", "text": "Results of Operations and Financial Condition..."}],"summary": "## Apple Inc. 8-K (2026-01-29)\n- Form: 8-K ...","charCount": 4872,"scrapedAt": "2026-08-19T10:52:11.000Z"}
Use cases
- Financial alt-data β monitor 8-K event items (2.02 results, 1.01 agreements, 9.01 exhibits) across a watchlist.
- Risk analysis β 10-K Item 1A risk-factor corpus for sector risk benchmarking or LLM risk-extraction pipelines.
- 13F tracking β institutional holdings snapshots (quarterly) for fund-flow and positioning analysis.
- Vertical AI corpus β clean, sectioned regulatory text for fine-tuning, RAG, or evaluation datasets.
- Fundamental screening β 10-Q/10-K MD&A text for narrative trend analysis over time.
Run from the API
curl -X POST "https://api.apify.com/v2/acts/darknezz~sec-edgar-filings-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"ticker":"AAPL","formTypes":["8-K"],"period":"2024-2026","summarize":true,"maxItems":5}'
Run from Python
import asynciofrom apify_client import ApifyClientclient = ApifyClient("YOUR-APIFY-TOKEN")async def main():run = await client.actor("darknezz/sec-edgar-filings-scraper").call(run_input={"ticker": "MSFT", "formTypes": ["8-K"], "period": "2025-2026", "maxItems": 5})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["accessionNumber"], item["formType"], item["filingDate"])print("items:", item.get("items"), "| sections:", len(item.get("sections", [])))asyncio.run(main())
Pricing
Pay-per-event β $0.02 per filing extracted (result event) plus a
$0.01 one-time run-start fee. You only pay for filings that are
actually delivered to the dataset; an empty search costs nothing.
Worked examples: a 5-filing lookup costs $0.11 (5 Γ $0.02 + $0.01); a 100-filing sweep costs $2.01.
FAQ
Do I need an API key? No β EDGAR is a free public API. Only a descriptive User-Agent is required, which the actor sets automatically.
Rate limits? SEC's fair-access policy allows 10 requests/second; the actor stays at ~5 and backs off on 429s.
Why are exhibits missing from sections? Each filing yields its primary
document only; exhibit files (EX-99.1 press releases, EX-10 contracts) are
one click away via sourceUrl (the filing index).
Amendments? /A variants are included when the form-type filter matches
(e.g. 10-K/A); use the exact form code to narrow.
What about delisted tickers? If the ticker is absent from the SEC company list, the actor falls back to display-name full-text search, which covers most historical filers.
Is the CIK lookup reliable? Yes β company_tickers.json is the SEC's
own mapping; the zero-padded 10-digit CIK is used in search queries (the
most common integration mistake).
Can I pull a 13F mega-manager like JPM? Yes, up to 20,000 positions per
filing; larger filings are truncated with holdingsCount and
holdingsTruncated flags so the record stays under Apify's item-size cap.
Limitations
- Primary document only β exhibits and multi-part filings beyond the
primary document are not parsed (linked from
sourceUrl). - Per-section cap β sections over 60k characters are truncated; the full text remains at the source URL.
- 13F cap β positions beyond 20,000 per filing are truncated with explicit flags (records above Apify's 9 MB item cap would fail).
- Historical depth β the full-text index covers filings back to ~2001; pre-2001 documents are not searchable through this endpoint.