Zillow/Realtor Listing Change Monitor avatar

Zillow/Realtor Listing Change Monitor

Pricing

Pay per usage

Go to Apify Store
Zillow/Realtor Listing Change Monitor

Zillow/Realtor Listing Change Monitor

Monitors public Zillow and Realtor listing pages for visible changes without login, private APIs, or bypass techniques.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Brian Keefe

Brian Keefe

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 months ago

Last modified

Share

Production-ready Apify Actor for monitoring visible changes on low-volume, public Zillow and Realtor pages.

What It Does

  • Accepts public listing URLs and public agent/profile URLs.
  • Auto-detects Zillow vs. Realtor, or respects a forced sourceType.
  • Extracts visible listing details such as address/title, price, status, beds, baths, and square footage.
  • Optionally includes public agent/profile/contact links already visible on the page.
  • Compares current results against previousSnapshot and emits change fields plus previous/current values.
  • Returns warning rows for blocked, login-required, or captcha pages.
  • Supports fixture:// URLs for deterministic local testing.

Public-Data-Only Limitations

  • Public URLs only.
  • No login.
  • No MLS or private APIs.
  • No anti-bot bypass.
  • No broad search scraping.
  • No stealth, captcha solving, proxy escalation, or hidden endpoint access.

If Zillow or Realtor returns a blocked or login wall page, the actor records a warning row and stops there for that URL.

Input

{
"urls": [
"https://www.zillow.com/homedetails/...",
"https://www.realtor.com/realestateagents/...",
"fixture://zillow-listing"
],
"sourceType": "auto",
"previousSnapshot": [],
"maxPages": 10,
"includeAgentInfo": true
}

Output

Each dataset item is either a listing row or a warning row.

Example listing fields:

{
"rowType": "listing",
"source": "zillow",
"url": "fixture://zillow-listing",
"visibleAddress": "123 Main St, Austin, TX, 78701",
"visibleTitle": "Single family residence",
"price": 765000,
"status": "For sale",
"beds": 3,
"baths": 2,
"sqft": 1840,
"agentName": "Jamie Stone",
"agentProfileUrl": "fixture://zillow-agent",
"contactLinks": [
"tel:+15125550199",
"mailto:jamie@example.com"
],
"evidence": {
"priceText": "$765,000",
"statusText": "For sale"
},
"snapshotTimestamp": "2026-07-05T00:00:00.000Z",
"changed": true,
"changeFields": ["price"],
"previousPrice": 749000,
"currentPrice": 765000,
"previousStatus": "For sale",
"currentStatus": "For sale"
}

Fixture URLs

Local deterministic fixtures included for smoke tests:

  • fixture://zillow-listing
  • fixture://realtor-listing
  • fixture://realtor-agent
  • fixture://blocked-page

Development

Install and test:

npm install
npm test

Run locally:

$npm start

Notes On Parsing

  • Uses JSON-LD first when available.
  • Falls back to common visible page selectors and text heuristics.
  • Normalizes price, beds, baths, and sqft to numbers when possible.
  • Matches previous rows by url, visibleAddress, and visibleTitle.

Files

  • Actor metadata: .actor/actor.json
  • Input schema: .actor/input_schema.json
  • Main entrypoint: src/main.js
  • Fixtures: fixtures/*.html
  • Smoke tests: tests/smoke.test.js