[object Object]

← back to Re Flyer Aggregator

EDGAR monitor: West-footprint sweep + filing enrichment (property/price/sqft), earnings-release filter + Item 2.01 closed-deal flag + $/SF sanity gate (never publish a wrong price). Finding: Item 2.01 RE 8-Ks are sparse -> EDGAR is a thin free signal, not a full feed (TK-10708)

dda8f015e55d197446837f0f27f8cb9cf496d9f1 · 2026-08-19 13:39:18 -0700 · Steve Abrams

Files touched

Diff

commit dda8f015e55d197446837f0f27f8cb9cf496d9f1
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Aug 19 13:39:18 2026 -0700

    EDGAR monitor: West-footprint sweep + filing enrichment (property/price/sqft), earnings-release filter + Item 2.01 closed-deal flag + $/SF sanity gate (never publish a wrong price). Finding: Item 2.01 RE 8-Ks are sparse -> EDGAR is a thin free signal, not a full feed (TK-10708)
---
 data/edgar-seen.json                |   2 +-
 out/edgar-new-deals-2026-08-19.json | 268 ++++++++++++------------------------
 scripts/edgar-cre-monitor.mjs       | 137 ++++++++++++------
 3 files changed, 184 insertions(+), 223 deletions(-)

diff --git a/data/edgar-seen.json b/data/edgar-seen.json
index 2fc4692..ece88d1 100644
--- a/data/edgar-seen.json
+++ b/data/edgar-seen.json
@@ -1 +1 @@
-["0001364250-26-000038","0001482512-26-000064","0001628280-26-049820","0000908311-26-000096","0000034903-26-000040","0001571283-26-000037","0001037540-26-000031","0000049600-26-000040","0001360604-26-000063","0001193125-26-344730","0001307748-26-000191","0001631569-26-000039","0001193125-26-323784","0001476204-26-000030","0001193125-26-328612","0001437749-26-025519","0001286043-26-000045","0001628280-26-049346","0001193125-26-321040","0000915912-26-000018","0001717547-26-000059","0001581068-26-000027","0001095651-26-000022","0001868159-26-000038","0001193125-26-342419","0001628280-26-050409","0001539497-26-002300","0001539497-26-002258","0001539497-26-002293","0001539497-26-001974","0001539497-26-002021","0001539497-26-002210"]
\ No newline at end of file
+["0001364250-26-000038","0001482512-26-000064","0000899689-26-000048","0001677576-26-000003","0001571283-26-000037","0001628280-26-049820","0001500217-26-000043","0000049600-26-000040","0001854964-26-000025","0001360604-26-000063","0000912242-26-000034","0000034903-26-000040","0001628280-26-049346","0001873923-26-000105","0001307748-26-000191","0001628280-26-053386","0000908311-26-000096","0000917251-26-000061","0001193125-26-321040","0001075415-26-000029","0001611547-26-000058","0001527541-26-000254","0001456772-26-000034","0000945394-26-000048","0001476204-26-000030","0001193125-26-344730","0000915912-26-000018","0001617406-26-000038","0001628280-26-052071","0001193125-26-328612","0001193125-26-323784","0001437749-26-025519","0001035443-26-000067","0001104659-26-091251","0001104659-26-086260","0001025378-26-000114","0001104659-26-089980","0001140361-26-032873","0001628280-26-057231","0001104659-26-084849","0001581068-26-000027","0001756770-26-000079","0001628280-26-054326","0001213900-26-084882","0001539497-26-002258","0001539497-26-002300","0001539497-26-002293","0001539497-26-002021","0001539497-26-002210","0001104659-26-087536","0000910108-26-000047","0001193125-26-331498","0001286043-26-000045","0001628280-26-052544","0001628280-26-057243","0001628280-26-054906","0001479094-26-000025","0001437749-26-024458","0001104659-26-086874","0001424182-26-000061","0001631569-26-000039","0001705696-26-000088","0001193125-26-342419","0001104659-26-092962","0000860546-26-000034","0001717307-26-000039","0001037540-26-000031","0001042776-26-000064","0001286043-26-000046","0000907254-26-000047","0001018164-26-000070","0001628280-26-048955","0001213900-26-079426","0001628280-26-057288","0001628280-26-057287","0001628280-26-057363","0001104659-26-091634","0001104659-26-087720","0001104659-26-087561","0000844059-26-000083","0001289490-26-000048","0001095651-26-000022","0001539497-26-002284","0001104659-26-087553","0000025232-26-000061","0001193125-26-336727","0001628280-26-050608","0000790816-26-000025","0001837671-26-000060","0001193125-26-352377","0001628280-26-049210","0001193125-26-322090","0001048268-26-000131","0001193125-26-324855","0001492298-26-000027","0001104659-26-092380","0001193125-26-330810","0001628280-26-050409","0001193125-26-347968","0001045450-26-000033"]
\ No newline at end of file
diff --git a/out/edgar-new-deals-2026-08-19.json b/out/edgar-new-deals-2026-08-19.json
index 2f0bde1..85cfd67 100644
--- a/out/edgar-new-deals-2026-08-19.json
+++ b/out/edgar-new-deals-2026-08-19.json
@@ -1,194 +1,98 @@
 [
-  {
-    "filer": "Douglas Emmett Inc  (DEI)  (CIK 0001364250)",
-    "file_date": "2026-08-04",
-    "accession": "0001364250-26-000038",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1364250/000136425026000038/0001364250-26-000038-index.htm"
-  },
-  {
-    "filer": "Hudson Pacific Properties, Inc.  (HPP, HPP-PC)  (CIK 0001482512)",
-    "file_date": "2026-08-05",
-    "accession": "0001482512-26-000064",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1482512/000148251226000064/0001482512-26-000064-index.htm"
-  },
-  {
-    "filer": "KILROY REALTY CORP  (KRC)  (CIK 0001025996)",
-    "file_date": "2026-07-27",
-    "accession": "0001628280-26-049820",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1025996/000162828026049820/0001628280-26-049820-index.htm"
-  },
   {
     "filer": "Creative Media & Community Trust Corp  (CMCT)  (CIK 0000908311)",
     "file_date": "2026-08-14",
     "accession": "0000908311-26-000096",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/908311/000090831126000096/0000908311-26-000096-index.htm"
-  },
-  {
-    "filer": "FEDERAL REALTY INVESTMENT TRUST  (FRT, FRT-PC)  (CIK 0000034903)",
-    "file_date": "2026-07-31",
-    "accession": "0000034903-26-000040",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/34903/000003490326000040/0000034903-26-000040-index.htm"
-  },
-  {
-    "filer": "Rexford Industrial Realty, Inc.  (REXR, REXR-PB, REXR-PC)  (CIK 0001571283)",
-    "file_date": "2026-07-23",
-    "accession": "0001571283-26-000037",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1571283/000157128326000037/0001571283-26-000037-index.htm"
-  },
-  {
-    "filer": "BXP, Inc.  (BXP)  (CIK 0001037540)",
-    "file_date": "2026-07-28",
-    "accession": "0001037540-26-000031",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1037540/000103754026000031/0001037540-26-000031-index.htm"
-  },
-  {
-    "filer": "EASTGROUP PROPERTIES INC  (EGP)  (CIK 0000049600)",
-    "file_date": "2026-07-22",
-    "accession": "0000049600-26-000040",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/49600/000004960026000040/0000049600-26-000040-index.htm"
-  },
-  {
-    "filer": "Healthcare Realty Trust Inc  (HR)  (CIK 0001360604)",
-    "file_date": "2026-07-30",
-    "accession": "0001360604-26-000063",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1360604/000136060426000063/0001360604-26-000063-index.htm"
+    "cik": "908311",
+    "region": "California",
+    "filing_url": "https://www.sec.gov/Archives/edgar/data/908311/000090831126000096/cmct-20260814.htm",
+    "kind": "deal",
+    "item201": false,
+    "price": null,
+    "price_label": null,
+    "price_confidence": null,
+    "sqft": null,
+    "property_type": null,
+    "location": null
+  },
+  {
+    "filer": "DIVERSIFIED HEALTHCARE TRUST  (DHC, DHCNI, DHCNL)  (CIK 0001075415)",
+    "file_date": "2026-08-03",
+    "accession": "0001075415-26-000029",
+    "cik": "1075415",
+    "region": "California",
+    "filing_url": "https://www.sec.gov/Archives/edgar/data/1075415/000107541526000029/dhc-20260803.htm",
+    "kind": "deal",
+    "item201": false,
+    "price": null,
+    "price_label": null,
+    "price_confidence": null,
+    "sqft": null,
+    "property_type": null,
+    "location": null
+  },
+  {
+    "filer": "Wheeler Real Estate Investment Trust, Inc.  (WHLR, WHLRD, WHLRL, WHLRP)  (CIK 0001527541)",
+    "file_date": "2026-08-06",
+    "accession": "0001527541-26-000254",
+    "cik": "1527541",
+    "region": "California",
+    "filing_url": "https://www.sec.gov/Archives/edgar/data/1527541/000152754126000254/ex991earningsannouncementq.htm",
+    "kind": "deal",
+    "item201": false,
+    "price": null,
+    "price_label": null,
+    "price_confidence": null,
+    "sqft": null,
+    "property_type": "retail",
+    "location": null
+  },
+  {
+    "filer": "OFFICE PROPERTIES INCOME TRUST  (OPI)  (CIK 0001456772)",
+    "file_date": "2026-08-05",
+    "accession": "0001456772-26-000034",
+    "cik": "1456772",
+    "region": "California",
+    "filing_url": "https://www.sec.gov/Archives/edgar/data/1456772/000145677226000034/opi-20260805.htm",
+    "kind": "deal",
+    "item201": false,
+    "price": null,
+    "price_label": null,
+    "price_confidence": null,
+    "sqft": null,
+    "property_type": "office",
+    "location": null
+  },
+  {
+    "filer": "Service Properties Trust  (SVC)  (CIK 0000945394)",
+    "file_date": "2026-08-05",
+    "accession": "0000945394-26-000048",
+    "cik": "945394",
+    "region": "California",
+    "filing_url": "https://www.sec.gov/Archives/edgar/data/945394/000094539426000048/R1.htm",
+    "kind": "deal",
+    "item201": false,
+    "price": null,
+    "price_label": null,
+    "price_confidence": null,
+    "sqft": null,
+    "property_type": "office",
+    "location": null
   },
   {
     "filer": "KILROY REALTY CORP  (KRC)  (CIK 0001025996)",
     "file_date": "2026-08-11",
     "accession": "0001193125-26-344730",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1025996/000119312526344730/0001193125-26-344730-index.htm"
-  },
-  {
-    "filer": "InvenTrust Properties Corp.  (IVT)  (CIK 0001307748)",
-    "file_date": "2026-08-03",
-    "accession": "0001307748-26-000191",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1307748/000130774826000191/0001307748-26-000191-index.htm"
-  },
-  {
-    "filer": "Community Healthcare Trust Inc  (CHCT)  (CIK 0001631569)",
-    "file_date": "2026-08-04",
-    "accession": "0001631569-26-000039",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1631569/000163156926000039/0001631569-26-000039-index.htm"
-  },
-  {
-    "filer": "REGENCY CENTERS CORP  (REG, REGCO, REGCP)  (CIK 0000910606)",
-    "file_date": "2026-07-29",
-    "accession": "0001193125-26-323784",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/910606/000119312526323784/0001193125-26-323784-index.htm"
-  },
-  {
-    "filer": "Phillips Edison & Company, Inc.  (PECO)  (CIK 0001476204)",
-    "file_date": "2026-07-23",
-    "accession": "0001476204-26-000030",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1476204/000147620426000030/0001476204-26-000030-index.htm"
-  },
-  {
-    "filer": "EQUITY RESIDENTIAL  (EQR)  (CIK 0000906107)",
-    "file_date": "2026-07-31",
-    "accession": "0001193125-26-328612",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/906107/000119312526328612/0001193125-26-328612-index.htm"
-  },
-  {
-    "filer": "Chatham Lodging Trust  (CLDT, CLDT-PA)  (CIK 0001476045)",
-    "file_date": "2026-08-04",
-    "accession": "0001437749-26-025519",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1476045/000143774926025519/0001437749-26-025519-index.htm"
-  },
-  {
-    "filer": "KITE REALTY GROUP TRUST  (KRG)  (CIK 0001286043)",
-    "file_date": "2026-07-30",
-    "accession": "0001286043-26-000045",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1286043/000128604326000045/0001286043-26-000045-index.htm"
-  },
-  {
-    "filer": "SL GREEN REALTY CORP  (SLG, SLG-PI)  (CIK 0001040971)",
-    "file_date": "2026-07-23",
-    "accession": "0001628280-26-049346",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1040971/000162828026049346/0001628280-26-049346-index.htm"
-  },
-  {
-    "filer": "ACADIA REALTY TRUST  (AKR)  (CIK 0000899629)",
-    "file_date": "2026-07-28",
-    "accession": "0001193125-26-321040",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/899629/000119312526321040/0001193125-26-321040-index.htm"
-  },
-  {
-    "filer": "AVALONBAY COMMUNITIES INC  (AVB)  (CIK 0000915912)",
-    "file_date": "2026-07-23",
-    "accession": "0000915912-26-000018",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/915912/000091591226000018/0000915912-26-000018-index.htm"
-  },
-  {
-    "filer": "BrightSpire Capital, Inc.  (BRSP)  (CIK 0001717547)",
-    "file_date": "2026-07-28",
-    "accession": "0001717547-26-000059",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1717547/000171754726000059/0001717547-26-000059-index.htm"
-  },
-  {
-    "filer": "Brixmor Property Group Inc.  (BRX)  (CIK 0001581068)",
-    "file_date": "2026-07-27",
-    "accession": "0001581068-26-000027",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1581068/000158106826000027/0001581068-26-000027-index.htm"
-  },
-  {
-    "filer": "Safehold Inc.  (SAFE)  (CIK 0001095651)",
-    "file_date": "2026-07-30",
-    "accession": "0001095651-26-000022",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1095651/000109565126000022/0001095651-26-000022-index.htm"
-  },
-  {
-    "filer": "Lineage, Inc.  (LINE)  (CIK 0001868159)",
-    "file_date": "2026-08-05",
-    "accession": "0001868159-26-000038",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1868159/000186815926000038/0001868159-26-000038-index.htm"
-  },
-  {
-    "filer": "Apple Hospitality REIT, Inc.  (APLE)  (CIK 0001418121)",
-    "file_date": "2026-08-10",
-    "accession": "0001193125-26-342419",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1418121/000119312526342419/0001193125-26-342419-index.htm"
-  },
-  {
-    "filer": "NEWMARK GROUP, INC.  (NMRK)  (CIK 0001690680)",
-    "file_date": "2026-07-29",
-    "accession": "0001628280-26-050409",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/1690680/000162828026050409/0001628280-26-050409-index.htm"
-  },
-  {
-    "filer": "BMO 2026-C15 Mortgage Trust  (CIK 0002063009)",
-    "file_date": "2026-08-18",
-    "accession": "0001539497-26-002300",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/2063009/000153949726002300/0001539497-26-002300-index.htm"
-  },
-  {
-    "filer": "Morgan Stanley Bank of America Merrill Lynch Trust 2026-C36  (CIK 0002145539)",
-    "file_date": "2026-08-14",
-    "accession": "0001539497-26-002258",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/2145539/000153949726002258/0001539497-26-002258-index.htm"
-  },
-  {
-    "filer": "Benchmark 2026-V23 Mortgage Trust  (CIK 0002148615)",
-    "file_date": "2026-08-18",
-    "accession": "0001539497-26-002293",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/2148615/000153949726002293/0001539497-26-002293-index.htm"
-  },
-  {
-    "filer": "Citigroup Commercial Mortgage Trust 2026-MFAM1  (CIK 0002143199)",
-    "file_date": "2026-07-17",
-    "accession": "0001539497-26-001974",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/2143199/000153949726001974/0001539497-26-001974-index.htm"
-  },
-  {
-    "filer": "Citigroup Commercial Mortgage Trust 2026-MFAM1  (CIK 0002143199)",
-    "file_date": "2026-07-29",
-    "accession": "0001539497-26-002021",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/2143199/000153949726002021/0001539497-26-002021-index.htm"
-  },
-  {
-    "filer": "BMO 2026-5C16 Mortgage Trust  (CIK 0002136643)",
-    "file_date": "2026-08-13",
-    "accession": "0001539497-26-002210",
-    "filing_url": "https://www.sec.gov/Archives/edgar/data/2136643/000153949726002210/0001539497-26-002210-index.htm"
+    "cik": "1025996",
+    "region": "California",
+    "filing_url": "https://www.sec.gov/Archives/edgar/data/1025996/000119312526344730/d64354dex991.htm",
+    "kind": "deal",
+    "item201": false,
+    "price": null,
+    "price_label": null,
+    "price_confidence": null,
+    "sqft": null,
+    "property_type": "life science",
+    "location": null
   }
 ]
