SEC EDGAR Filings Scraper — 10-K, 10-Q & 8-K avatar

SEC EDGAR Filings Scraper — 10-K, 10-Q & 8-K

Pricing

Pay per event

Go to Apify Store
SEC EDGAR Filings Scraper — 10-K, 10-Q & 8-K

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

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

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 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.

⚙️ How to use it

  1. Click Try for free at the top of the page — Apify gives every new account $5 of free credit.
  2. Enter one or more ticker symbols (e.g. AAPL, MSFT) or raw 10-digit CIK numbers. We resolve tickers to CIKs via SEC's company_tickers.json automatically.
  3. Optionally filter by form type (10-K, 10-Q, 8-K, S-1, SC 13D, etc.) and set a per-company result cap.
  4. Click Start. Output streams into the run's dataset in real time.
  5. 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

FieldTypeRequiredDefaultNotes
tickersarrayyes["AAPL", "MSFT"]Ticker symbols (e.g. AAPL) or 10-digit CIKs. Tickers resolved to CIKs via SEC's company_tickers.json.
formTypesarrayno["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.
maxResultsPerCompanyintegerno20Cap on filings returned per company. EDGAR returns up to ~1 000 most-recent filings per submissions call.
userAgentstringno"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.
proxyConfigurationobjectno{"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.

FieldTypeNotes
cikstring10-digit CIK (zero-padded).
tickerstring | nullTicker symbol, if resolved from one.
company_namestringRegistrant name as it appears on EDGAR.
form_typestringForm type (10-K, 10-Q, 8-K, S-1, SC 13D, Form 4, etc.).
accession_numberstringAccession number (e.g. 0000320193-24-000123). Stable unique ID.
filing_datestringFiling date in YYYY-MM-DD format.
report_datestring | nullReporting-period end date (not present for all form types).
acceptance_datetimestring | nullEDGAR acceptance timestamp (ISO-8601).
primary_documentstring | nullPrimary document filename.
primary_document_urlstringDirect URL to the primary HTML or PDF on sec.gov.
filing_index_urlstringEDGAR filing index URL — links to all exhibits.
is_xbrlboolean | nullWhether the filing includes XBRL-tagged financial data.
scraped_atstringISO-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:

EventUSDWhat it is
actor-start$0.20One-off warm-up charge per run.
result$0.002Per 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_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.

💬 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.