Commercial property listings from Crexi with address, county, asking price, coordinates and the listing broker — and paywall placeholders dropped instead of passed through.
The browser Origin/Referer/UA headers Crexi's WAF expects are sent on every request
(crexi.HEADERS, applied in _json) instead of only on a client the actor builds itself. A
caller's own client therefore carries them too: Scrapebench-api injects its client (#196). The
headers on the wire are unchanged for Apify runs.
0.1.0 — 2026-09-07
First release (#155).
Crexi's paywalled details entries arrive as strings of asterisks ("Year Built": "****"),
not nulls. Measured over 12 retail listings on 2026-09-07: Year Built masked on 9 of 9 present,
APN on 6 of 6, Parking / Tenancy / Units / Cap Rate / Price per SqFt on every occurrence. They
are dropped rather than passed through, because **** survives an is-not-null filter.
The API refuses offset + count >= 1500, so no query can reach past 1,499 rows of a catalogue
of 242,488. A run that hits the ceiling says so next to Crexi's own totalCount.
isLease and askingPriceFrom/To are accepted and ignored (total unchanged at 242,488), so
price is filtered client-side and no lease/sale split is advertised.
assert_ok + assert_not_bounced on every response, and a source_changed notice when the
envelope loses its data key — the incumbent in this lane has been returning zero properties
on SUCCEEDED runs since a site change.
Property-type input validated against Crexi's own enum, which 400s on an unknown value.