\ No newline at end of file
diff --git a/scripts/edgar-cre-monitor.mjs b/scripts/edgar-cre-monitor.mjs
index 168642f..b93bf55 100644
--- a/scripts/edgar-cre-monitor.mjs
+++ b/scripts/edgar-cre-monitor.mjs
@@ -1,12 +1,11 @@
 #!/usr/bin/env node
-// TK-10708  FREE "be first to a closed deal" monitor. SEC EDGAR full-text search for
-// recent 8-K real-estate acquisition filings -- public buyers/REITs disclose closings
-// the day they happen, often BEFORE the trade press. $0, same-day, no key, no owner names.
+// TK-10708  FREE "be first to a closed deal" monitor + enrichment.
+// SEC EDGAR full-text search for recent 8-K real-estate ACQUISITION filings across the
+// RENTV West footprint, then fetches each NEW filing and extracts property + price so the
+// alert reads "Kilroy acquired [property/city] for $[X]". $0, no key, no owner names.
 //
-// Covers institutional/public-company deals (a subset, but the newsworthy big ones).
-// Dedupes by accession number so each run surfaces only what's NEW -> the alert feed.
-//
-// Usage: node scripts/edgar-cre-monitor.mjs [--loc "Los Angeles"] [--days 30]
+// Covers public-company / REIT deals (the big newsworthy ones). Dedupes by accession.
+// Usage: node scripts/edgar-cre-monitor.mjs [--days 14] [--max 30] [--dry]
 
 import { readFileSync, writeFileSync, existsSync } from 'node:fs';
 import { fileURLToPath } from 'node:url';
