Real Estate Aggregator — Multi-Platform Property Search
Pricing
Pay per usage
Real Estate Aggregator — Multi-Platform Property Search
Search Zillow, Redfin, Realtor.com, and Apartments.com in one run. Deduplicates listings by address, unifies property data, and computes market analytics including median price, price per sqft, and days on market.
Pricing
Pay per usage
Rating
0.0
(0)
Developer

Ricardo Akiyoshi
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Search Zillow, Redfin, Realtor.com, and Apartments.com in a single run. This premium actor aggregates listings from all four platforms, deduplicates them by normalized address, and outputs unified property data with cross-platform price comparison and market analytics.
Why use an aggregator?
Each real estate platform has different listings, different prices, and different data quality. Searching them one by one is slow and you miss overlaps. This actor:
- Searches all 4 platforms simultaneously — one input, one run, one dataset
- Deduplicates by address — the same property listed on Zillow and Redfin becomes one record with data from both
- Compares prices across platforms — see if Zillow shows a different price than Redfin for the same property
- Computes market analytics — median price, price per sqft, days on market, and more
- Saves hours of manual work — no more opening 4 tabs and cross-referencing
Use Cases
Home Buyers
Search once, see every listing across all major platforms. Compare prices and find listings that only appear on one platform (hidden gems).
Real Estate Investors
Get comprehensive market data for any US location. Median price, price per sqft, and property type distribution help you evaluate markets quickly.
Real Estate Agents
Monitor competing listings across all platforms. See which properties are listed where and at what price.
Market Analysts
Pull structured data from 4 platforms into one clean dataset. Use the market analytics summary for reports and comparisons.
Property Managers
Find rental listings across Apartments.com and the other platforms. Compare rental rates in your target area.
Input Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
location | string | Yes | City and state (e.g., "Miami, FL"), ZIP code, or neighborhood |
listingType | enum | No | for_sale (default), for_rent, or recently_sold |
minPrice | integer | No | Minimum price filter |
maxPrice | integer | No | Maximum price filter |
minBeds | integer | No | Minimum bedrooms |
minBaths | integer | No | Minimum bathrooms |
propertyType | enum | No | any (default), house, condo, townhouse, apartment, land |
maxResults | integer | No | Max deduplicated results (default: 200) |
proxyConfiguration | object | No | Apify proxy config (residential recommended) |
Output Schema
Each property record includes:
Core Fields
normalizedAddress— Deduplicated address keyfullAddress— Complete street addressbestPrice/priceFormatted— Lowest price found across platformsbeds,baths,sqft— Property dimensionslotSize,yearBuilt— Lot and building infopropertyType— House, Condo, Townhouse, etc.listingType— For sale, for rent, recently sold
Cross-Platform Data
zillowUrl,redfinUrl,realtorUrl,apartmentsUrl— Direct links per platformzillowPrice,redfinPrice,realtorPrice,apartmentsPrice— Price on each platformsources— Which platforms listed this propertysourcesCount— Number of platforms (higher = more visibility)
Platform-Specific
zestimate— Zillow's automated valuationredfinEstimate— Redfin's automated valuationdaysOnZillow,daysOnRedfin— Days on market per platformhoaFee— HOA dues (from Redfin)
Enrichment
description— Property descriptionagentName,agentPhone,brokerName— Listing agent infophotos— Aggregated photo URLs from all platformspriceHistory— Combined price history from all platforms
Market Analytics (first record in dataset)
The first record in the output has _type: "market_analytics" and includes:
medianPrice,averagePrice,minPrice,maxPricemedianPricePerSqft,averagePricePerSqftaverageBeds,averageBaths,averageSqftaverageDaysOnMarket,medianDaysOnMarketpropertyTypeDistribution— Count per property typepropertiesOnMultiplePlatforms— How many properties appear on 2+ platformsplatformBreakdown— Raw count per platform before dedupduplicatesRemoved— How many duplicates were merged
Example Output
{"normalizedAddress": "123 main st miami fl 33101","fullAddress": "123 Main St, Miami, FL 33101","bestPrice": "$450,000","beds": 3,"baths": 2,"sqft": 1850,"lotSize": "5000 sqft","yearBuilt": 1995,"propertyType": "House","listingType": "for_sale","zillowUrl": "https://www.zillow.com/homedetails/123-main-st/12345_zpid/","redfinUrl": "https://www.redfin.com/FL/Miami/123-Main-St/home/67890","realtorUrl": "https://www.realtor.com/realestateandhomes-detail/123-Main-St_Miami_FL_33101","zillowPrice": "$450,000","redfinPrice": "$449,000","realtorPrice": "$450,000","zestimate": 465000,"redfinEstimate": 458000,"sources": "zillow, redfin, realtor","sourcesCount": 3,"photos": ["https://photos.zillowstatic.com/...", "https://ssl.cdn-redfin.com/..."],"priceHistory": [{"date": "2025-06-15", "price": 475000, "event": "Listed for sale", "source": "zillow"},{"date": "2025-07-01", "price": 450000, "event": "Price reduced", "source": "redfin"}]}
Extraction Strategies
The actor uses multiple extraction strategies per platform, falling through to the next if one fails:
| Platform | Strategy 1 | Strategy 2 | Strategy 3 | Strategy 4 |
|---|---|---|---|---|
| Zillow | __NEXT_DATA__ JSON | Apollo preloaded data | DOM selectors | — |
| Redfin | Stingray API JSON | DOM selectors | CSV endpoint | — |
| Realtor.com | __NEXT_DATA__ JSON | JSON-LD (Schema.org) | Script state objects | DOM selectors |
| Apartments.com | JSON-LD | __PRELOADED_STATE__ | DOM selectors | — |
Pricing
This actor uses Pay Per Event pricing:
- $0.01 per unique property found (after deduplication)
- You only pay for deduplicated results, not raw platform hits
- A property found on all 4 platforms still costs only $0.01
- Market analytics record is included free
Example costs:
- 50 properties in a small town: $0.50
- 200 properties in a city: $2.00
- 500 properties in a metro area: $5.00
Tips for Best Results
- Use residential proxies — All four platforms have anti-bot measures. Datacenter IPs will get blocked quickly.
- Start with a specific location — "Miami Beach, FL" works better than just "Miami" (fewer results, faster run).
- Set price filters — Narrower searches return more accurate results from each platform.
- Check the analytics record — The first record in your dataset has market statistics. Use it for quick market evaluation.
- Look at
sourcesCount— Properties listed on 3-4 platforms are typically "real" active listings, not stale data.
Limitations
- US locations only (all four platforms are US-focused)
- Apartments.com only has rental listings — it won't contribute data for "for_sale" searches
- Some platforms may block requests even with proxies; the actor will log warnings and continue with available data
- Price history depth varies by platform (Zillow tends to have the most historical data)
- Results depend on what each platform returns for your search — not all properties appear on all platforms
Changelog
v1.0 (2026-03-02)
- Initial release
- 4-platform aggregation: Zillow, Redfin, Realtor.com, Apartments.com
- Address normalization and deduplication engine
- Market analytics computation
- PPE pricing at $0.01 per unique property
Integration — Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("sovereigntaylor/real-estate-aggregator").call(run_input={"searchTerm": "example query","maxResults": 50})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{item.get('title', item.get('name', 'N/A'))}")
Integration — JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('sovereigntaylor/real-estate-aggregator').call({searchTerm: 'example query',maxResults: 50});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach(item => console.log(item.title || item.name || 'N/A'));