← Blog

Tracking M&A deals from SEC filings: a typed JSON feed

When two public companies agree to a deal, the news hits the tape first, but the record hits EDGAR. The target files an 8-K saying it signed a definitive agreement, and over the following weeks both sides file the proxy material that takes the deal to a shareholder vote. If you run merger arbitrage, build a deal-monitoring tool, or just want to know the moment a name in your book gets a bid, those filings are the ground truth, earlier and more precise than a headline, and they say exactly what was signed.

The catch is that a single deal does not arrive as one tidy "merger" record. It arrives as a handful of differently-shaped forms, filed under different CIKs, spread across the deal's life.

Where a deal shows up in EDGAR

There are two surfaces, and a complete picture needs both.

The first is the 8-K. When a company signs a merger agreement, it reports it under item 1.01, "entry into a material definitive agreement," within four business days. That is the fastest signal: the announcement, machine-readable, usually the same day the deal is public. The same item 1.01 also fires for financing agreements and big commercial contracts, so the item code tells you a material agreement exists, not that it is specifically a merger; you read the 8-K or the follow-on proxy to confirm which.

The second surface is the proxy trail. A merger that needs a shareholder vote generates its own forms:

Form What it is
425 Prospectus / communication about a business combination
PREM14A Preliminary merger proxy statement
DEFM14A Definitive merger proxy statement
DEFA14A Additional proxy soliciting material

These are unambiguous: a DEFM14A is only ever a merger going to a vote. They come later than the 8-K, but they carry the terms, the board's reasoning, and the timeline. Watch the 8-K for the announcement and the proxy forms for everything that follows.

Why it is awkward as data

Pull a company's submissions feed from data.sec.gov and the forms come back as parallel arrays of bare strings. Reconstructing a deal from that means doing several jobs at once:

  1. Recognize the merger forms by string. 425, PREM14A, DEFM14A, DEFA14A are the live set, and the proxy variants are easy to confuse with the ordinary DEF 14A annual meeting proxy, which is not a merger at all.
  2. Find item 1.01 inside the 8-K. The item arrives as a comma-joined string like 1.01,9.01, so you are substring-matching a code out of a list and deciding whether the rest of the filing is noise.
  3. Watch both sides. The agreement can be reported by the target, the acquirer, or both, under separate CIKs. If you only track one ticker you miss half the trail.
  4. Gate on the right timestamp. The useful time is acceptanceDateTime, when the filing went public, not filingDate, a calendar date that buckets a whole day together.

None of this is hard. It is just the kind of glue that quietly breaks when the SEC adds a form or a deal is structured in a way your string matching did not anticipate, and a missed DEFM14A is a missed deal.

The typed shape

EDGAR Events does the recognition and hands back labeled JSON. The 8-K announcement comes through as an 8-K event with item 1.01 already parsed:

{
  "event_type": "8-K",
  "form": "8-K",
  "ticker": "...",
  "company": "...",
  "filed_date": "2026-06-22",
  "accepted": "2026-06-22T12:41:08.000Z",
  "items": [
    { "code": "1.01", "label": "entry into material definitive agreement", "material": true },
    { "code": "9.01", "label": "financial statements and exhibits", "material": false }
  ],
  "summary": "8-K: 1.01 (entry into material definitive agreement); 9.01 (financial statements and exhibits)",
  "material": true,
  "accession": "...",
  "filing_url": "https://www.sec.gov/Archives/edgar/data/.../...",
  "source": "submissions"
}

The proxy filings come through with event_type set to merger and the form labeled:

{
  "event_type": "merger",
  "form": "DEFM14A",
  "ticker": "...",
  "company": "...",
  "filed_date": "2026-07-10",
  "accepted": "2026-07-10T21:03:55.000Z",
  "summary": "definitive merger proxy",
  "material": true,
  "accession": "...",
  "filing_url": "https://www.sec.gov/Archives/edgar/data/.../...",
  "source": "submissions"
}

Every merger form maps to a plain label: 425 is a merger communication, PREM14A a preliminary merger proxy, DEFM14A a definitive merger proxy, DEFA14A additional soliciting material. You branch on event_type and form, not on a string-matching table you maintain.

Pulling it

For the announcement, filter the 8-K stream to item 1.01 across the names you care about:

curl -s -H "X-API-Key: $EDGAR_KEY" \
  "https://api.edgarevents.com/filings?ticker=WBD,PARA,LYV&type=8-K&item=1.01"

For the proxy trail, ask for the specific form:

curl -s -H "X-API-Key: $EDGAR_KEY" \
  "https://api.edgarevents.com/filings?ticker=WBD,PARA,LYV&type=DEFM14A"

Or pull everything typed for a name and branch on event_type in your own code; 8-K, merger, activist_stake, and ipo_or_prospectus all come back from the same call:

curl -s -H "X-API-Key: $EDGAR_KEY" \
  "https://api.edgarevents.com/filings/WBD?hours=168"

hours sets the lookback up to a week, material=true drops the routine forms, and since takes an ISO timestamp if you are polling on a cursor.

Push, don't poll

Deals do not wait for your next poll. Register a webhook for the 8-K and merger streams and matching filings are POSTed to you within seconds:

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

You get every material 8-K and every merger form for those tickers; in your handler, check event_type == "merger" or scan items for code 1.01 to route the deal-relevant ones. Each delivery is signed with HMAC-SHA256 in the X-Edgar-Signature header, so you can verify it before acting.

Do you need this?

If you are happy owning the form-string set, the item-1.01 substring match, the both-sides CIK dedup, and a polling loop against the SEC rate limit, a library like edgartools gets you the raw filings for free. What you pay for here is not having to keep that glue alive: the merger forms stay recognized as the SEC revises them, item 1.01 is parsed and labeled the same way every time, and a signed event is pushed to you instead of you diffing the submissions feed on a timer.

It is $29/month, self-serve, live from data.sec.gov, cancel anytime. Grab a key at edgarevents.com; the full interactive reference is at api.edgarevents.com/docs.

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