What is an 8-K?
8-Ks are filed within 4 business days of any "material event." The most important items:
- Item 1.01: Entry into material agreement (M&A, major contracts)
- Item 1.03: Bankruptcy / receivership
- Item 2.02: Results of operations (earnings releases)
- Item 4.02: Non-reliance on financial statements (restatements)
- Item 5.02: Director/officer departure or appointment (CEO changes)
- Item 8.01: Other material events
Architecture
The 8-K monitoring system fetches the EDGAR RSS feed every 15 minutes, filters by your watchlist CIK numbers, extracts key filing metadata, summarizes with an LLM, and sends notifications:
EDGAR RSS feed → OpenClaw HEARTBEAT (every 15 min) → filter by watchlist + item number → LLM summarization → notification
HEARTBEAT Configuration
Here's the OpenClaw HEARTBEAT config to monitor 8-Ks on a recurring schedule:
name: edgar_8k_monitor
schedule: "*/15 * * * *"
steps:
- fetch:
url: "https://www.sec.gov/cgi-bin/browse-edgar?action=getcurrent&type=8-K&dateb=&owner=include&count=40&search_text=&output=atom"
headers:
User-Agent: "YourName your@email.com"
- filter:
field: cik
values: "{{ watchlist_ciks }}"
- llm:
prompt: |
Summarize this 8-K filing in 3 bullet points.
Focus on: what happened, what item number, material impact.
Filing content: {{ content }}
- notify:
channel: email
subject: "🚨 8-K Alert: {{ company_name }} — {{ item_description }}"
Watchlist Configuration
Define your watchlist with ticker symbols and CIK numbers:
watchlist:
- ticker: AAPL
cik: "0000320193"
- ticker: MSFT
cik: "0000789019"
- ticker: NVDA
cik: "0001045810"
Python: Fetching Latest 8-Ks for a CIK
This Python function retrieves recent 8-K filings for a specific company CIK:
import httpx
def get_recent_8ks(cik: str, count: int = 10):
padded = cik.zfill(10)
url = f"https://data.sec.gov/submissions/CIK{padded}.json"
headers = {"User-Agent": "YourName your@email.com"}
r = httpx.get(url, headers=headers)
data = r.json()
filings = data["filings"]["recent"]
results = []
for i, form in enumerate(filings["form"]):
if form == "8-K":
results.append({
"date": filings["filingDate"][i],
"accession": filings["accessionNumber"][i],
"description": filings["primaryDocument"][i]
})
if len(results) >= count:
break
return results
Noise Filtering
Not all 8-Ks are equal. Filter by item number to prioritize signal over noise:
| Item | Signal Strength | Notes |
|---|---|---|
| 2.02 (Earnings) | ⭐⭐⭐⭐⭐ | Highest priority — material financial results |
| 5.02 (Executive Changes) | ⭐⭐⭐⭐⭐ | CEO/CFO departure or appointment |
| 1.01 (Material Agreement) | ⭐⭐⭐⭐ | M&A, major contracts, partnerships |
| 1.03 (Bankruptcy) | ⭐⭐⭐⭐ | Extreme events — always material |
| 4.02 (Restatement) | ⭐⭐⭐⭐ | Accounting corrections — review immediately |
| 7.01 / 8.01 (Other) | ⭐ | Often routine press releases — low signal |
FAQ
Q: How do I find a company's CIK number?
A: Search at sec.gov/cgi-bin/browse-edgar or hit data.sec.gov/submissions/CIK{padded}.json directly with a ticker symbol search.
Q: Can I monitor all 8-Ks, not just my watchlist?
A: Yes, use the full RSS feed and filter by sector using SIC codes. Note: This generates high volume — be ready to filter or you'll be overwhelmed.
Q: What User-Agent is required?
A: SEC requires identifying yourself: "CompanyName contact@email.com" format. This helps them track usage patterns and contact you if needed.