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
18 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
one-time actor-start fee per run. You only pay for filings that are
actually delivered to the dataset; an empty search costs nothing.
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.