SEC EDGAR Filings Scraper — 10-K, 10-Q & 8-K
Pricing
Pay per event
SEC EDGAR Filings Scraper — 10-K, 10-Q & 8-K
Search SEC EDGAR filings by company ticker, CIK, or form type — resolve tickers to CIKs automatically and get each filing's form type, period, filing date, accession number, and primary-document URL as clean JSON, CSV, or Excel rows. We handle SEC's rate limits so your run never gets flagged.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 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 filings 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.20 | 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 a SEC EDGAR filings scraper used for?
Investigative journalists, equity analysts, compliance teams, and academic researchers use a SEC EDGAR filings 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 a SEC EDGAR filings API I can use instead?
The SEC publishes a free SEC 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 filings 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.