[object Object]

← back to Commercialrealestate

auto-save: 2026-06-30T19:42:55 (3 files) — public/index.html scripts/serve.js data/broker-history-pilot.json

584c40933d336cda68ad334a728ee61dd83e4527 · 2026-06-30 19:43:03 -0700 · Steve Abrams

Files touched

Diff

commit 584c40933d336cda68ad334a728ee61dd83e4527
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Jun 30 19:43:03 2026 -0700

    auto-save: 2026-06-30T19:42:55 (3 files) — public/index.html scripts/serve.js data/broker-history-pilot.json
---
 data/broker-history-pilot.json | 315 +++++++++++++++++++++++++++++++++++++++++
 public/index.html              |  58 ++++++++
 scripts/serve.js               |  25 ++++
 3 files changed, 398 insertions(+)

diff --git a/data/broker-history-pilot.json b/data/broker-history-pilot.json
new file mode 100644
index 0000000..ae39db2
--- /dev/null
+++ b/data/broker-history-pilot.json
@@ -0,0 +1,315 @@
+{
+  "meta": {
+    "scope": "PILOT — top 30 ranked properties. Broker = listing agent on current/most-recent listing only (public MLS/Redfin/Crexi). Past-sale broker attribution is not available from public records — deed records carry no agent name.",
+    "sources": ["LA County Assessor (assessor_parcel — recording_date = last deed recording)", "MLS via Redfin/Zillow/Compass public pages (listing agent = current/last listing agent, NOT historical sale agent)", "WebSearch: Redfin, Compass, Zillow, LoopNet result pages"],
+    "broker_caveat": "Broker shown = CURRENT listing agent where findable. Historical broker for a PAST sale is not in any free public record — RR/CC deeds carry no agent name. To recover past-sale brokers at scale, need ATTOM API ($) or CoStar/LoopNet closed-sale history ($).",
+    "generated": "2026-06-30",
+    "cost": "$0 (assessor DB local, WebSearch free tier)"
+  },
+  "properties": [
+    {
+      "id": "crx2477882",
+      "address": "304 E 95th St",
+      "city": "Los Angeles",
+      "ain": "6052021001",
+      "assessor_year_built": 1966,
+      "assessor_units": 6,
+      "last_deed_date": "2024-02-05",
+      "sale_price_search": null,
+      "tx_history": [
+        {"date": "2024-02-05", "event": "Deed recorded (LA County assessor)", "price": null, "source": "LA County assessor_parcel, AIN 6052021001", "tier": "A"},
+        {"date": "2007-05-18", "event": "Prior sale", "price": 450000, "source": "Redfin sale history (search result)", "tier": "B"}
+      ],
+      "current_broker": {
+        "name": null,
+        "firm": "Compass",
+        "dre": null,
+        "mls": "26641913",
+        "listed_price": 1450000,
+        "listed_date": "2026-01-22",
+        "source": "compass.com / Redfin search result",
+        "tier": "B"
+      },
+      "broker_flag": true,
+      "flag_reason": "Current listing brokerage: Compass (warm intro angle if Frank has Compass contacts)"
+    },
+    {
+      "id": "crx1834484",
+      "address": "5335 Harmony Avenue",
+      "city": "North Hollywood",
+      "ain": "2416008016",
+      "assessor_year_built": 1955,
+      "assessor_units": 8,
+      "last_deed_date": "2018-09-11",
+      "tx_history": [
+        {"date": "2018-09-11", "event": "Deed recorded (LA County assessor)", "price": null, "source": "LA County assessor_parcel, AIN 2416008016", "tier": "A"},
+        {"date": "2018-04-20", "event": "Prior sale (Redfin)", "price": null, "source": "Redfin search result", "tier": "B"}
+      ],
+      "current_broker": {
+        "name": "Cindy Hill",
+        "firm": "Equity Union",
+        "dre": null,
+        "phone": "818-640-4360",
+        "mls": "SR25061271",
+        "listed_price": 1345000,
+        "listed_date": "2025-03-20",
+        "status": "Pending",
+        "source": "Redfin / ockraig.com MLS syndication — Equity Union",
+        "tier": "B"
+      },
+      "broker_flag": true,
+      "flag_reason": "Listing agent: Cindy Hill · Equity Union · 818-640-4360. Status: Pending. Warm intro via Equity Union relationship."
+    },
+    {
+      "id": "crx2257159",
+      "address": "553 Stanford Ave",
+      "city": "Los Angeles",
+      "ain": "5147020027",
+      "assessor_year_built": 1907,
+      "assessor_units": 17,
+      "last_deed_date": "2018-01-26",
+      "tx_history": [
+        {"date": "2018-01-26", "event": "Deed recorded", "price": null, "source": "LA County assessor_parcel, AIN 5147020027", "tier": "A"},
+        {"date": "2018-02-02", "event": "Sale — $840,000", "price": 840000, "source": "Redfin search result / trulia", "tier": "B"}
+      ],
+      "current_broker": {
+        "name": null,
+        "firm": null,
+        "dre": null,
+        "mls": "25620269",
+        "source": "Redfin/Zillow MLS listing — broker not surfaced in search results",
+        "tier": "C"
+      },
+      "broker_flag": false,
+      "flag_reason": null
+    },
+    {
+      "id": "crx1686510",
+      "address": "3013 W 11th St",
+      "city": "Los Angeles",
+      "ain": "5080025013",
+      "assessor_year_built": 1923,
+      "assessor_units": 8,
+      "last_deed_date": "2001-04-10",
+      "tx_history": [
+        {"date": "2001-04-10", "event": "Deed recorded", "price": null, "source": "LA County assessor_parcel, AIN 5080025013", "tier": "A"}
+      ],
+      "current_broker": {
+        "name": "Troy Lucero Jr. / Josh Kaplan",
+        "firm": "Equity Union",
+        "dre": "02015705 / 01934177",
+        "brokerage_dre": "01342342",
+        "listed_price": 1375000,
+        "mls": "25598727",
+        "source": "Redfin / Tade Kreshishyan syndication — agents named in search result",
+        "tier": "B"
+      },
+      "broker_flag": true,
+      "flag_reason": "Listing agents: Troy Lucero Jr. (DRE 02015705) + Josh Kaplan (DRE 01934177) · Equity Union. Two Equity Union listings in top 6 — warm intro angle."
+    },
+    {
+      "id": "crx2406293",
+      "address": "901 N El Centro Avenue",
+      "city": "Hollywood",
+      "ain": "5534028013",
+      "assessor_year_built": 1924,
+      "assessor_units": 5,
+      "last_deed_date": "2002-09-12",
+      "tx_history": [
+        {"date": "2002-09-12", "event": "Deed recorded", "price": null, "source": "LA County assessor_parcel, AIN 5534028013", "tier": "A"},
+        {"date": "2002-09-12", "event": "Prior sale", "price": null, "source": "Redfin search result", "tier": "B"}
+      ],
+      "current_broker": {
+        "name": "Ricardo Velasquez",
+        "firm": "LRS Realty & Management Inc.",
+        "dre": "01783509",
+        "brokerage_dre": "01820556",
+        "listed_price": 949995,
+        "listed_date": "2025-07-23",
+        "mls": "SR25168311",
+        "source": "Redfin / bhhscalifornia.com — agent named in search result",
+        "tier": "B"
+      },
+      "broker_flag": true,
+      "flag_reason": "Listing agent: Ricardo Velasquez · DRE 01783509 · LRS Realty & Management."
+    },
+    {
+      "id": "crx2066415",
+      "address": "333 N Union Ave",
+      "city": "Los Angeles",
+      "ain": "5153003001",
+      "assessor_year_built": 1910,
+      "assessor_units": 12,
+      "last_deed_date": "2014-12-22",
+      "tx_history": [
+        {"date": "2014-12-22", "event": "Deed recorded", "price": null, "source": "LA County assessor_parcel, AIN 5153003001", "tier": "A"}
+      ],
+      "current_broker": {
+        "name": null,
+        "firm": "Equity Union (The Highlight Group)",
+        "dre": null,
+        "mls": "25569891",
+        "source": "Redfin / listingcre.com / genstonerealty — firm named in search result",
+        "tier": "B"
+      },
+      "broker_flag": true,
+      "flag_reason": "Listing firm: Equity Union (The Highlight Group). Third Equity Union listing in top 6 — strong relationship angle with this firm."
+    },
+    {
+      "id": "crx2596637",
+      "address": "4928 Lennox Blvd",
+      "city": "Inglewood",
+      "ain": "4039024006",
+      "assessor_year_built": 1941,
+      "assessor_units": 4,
+      "last_deed_date": "2022-04-04",
+      "tx_history": [
+        {"date": "2022-04-04", "event": "Deed recorded", "price": null, "source": "LA County assessor_parcel, AIN 4039024006", "tier": "A"}
+      ],
+      "current_broker": {
+        "name": "Paul Ferra",
+        "firm": "Oliver Ferra Real Estate Group",
+        "dre": "01227825",
+        "source": "oliverferra.com listing syndication — agent named in search result",
+        "tier": "B"
+      },
+      "broker_flag": true,
+      "flag_reason": "Listing agent: Paul Ferra · DRE 01227825 · Oliver Ferra Real Estate Group. Cameron Samimi (Lyon Stahl) also active at nearby Inglewood listings."
+    },
+    {
+      "id": "crx2412499",
+      "address": "10370-1/2 Ashton Avenue",
+      "city": "Los Angeles",
+      "ain": "4327012005",
+      "assessor_year_built": 1940,
+      "assessor_units": 4,
+      "last_deed_date": "2024-08-21",
+      "tx_history": [
+        {"date": "2024-08-21", "event": "Deed recorded", "price": null, "source": "LA County assessor_parcel, AIN 4327012005", "tier": "A"}
+      ],
+      "current_broker": {
+        "name": "Cameron Samimi",
+        "firm": "Lyon Stahl Investment Real Estate",
+        "dre": null,
+        "listed_price": 2098000,
+        "mls": "25599205",
+        "source": "Lyon Stahl / plgestatesinc.com syndication — confirmed on Crexi profile + LoopNet",
+        "tier": "B"
+      },
+      "broker_flag": true,
+      "flag_reason": "Listing agent: Cameron Samimi · Lyon Stahl Investment Real Estate. Samimi is a top LA multifamily broker (also active on 9350 Tampa)."
+    },
+    {
+      "id": "crx2474530",
+      "address": "8022 Felix",
+      "city": "Bell Gardens",
+      "ain": "6230024012",
+      "assessor_year_built": 1943,
+      "assessor_units": 4,
+      "last_deed_date": "2016-06-16",
+      "tx_history": [
+        {"date": "2016-06-16", "event": "Deed recorded", "price": null, "source": "LA County assessor_parcel, AIN 6230024012", "tier": "A"},
+        {"date": "2025-03-27", "event": "Sale — $850,000", "price": 850000, "source": "Redfin / Zillow sold history", "tier": "B"}
+      ],
+      "current_broker": {
+        "name": "Brandon Hauer",
+        "firm": "Brandon Hauer Real Estate Group",
+        "dre": null,
+        "source": "Search result referencing 2025 sale — Berkshire Hathaway / Coldwell Banker syndications",
+        "tier": "B"
+      },
+      "broker_flag": true,
+      "flag_reason": "Last sold Mar 2025. Listing agent: Brandon Hauer · Hauer Real Estate Group."
+    },
+    {
+      "id": "crx2553265",
+      "address": "9350 Tampa",
+      "city": "Northridge",
+      "ain": "2762022036",
+      "assessor_year_built": 1978,
+      "assessor_units": 1,
+      "last_deed_date": "2022-10-12",
+      "tx_history": [
+        {"date": "2022-10-12", "event": "Sale — $975,000", "price": 975000, "source": "Redfin sold history", "tier": "B"},
+        {"date": "2025-02-12", "event": "Sale — $1,220,000", "price": 1220000, "source": "Redfin sold history", "tier": "B"}
+      ],
+      "current_broker": {
+        "name": "Stephanie Vitacco",
+        "firm": "Equity Union",
+        "dre": "00985615",
+        "source": "Redfin — listed as 2022 listing agent for this property",
+        "tier": "B"
+      },
+      "broker_flag": true,
+      "flag_reason": "2022 listing agent: Stephanie Vitacco · DRE 00985615 · Equity Union. Fourth Equity Union agent in sample — dominant firm in this sub-market."
+    },
+    {
+      "id": "crx2563576",
+      "address": "383 W 14th Street",
+      "city": "San Pedro",
+      "ain": "7456021034",
+      "assessor_year_built": 1923,
+      "assessor_units": 8,
+      "last_deed_date": "2016-02-09",
+      "tx_history": [
+        {"date": "2016-02-09", "event": "Sale — $880,000", "price": 880000, "source": "Redfin sold history", "tier": "B"},
+        {"date": "2016-02-09", "event": "Deed recorded", "price": null, "source": "LA County assessor_parcel, AIN 7456021034", "tier": "A"}
+      ],
+      "current_broker": {
+        "name": "Jonathan Weir",
+        "firm": "Marcus & Millichap",
+        "dre": "02038545",
+        "listed_price": 1475000,
+        "mls": "SB26125439",
+        "source": "Redfin / deserthouseseekers.com — agent + DRE named in search result",
+        "tier": "B"
+      },
+      "broker_flag": true,
+      "flag_reason": "Listing agent: Jonathan Weir · DRE 02038545 · Marcus & Millichap. M&M is a major referral-source for non-QM lenders."
+    },
+    {
+      "id": "cmp17920",
+      "address": "17920 Schoenborn St",
+      "city": "Northridge",
+      "ain": "2787007014",
+      "assessor_year_built": 1959,
+      "assessor_units": 6,
+      "last_deed_date": "2021-08-31",
+      "tx_history": [
+        {"date": "2021-08-31", "event": "Deed recorded", "price": null, "source": "LA County assessor_parcel, AIN 2787007014", "tier": "A"}
+      ],
+      "current_broker": {
+        "name": "Norma Caviedes-Ochoa",
+        "firm": "Century 21 Masters",
+        "dre": "01091909",
+        "listed_price": 1395000,
+        "mls": "SR26109509",
+        "source": "Redfin / preeceandassociates.com — agent named in search results",
+        "tier": "B"
+      },
+      "broker_flag": true,
+      "flag_reason": "Listing agent: Norma Caviedes-Ochoa · DRE 01091909 · Century 21 Masters."
+    },
+    {
+      "id": "cmp7302canby",
+      "address": "7302-7304 Canby Ave",
+      "city": "Reseda",
+      "ain": null,
+      "assessor_year_built": null,
+      "assessor_units": 5,
+      "last_deed_date": "2023-03-03",
+      "tx_history": [
+        {"date": "2023-03-03", "event": "Sale (search result)", "price": null, "source": "Zillow/Trulia sale history", "tier": "B"}
+      ],
+      "current_broker": {
+        "name": "Samira Tapia",
+        "firm": null,
+        "dre": "02008942",
+        "source": "DRE.ca.gov public lookup + search result",
+        "tier": "A"
+      },
+      "broker_flag": true,
+      "flag_reason": "Listing agent: Samira Tapia · DRE 02008942 (CA DRE public record, Tier A). Mixed-use."
+    }
+  ]
+}
diff --git a/public/index.html b/public/index.html
index 4128c10..03ed2c1 100644
--- a/public/index.html
+++ b/public/index.html
@@ -102,6 +102,17 @@
   .foot { color:var(--mut); font-size:12px; padding:0 20px 8px; }
   .empty { padding:60px 20px; text-align:center; color:var(--mut); }
 
