SEC EDGAR Filings Scraper icon

Automation · Business data

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.

Free Apify credit covers a first run. No credit card to try.

What this Actor 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 rotationcurl-cffi impersonates 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, with Retry-After headers 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.

Input

Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.

FieldTypeRequiredWhat it does
tickers array yes List of ticker symbols (e.g. AAPL) or 10-digit CIKs. We resolve tickers to CIKs via SEC's company_tickers.json.
formTypes array no Form types to include (e.g. 10-K, 10-Q, 8-K). Leave empty to include every form.
maxResultsPerCompany integer no Cap on filings returned per company. EDGAR returns ~1000 most recent per submissions call.
userAgent string no SEC requires a UA with a contact email. Default identifies as Devil Scrapes; replace if you want SEC to know it's your run.
{
  "tickers": [
    "AAPL"
  ],
  "formTypes": [
    "10-K"
  ],
  "maxResultsPerCompany": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}

Output

One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.

ciktickercompany_nameform_typeaccession_numberfiling_datereport_dateacceptance_datetimeprimary_documentprimary_document_urlfiling_index_urlis_xbrlscraped_at

{
  "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

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Result emitted$0.0020Per result written to the dataset.

You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.

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_url and filing_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_url links 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.

Ready to run it?

Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.

Related Actors

Teams that run this also run