Realtor.com Listings Scraper
Pricing
from $0.42 / 1,000 listings
Realtor.com Listings Scraper
Scrape Realtor.com property listings by location: price, beds, baths, photos, description and the listing agent's contact. Export to JSON, CSV or Excel.
Pricing
from $0.42 / 1,000 listings
Rating
0.0
(0)
Developer
Nice Dev
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share
🏠 What is Realtor.com Listings Scraper?
Realtor.com Listings Scraper extracts property listings from Realtor.com: price, beds, baths, square footage, the full description, every photo, and the listing agent's name, email and phone, for any US city, ZIP code, county or state. It works as a Realtor.com API alternative: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.
Type a location (Austin, TX), click Start, and download the listings in JSON, CSV or Excel. No login, nothing to set up, and it is fast: about 1,000 listings in 10 seconds. Homes for sale, for rent, sold, pending and coming soon, with 31 filters and an optional detail pass that adds price history, tax history, schools, flood and fire risk and value estimates — plus two options sold apart: the property's building permit history (with a roof-permit flag) and how many people viewed the listing.
📋 What data can you extract from Realtor.com?
One item per listing, 78 fields:
| Category | What you get |
|---|---|
| 🏷️ Listing | Realtor.com id, MLS number, link, status (for sale, for rent, sold, pending, coming soon), who published it (an agent, a builder, a rental company), badges such as "new listing" or "price reduced" |
| 💰 Price | asking price, price per square foot, last price cut and its date, last sale price and date — 460000 USD, 285 per sq ft |
| 🏠 The home | property type, beds, baths, living area, lot size, year built, stories, garage spaces, HOA fee — 3 beds, 2.5 baths, 1,612 sq ft |
| 📍 Location | street address, city, state, ZIP code, county, neighborhood, latitude and longitude, Street View link |
| 📝 Text and photos | the agent's full description, feature lists (appliances, interior…), every photo, virtual tour, open houses, pet policy |
| 📇 Agent and office | listing agent's name, email, phone numbers and photo, office, broker, MLS board — (512) 637-8277 |
| 🕒 Dates | date listed, last update, days on market — what the date filters read |
| 📈 History and estimates | detail — price history, tax history, value estimates with their past and a 12-month forecast, mortgage estimate |
| 🏫 Schools and risk | detail — assigned schools with their rating, FEMA flood zone, flood, fire and noise scores |
| 👀 Demand and permits | options — how many people viewed, clicked and enquired, per period (includeViewStats); building permit history and a roof-permit flag (includePermitHistory) |
Every field, with an example, is listed in the Output section below.
Fields marked detail are filled when Extract details is on (read 25 listings per extra request, charged as its own event); fields marked options only when their option is on, each charged for what it delivers. Everything else — description, photos and the agent's contact details included — comes with the search results.
✅ Why use Realtor.com Listings Scraper?
- 🚀 Fast: about 1,000 listings in 10 seconds, 5 requests.
- 🏠 Type the city, not a URL:
Austin, TX,78704,Travis CountyorTexas— or paste a Realtor.com search URL and its filters are read. - 🎛️ 31 filters: price, beds, baths, living area, lot, year built, garage, HOA fee, radius, property type, foreclosures, new construction, open houses, virtual tours, no pending sales, MLS listings only, pets — 27 of them applied by the site itself, so a filtered search costs less, not more.
- 📈 More than the listing card: price and tax history, school ratings, flood / fire / noise scores, value estimates with a 12-month forecast. On top, two options: the building permit history of the property (type of work, project, date, status) with a
hasRoofPermitflag that spots roofing jobs at a glance — the list roofers, remodelers and insurers look for — and how many people viewed, saved and enquired about the listing over the last days. You pay for them only when they are delivered: a property with no permit on record, or a brand-new listing with no view count yet, costs nothing extra. - 📇 The listing agent comes with the listing: name, email, phone, photo, office and broker, with no separate agent scraper to buy.
- 🔍 Past the site's 10,000-result cap: a search bigger than that is split into price bands (sold homes: sale-date ranges) on its own.
- 🔔 Monitoring built in: tick Only new listings, schedule the Actor, and each run returns (and charges) only what it has never delivered before.
- 🔌 API, scheduling, integrations (Make, Zapier, n8n, Google Sheets…), and JSON/CSV/Excel export via the Apify platform.
🚀 How to scrape Realtor.com
- Create a free Apify account.
- Open Realtor.com Listings Scraper and type a Location (e.g.
Austin, TX). - Or paste your own Realtor.com URLs into Start URLs: search results pages, sold pages, rental pages, or single listing pages.
- Pick a Listing status (for sale, for rent, sold, pending, coming soon), set the filters you need and Max listings (100 by default, 0 = no limit), then click Start.
- Download the dataset in JSON, CSV, Excel or via API.
💰 How much does it cost to scrape Realtor.com?
This Actor uses pay per event pricing: $0.65 per 1,000 listings — plus $0.01 per run start ($1 per 100 runs). Listings read with Extract details on cost $0.69 per 1,000 instead, the extra requests included. Two options come on top, charged only for what they deliver: building permits, $1.79 per 1,000 permit rows (3 permits on a property = 3 rows; none = nothing) and view statistics, $0.89 per 1,000 listings that have them; turning either on reads the detail page, so the listing is charged as a listing with details. A single listing page pasted into startUrls is always read in full and costs the same. Higher Apify plans pay less per listing: $0.64 (Bronze), $0.63 (Silver) and $0.62 (Gold) per 1,000 — with details $0.68, $0.67 and $0.66; permit rows $1.78, $1.77 and $1.76; view statistics $0.88, $0.87 and $0.86. The Actor's own filters (listing date, excluded keywords, agent phone) are applied to every listing it reads, kept or not: $0.04 per 1,000 listings checked (filter-check), $0.035 on Bronze, $0.03 on Silver and $0.025 on Gold; a run without them pays nothing for it. Example: 20,000 listings ≈ $13.01; a daily monitor of 300 new listings ≈ $0.21 a day. Platform usage (compute, proxy) is included in the price.
⚙️ Input
{"location": "Austin, TX","listingStatus": "for_sale","maxItems": 200}
Several locations, a cap per search, houses in a price range, only the ones not delivered before:
{"locations": ["Austin, TX", "78704", "Dallas, TX"],"propertyType": ["single_family"],"minPrice": 300000,"maxPrice": 600000,"minBedrooms": 3,"maxItemsPerQuery": 500,"onlyNew": true,"stateKey": "austin-houses"}
Or with your own URLs:
{"startUrls": [{ "url": "https://www.realtor.com/realestateandhomes-search/Austin_TX/beds-3/price-300000-600000" },{ "url": "https://www.realtor.com/realestateandhomes-detail/7704-Fenton-Cv_Austin_TX_78736_M73634-37439" }],"maxItems": 500}
Give at least one place (location or locations) or one URL (startUrls). With none, the Actor runs an example instead of stopping — a search in Austin, TX, at most 20 listings — and says so in the log.
| Field | Notes |
|---|---|
location, locations | City (Austin, TX), ZIP code (78704), county or state (Texas); locations adds more places. |
query, searchQueries | Keyword matched against the listing text (pool, waterfront). Every keyword is searched in every location (max 500 searches per run). |
startUrls | Realtor.com search, sold or rental pages (place, price, beds, baths, sqft, lot size, home age, days on market, HOA, garage, type, radius, listing switches, sort and page are read from the URL; features, keywords and price-reduced filters are refused by name) or single listing pages. |
listingStatus | for_sale, for_rent, sold, pending or coming_soon. |
propertyType | single_family, condos, townhomes, multi_family, land, mobile, farm — several at once. |
minPrice, maxPrice, minBedrooms, maxBedrooms, minBathrooms, maxBathrooms | Price in US dollars (the monthly rent for rentals); half bathrooms count as 0.5. |
minSqft, maxSqft, minLotSqft, maxLotSqft, minYearBuilt, maxYearBuilt, minGarage, maxHoaFee | Living area and lot in square feet, year built, garage spaces, monthly HOA fee. |
radiusMiles, sortBy, soldWithinDays | Widen the search around the location (5); order the results (list_date:desc); for sold listings, how far back to go. |
foreclosureOnly, newConstructionOnly, openHousesOnly, virtualTourOnly, noHoaFeeOnly, excludePending, mlsOnly, petsAllowed | Switches applied by the site; excludePending leaves out the homes for sale already under contract (from 1 in 7 to 1 in 3, depending on the city); mlsOnly keeps the listings an MLS publishes (no builder plans, no apartments posted by rental companies); petsAllowed (cats, dogs) only applies to rentals. |
extractDetails | Add price and tax history, schools, risk scores and value estimates (read 25 listings per extra request, charged as its own event). Off by default. |
includePermitHistory, includeViewStats | Options, off by default: the building permits filed on the property with a roof-permit flag (charged per permit row), and the view / save / enquiry counts per period (charged per listing that has them). Either one turns extractDetails on. |
maxItems, maxItemsPerQuery | Stop after this many listings for the whole run (0 = unlimited); cap for EACH search (location × keyword, or search URL). |
postedAfter, postedBefore | Listing date range: 2026-09-01, or a period before now (7 days, 2 weeks, 1 month, 24 hours). |
excludeKeywords, requirePhone | Drop listings whose address, city or description contains one of these words (case and accents ignored); or whose agent has no phone number. |
onlyNew, stateKey, resetState | Monitoring: only the listings never delivered under this memory key; resetState forgets the memory. |
| Advanced | proxyConfiguration (Apify proxy by default, included in the price; the residential proxy is not available), maxConcurrency, maxRequestsPerMinute, maxRequestRetries, debugLog. |
📦 Output
One item, shortened to the fields a search result carries (the detail fields are cut here):
{"id": "7363437439","listingId": "2816017","url": "https://www.realtor.com/realestateandhomes-detail/7704-Fenton-Cv_Austin_TX_78736_M73634-37439","status": "for_sale","mlsStatus": "Active","listPrice": 460000,"currency": "USD","pricePerSqft": 285,"listDate": "2026-09-20T02:35:29.000Z","propertyType": "single_family","beds": 3,"baths": 2.5,"sqft": 1612,"lotSqft": 8015,"yearBuilt": 1982,"description": "Welcome to this stylishly updated home nestled on a private cul-de-sac lot...","address": "7704 Fenton Cv","city": "Austin","stateCode": "TX","postalCode": "78736","countyName": "Travis","latitude": 30.35,"longitude": -97.77,"agentName": "PATRICIA SMITH","agentEmail": "patriciasmith@realtor.com","agentPhone": "(512) 637-8277","officeName": "Keller Williams Realty","mlsName": "AUTX","mlsNumber": "2816017","photos": ["https://ap.rdcpix.com/.../1-m.jpg"],"photoCount": 27,"daysOnMarket": 14,"searchUrl": "https://www.realtor.com/realestateandhomes-search/Austin_TX?page=1","scrapedAt": "2026-09-20T12:00:00.000Z"}
You can download the dataset in various formats such as JSON, HTML, CSV or Excel.
All 78 fields
| Fields | Example |
|---|---|
id, listingId, url | 7363437439, 2816017, https://www.realtor.com/realestateandhomes-detail/... |
status, mlsStatus, flags, tags | for_sale, Active, isNewListing, central_air |
listPrice, currency, pricePerSqft, listPriceMin, listPriceMax | 460000, USD, 285 — min / max for a new-construction price range |
priceReducedAmount, priceReducedDate, lastSoldPrice, lastSoldDate | 15000, 2026-09-12T15:04:11.207Z, 389900, 2020-08-24 |
listDate, lastUpdateDate, daysOnMarket | 2026-09-20T02:35:29.000Z (what the date filters read), 14 |
propertyType, propertySubType, yearBuilt, stories, garage | single_family, condo, 1982, 2, 2 |
beds, baths, bathsFull, bathsHalf, sqft, lotSqft, hoaFee | 3, 2.5, 2, 1, 1612, 8015, 250 |
description, features | the agent's own text; feature lines grouped by category (Appliances, Interior…) |
address, city, state, stateCode, postalCode | 7704 Fenton Cv, Austin, Texas, TX, 78736 |
countyName, countyFips, neighborhoods, latitude, longitude, streetViewUrl | Travis, 48453, Oak Hill, 30.35, -97.77 |
agentName, agentEmail, agentPhone, agentPhones, agentPhotoUrl | PATRICIA SMITH, patriciasmith@realtor.com, (512) 637-8277, every number with its type, the agent's photo |
officeName, officeEmail, officePhone, brokerName, mlsName, mlsNumber, listingSource | Keller Williams Realty, AUTX, 2816017, mls (or a builder, new_home, or a rental company, community / unit_rental) |
photos, photoCount, virtualTourUrl, openHouses, petPolicy | 27 photo URLs, a Matterport link, the scheduled open houses, which pets a rental takes |
priceHistory, taxHistory, estimates, estimatesHistory, estimatesForecast | detail — 39 listing events, 17 years of tax, 3 value estimates with past and forecast |
schools, floodScore, femaZone, fireScore, noiseScore, noiseCategories | detail — assigned schools with their rating, FEMA zone, flood / fire / noise scores |
monthlyPayment | detail — mortgage estimate |
stats | option includeViewStats — views, clicks, saves, shares and enquiries per period |
buildingPermits, hasRoofPermit | option includePermitHistory — each permit (project, type of work, date, status); true when one is a roof job |
searchUrl, scrapedAt | the search it was found through, ISO timestamp |
💡 Tips
How to get more results
One search returns at most 10,000 listings — that is the site's own limit, not the Actor's. Above it, the Actor splits the search into price bands, and each band again until every piece fits — sold homes into sale-date ranges instead, since many of them have no price — so a whole state comes out in one run. The few listings with no price at all (about 1 in 1,000 rentals, fewer for sale) cannot be reached by a price band; sold homes lose none. The count the site shows also counts twice a home listed by two sources (two MLS, or an MLS and a rental manager): it comes out once, under one id and one URL. Measured on whole searches: Harris County for sale, 29,279 listings for a count of 29,403; Arizona rentals, 35,456 for 35,842. You can also split a search yourself by putting several ZIP codes in locations. Set maxItems to 0 to take everything a search has.
How to reduce costs
The price is per listing, so the levers are maxItems, maxItemsPerQuery, the filters (a filtered-out listing costs only its filter check, $0.04 per 1,000, $0.025 on the Gold plan) and onlyNew for recurring runs (you never pay twice for the same listing). Leaving extractDetails off keeps listings at the lower price: the search results already carry description, photos and the agent's contact details.
Several searches in one run
Fill locations and / or searchQueries: the Actor runs one search per location × keyword (3 keywords × 4 cities = 12 searches, up to 500 per run). The single location and query fields still work and are added to the lists. A listing found by several searches is saved — and charged — once. Set maxItemsPerQuery to give every search its own cap: without it the first searches can use up the whole maxItems budget. You can also paste several search URLs into startUrls: each one is a search of its own, with the same cap.
Monitoring: only the new listings
Tick Only new listings (onlyNew) and schedule the Actor. The first run returns everything; each later run skips the listings already delivered: they are not saved, not charged, and no detail request is made for them. The memory lives in a named key-value store of your account (realtor-listings-scraper-seen, up to 150,000 listings per key) and is only updated with listings that really reached the dataset, so a failed run never hides anything. Give each schedule its own stateKey (two schedules sharing a key would hide each other's listings), and tick resetState once to start over. The searches of the form are then sorted by listing date, newest first (rentals: in the order they were published, which also reaches the rentals that carry no date; a pasted URL keeps its own sort), and a search stops once it meets 200 listings in a row that you already have — or, under a lower maxItems / maxItemsPerQuery, 80 % of that cap in all (a listing of the block the last run delivered may have been sold or relisted since). Realtor.com dates a listing by the day it first went on the market and never moves that date afterwards, so a listing you already have cannot climb back above a new one. Rental buildings (apartment communities) are the exception: the site puts them back on top each time they are updated, so they never count in those 200, and one you already have is still skipped.
Filter by listing date
postedAfter and postedBefore take a date (2026-09-01, the whole day is included, site time zone) or a period before now (7 days, 2 weeks, 1 month; via the API also 24 hours or a full ISO date-time). The filter reads listDate, the moment the listing went on the market; a listing without one is dropped as soon as a date bound is set. Filtered-out listings are not saved and do not count in maxItems (each listing checked costs the filter fee, see pricing); the run summary tells how many were filtered. With postedAfter, the searches of the form are sorted by newest and stop at the first page that is entirely too old; a URL pasted into startUrls keeps its own sort, and stops early only when it is sorted by newest listing date — otherwise it is read to its end, each listing checked.
🔌 Integrations and API
Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.
🤖 Use with AI agents (MCP)
AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the Apify MCP server, billed to their Apify account like any run. It returns one item per Realtor.com property listing. Actor id: nice_dev/realtor-listings-scraper; MCP server with this Actor only: https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/realtor-listings-scraper.
Smallest input, for a cheap first call:
{"location": "Austin, TX","maxItems": 10}
Key output fields: url, status, listPrice, beds, baths, sqft, address, agentPhone.
Cost: $0.65 per 1,000 listings plus $0.01 per run start ($0.62 per 1,000 on the Gold plan); Extract details, the permit and view-statistics options and the Actor's own filters cost extra, see the pricing section above. Cap each call with maxItems and, through the API, with the run option maxTotalChargeUsd.
❓ FAQ
Is it legal to scrape Realtor.com?
The Actor only reads what Realtor.com shows publicly to any anonymous visitor. It logs in to nothing. Results contain the contact details of licensed real-estate professionals acting in their trade, and personal data is protected by GDPR and by US state privacy laws: do not store it without a legitimate reason, and do not use it for unsolicited marketing where that is restricted. Listing content comes from local MLS boards and its redistribution can be limited by their rules. You are responsible for using the data in compliance with Realtor.com's Terms of Use and applicable law. This Actor is not affiliated with Realtor.com, Move, Inc. or the National Association of REALTORS®.
Does it need a login or a proxy?
No login. The proxy is included in the price: leave the default setting (the residential proxy is not available). A request the site turns away is retried at once on a new proxy session (without a proxy, after a pause of 5 seconds, doubled at each retry up to 150 seconds).
Which fields can be empty?
Realtor.com does not publish everything for every listing, and the Actor never invents a value: a field it has no data for is null or an empty list. Measured on 800 real listings of every kind: agentEmail and agentPhone are there on about 6 listings in 10 (almost always on sold listings, less often on new ones), beds / baths / sqft are missing on land and mobile homes, and lastSoldPrice is null in non-disclosure states such as Texas and Utah, where sale prices are not public records. With extractDetails on and measured on 30 listings: price history and schools on all of them, tax history on 20, value estimates on 22. With the options on (26/09, 450 listings): building permits on 169 of 300 listings in Austin (5 rows on average, up to 20) and 116 of 150 in Tampa, where 69 carry a roof permit; view counts on 426 of 450 — a brand-new listing has none yet, the site starts counting a few days after it goes up.
Is the data safe to open in Excel or to show on a web page?
Descriptions are the agents' own words, copied as they are, and a text can begin with -, +, = or @ (a phone number, a line such as -20% price cut): Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. Every URL field (url, photos, virtualTourUrl, streetViewUrl, agentPhotoUrl) holds an http(s) URL or null — nothing else gets through. On a web page, escape every field like any text written by a stranger.
Known limitations
- Site filters that are not in the input can still be used by pasting a filtered search URL into
startUrls. A URL whose filters the Actor cannot apply is refused by name instead of being run without them. - One search returns at most 10,000 listings on the site itself; bigger searches are split automatically, and
maxItemsPerQuerystill counts for the whole search, not for each piece. Past 10,000, the listings come band by band: the sort order holds within each band, not across the whole search. daysOnMarketis counted fromlistDate: Realtor.com leaves its own field empty. For a sold home it stops at the sale day (lastSoldDate).onlyNewremembers listing ids, not their content: a listing whose price changed is not returned again.- Rentals: part of the rental listings carry no listing date on Realtor.com (12 % in Austin, 61 % across Arizona), so their
listDateanddaysOnMarketare empty.onlyNewstill returns the new ones (rentals are read in the order they were published);postedAfter/postedBeforeleave them out. - Sold homes: many sales were never listed and come from public records (30 % of Texas sales, a third to a half in some cities). They have no
listPrice,listDate, MLS number, agent or description (listingSourceis empty); sorted by listing date, sale date or price they come last, sorted by size or last update they are mixed in. - "Sold in the last N days" counts from the day the run started (New York time), for its whole length — a resurrected run keeps that day.
- Two runs sharing the same
stateKeyat the same time may both return the same new listing.
A run that reaches its timeout stops itself about 45 seconds before it: no new page is asked, what it read is saved and, with onlyNew, remembered, and the run ends Succeeded with "Stopped before the run's timeout". Resurrect it to go on from there, or give the next run a longer timeout (Run options).
A run the platform stops without warning (out of memory)
- Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the listings already saved are skipped: none is delivered or charged twice, and
maxItemsstill counts them. - With
onlyNew, the memory is saved after each write (at most once every 2 seconds): resurrect the stopped run and the listings it had saved meanwhile join the memory; leave it stopped for good, and the next run may return the listings of its last 2 seconds once more.
Something doesn't work?
The last line of the log counts the listings saved, filtered out and no longer on Realtor.com (removed while the run was reading them), and the requests that failed after every retry. Those requests and the removed listings are listed, with the reason, in the FAILED_REQUESTS record of the run's key-value store. A run that saved nothing and had failed requests fails, and its last message gives the cause (a location the site does not know says so, instead of "run it again"). A run that saved some listings fails too when at least as many requests failed for good as were read: a green run with a short dataset would hide an outage. One failed request among many is only a warning.
If Realtor.com changes its pages, you are told instead of paying for blank rows. A results page that counts listings but gives none the Actor can read is an error (listed in FAILED_REQUESTS), never a quiet "No listings found". If the first 20 listings read all lack their URL, status, price or listing date (rentals aside), last update date, property type, address, city, state, ZIP code, county, MLS number or — with details — price history, the run saves nothing more, stops and fails, and its last message names the missing field: at most those first listings are charged. A listing that postedAfter / postedBefore drops because it has no date at all counts among those 20. With details, if the first 20 listings of the run all come back as no longer on Realtor.com, the run stops and fails the same way, with nothing charged.
🛟 Support
Open an issue in the Issues tab with a link to your run: the run log and the FAILED_REQUESTS record of the key-value store show exactly which URLs failed and why.