← Actor catalog · Managed data feeds · Zumper Actor

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.

−3.99%The overnight cut: SoMa Square, 1 Saint Francis Pl (SoMa), $3,912 → $3,756 between Pass A and Pass B on August 23.
6 hoursHow long the cut had held when a third pass re-checked: still $3,756 at 6:03 AM Pacific — a price event, not a listing glitch.
Same dayThe managed-feed delivery path: change rows are forwarded to Slack or Sheets the day a pass detects them.

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 IDAddressRent changeDropChanged field
165586911 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

Zumper searchNamed SF window and filters
Apify ActorNormalize listings, build 1.1.22
Customer stateCompare fingerprints per ID
Change datasetThe tabled row; empty when unchanged
n8n deliverySlack same day; Sheets or email

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.

Published August 21, 2026 · Updated August 23, 2026 · Test evidence: Apify build 1.1.22, runs dtSMZpiMd1cT1aDpH (baseline, 04:02Z), 93e1mKvinDj30uuf1 (comparison, 07:05Z), and lTSRt9vMcefVBmmOL (later pass, 13:03Z) on August 23; earlier five-cut window: build 1.1.20, runs VW3Py0fARVOiaLQ5l and dmmjgJuSoOU1Zj4Gz (August 21) · See all managed-feed terms