Live change events · San Francisco, California
SoMa Square cut its advertised floor $156 overnight. A feed puts that in Slack the same day.
Overnight into August 23, 2026 (Pacific time), listing 16558691 — SoMa Square, the multi-unit building at 1 Saint Francis Pl in SoMa — moved its observed price_min from $3,912 to $3,756: a −$156 (−3.99%) cut between two monitoring passes. Six hours later, a third pass still observed $3,756 — the cut held rather than bouncing back. In a managed feed, a change row like that goes out to Slack or Sheets the same day it is detected. This page is written for SF multifamily yield and acquisitions desks that price concessions and re-trades off asking-rent movement, not for buyer agents hunting a deal.
This is not a Zumper dump. Pass A stored a baseline of the search window without alerting anyone. Pass B re-ran the identical search overnight, compared every listing by stable ID, and emitted only the rows whose tracked rent had moved. Everything unchanged stayed silent.
No form backend, cookies, tracking pixels, or analytics. The email code identifies this case study only after you send the draft.
The two-pass San Francisco test
The test used the Zumper Rental Scraper build 1.1.22 — the same build currently on the Store. Pass A (run dtSMZpiMd1cT1aDpH) recorded the baseline of a San Francisco apartment search at 2026-08-23T04:02Z: listing 16558691 — SoMa Square — showed an observed price_min of $3,912. Pass B (run 93e1mKvinDj30uuf1) repeated the identical search and finished at 2026-08-23T07:05Z — an overnight window in San Francisco, 9:02 PM to 12:05 AM Pacific — and observed $3,756 for the same stable listing_id: a −$156 (−3.99%) cut. A third pass (run lTSRt9vMcefVBmmOL, 13:03Z) still observed $3,756 six hours later, so the cut persisted through the morning rather than reverting.
An earlier window on the same search — build 1.1.20, baseline run VW3Py0fARVOiaLQ5l (2026-08-21T05:03Z) and comparison run dmmjgJuSoOU1Zj4Gz (10:16Z) — emitted five price_min cuts, from −$100 (−2.60%) at 300 Anzavista Ave to −$248 (−6.96%) at NEMA, 8 10th St. Those are that window's history, not this one's rows: NEMA (32687497) held its reduced $3,315 floor across all three August 23 passes and therefore emitted nothing new.
The real price_min cut, in one overnight window
The listing below lowered its observed minimum asking rent (price_min) between the two August 23 passes. This window's table is a single row — the cut exactly as observed, nothing sampled out, nothing added.
| Listing ID | Address | Rent change | Drop | Changed field |
|---|---|---|---|---|
| 16558691 | 1 Saint Francis Pl (SoMa Square, SoMa), San Francisco, CA | $3,912 → $3,756 | −$156 (−3.99%) | price_min |
Observed asking rents can change again after the observation time. A building record like SoMa Square covers several available unit types, so price_min is the advertised floor of a range ($3,756–$6,189 at the comparison pass), not one unit's rent.
Why a yield desk cares about a $156 cut
Individually, a $156 trim looks like noise. Watched across a submarket, small price_min cuts are how effective-rent softness shows up before it reaches quarterly comps: operators shade the advertised floor first. SoMa Square shaded its floor −3.99% overnight and was still holding the lower number six hours later — a deliberate reprice, verified twice, not a listing glitch. A change-only feed gives an acquisitions or asset-management desk the timestamp, the prior price, and the delta per stable listing ID — enough to track how fast a competitor reprices, which submarkets are shading first, and whether an underwriting assumption about market rent still holds this week. A full nightly export of every SF listing tells you none of that without building the diff yourself.
How the comparison works
1. Stable identity
listing_id is the primary identity. A canonical source URL is retained for delivery and inspection.
2. Tracked snapshot
The fingerprint covers rent range, bedroom and bathroom range, and the canonical listing URL.
3. Caller-owned state
Each monitorId gets a separate record in the named zumper-rental-monitor-state store, in the customer's own Apify account.
4. Change-only output
An unchanged listing emits nothing. A price event carries the prior value, the new value, and which field moved.
How a managed feed delivers these events
The delivery workflow calls the Actor on a schedule, reads its dataset, stops when the dataset is empty, and forwards changed rows to the agreed destination. Credentials belong in n8n credential objects, not inside the workflow JSON.
Limits I keep in the product
One event describes one window, not the SF market. This was a single overnight comparison of one search. It demonstrates change detection on live data; it is not a market report or a rent index.
No removal claim from a capped search. A listing can disappear because the portal reordered the result window. The feed reports new, price, and detail changes; it does not call an absent row “removed.”
Price ranges need context. A building can expose several unit types in one row. The feed preserves the observed minimum and maximum rather than pretending each building has one rent.
Source access is tested before a quote. A working San Francisco run does not prove that every portal, market, or filter is available. Residential proxy or unblocker costs are scoped separately.
Self-serve or managed
You can run the Actor in your own Apify account and wire delivery yourself. A managed package covers a named source set, agreed schema, schedule, delivery target, monitoring, and source repairs.
One proven source
Real-estate pilot
$750 setup + $350/month
- One market and filter set
- Up to 5,000 delivered rows per month
- Daily delivery by default
- Acceptance against a live source sample
Up to three proven sources
Real-estate Growth feed
$1,750 setup + $950/month
- Up to three source and market combinations
- Normalized change schema
- Daily or agreed scheduled delivery
- Source monitoring and bounded maintenance
Apify platform usage, Actor charges, residential proxies, unblockers, and third-party APIs are separate unless a written quote includes a cap. A monthly service starts only after the sample and schema pass the agreed acceptance check.