Crexi stopped disclosing financial data to anonymous callers. This release
tells the truth about that, and stops charging for analysis it cannot produce.
Upstream change.GET /assets/{id} no longer returns the inline
summaryDetails array, and its top-level capRate / netOperatingIncome
fields are gone. Cap rate, NOI, unit count, occupancy, year built, APN,
tenancy, parking and lease terms are returned as asterisk masks (*****) to
anyone not signed in to Crexi. Verified across 95 listings, including 25
selected by Crexi's own capRateMin filter — listings that provably carry a
cap rate and still returned *****, with zero exceptions.
Added the public /assets/{id}/summary endpoint, which replaced the
inline array. This restores buildingSizeSqFt, lotSizeAcres,
numberOfBuildings, stories, zoning, buildingClass and
saleCondition, and with them analysis.pricePerSqFt. Both payload shapes
are parsed and merged, so neither can regress the other.
Masked values are treated as unavailable. Never parsed as zero, never
passed through as "*****". Applied across the money, percent, integer and
text branches alike.
Billing now follows what was actually produced. The premium
listing-analyzed event fires only when a record carries real yield
analysis — cap rate, NOI, DSCR, debt yield, cash-on-cash or Deal Score.
Otherwise the listing is delivered and charged listing-scraped. Loan
sizing and debt service derived from the asking price and the caller's own
assumptions no longer qualify for the premium rate. Records are pushed in
contiguous runs sharing one event, so rank ordering is preserved and
charging stays bound to delivery. Prices themselves are unchanged.
Per-record billing transparency:dataQuality.analysisProduced,
dataQuality.billedEvent and dataQuality.analysisUnavailableReason.
Tri-state screening.minDscr and minDealScore now distinguish
PASS / FAIL / UNSCREENABLE. A listing whose metric could not be computed is
never reported, counted or explained as one that failed a threshold.
RUN_SUMMARY reports screenedCount, failedScreenCount and
unscreenableCount separately.
Corrected messaging. Nothing now claims "Crexi does not publish a cap
rate" — Crexi still filters on it server-side, so it plainly holds the
figure; it just does not disclose it. Messages say the data "was not
available in the public Crexi data returned for this listing".
Repositioned as a Crexi listing extractor and deal screener. README,
Store title, input descriptions and examples now match what the Actor can
actually deliver. The Deal Finder example no longer sets thresholds that
cannot be evaluated.
1.0 — 2026-08-30
First release.
Three modes: Property Search, Analyze Listing URLs, and Deal Finder.
Search filters verified empirically against Crexi's API: city, state, ZIP,
property type, asking price range, cap rate range, opportunity zone and
under-contract status. Filters Crexi silently ignores are never sent.
Automatic query partitioning to exceed Crexi's 1,499-results-per-query cap,
with de-duplication by listing ID.
Bulk fetching of up to 1,499 listings per request.
Investment analysis: price/SF, price/unit, NOI per unit, loan sizing, debt
service, DSCR, debt yield, cash flow, cash-on-cash and break-even occupancy.
Deterministic, fully auditable 0-100 Deal Score with published weights and
per-component breakdown.
Strict separation of scraped source data, calculated analysis values and
dataQuality provenance. Unavailable metrics return null with a reason.
Three dataset views: Listings overview, Investment analysis, Broker leads.