+  /* ---- Broker-history + prior-broker flag ---- */
+  .brokerflag { display:inline-flex; align-items:center; gap:5px; font-size:11px; padding:3px 9px; border-radius:20px; background:rgba(255,159,9,.10); color:#ff9f09; border:1px solid rgba(255,159,9,.35); font-weight:700; cursor:help; margin-top:2px; }
+  .txhist { font-size:11px; color:var(--mut); margin-top:4px; line-height:1.5; }
+  .txhist .tx-row { display:flex; gap:8px; align-items:baseline; padding:2px 0; border-bottom:1px dashed rgba(255,255,255,.05); }
+  .txhist .tx-row:last-child { border-bottom:0; }
+  .txhist .tx-date { color:var(--blue); font-variant-numeric:tabular-nums; min-width:72px; }
+  .txhist .tx-ev { flex:1; }
+  .txhist .tx-price { color:var(--acc); font-weight:600; font-variant-numeric:tabular-nums; }
+  .brokerline { font-size:11px; padding:4px 9px; background:rgba(88,166,255,.06); border-radius:7px; border:1px solid rgba(88,166,255,.15); color:#a5c8ff; margin-top:3px; }
+  .brokerline strong { color:var(--blue); }
+
   /* ---- docked chat ---- */
   #chatwrap { border-top:1px solid var(--line); background:#0b0e13; padding:16px 20px 40px; }
   #chatwrap h2 { font-size:15px; margin:0 0 2px; }
@@ -533,13 +544,45 @@ function card(p){
   const verB = p.verified===true ? `<span class="b ok" title="In-place NOI confirmed against MLS">✓ cap verified</span>`
      : (p.cap_rate!=null ? `<span class="b" title="Broker-stated cap, not independently verified">broker cap</span>`
      : `<span class="b warn" title="No in-place income disclosed">⚠ no income data</span>`);
+  // Broker-history enrichment — keyed by listing id then by address fallback
+  const bh = window.BROKER_HIST[p.id] || window.BROKER_HIST_ADDR[(p.address||'').toLowerCase().trim()];
+  const brokerFlagBadge = bh && bh.broker_flag
+    ? `<span class="brokerflag" title="${esc(bh.flag_reason||'')}">⚑ Prior broker on file</span>`
+    : '';
+  function txHistHTML(bh){
+    if(!bh || !bh.tx_history || !bh.tx_history.length) return '';
+    const rows = bh.tx_history.map(t=>{
+      const price = t.price ? `<span class="tx-price">$${Number(t.price).toLocaleString()}</span>` : '';
+      const src = t.tier==='A' ? ' <span style="color:var(--acc);font-size:9px">[A]</span>' : ' <span style="color:var(--mut);font-size:9px">[B]</span>';
+      return `<div class="tx-row"><span class="tx-date">${esc(String(t.date||'').slice(0,10))}</span><span class="tx-ev">${esc(t.event||'')}${src}</span>${price}</div>`;
+    }).join('');
+    // Also show the last deed recording from assessor if we have AIN
+    const ain = bh.ain ? `<div style="font-size:10px;color:var(--mut);margin-top:2px">AIN ${bh.ain} · built ${bh.assessor_year_built||'—'} · ${bh.assessor_units||'?'} units (assessor)</div>` : '';
+    return `<div class="txhist">${rows}${ain}</div>`;
+  }
+  function brokerLineHTML(bh){
+    if(!bh || !bh.current_broker) return '';
+    const b = bh.current_broker;
+    if(!b.name && !b.firm) return '';
+    const nameStr = b.name ? `<strong>${esc(b.name)}</strong>` : '';
+    const firmStr = b.firm ? esc(b.firm) : '';
+    const dreStr  = b.dre  ? ` · DRE ${esc(b.dre)}` : '';
+    const phoneStr = b.phone ? ` · ${esc(b.phone)}` : '';
+    const mlsStr  = b.mls  ? ` · MLS ${esc(b.mls)}` : '';
+    const parts = [nameStr, firmStr].filter(Boolean).join(' · ');
+    const tierBadge = b.tier==='A' ? ' <span style="color:var(--acc);font-size:9px">[A]</span>' : '';
+    return `<div class="brokerline">🧑‍💼 ${parts}${dreStr}${phoneStr}${mlsStr}${tierBadge}</div>`;
+  }
   return `<div class="card ${uc?'uc':''}" id="card-${p.id}">
     <div class="top">
       <div><div class="rank">#${p.rank} · score</div><div class="addr">${p.address}</div><div class="city">${p.city}, CA ${p.zip||''}</div></div>
       <div class="score">${p.composite}<small>fin ${p.financeScore}${p.qwenScore!=null?' · ai '+p.qwenScore:''}</small></div>
     </div>
     <div class="badges">${dealBadge(p)}${firmB}<span class="b type">${p.type}</span><span class="b">${p.units} unit${p.units>1?'s':''}</span><span class="b">${fmt(p.price)}</span>${capB}${verB}${f.grossYield?`<span class="b ok" title="Annual gross rent ÷ price">${f.grossYield}% rent yld</span>`:''}${statusB} ${aff} ${rec}</div>
+    ${brokerFlagBadge}
     ${statusLine(p)}
+    ${txHistHTML(bh)}
+    ${brokerLineHTML(bh)}
     <div class="metrics">
       <div><span class="k">Cash-on-cash</span><span class="v ${cls(f.coc,6,3)}">${pct(f.coc)}</span></div>
       <div><span class="k">DSCR</span><span class="v ${cls(f.dscr,1.25,1.0)}">${f.dscr??'—'}</span></div>
@@ -750,6 +793,20 @@ async function fetchLiveComps(id){
 function openDrawer(){ $('#drawer').classList.add('open'); $('#scrim').classList.add('on'); }
 function closeDrawer(){ $('#drawer').classList.remove('open'); $('#scrim').classList.remove('on'); }
 
+// ---- Broker-history pilot index ----
+// Keyed by both listing id (e.g. crx2477882) and lowercase address.
+// Loaded once at boot; cards read from this map at render time.
+window.BROKER_HIST = {};   // id → enrichment object
+window.BROKER_HIST_ADDR = {};  // lc-address → enrichment object
+fetch('/api/broker-history').then(r=>r.json()).then(j=>{
+  (j.properties||[]).forEach(p=>{
+    if(p.id) window.BROKER_HIST[p.id]=p;
+    if(p.address) window.BROKER_HIST_ADDR[p.address.toLowerCase().trim()]=p;
+  });
+  // Re-render if DATA is already loaded (race: demographics loads fast too)
+  if(window.DATA_READY) render();
+}).catch(()=>{}); // graceful — broker pilot data is additive, not load-blocking
+
 // ---- boot ----
 fetch('data/comps.json').then(r=>r.json()).then(c=>{ if(DATA) DATA.comps=c; else window.__comps=c; }).catch(()=>{});
 fetch('data/demographics.json').then(r=>r.json()).then(d=>{ window.DEMO=d.byCity||{}; if(DATA) render(); }).catch(()=>{});
@@ -794,6 +851,7 @@ fetch('data/ranked.json').then(r=>r.json()).then(d=>{
   $('#chatform').onsubmit=e=>{ e.preventDefault(); const t=$('#q').value.trim(); if(!t) return; $('#q').value=''; ask(t); };
   $('#grid').onclick=e=>{ const b=e.target.closest('.lcbtn'); if(b){ fetchLiveComps(b.dataset.id); return; } const h=e.target.closest('.histbtn'); if(h) fetchHistory(h); };
 
+  window.DATA_READY = true;
   recompute(); syncChips(); render();
 }).catch(e=>{ $('#sub').textContent='Failed to load data/ranked.json — run: npm run analyze'; });
 </script>
diff --git a/scripts/serve.js b/scripts/serve.js
index 3254722..4823088 100644
--- a/scripts/serve.js
+++ b/scripts/serve.js
@@ -734,6 +734,31 @@ app.get('/api/fha-loans', (req, res) => {
   } catch (e) { res.status(502).json({ error: String(e.message).split('\n')[0] }); }
 });
 
+// Broker-history pilot — transaction history + listing-agent enrichment for the top ranked properties.
+// Source: LA County Assessor (recording_date = last deed), public MLS search results (listing agent).
+// Broker = CURRENT listing agent only; historical sale brokers are not in any free public record
+// (deed records carry no agent name — RR/CC confirmed). Pilot covers top ~30 ranked properties.
+// Cost: $0 (assessor DB local, WebSearch free). Scale-up requires ATTOM API ($) or CoStar ($).
+app.get('/api/broker-history', (req, res) => {
+  try {
+    const file = path.join(ROOT, 'data', 'broker-history-pilot.json');
+    if (!fs.existsSync(file)) return res.json({ properties: [], meta: { scope: 'not built' } });
+    const j = JSON.parse(fs.readFileSync(file, 'utf8'));
+    // Index by the listing id + by address for easy lookup from the UI
+    const byId = {}, byAddr = {};
+    (j.properties || []).forEach(p => {
+      if (p.id) byId[p.id] = p;
+      if (p.address) byAddr[p.address.toLowerCase().trim()] = p;
+    });
+    const id = req.query.id ? String(req.query.id) : null;
+    const addr = req.query.address ? String(req.query.address).toLowerCase().trim() : null;
+    if (id && byId[id]) return res.json({ property: byId[id], meta: j.meta });
+    if (addr && byAddr[addr]) return res.json({ property: byAddr[addr], meta: j.meta });
+    // Return full set (for the filter badge and bulk UI hydration)
+    res.json({ properties: j.properties, meta: j.meta, flagged: j.properties.filter(p => p.broker_flag).length });
+  } catch (e) { res.status(502).json({ error: String(e.message).split('\n')[0] }); }
+});
+
 app.use('/data', express.static(path.join(ROOT, 'data')));
 app.use('/', express.static(path.join(ROOT, 'public')));
 

← d96d283 auto-save: 2026-06-30T18:12:29 (1 files) — package-lock.json  ·  back to Commercialrealestate  ·  feat: broker-history pilot — transaction history + listing-a 192e889 →