@@ -15,54 +14,112 @@ import { dirname, join } from 'node:path';
 const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
 const args = process.argv.slice(2);
 const getArg = (f, d) => { const i = args.indexOf(f); return i >= 0 ? args[i + 1] : d; };
-const LOC = getArg('--loc', 'Los Angeles');
-const DAYS = parseInt(getArg('--days', '30'), 10);
+const DAYS = parseInt(getArg('--days', '14'), 10);
+const MAX_ENRICH = parseInt(getArg('--max', '30'), 10);
 const UA = 'DW-research steve@designerwallcoverings.com';   // SEC requires a UA
 const SEEN_FILE = join(ROOT, 'data', 'edgar-seen.json');
+// RENTV West footprint (state names match "City, State" in filing text).
+const REGIONS = ['California', 'Arizona', 'Nevada', 'Washington', 'Oregon', 'Colorado', 'Texas'];
 
+const sleep = ms => new Promise(r => setTimeout(r, ms));
 const today = new Date();
 const start = new Date(today.getTime() - DAYS * 864e5).toISOString().slice(0, 10);
 const end = today.toISOString().slice(0, 10);
 
-// RE-acquisition signal: property size + location + "acquired". Filters out non-RE noise.
-const q = `"square feet" "${LOC}" "acquired"`;
-const url = `https://efts.sec.gov/LATEST/search-index?q=${encodeURIComponent(q)}&forms=8-K&startdt=${start}&enddt=${end}`;
+async function ftsFor(region) {
+  const q = `"square feet" "${region}" "acquired"`;
+  const url = `https://efts.sec.gov/LATEST/search-index?q=${encodeURIComponent(q)}&forms=8-K&startdt=${start}&enddt=${end}`;
+  const r = await fetch(url, { headers: { 'User-Agent': UA } });
+  if (!r.ok) return [];
+  const d = await r.json();
+  return (d.hits?.hits || []).map(h => {
+    const s = h._source || {};
+    const [accn] = (h._id || '').split(':');
+    const cik = (s.ciks && s.ciks[0]) ? String(s.ciks[0]).replace(/^0+/, '') : null;
+    return { filer: (s.display_names || ['?'])[0], file_date: s.file_date, accession: accn, cik, region };
+  });
+}
 
