← back to Commercialrealestate
CRE: case-insensitive generic sniffer (handles M&M/.NET capitalized Results+fields); record firm discovery — M&M has /api/contentsearch/properties (needs POST payload), LoopNet anti-bot dead-end
c70d4a635889d026dd9f6b4d60813ef3234c7140 · 2026-06-27 05:37:58 -0700 · Steve
Files touched
M scripts/sources/firms.js
Diff
commit c70d4a635889d026dd9f6b4d60813ef3234c7140
Author: Steve <steve@designerwallcoverings.com>
Date: Sat Jun 27 05:37:58 2026 -0700
CRE: case-insensitive generic sniffer (handles M&M/.NET capitalized Results+fields); record firm discovery — M&M has /api/contentsearch/properties (needs POST payload), LoopNet anti-bot dead-end
---
scripts/sources/firms.js | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/scripts/sources/firms.js b/scripts/sources/firms.js
index 4430987..75cd98b 100644
--- a/scripts/sources/firms.js
+++ b/scripts/sources/firms.js
@@ -145,7 +145,12 @@ const FIRMS = [
},
{
key: 'marcusmillichap', name: 'Marcus & Millichap', idPrefix: 'mm', status: 'needs-discovery',
- // M&M is the dominant SFV multifamily brokerage — highest-value add. Property search:
+ // M&M is the dominant SFV multifamily brokerage — highest-value add. DISCOVERY (2026-06-27): it
+ // HAS a real JSON API — POST /api/contentsearch/properties (and /mapproperties) returning
+ // {Results:[...]} with capitalized .NET field names (now handled by the case-insensitive sniffer).
+ // Remaining gap: the search returns empty Results unless the POST body carries the location filter
+ // (lat/lng/polygon). A search URL nav alone didn't populate it. TODO: capture & replay the POST
+ // payload (a discover2-style request-body log) to get populated results.
apiHosts: ['marcusmillichap.com', 'api.marcusmillichap'],
navUrls: (city) => [`https://www.marcusmillichap.com/properties?searchText=${encodeURIComponent(city + ', CA')}`],
extract: genericExtract
@@ -221,6 +226,9 @@ const FIRMS = [
extract: genericExtract
},
{
+ // DISCOVERY (2026-06-27): LoopNet (CoStar-owned) emitted 0 JSON on its apiHosts — it server-renders
+ // and is heavily anti-bot; Browserbase sees no listing API. Treat as a dead end without a much
+ // deeper anti-bot approach. Crexi already covers most of the same inventory.
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/`],
← e133dd4 auto-save: 2026-06-27T05:37:39 (1 files) — scripts/sources/f
·
back to Commercialrealestate
·
afternoon CRE update 2026-06-27 216da73 →