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

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

Pricing

Pay per event

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

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

DevilScrapes

Maintained by Community

Actor 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 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.005One-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 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.