-const res = await fetch(url, { headers: { 'User-Agent': UA } });
-if (!res.ok) { console.error('EDGAR HTTP', res.status); process.exit(1); }
-const data = await res.json();
-const hits = data.hits?.hits || [];
+// --- deal-detail extraction from a filing's text ---
+const stripTags = html => html.replace(/<[^>]+>/g, ' ').replace(/&nbsp;/g, ' ').replace(/&amp;/g, '&').replace(/&#\d+;/g, ' ').replace(/\s+/g, ' ').trim();
+function extractDeal(text) {
+  const out = { price: null, price_label: null, price_confidence: null, sqft: null, property_type: null, location: null };
+  const sf = text.match(/([\d,]{4,})\s*(?:rentable\s*)?(?:square feet|sq\.?\s*ft)/i);
+  if (sf) out.sqft = parseInt(sf[1].replace(/,/g, ''), 10);
+  // price: ONLY amounts anchored to deal-price context (avoid balance-sheet/portfolio numbers).
+  const priceRe = /\$\s?([\d,]+(?:\.\d+)?)\s*(billion|million)\b/gi;
+  const DEAL = /(purchase price|acquisition price|aggregate (?:consideration|purchase)|consideration of|acquired .{0,30}for|for approximately|sold .{0,20}for|sale price|total consideration|for a (?:purchase|total))/i;
+  const cands = []; let m;
+  while ((m = priceRe.exec(text))) {
+    const val = parseFloat(m[1].replace(/,/g, '')) * (/billion/i.test(m[2]) ? 1e9 : 1e6);
+    const ctx = text.slice(Math.max(0, m.index - 70), m.index + 15);
+    if (DEAL.test(ctx)) cands.push({ val, label: `$${m[1]} ${m[2].toLowerCase()}` });
+  }
+  // $/SF sanity gate (plausible CRE range) when sqft is known
+  const ok = c => !out.sqft || (c.val / out.sqft >= 50 && c.val / out.sqft <= 5000);
+  const plausible = cands.filter(ok);
+  const chosen = plausible[0] || null;           // first deal-anchored, sanity-passing figure
+  if (chosen) { out.price = Math.round(chosen.val); out.price_label = chosen.label; out.price_confidence = out.sqft ? 'anchored+ppsf-ok' : 'anchored'; }
+  else if (cands.length) { out.price_confidence = 'anchored-but-implausible-ppsf'; } // leave price null, flag
+  const pt = text.match(/\b(office|industrial|logistics|warehouse|retail|multifamily|apartment|life science|data center|self[- ]storage|hotel|mixed[- ]use|medical office)\b/i);
+  if (pt) out.property_type = pt[1].toLowerCase();
+  const loc = text.match(/located (?:in|at|within)\s+([^.,;]{3,60}?,\s*(?:California|Arizona|Nevada|Washington|Oregon|Colorado|Texas|CA|AZ|NV|WA|OR|CO|TX))\b/i)
+           || text.match(/\bin\s+([A-Z][a-zA-Z ]{2,30},\s*(?:California|Arizona|Nevada|Washington|Oregon|Colorado|Texas))\b/);
+  if (loc) out.location = loc[1].replace(/\s+/g, ' ').trim();
+  return out;
+}
 
-const parse = h => {
-  const s = h._source || {};
-  const [accn, doc] = (h._id || '').split(':');
-  const cik = (s.ciks && s.ciks[0]) ? String(s.ciks[0]).replace(/^0+/, '') : null;
-  const accnClean = (accn || '').replace(/-/g, '');
-  const filingUrl = cik && accn ? `https://www.sec.gov/Archives/edgar/data/${cik}/${accnClean}/${accn}-index.htm` : null;
-  return {
-    filer: (s.display_names || ['?'])[0],
-    file_date: s.file_date,
-    accession: accn,
-    filing_url: filingUrl,
-  };
-};
-const deals = [];
-const byAccn = new Set();
-for (const d of hits.map(parse)) { if (d.accession && !byAccn.has(d.accession)) { byAccn.add(d.accession); deals.push(d); } }
+async function enrich(d) {
+  try {
+    const accnClean = d.accession.replace(/-/g, '');
+    const idxUrl = `https://www.sec.gov/Archives/edgar/data/${d.cik}/${accnClean}/index.json`;
+    const idx = await (await fetch(idxUrl, { headers: { 'User-Agent': UA } })).json();
+    const items = idx.directory?.item || [];
+    // prefer a press-release exhibit (EX-99), else the primary 8-K htm
+    const pick = items.find(i => /ex-?99.*\.htm/i.test(i.name)) || items.find(i => /\.htm$/i.test(i.name) && !/index/i.test(i.name));
+    if (!pick) return { ...d, filing_url: `https://www.sec.gov/Archives/edgar/data/${d.cik}/${accnClean}/${d.accession}-index.htm` };
+    const docUrl = `https://www.sec.gov/Archives/edgar/data/${d.cik}/${accnClean}/${pick.name}`;
+    const text = stripTags(await (await fetch(docUrl, { headers: { 'User-Agent': UA } })).text()).slice(0, 40000);
+    // Classify: quarterly EARNINGS releases mention "acquired"/"square feet" in passing but
+    // are NOT single-deal announcements. Drop them so the feed is real closed deals only.
+    const earningsHits = (text.match(/funds from operations|\bFFO\b|per diluted share|quarter ended|nine months ended|net income available/gi) || []).length;
+    // Item 2.01 = "Completion of Acquisition or Disposition of Assets" = a CLOSED deal (vs 2.02 earnings).
+    const item201 = /Item\s*2\.01|Completion of (?:the )?Acquisition or Disposition/i.test(text);
+    const kind = item201 ? 'closed_deal' : (earningsHits >= 2 ? 'earnings' : 'deal');
+    return { ...d, filing_url: docUrl, kind, item201, ...extractDeal(text) };
+  } catch { return { ...d, filing_url: null }; }
+}
+
+// 1) sweep regions, merge+dedupe by accession
+const all = [];
+for (const region of REGIONS) { all.push(...await ftsFor(region)); await sleep(150); }
+const byAccn = new Map();
+for (const d of all) if (!byAccn.has(d.accession)) byAccn.set(d.accession, d);
+const deals = [...byAccn.values()];
 
 const seen = existsSync(SEEN_FILE) ? new Set(JSON.parse(readFileSync(SEEN_FILE, 'utf8'))) : new Set();
 const fresh = deals.filter(d => !seen.has(d.accession));
+console.log(`EDGAR West-footprint RE 8-Ks (last ${DAYS}d): ${deals.length} total, ${fresh.length} NEW. Enriching up to ${MAX_ENRICH}...`);
+
+// 2) enrich new filings (rate-limited, SEC-polite)
+const enriched = [];
+for (const d of fresh.slice(0, MAX_ENRICH)) { enriched.push(await enrich(d)); await sleep(150); }
 
-console.log(`EDGAR RE-acquisition 8-Ks for "${LOC}" (last ${DAYS}d): ${deals.length} total, ${fresh.length} NEW.`);
-for (const d of fresh.slice(0, 12)) console.log(`  NEW  ${d.file_date}  ${d.filer.slice(0, 50)}  ${d.filing_url}`);
+const realDeals = enriched.filter(d => d.kind === 'closed_deal' || d.kind === 'deal')
+  .sort((a, b) => (b.kind === 'closed_deal') - (a.kind === 'closed_deal'));
+const closed = realDeals.filter(d => d.kind === 'closed_deal').length;
+const earnings = enriched.filter(d => d.kind === 'earnings');
+console.log(`-> ${closed} CLOSED-deal (Item 2.01), ${realDeals.length - closed} other acquisition 8-Ks, ${earnings.length} earnings dropped.`);
+for (const d of realDeals) {
+  const price = d.price_label || '$? (see filing)';
+  const where = d.location || d.region;
+  const pt = d.property_type ? ` ${d.property_type}` : '';
+  console.log(`  ${d.file_date}  ${d.filer.split('(')[0].trim().slice(0,32)} acquired${pt} in ${where} for ${price}${d.sqft ? ` (${d.sqft.toLocaleString()} SF)` : ''}`);
+}
 
-// persist seen + write the new-deal alert feed ("tell people first")
 if (!args.includes('--dry')) {
   deals.forEach(d => seen.add(d.accession));
   writeFileSync(SEEN_FILE, JSON.stringify([...seen], null, 0));
-  if (fresh.length) {
-    const stamp = end;
-    writeFileSync(join(ROOT, 'out', `edgar-new-deals-${stamp}.json`), JSON.stringify(fresh, null, 2));
-    console.log(`-> wrote out/edgar-new-deals-${stamp}.json (${fresh.length} new) for the alert feed.`);
-  }
+  if (realDeals.length) writeFileSync(join(ROOT, 'out', `edgar-new-deals-${end}.json`), JSON.stringify(realDeals, null, 2));
+  console.log(realDeals.length ? `-> out/edgar-new-deals-${end}.json (${realDeals.length} deals) for the alert feed.` : 'no new single-deal announcements.');
 }

← effdba0 be-first, FREE: SEC EDGAR CRE 8-K acquisition monitor (same-  ·  back to Re Flyer Aggregator  ·  be-first PRIMARY feed: free CRE-news closed-deal monitor (TR 854c054 →