See what companies disclosed—not why prices moved.
An open-source monitor for material company events disclosed in SEC filings, including Forms 8-K and 6-K. Material Event Radar groups structured events by filing, ranks them transparently, and always links back to the original SEC disclosure.
An independent open-source project, not an official Drillr product.
Open the live radar · JSON API · RSS feed · Architecture · Build with Drillr
- Filing first: collapses duplicate source rows by SEC accession while preserving distinct matters as sections.
- Auditable: exposes source tables, merged row counts, completeness, score components, and the original SEC filing.
- Honest about gaps: sparse extraction is hidden by default and missing terms are never inferred.
- Built for scanning: daily and 7/30-day timelines, shareable filters, local watchlists, and responsive filing dossiers.
- Open data surfaces: filtered JSON, CSV, and RSS use the same factual aggregation model as the interface.
Material Event Radar turns structured SEC filing data into a daily, auditable view of company disclosures. It currently covers acquisitions and other deals, executive departures and appointments, debt issuance, and securities offerings. Results preserve the SEC accession number and original disclosure link so every summary can be checked against its source.
Requirements: Node.js 20.9 or newer.
npm install
npm run dev:fixtureOpen http://localhost:3000/?date=2026-07-13. Fixture mode uses the real recorded July 13, 2026 validation sample and labels it clearly as historical data. It never pretends to be live.
Run with live Drillr data
cp .env.example .env.local
npm run devSet the server-only values in .env.local:
DRILLR_API_KEY=drl_replace_me
SEC_USER_AGENT=material-event-radar/0.1 your-email@example.comCreate a Drillr API key. DRILLR_API_KEY is read only by the Node.js server; it is never returned by an API route, logged, embedded in HTML, or placed in a NEXT_PUBLIC_* variable.
The public hosted instance serves rolling 1/7/30-day windows ending on the latest complete weekday. A self-hosted instance can opt into arbitrary historical dates by setting RADAR_ALLOW_HISTORICAL_DATES=true; those requests use that deployment's own server-side key.
- Queries
company_deal_events,executive_change,debt_issuance, andsecurities_offeringin four parallel requests. - Excludes synthetic
news_*accessions and joins company identity inside the queries. - Merges complementary deals, debt, offerings, departures, and appointments without discarding distinct events.
- Supports 1, 7, and 30 calendar-day views with one bounded range query per source table.
- Persists ticker watchlists only in browser local storage; no account is required and watchlists never leave the browser.
- Keeps search, category, form, completeness, window, watchlist mode, and open filing in shareable URLs.
- Provides deterministic importance-score explanations and per-section source-table provenance.
- Displays source mode, refresh time, row counts, extraction completeness, and SEC verification state.
The versioned read-only API supports identical filters across JSON, CSV, and RSS:
curl 'https://material-event-radar.vercel.app/api/v1/events?window=7&category=deal'
curl -OJL 'https://material-event-radar.vercel.app/api/v1/events?format=csv'Subscribe to a filtered feed:
https://material-event-radar.vercel.app/feed.xml?window=7&tickers=NVDA,AAPL
See Public API and feeds for parameters, response shape, rate limits, and caching behavior.
Browser
└─ Next.js server API
├─ 4 parallel Drillr SQL requests
├─ accession aggregation and deterministic ranking
├─ SEC link/form verification for daily views
└─ shared persistent date/window cache
The hosted routes apply conservative request budgets and reuse a persistent date/window cache. The detailed boundaries and range-query design are documented in Architecture.
The hosted site uses Vercel Web Analytics for anonymous, aggregate page views and referrers. It does not use analytics cookies or custom interaction events. Query strings and URL fragments are removed before an event is sent, so searches, tickers, watchlists, filters, and selected filings are not included in analytics. Outbound Drillr links use readable branded short links; Drillr records the project source after a click without exposing UTM parameters in the browser address bar.
The fixed 2026-07-13 regression fixture represents 30 structured rows collapsed into 13 filings. It covers:
- Public Storage notes offering
- Plug Power's two property transactions in one filing
- Agenus and Silo Pharma private placements
- Data I/O's nine records and three logical sections
- N-able's departure/appointment transition
- Braskem's Form 6-K boundary
- the historical sparse-extraction case for TOP Financial
Run the full local quality suite:
npm test
npm run typecheck
npm run lint
npm run build
npm run test:e2ePlaywright automatically starts fixture mode, so browser tests do not need production credentials. GitHub Actions runs the same unit, type, lint, build, browser, and CodeQL checks.
| Variable | Required | Default | Purpose |
|---|---|---|---|
DRILLR_API_KEY |
Live mode | — | Server-side Drillr authentication |
RADAR_DATA_MODE |
No | live |
Set fixture for the recorded validation sample |
DRILLR_API_BASE_URL |
No | https://gateway.drillr.ai |
Drillr REST base URL |
SEC_USER_AGENT |
Recommended | App identifier | Identifies SEC requests responsibly |
EVENT_CACHE_TTL_SECONDS |
No | 3600 |
Shared aggregated date/window cache |
SEC_METADATA_CACHE_TTL_SECONDS |
No | 604800 |
SEC form/link metadata cache |
RADAR_ALLOW_HISTORICAL_DATES |
No | false |
Permit arbitrary dates on a self-hosted instance |
PUBLIC_MAX_FILINGS |
No | 100 |
Maximum JSON/CSV filings returned per request |
PUBLIC_MAX_RSS_ITEMS |
No | 50 |
Maximum RSS items returned per request |
PUBLIC_RATE_LIMIT_PER_MINUTE |
No | 20 |
Best-effort per-address minute budget |
PUBLIC_RATE_LIMIT_PER_DAY |
No | 200 |
Best-effort per-address daily budget |
Read CONTRIBUTING.md, browse the roadmap, or start with a good first issue. Questions and open-ended ideas belong in Discussions.
Report vulnerabilities privately through the instructions in SECURITY.md. Community participation follows the Code of Conduct. Release history is in CHANGELOG.md.
This project reports what a company disclosed. It does not mix news with filings, infer missing financial terms, attribute stock moves, manage portfolios, or make buy/sell recommendations.
MIT licensed. This independent project accesses structured event data through Drillr; SEC.gov remains the original disclosure source. It is not affiliated with or endorsed by Drillr.

