SEC EDGAR Scraper — 10-K, 10-Q & 8-K Filings
Pricing
Pay per event
SEC EDGAR Scraper — 10-K, 10-Q & 8-K Filings
Search SEC EDGAR (US public company filings) by company ticker, CIK, or form type via the free EDGAR API — each filing's CIK, form type, period, filing date, accession number, and primary-document URL — export to JSON or CSV dataset. Built on SEC's full-text search.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
🎯 What this scrapes
The SEC EDGAR system (sec.gov) publishes every public-company filing — 10-K annual reports, 10-Q quarterlies, 8-K material events, S-1 registration statements, proxy statements, Form 4 insider-transaction filings, SC 13D beneficial-ownership reports, and more. The system exposes both per-company submissions endpoints and full-text search APIs.
This sec edgar scraper wraps the per-company submissions endpoint, resolves ticker symbols to 10-digit CIKs automatically, and writes one Pydantic-validated dataset row per filing — including form type, period, filing date, accession number, and the direct URL to the primary document. We handle the rate-limit ceiling (~10 req/sec polite limit), backoff on 429s, and User-Agent compliance so you never have to.
🔥 What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a legitimate browser session, not Python. - 🌐 Proxy rotation via Apify Proxy — fresh session and exit IP on every retry, keeping your run clean through any turbulence.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per request, withRetry-Afterheaders honoured automatically. - 🧱 Rate-limit-aware pacing — when EDGAR pushes back, we slow down instead of hammering and getting your run flagged.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable accession-number IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for results that land in your dataset. No data, no charge (beyond the small warm-up fee).
💡 Use cases
- Earnings calendar automation — schedule a daily diff for 10-Q and 10-K filings across your covered companies. Build your own earnings calendar without paying for a vendor feed.
- 8-K filing alert and material-events monitoring — pull every 8-K for your watchlist; pipe to Slack or email via n8n / Make / Zapier. Sub-minute freshness is not guaranteed (SEC publishes in batches), but daily-cadence monitoring is solid.
- M&A and activist-investor monitoring — filter for S-4 merger filings and SC 13D beneficial-ownership disclosures. Ideal for investigative journalists and M&A research desks.
- Insider trading filings API substitute — harvest Form 4 filings for any issuer without a per-seat subscription. Use as a free research tool; complement sec-api.io for production.
- Investigative data journalism — structured rows ready for pandas, Jupyter, or R. Used by data-desk reporters at NICAR-affiliated newsrooms for document-heavy investigations.
- Academic finance research — replicate event-study datasets; bulk-download 10-Ks for NLP analysis; reconstruct historical S-1 filings for IPO research.
⚙️ How to use it
- Click Try for free at the top of the page — Apify gives every new account $5 of free credit.
- Enter one or more ticker symbols (e.g.
AAPL,MSFT) or raw 10-digit CIK numbers. We resolve tickers to CIKs via SEC'scompany_tickers.jsonautomatically. - Optionally filter by form type (
10-K,10-Q,8-K,S-1,SC 13D, etc.) and set a per-company result cap. - Click Start. Output streams into the run's dataset in real time.
- Export from Storage → Dataset as JSON, CSV, or Excel — or pull via the Apify REST API.
For automated pipelines: the Apify API lets you trigger runs programmatically and fetch the dataset when the run completes. Drop-in for n8n, Make, or Zapier using the native Apify integrations.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
tickers | array | yes | ["AAPL", "MSFT"] | Ticker symbols (e.g. AAPL) or 10-digit CIKs. Tickers resolved to CIKs via SEC's company_tickers.json. |
formTypes | array | no | ["10-K", "10-Q"] | Form types to include (e.g. 10-K, 10-Q, 8-K, S-1, SC 13D). Leave empty to include every form. |
maxResultsPerCompany | integer | no | 20 | Cap on filings returned per company. EDGAR returns up to ~1 000 most-recent filings per submissions call. |
userAgent | string | no | "DevilScrapes-EDGAR/1.0 (contact: apify.com/DevilScrapes)" | SEC requires a User-Agent with a contact identifier. Replace with your own if you want SEC to associate requests with your organisation. |
proxyConfiguration | object | no | {"useApifyProxy": false} | Proxy settings. SEC accepts polite anonymous requests; proxy is optional but available if you need it. |
Example input
{"tickers": ["AAPL"],"formTypes": ["10-K"],"maxResultsPerCompany": 3,"proxyConfiguration": {"useApifyProxy": false}}
📤 Output
Every row is one dataset item representing a single SEC filing.
| Field | Type | Notes |
|---|---|---|
cik | string | 10-digit CIK (zero-padded). |
ticker | string | null | Ticker symbol, if resolved from one. |
company_name | string | Registrant name as it appears on EDGAR. |
form_type | string | Form type (10-K, 10-Q, 8-K, S-1, SC 13D, Form 4, etc.). |
accession_number | string | Accession number (e.g. 0000320193-24-000123). Stable unique ID. |
filing_date | string | Filing date in YYYY-MM-DD format. |
report_date | string | null | Reporting-period end date (not present for all form types). |
acceptance_datetime | string | null | EDGAR acceptance timestamp (ISO-8601). |
primary_document | string | null | Primary document filename. |
primary_document_url | string | Direct URL to the primary HTML or PDF on sec.gov. |
filing_index_url | string | EDGAR filing index URL — links to all exhibits. |
is_xbrl | boolean | null | Whether the filing includes XBRL-tagged financial data. |
scraped_at | string | ISO-8601 timestamp for when this row was recorded. |
Example output
{"cik": "0000320193","ticker": "AAPL","company_name": "Apple Inc.","form_type": "10-K","accession_number": "0000320193-24-000123","filing_date": "2024-11-01","report_date": "2024-09-28","acceptance_datetime": "2024-11-01T06:01:36.000Z","primary_document": "aapl-20240928.htm","primary_document_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/aapl-20240928.htm","filing_index_url": "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000320193&type=10-K","is_xbrl": true,"scraped_at": "2024-11-02T09:14:22.000Z"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.005 | One-off warm-up charge per run. |
result | $0.002 | Per dataset item (one filing row). |
Example: 1 000 results at the rates above ≈ $2.00. No subscription, no minimum, no card required to start — Apify gives every new account $5 of free credit, which covers your first 2 500 filing rows.
🚧 Limitations
- Filing history depth: we pull from each company's
submissions/CIK#.json, which covers the most recent ~1 000 filings. For historical filings beyond that window, the EDGAR full-text search and per-year archive endpoints need a separate request pattern. - Ticker resolution scope: ticker-to-CIK resolution works for the operating-company set in SEC's
company_tickers.json. Mutual-fund CIKs and individual-filer CIKs are supported if you supply the CIK directly. - Filing content: we surface
primary_document_urlandfiling_index_url— we do not download or parse the filing body. Pair with a generic HTML fetcher to retrieve the actual document text. - Sub-minute freshness: SEC publishes filings to EDGAR in processing batches; new filings can take minutes to appear in the submissions API. For near-real-time push, use SEC's RSS or PDS feeds alongside this scraper.
- Form 4 display names: insider-person names are in the XML body of the Form 4 — not in the submissions metadata we extract.
primary_document_urllinks directly to the XML for downstream parsing.
❓ FAQ
What is an sec edgar scraper used for?
Investigative journalists, equity analysts, compliance teams, and academic researchers use an sec edgar scraper to bulk-download structured filing metadata — form type, filing date, accession number, direct document URL — without hand-rolling ticker-to-CIK resolution and rate-limit handling. Common workflows: earnings calendars, 8-K alert feeds, M&A monitoring, and NLP datasets from 10-K text.
Is there an edgar filings api I can use instead?
The SEC publishes a free edgar filings api (no key required, just a contact User-Agent). This Actor wraps that API and adds ticker resolution, form-type filtering, Pydantic-validated output rows, and Apify-native export — so you get clean structured data without writing the plumbing yourself.
How does this compare to sec-api.io or edgartools?
sec-api.io and edgartools are paid subscription products. This Actor is priced per-result and integrates natively with n8n, Make, Zapier, and any tool that supports the Apify API. For one-off or irregular extractions it is usually cheaper. For very high-volume production pipelines, compare cost profiles.
What is the sec edgar api rate limit?
SEC asks for no more than 10 requests per second and a descriptive User-Agent. We pace requests conservatively, honour 429 responses with backoff, and surface partial-success status messages so you always know where your run stands.
Can I use edgar full-text search with this Actor?
This Actor uses the per-company submissions endpoint. The EDGAR full-text search index (efts.sec.gov) lets you search filing content by keyword — useful for finding specific disclosures across all filers. A separate full-text search Actor is on the roadmap; contact us on the Issues tab if that workflow is blocking you.
Do I need an API key?
No. SEC requires only a User-Agent string with a contact identifier. The default User-Agent in this Actor already satisfies that requirement.
Why is report_date sometimes null?
Some form types (notably 8-K current reports) record only a filing date, not a reporting-period end date. report_date is null for those rows.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a form type we're not handling? Open an issue on the Actor's Issues tab in Apify Console — we ship fixes weekly and read every report. If the edgar full-text search or XBRL-data extraction angle is on your roadmap, say so and we will prioritise it.