Realtor.com Listings Scraper
Pricing
from $1.00 / 1,000 listing results
Realtor.com Listings Scraper
Search realtor.com for-sale listings by city, county, ZIP or state with price, beds and baths filters. Optionally enrich each listing with full property details, agent contacts and custom keyword detection.
Pricing
from $1.00 / 1,000 listing results
Rating
0.0
(0)
Developer
Malik Ammar Faisal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Realtor.com Scraper — Extract Real Estate Listings, Property Details & Agent Contacts
Realtor.com Listings Scraper is a fast, reliable Realtor.com scraper that extracts for-sale and new-construction property listings from realtor.com by city, county, ZIP code or entire US state. Filter by price, bedrooms, bathrooms and listing date, then download clean, structured real estate data as JSON, CSV, Excel or XML — or pull it straight into your app through the API.
Use it as an unofficial Realtor.com API for lead generation, market research, comparable-sales analysis, investment sourcing, daily new-listing alerts and real estate data pipelines.
What can you extract from Realtor.com with this scraper?
Every listing is returned as one structured record. With full property details enabled (the default) you get:
| Category | Fields |
|---|---|
| Listing | property ID, listing ID, realtor.com URL, status, list date, days on market, photo count, primary photo URL, full description |
| Location | street address, city, county, state, ZIP code, latitude, longitude |
| Price & size | list price, bedrooms, bathrooms, living area (sq ft), lot size (sq ft), year built, year renovated |
| Property facts | property type, construction, heating, cooling, exterior, roofing, plus the complete structured details list exactly as shown on realtor.com (utilities, interior, exterior, HOA, schools, taxes, …) |
| Agent & brokerage | listing agent name, phone, email, agent profile URL, brokerage name, office phone |
| Keyword detection | keywordMatches and keywordScore for any custom regex groups you define (optional) |
Turn off fetchDetails for a cheaper, search-only run that still returns address, coordinates, price, beds/baths/sqft, lot size, year built, property type, description, photo and listing agent name/phone.
Why use this Realtor.com scraper?
- Search any area — pass any number of locations (
"Milwaukee, WI","Kenosha County, WI","53202","Brooklyn, NY") or scrape a whole state with a two-letter state code. - Server-side filters — price range, bedrooms, bathrooms, listing status (for sale / ready to build) and listed within the last N days, applied by realtor.com itself so you only pay for listings you want.
- Complete pagination — goes past realtor.com's 200-results-per-page limit automatically and de-duplicates listings across overlapping locations.
- Full property details — one extra request per listing enriches the record with county, coordinates, structured details and agent email/brokerage.
- Custom keyword detection — define regular-expression groups to flag features (waterfront, pool, ADU, septic, solar, …) and rank listings by
keywordScore. - Built for monitoring — schedule it with
daysListed: 1and get every new listing in your market each morning. - Robust against blocking — Apify residential proxy rotation, automatic retries with exponential backoff and bot-challenge detection.
- Pay per event — you are charged per listing, not per compute minute; the run stops cleanly at
maxResultsor your cost limit.
How to scrape Realtor.com listings
- Open the Actor in Apify Console and click Try for free.
- Enter one or more Locations (city, county, ZIP or neighborhood) — or leave it empty and set a State code to search an entire state.
- Optionally set price, bedroom, bathroom and Listed within the last N days filters.
- Choose Max results and whether to Fetch full property details.
- Click Start. When the run finishes, open the Output tab to preview the data or Export it as JSON, CSV, Excel, XML, HTML or RSS.
You can also run it from the Apify API, the Apify CLI, or the JavaScript / Python clients — see Use the scraper from code below.
Input parameters
| Field | Type | Default | Description |
|---|---|---|---|
locations | string[] | [] | One search per entry: city, county, ZIP or neighborhood. |
stateCode | string | – | Two-letter US state code; used only when locations is empty (state-wide search). |
status | string[] | ["for_sale","ready_to_build"] | Listing types to include. |
daysListed | integer | – | Only listings listed within the last N days. 1 = daily new-listing monitoring. |
priceMin / priceMax | integer | – | List price range in USD. |
bedsMin / bedsMax | integer | – | Bedroom range. |
bathsMin / bathsMax | number | – | Bathroom range. |
sortBy | newest | oldest | price_asc | price_desc | newest | Collection order (matters when maxResults is smaller than the match count). |
maxResults | integer | 1000 | Stop after this many unique listings across all locations. |
fetchDetails | boolean | true | One extra request per listing for the full property record. Turn off for a cheaper search-only run. |
keywordGroups | object[] | [] | Optional regex groups for feature detection (see Keyword detection). Leave empty to skip. Automatically enables fetchDetails. |
proxyConfiguration | object | Apify RESIDENTIAL | Residential proxies strongly recommended. |
maxConcurrency | integer | 10 | Parallel detail requests. |
maxRetries | integer | 4 | Retries per request. |
debugLog | boolean | false | Verbose logs + raw sample response in the key-value store. |
Example input
Scrape every 3+ bedroom home listed in the last week in two Wisconsin counties, priced between $200k and $600k, with full property details:
{"locations": ["Kenosha County, WI", "Racine County, WI"],"daysListed": 7,"priceMin": 200000,"priceMax": 600000,"bedsMin": 3,"maxResults": 500,"fetchDetails": true}
State-wide search-only run (cheapest option):
{"stateCode": "NY","daysListed": 1,"fetchDetails": false,"maxResults": 2000}
Output example
One dataset item per unique listing:
{"propertyId": "8279116705","listingId": "2986442139","url": "https://www.realtor.com/realestateandhomes-detail/1234-Main-St_Kenosha_WI_53140_M82791-16705","status": "for_sale","address": "1234 Main St","city": "Kenosha","county": "Kenosha","stateCode": "WI","postalCode": "53140","latitude": 42.573828,"longitude": -88.110104,"price": 249900,"beds": 2,"baths": 1,"sqft": 863,"lotSqft": 8276,"yearBuilt": 1930,"yearRenovated": null,"propertyType": "single_family","construction": null,"heating": "Forced air","cooling": "Central air","exterior": null,"roofing": null,"listDate": "2026-08-28T21:30:56.000000Z","photoCount": 24,"primaryPhotoUrl": "http://ap.rdcpix.com/....jpg","description": "Charming ranch on a quiet lot close to schools and parks ...","details": [{ "category": "Utilities", "parentCategory": "Utilities", "text": ["Sewer: Public", "Water: Public"] }],"agentName": "Jane Doe","agentPhone": "2625551234","agentEmail": "jane@example.com","agentUrl": "https://www.realtor.com/realestateagents/...","brokerageName": "Example Realty","officePhone": "2625550000","keywordMatches": {},"keywordScore": 0,"detailsFetched": true,"searchLocation": "Kenosha County, WI","scrapedAt": "2026-08-29T12:00:00+00:00"}
With fetchDetails: false, county, details, agentEmail, brokerageName and the keyword fields stay empty and detailsFetched is false.
A run summary (listingsPushed, listingsWithDetails, per-location totals, request stats, charged amount) is saved to the key-value store under SUMMARY. Both outputs are declared in the Actor output schema, so they appear in the run's Output tab and in the GET run API response, and every dataset field is documented in the dataset schema (readable by AI agents and MCP clients).
Keyword detection
Need to find listings with a specific feature that realtor.com does not expose as a filter? Add one or more keyword groups — the field is empty by default and completely optional. Each group is a named set of case-insensitive Python regular expressions:
{"name": "pool","detailPatterns": ["\\bpool\\b"],"descriptionPatterns": ["\\b(in-?ground|heated)\\s+pool\\b"],"detailScore": 10,"descriptionScore": 5}
detailPatternsrun against every row of the structured details list (e.g."Exterior: In Ground Pool"). A match addsdetailScore(default 10) per matching row and records"<category>: <text>"inkeywordMatches.descriptionPatternsrun against the free-text description. Each matching pattern addsdescriptionScore(default 5) and records a short snippet.- Use
\bword boundaries to avoid false positives. - If more than one group is defined and all of them match,
keywordScoregets a +20 bonus — useful for "must have A and B" searches. Sort or filter the dataset bykeywordScore.
How much does it cost to scrape Realtor.com?
This Actor uses pay-per-event pricing, so you pay only for what you use:
| Event | Charged |
|---|---|
| Actor start | once per run |
| Listing result | per listing pushed to the dataset |
| Listing details | additionally per listing enriched with full property details |
Turn off fetchDetails for cheap, high-volume searches; turn it on when you need county, agent contacts, structured details or keyword detection. The run stops cleanly when maxResults or your run's maximum cost limit is reached, so you never pay for more than you asked for. Apify's free plan is enough to try it out.
Use the Realtor.com scraper from code
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("<ACTOR_ID>").call(run_input={"locations": ["Milwaukee, WI"],"daysListed": 1,"maxResults": 100,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["price"], item["address"], item["url"])
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('<ACTOR_ID>').call({locations: ['Milwaukee, WI'],daysListed: 1,maxResults: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Integrations and automation
- Schedules — run daily, hourly or on any cron expression to monitor new listings.
- Webhooks — trigger your own endpoint when a run finishes.
- Google Sheets, Slack, email, Make, Zapier, n8n — push new listings into your workflow with Apify's integrations.
- AI agents & MCP — the dataset schema documents every field, so LLM agents can query the output directly through the Apify MCP server.
Tips for better results
- Daily monitoring: schedule the Actor with
daysListed: 1and connect a webhook or integration to get new listings every morning. - Large areas: prefer several counties over a single state-wide search — results are more relevant and you can stop early per county.
- Blocks / retries: keep the default residential proxy; lower
maxConcurrencyif the log shows many retries. - Cost control: set
maxResultsand a run-level maximum cost so large searches never overrun your budget.
FAQ
Is it legal to scrape Realtor.com?
The scraper collects only publicly available listing data — no login, no personal data behind authentication. Web scraping of public data is generally legal, but you are responsible for using the data in accordance with realtor.com's terms of service and applicable laws (including privacy laws such as GDPR and CCPA when handling agent contact details). See Apify's guide to the legality of web scraping.
Does it return sold, pending or rental listings?
No. It covers for-sale and ready-to-build (new construction) listings. Sold history and rentals are not included.
How many listings can I scrape in one run?
Up to maxResults (max 10,000) across all locations. realtor.com caps individual searches, so for very large state-wide searches split the work by county or ZIP code.
Do I need proxies?
Yes — realtor.com rate-limits and blocks datacenter IPs. The Actor defaults to Apify residential proxies, which are included in your Apify subscription.
What if Realtor.com changes its website?
realtor.com can change its private API at any time. The Actor is actively maintained; if you notice missing fields or failing runs, open an issue on the Actor's Issues tab.
Can I get agent emails and phone numbers?
Yes. With fetchDetails: true each listing includes the listing agent's name, phone, email, profile URL, brokerage name and office phone when realtor.com publishes them.
Related real estate scrapers
Looking for other sources? Search the Apify Store for Zillow, Redfin, Trulia, Homes.com and Apartments.com scrapers to combine data from multiple portals.
Scrapes publicly available listing data from realtor.com. Not affiliated with, endorsed by or sponsored by Realtor.com, Move Inc. or the National Association of REALTORS®.