← back to Commercialrealestate
auto-save: 2026-06-26T23:36:14 (2 files) — scripts/refresh-all.js scripts/sources/firms.js
9c2ab88165be29efb33f81cb9d0889d1694874d0 · 2026-06-26 23:36:20 -0700 · Steve Abrams
Files touched
M scripts/refresh-all.jsM scripts/sources/firms.js
Diff
commit 9c2ab88165be29efb33f81cb9d0889d1694874d0
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Jun 26 23:36:20 2026 -0700
auto-save: 2026-06-26T23:36:14 (2 files) — scripts/refresh-all.js scripts/sources/firms.js
---
scripts/refresh-all.js | 6 ++++-
scripts/sources/firms.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 65 insertions(+), 2 deletions(-)
diff --git a/scripts/refresh-all.js b/scripts/refresh-all.js
index d270f8a..025612d 100644
--- a/scripts/refresh-all.js
+++ b/scripts/refresh-all.js
@@ -24,7 +24,11 @@ const get = (t, k) => (t.match(new RegExp('^' + k + '=(.*)$', 'm')) || [])[1]?.r
const NAV_CITIES = process.env.CC_NAV
? process.env.CC_NAV.split(',').map(s => s.trim())
- : ['Van Nuys', 'Reseda', 'North Hollywood', 'Northridge', 'Panorama City', 'Canoga Park', 'Sherman Oaks', 'Sun Valley', 'Encino', 'Granada Hills'];
+ : ['Van Nuys', 'Reseda', 'North Hollywood', 'Northridge', 'Panorama City', 'Canoga Park',
+ 'Sherman Oaks', 'Sun Valley', 'Encino', 'Granada Hills', 'Woodland Hills', 'Tarzana',
+ 'Studio City', 'Chatsworth',
+ // Eastside / Westside expansion (2026-06-27):
+ 'Silver Lake', 'West Hollywood', 'Santa Monica'];
// Which firms to run. Default = verified only, so an unattended cron never silently scrapes an
// unconfirmed firm. Pass CC_FIRMS to opt specific firms in.
diff --git a/scripts/sources/firms.js b/scripts/sources/firms.js
index 442e9ab..600f373 100644
--- a/scripts/sources/firms.js
+++ b/scripts/sources/firms.js
@@ -17,11 +17,18 @@
'use strict';
// ── Shared market filter (single source of truth; was duplicated inline in refresh-listings.js) ──
+// Named SFV for history, but now the full target-market set: San Fernando Valley + select
+// Eastside/Westside submarkets (Silver Lake, West Hollywood, Santa Monica). NOTE: the premium
+// Westside cities (Santa Monica, West Hollywood) typically clear the $1.75M band, so widen MAXP if
+// you want real coverage there. Silver Lake assets sometimes surface under city "Los Angeles" in
+// feeds — kept out deliberately to avoid pulling all of LA; revisit if Silver Lake yield is 0.
const SFV = new Set(['van nuys', 'reseda', 'north hollywood', 'northridge', 'panorama city',
'canoga park', 'sherman oaks', 'sun valley', 'encino', 'granada hills', 'tarzana', 'woodland hills',
'winnetka', 'west hills', 'lake balboa', 'valley village', 'valley glen', 'studio city', 'toluca lake',
'arleta', 'pacoima', 'mission hills', 'sylmar', 'tujunga', 'sunland', 'porter ranch', 'chatsworth',
- 'north hills']);
+ 'north hills',
+ // Eastside / Westside expansion (2026-06-27):
+ 'silver lake', 'silverlake', 'west hollywood', 'santa monica']);
const MINP = 800000, MAXP = 1750000;
@@ -149,6 +156,58 @@ const FIRMS = [
apiHosts: ['jll.com', 'property.jll.com'],
navUrls: (city) => [`https://property.jll.com/search?q=${encodeURIComponent(city + ', CA')}`],
extract: genericExtract
+ },
+ // ── Additional commercial brokerages active in the San Fernando Valley (2026-06-27) ──
+ // Major multifamily/commercial shops that list SFV deals. All start needs-discovery: run
+ // `node scripts/discover-firm.js <key>` (or just include them in a refresh-all sweep) to confirm
+ // each one's public property-search emits listing JSON the generic sniffer can read.
+ {
+ key: 'matthews', name: 'Matthews REIS', idPrefix: 'mat', status: 'needs-discovery',
+ apiHosts: ['matthews.com'],
+ navUrls: (city) => [`https://www.matthews.com/listings/?location=${encodeURIComponent(city + ', CA')}`],
+ extract: genericExtract
+ },
+ {
+ key: 'kidder', name: 'Kidder Mathews', idPrefix: 'kid', status: 'needs-discovery',
+ apiHosts: ['kidder.com'],
+ navUrls: (city) => [`https://kidder.com/properties/?search=${encodeURIComponent(city + ', CA')}`],
+ extract: genericExtract
+ },
+ {
+ key: 'naicapital', name: 'NAI Capital', idPrefix: 'nai', status: 'needs-discovery',
+ apiHosts: ['naicapital.com'],
+ navUrls: (city) => [`https://www.naicapital.com/properties/?keyword=${encodeURIComponent(city + ' CA')}`],
+ extract: genericExtract
+ },
+ {
+ key: 'cushwake', name: 'Cushman & Wakefield', idPrefix: 'cw', status: 'needs-discovery',
+ apiHosts: ['cushmanwakefield.com'],
+ navUrls: (city) => [`https://www.cushmanwakefield.com/en/united-states/properties?q=${encodeURIComponent(city + ', CA')}`],
+ extract: genericExtract
+ },
+ {
+ key: 'newmark', name: 'Newmark', idPrefix: 'nmrk', status: 'needs-discovery',
+ apiHosts: ['nmrk.com'],
+ navUrls: (city) => [`https://www.nmrk.com/properties?location=${encodeURIComponent(city + ', CA')}`],
+ extract: genericExtract
+ },
+ {
+ key: 'berkadia', name: 'Berkadia', idPrefix: 'berk', status: 'needs-discovery',
+ apiHosts: ['berkadia.com'],
+ navUrls: (city) => [`https://www.berkadia.com/listings/?location=${encodeURIComponent(city + ', CA')}`],
+ extract: genericExtract
+ },
+ {
+ key: 'stepp', name: 'Stepp Commercial', idPrefix: 'stp', status: 'needs-discovery',
+ apiHosts: ['steppcommercial.com'],
+ navUrls: (city) => [`https://www.steppcommercial.com/listings/?q=${encodeURIComponent(city)}`],
+ extract: genericExtract
+ },
+ {
+ key: 'loopnet', name: 'LoopNet', idPrefix: 'ln', status: 'needs-discovery',
+ apiHosts: ['loopnet.com', 'api.loopnet.com'],
+ navUrls: (city, slug) => [`https://www.loopnet.com/search/${slug === 'retail' ? 'retail' : 'multifamily'}/${city.replace(/\s+/g, '-').toLowerCase()}-ca/for-sale/`],
+ extract: genericExtract
}
];
← 9c8ad7b CRE: multi-firm listing-source framework + firm badges in vi
·
back to Commercialrealestate
·
CRE: expand geographic scope to all of LA County (88 cities 2674ef8 →