← Blog

Monitoring 8-K material events across a ticker watchlist

The 8-K is the SEC's "something just happened" form, filed within four business days of a material event. If you hold or follow a basket of names, the question you actually run all day is narrow: did any of these companies just file an 8-K worth reacting to? Doing that against raw EDGAR means one request per ticker, a code-to-label map, a materiality rule, and a dedup ledger. Here is the workflow done as a single call, and the details that decide whether it is reliable.

One request, the whole list

8-Ks are filed under the issuer's own CIK, so a per-ticker scan works here (unlike a 13D, which hides on the filer's page). Pass the whole watchlist comma-separated and gate on materiality in the same request:

curl -s -H "X-API-Key: $EDGAR_KEY" \
  "https://api.edgarevents.com/filings?ticker=AAPL,MSFT,NVDA,AMD&type=8-K&material=true&hours=24"

The response is an envelope, not a bare array:

{
  "count": 1,
  "universe": ["AAPL", "MSFT", "NVDA", "AMD"],
  "events": [
    {
      "event_type": "8-K",
      "form": "8-K",
      "ticker": "NVDA",
      "company": "NVIDIA CORP",
      "cik": "0001045810",
      "filed_date": "2026-06-18",
      "accepted": "2026-06-18T20:00:24.000Z",
      "items": [
        { "code": "8.01", "label": "other events", "material": true },
        { "code": "9.01", "label": "financial statements and exhibits", "material": false }
      ],
      "material": true,
      "accession": "0001193125-26-275783",
      "filing_url": "https://www.sec.gov/Archives/edgar/data/1045810/000119312526275783/d48176d8k.htm"
    }
  ],
  "errors": null
}

When nothing in the window matches, count is 0 and events is empty. That is the normal state most hours of most days, and it is the right answer rather than an error.

Read the envelope, not just the events

Two fields next to events keep a watchlist honest.

universe echoes the tickers the query actually resolved and scanned. Diff it against the list you sent. If you watch BRKB and it is missing, you have a symbol problem (Berkshire's B shares are BRK-B on EDGAR), and you would never see that from an empty events array alone.

errors carries per-ticker resolution failures instead of failing the whole request. A typo or a delisted symbol shows up here while the rest of the basket still returns. Log it; a silently dropped ticker is a blind spot you find out about the day it files.

Materiality and item filters

material=true drops the filings that carry only routine items: an 8-K whose items are just 9.01 (financial statements and exhibits) or 5.07 (shareholder vote results) is usually noise, and the top-level material flag is true only when at least one item on the filing is material. Each item is labeled inline so you can route on it without your own lookup table.

When you want one specific catalyst rather than everything material, filter by code. Executive changes across the basket:

curl -s -H "X-API-Key: $EDGAR_KEY" \
  "https://api.edgarevents.com/filings?ticker=AAPL,MSFT,NVDA,AMD&type=8-K&item=5.02"

item=5.02 is a director or officer departure or appointment. Swap in 2.02 for earnings releases, 1.01 for a material agreement, 1.05 for a cybersecurity incident.

The lookback window and dedup

hours sets how far back the scan reaches. It defaults to 48 and caps at 168 (one week), which shapes how you schedule the poller. Two patterns work:

A daily cron at the same time runs hours=24 and sees each filing once. Simple, and fine if a few hours of lag is acceptable.

A tighter loop (say every fifteen minutes) should use hours=2, not hours=0.25, so a filing that lands right at a boundary is not missed. The overlap means you will see the same 8-K on consecutive polls, so dedup on accession. It is the SEC's stable per-filing identifier; write it down when you first act on a filing and skip anything you have already recorded. Sort and gate on accepted, the real public timestamp, not filed_date, which is only a calendar day and will order intraday filings wrong.

When you need it faster than a poll

A loop's latency floor is its interval. If you are reacting to the 8-K to size a position, register a webhook for the same filter and the filing is POSTed to you within seconds, signed with HMAC-SHA256 so you can verify it before acting:

curl -s -X POST -H "X-API-Key: $EDGAR_KEY" -H "Content-Type: application/json" \
  -d '{"event_types":["8-K"],"tickers":["AAPL","MSFT","NVDA","AMD"],"material_only":true,"url":"https://your-app.com/hooks/edgar"}' \
  "https://api.edgarevents.com/webhooks"

Poll /filings for backfill and a heartbeat, push for the live edge. Either way the materiality call and the item labels are applied the same way every time, which is the part that rots when you own it yourself.

Free tier to try it, then $29/month, self-serve, cancel anytime. Get a key at edgarevents.com; the interactive reference is at api.edgarevents.com/docs.

EDGAR Events is an independent service and is not affiliated with or endorsed by the U.S. Securities and Exchange Commission. Data comes from the public EDGAR system (data.sec.gov, efts.sec.gov).

SEC filings, already parsed.

Typed JSON for 8-K item codes, SC 13D activist stakes, IPO forms and merger proxies. $29/mo, self-serve, cancel anytime.

Get an API key