← 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
M data/edgar-seen.jsonM out/edgar-new-deals-2026-08-19.jsonM scripts/edgar-cre-monitor.mjs
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(/ /g, ' ').replace(/&/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 →