[object Object]

← 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

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 →