Monitor SEC EDGAR 10-K Filings for Competitive Analysis
Track competitor 10-K filings for revenue shifts, R&D spend changes, and risk factor disclosures. Automated pipeline with Thirdwatch SEC EDGAR Scraper.

Thirdwatch's SEC EDGAR Scraper monitors competitor 10-K and 10-Q filings for financial signals -- revenue trajectory, R&D intensity, margin compression, and cash position changes -- delivered as structured JSON with revenue and net income history on a scheduled cadence. Pay per result, no terminal subscription or enterprise contract required. Built for competitive intelligence teams, corporate strategy analysts, product marketers tracking public-company competitors, and growth leaders benchmarking their category against SEC filings data.
Why monitor SEC 10-K filings for competitive intel
Public company filings are the only source of audited, legally mandated financial disclosures. While press releases cherry-pick metrics and earnings calls spin narratives, 10-K annual reports contain the unvarnished numbers: exact revenue, cost of goods sold, operating expenses broken down by category, and risk factors that management is legally required to disclose. According to a Harvard Business Review analysis, competitive intelligence teams that systematically monitor SEC filings detect market-share shifts an average of two quarters before they appear in third-party market research reports.
The intelligence gap is automation. Most competitive intel workflows involve manually checking EDGAR, downloading PDFs, and extracting numbers into spreadsheets -- a process that takes 2-4 hours per competitor per quarter. Multiply by 8-15 competitors in a typical watch list and the quarterly filing season consumes 30-60 analyst hours. The Thirdwatch actor reduces each competitor to an API call that returns revenue, net_income, operating_income, gross_profit, rd_expense, stockholders_equity, and cash as structured fields with revenue_history and net_income_history for trend context.
For growth teams, three signals matter most. Rising rd_expense as a share of revenue predicts product investment. Diverging revenue growth rates across competitors reveal market-share shifts. Declining gross_profit margins under stable revenue suggest pricing pressure or cost inflation.
How does this compare to the alternatives?
Four approaches to competitive financial monitoring:
| Approach | Latency from filing | Structured metrics | Competitor coverage | Automation |
|---|---|---|---|---|
| Manual EDGAR monitoring | Hours (if you check daily) | No -- manual extraction | Limited by analyst bandwidth | None |
| Earnings call transcripts (Seeking Alpha, etc.) | Same day | Partial -- management-selected metrics | Broad | RSS alerts only |
| Commercial CI platform (Klue, Crayon) | Days to weeks | Some financial data | Vendor curates | Platform handles |
| Thirdwatch SEC EDGAR Scraper | Minutes from filing acceptance | Full XBRL financials | Any public US company | Apify scheduling |
Earnings calls give you management's narrative; 10-K filings give you the audited numbers behind it. The SEC EDGAR Scraper captures the numbers and lets you build the narrative yourself.
How to monitor competitor 10-K filings in 5 steps
Step 1: How do I configure my Apify environment?
Create a free account at apify.com, get your API token from Settings, and install the Python client.
export APIFY_TOKEN="apify_api_xxxxxxxxxxxxxxxx"
pip install apify-client pandasStep 2: How do I define my competitive watch list?
Build a watch list of public-company competitors by ticker symbol.
from apify_client import ApifyClient
import os, json, datetime
client = ApifyClient(os.environ["APIFY_TOKEN"])
# Example: cloud infrastructure competitive landscape
COMPETITORS = {
"AWS_parent": "AMZN",
"Azure_parent": "MSFT",
"GCP_parent": "GOOGL",
"Oracle_Cloud": "ORCL",
"Salesforce": "CRM",
"Snowflake": "SNOW",
"Datadog": "DDOG",
"Cloudflare": "NET",
}Step 3: How do I pull the latest annual filings with financials?
Extract the most recent 10-K for each competitor with full financial data.
tickers = list(COMPETITORS.values())
run = client.actor("thirdwatch/sec-edgar-scraper").call(run_input={
"queries": tickers,
"filingType": "10-K",
"includeFinancials": True,
"maxResults": 1, # Latest annual filing only
})
filings = client.dataset(run["defaultDatasetId"]).list_items().items
print(f"Retrieved {len(filings)} annual filings")Step 4: How do I build a competitive benchmarking dashboard?
Compute the financial ratios that reveal competitive positioning.
import pandas as pd
df = pd.DataFrame(filings)
# Core competitive metrics
df["revenue_B"] = df["revenue"] / 1e9
df["gross_margin"] = (df["gross_profit"] / df["revenue"] * 100).round(1)
df["operating_margin"] = (df["operating_income"] / df["revenue"] * 100).round(1)
df["net_margin"] = (df["net_income"] / df["revenue"] * 100).round(1)
df["rd_intensity"] = (df["rd_expense"] / df["revenue"] * 100).round(1)
df["cash_B"] = df["cash"] / 1e9
# Revenue growth from history
def yoy_growth(history):
if history and len(history) >= 2:
curr, prev = history[0]["value"], history[1]["value"]
if prev > 0:
return round((curr / prev - 1) * 100, 1)
return None
df["revenue_yoy"] = df["revenue_history"].apply(yoy_growth)
cols = ["company_name", "ticker", "revenue_B", "revenue_yoy",
"gross_margin", "operating_margin", "rd_intensity", "cash_B"]
print(df[cols].sort_values("revenue_B", ascending=False).to_string(index=False))Step 5: How do I set up quarterly monitoring alerts?
Schedule the actor to check for new filings weekly and flag changes above threshold.
# Run weekly -- check for new 10-K and 10-Q filings in the last 7 days
seven_days_ago = (datetime.date.today() - datetime.timedelta(days=7)).isoformat()
run = client.actor("thirdwatch/sec-edgar-scraper").call(run_input={
"queries": tickers,
"filingType": "all",
"includeFinancials": True,
"dateFrom": seven_days_ago,
"maxResults": 20,
})
new_filings = client.dataset(run["defaultDatasetId"]).list_items().items
for filing in new_filings:
growth = yoy_growth(filing.get("revenue_history"))
rd_pct = None
if filing.get("rd_expense") and filing.get("revenue"):
rd_pct = round(filing["rd_expense"] / filing["revenue"] * 100, 1)
alert_flags = []
if growth and abs(growth) > 15:
alert_flags.append(f"Revenue YoY: {growth:+.1f}%")
if rd_pct and rd_pct > 25:
alert_flags.append(f"R&D intensity: {rd_pct}%")
if alert_flags:
print(f"ALERT: {filing['company_name']} ({filing['ticker']}) "
f"filed {filing['filing_type']} on {filing['filed_date']}")
for flag in alert_flags:
print(f" - {flag}")Sample output
Two records from a competitive monitoring run. Each record weighs approximately 2 KB.
[
{
"company_name": "Snowflake Inc.",
"cik": "1640147",
"ticker": "SNOW",
"filing_type": "10-K",
"filed_date": "2026-03-28",
"period_of_report": "2026-01-31",
"url": "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=1640147",
"revenue": 4280000000,
"net_income": -320000000,
"total_assets": 9870000000,
"eps": -0.96,
"operating_income": -410000000,
"gross_profit": 2996000000,
"rd_expense": 1713000000,
"stockholders_equity": 5230000000,
"cash": 3840000000,
"revenue_history": [
{"period": "FY2026", "value": 4280000000},
{"period": "FY2025", "value": 3430000000},
{"period": "FY2024", "value": 2806000000}
],
"net_income_history": [
{"period": "FY2026", "value": -320000000},
{"period": "FY2025", "value": -836000000},
{"period": "FY2024", "value": -797000000}
]
},
{
"company_name": "Datadog, Inc.",
"cik": "1561550",
"ticker": "DDOG",
"filing_type": "10-K",
"filed_date": "2026-02-27",
"period_of_report": "2025-12-31",
"url": "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=1561550",
"revenue": 3150000000,
"net_income": 410000000,
"total_assets": 6540000000,
"eps": 1.21,
"operating_income": 320000000,
"gross_profit": 2520000000,
"rd_expense": 1102000000,
"stockholders_equity": 3890000000,
"cash": 2710000000,
"revenue_history": [
{"period": "FY2025", "value": 3150000000},
{"period": "FY2024", "value": 2684000000},
{"period": "FY2023", "value": 2128000000}
],
"net_income_history": [
{"period": "FY2025", "value": 410000000},
{"period": "FY2024", "value": 183000000},
{"period": "FY2023", "value": 49000000}
]
}
]The competitive intelligence story here is visible in the raw numbers: Snowflake's rd_expense at 40% of revenue versus Datadog's 35% signals heavier product investment. Snowflake's narrowing net loss (net_income_history) alongside 25% revenue growth shows an improving unit economics trajectory. cash positions indicate runway and acquisition capacity.
Common pitfalls
Three mistakes that undermine competitive filing intelligence. Comparing misaligned fiscal periods -- Snowflake's fiscal year ends January 31 while Datadog's ends December 31. A naive year-over-year comparison conflates different macro environments. Always normalize to the same calendar quarter using period_of_report. Ignoring segment disclosures -- Amazon's 10-K breaks revenue into AWS, North America retail, and International retail. The consolidated revenue field combines all segments. For competitive analysis of cloud infrastructure specifically, you need to parse the segment breakdown from the filing text, not just the top-line number. Over-indexing on a single metric -- R&D intensity rising could mean product investment (bullish) or revenue declining while R&D stays flat (bearish). Always read metrics in context with at least two other signals.
Schedule the actor weekly during earnings season (January-March for calendar-year filers) and monthly otherwise. Pair with our Google News Scraper to correlate filing dates with press coverage, or use LinkedIn Jobs Scraper to cross-reference hiring velocity as a leading indicator that confirms or contradicts the financial signals in 10-K filings.
Related use cases
Frequently asked questions
How quickly do 10-K filings appear on EDGAR after a company files?
EDGAR indexes new filings within minutes of SEC acceptance. For 10-K annual reports, large accelerated filers (public float above 700M) must file within 60 days of fiscal year-end; accelerated filers within 75 days; non-accelerated filers within 90 days. In practice, most large public companies file within the first 30 days. The actor pulls live from EDGAR, so running it daily during earnings season captures filings within hours of publication.
What competitive signals are most actionable from 10-K filings?
Three signals produce the highest competitive intelligence value: (1) R&D expense as a percentage of revenue -- a rising ratio signals increased product investment, often preceding new product launches by 12-18 months. (2) Revenue growth rate relative to competitors in the same sector -- diverging growth trajectories indicate market share shifts. (3) Gross margin trends -- declining gross margins may indicate pricing pressure from competitors or rising input costs. The actor extracts all three as structured fields.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.