# Changelog of Crexi Commercial Real Estate Scraper & Deal Screener (`zapticx/crexi-investment-analyzer`) Actor

- **URL**: https://apify.com/zapticx/crexi-investment-analyzer/changelog.md
- **Full Actor documentation**: https://apify.com/zapticx/crexi-investment-analyzer.md

## Changelog

### 1.0 (candidate) — 2026-09-14

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.
