Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Realtor.com Scraper icon

Realtor.com Scraper

Realtor.com listings as JSON, by city, ZIP or county. Fields: address, price, beds, baths, sqft, year built, days on market, agent, broker. $0.68/1k.

5 from 1 review on Apify 97 runs on Apify $0.00068 per property listing ($0.68 / 1,000)
Run this in the cloudRun on Apify →

Real Estate & Classifieds

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust location, startUrls, listingStatus (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.00068 per property listing = $0.68 per 1,000

You are charged forWhenPrice
Property listingCharged once per property listing returned. $0.68 per 1,000 listings. Diagnostics and empty results are never charged.$0.00068

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2020-01-01, and they are what you are actually charged.

Inputs

FieldWhat it doesType
locationWhere to search on Realtor.com. One per line. Accepts "City, ST" (Austin, TX), a 5-digit ZIP (78704), a county ("Travis County, TX"), a neighborhood ("Zilker, Austin, TX") or a state code (TX). United States only.array
startUrlsOptional. Paste Realtor.com search pages (https://www.realtor.com/realestateandhomes-search/Austin_TX) or single property pages (https://www.realtor.com/realestateandhomes-detail/..._M84963-61588). Filters written into the URL (price-, beds-, type-, show-recently-sold) are honoured. Works alongside "location".array
listingStatusWhich listings to return. "sold" covers recently sold homes; "off_market" covers homes no longer listed.string
propertyTypesOptional. Leave empty for every type. Note that Realtor.com's own value is "condos" (plural), "condo" matches nothing.array
maxItemsHard cap on rows returned across every location and URL. You are charged once per listing returned. Realtor.com's API cannot page deeper than 10,000 results per search, split by ZIP code to go beyond that.integer
sortByOrder the listings come back in.string
includePropertyDetailsAdds the listing description text, tax history, price history, nearby schools and value estimates to every row. Costs one extra request per listing, so the run is slower. It adds fields, never extra rows, so it does not change what you are charged.boolean
maxPhotosHow many photo URLs to keep per listing (0-50). Realtor.com returns up to 50.integer
priceMinOptional lowest list price.integer
priceMaxOptional highest list price.integer
bedsMinSkip anything with fewer bedrooms than this. Leave empty for no lower bound.integer
bedsMaxSkip anything with more bedrooms than this. Leave empty for no upper bound.integer
bathsMinSkip anything with fewer bathrooms than this. Leave empty for no lower bound.integer
sqftMinSmallest living area to keep, in square feet. Listings that do not publish a size are kept either way.integer
sqftMaxLargest living area to keep, in square feet. Listings that do not publish a size are kept either way.integer
lotSqftMinOptional. 1 acre = 43,560 sqft.integer
yearBuiltMinKeep only homes built in this year or later. Leave empty to ignore the build year.integer
yearBuiltMaxKeep only homes built in this year or earlier. Leave empty to ignore the build year.integer
listedWithinDaysOptional. Only listings first posted in this window. Use with status "For sale".integer
soldWithinDaysOptional. Only homes sold in this window. Use with status "Recently sold".integer
hasOpenHouseKeep only listings with an open house already on the calendar. Off returns everything.boolean
newConstructionKeep only new builds. Off returns new and resale together.boolean
foreclosureKeep only foreclosures. Off returns everything, foreclosures included.boolean
keywordsOptional. Words that must appear in the listing, for example "pool", "waterfront", "garage".array

What you get

A structured dataset — each result includes fields like:

addresscitystateCodepostalCodepricebedsbathssqftlotSqftpropertyTypeyearBuiltlistingStatusdaysOnMarketagentNamebrokerNamelatitudelongitudephotoCounturl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Real Estate & Classifieds

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Craigslist Scraper iconReal Estate & Classifieds

Craigslist Scraper

Scrape Craigslist listings by city, category and keyword: id, title, price, neighborhood, date, images and URL. No account or API key. $0.85 per 1,000.

1 use cases

Airbnb Listings Scraper iconTravel, Hotels & Events

Airbnb Listings Scraper

Scrape Airbnb listings by location, dates and guests. Get listing ID, name, room type, price, rating, reviews and host. No account, no API key.

Ready to run — no setup

Avito Listings Scraper iconReal Estate & Classifieds

Avito Listings Scraper

Scrape Avito.ru listings by keyword, category or city. Get id, title, price, seller name and type, publish date and photos. $0.30 per 1,000 listings.

1 use cases

Facebook Marketplace Scraper iconReal Estate & Classifieds

Facebook Marketplace Scraper

Scrape Facebook Marketplace listings by keyword and city. Rows carry title, price, currency, location, link, posted date, sold status.

Ready to run — no setup

Zillow Scraper iconReal Estate & Classifieds

Zillow Scraper

Scrape Zillow search results and full listing details: price, beds, baths, sqft, photos, price history, schools. No login or API key. $0.0008 per property.

1 use cases

See all Real Estate & Classifieds →

Realtor.com Scraper: US home listings by city, ZIP, county or a URL you paste

Type a location and every matching listing comes back as a row: address, price, beds, baths, square feet, lot size, property type, year built, status, days on market, the listing agent and broker, and the photos. For sale, for rent, recently sold, off market or ready to build.

The awkward part first. daysOnMarket counts from the list date on every row, whatever the status. On a sold or off-market listing that number keeps growing after the sale, so it is days since listing rather than days it was actually on the market. Use listDate and lastSoldDate when the difference matters.

InputCities, ZIPs, counties, neighbourhoods or state codes, or Realtor.com URLs
OutputOne row per listing
Ceiling10,000 listings per run, and Realtor.com will not page deeper than 10,000 per search
Account neededNone, and nothing to install
Price$0.68 per 1,000 listings, flat on every plan

🏷️ What Realtor.com Scraper does

Location takes Austin, TX, a five-digit ZIP, Travis County, TX, a neighbourhood like Zilker, Austin, TX, or a bare state code. One per line, and the whole run shares one budget and one duplicate check, so the same home found under two of your searches is delivered once.

Do not put a street address in there. It gets resolved to the area around it and searched as an area, so you would be billed for a neighbourhood's listings instead of the one house. Paste the property URL into Realtor.com URLs instead, which looks that one property up.

Pasted URLs keep their own filters. Price, beds, type and show-recently-sold written into a Realtor.com search URL are honoured, and search pages and single property pages both work.

Then there are the filters, and there are a lot of them: status, property type, price, beds, baths, living area, lot size, year built, how recently it was listed or sold, open houses, new builds, foreclosures, and keywords that have to appear in the listing.

One gotcha worth knowing: Realtor.com's own value is condos, plural. condo matches nothing.

📥 What you give it

{
  "location": ["Austin, TX"],
  "listingStatus": "for_sale",
  "propertyTypes": ["single_family"],
  "priceMax": 600000,
  "bedsMin": 3,
  "sortBy": "newest",
  "maxItems": 200
}
FieldDefaultWhat it is
locationbox starts at Austin, TXWhere to search. City, ZIP, county, neighbourhood or state code. US only.
startUrlsnoneRealtor.com search pages or single property pages, pasted from the site.
listingStatusfor_saleAlso for_rent, sold, off_market, ready_to_build.
propertyTypesevery typesingle_family, condos, townhomes, multi_family, mobile, land, farm and the combined condo_townhome_rowhome_coop.
sortBynewestAlso oldest, price_low, price_high, sold_date, most_photos.
priceMin, priceMaxnoneList price bounds in dollars.
bedsMin, bedsMax, bathsMinnoneRoom counts.
sqftMin, sqftMax, lotSqftMinnoneLiving area and lot size in square feet. One acre is 43,560.
yearBuiltMin, yearBuiltMaxnoneBuild year bounds.
listedWithinDaysnoneOnly listings first posted in this window. Pair it with For sale.
soldWithinDaysnoneOnly homes sold in this window. Pair it with Recently sold.
hasOpenHouse, newConstruction, foreclosureoffEach keeps only that kind when switched on.
keywordsnoneWords that must appear in the listing, like pool or waterfront.
includePropertyDetailsoffAdds description, tax history, price history, schools and value estimates. One extra request per listing, no extra charge.
maxPhotos30Photo URLs to keep per listing, 0 to 50.
maxItems50Total listings across every location and URL, up to 10,000.
proxyConfigurationleave it aloneOptional, under Network. Only the proxyUrls you type in are read.

📤 What you get back

A real row from a run on 14 September 2026, with the feature list cut short:

{
  "propertyId": "9843409442",
  "listingId": "3000701603",
  "url": "https://www.realtor.com/realestateandhomes-detail/5009-Monarda-Mint-Dr_Austin_TX_78754_M98434-09442",
  "address": "5009 Monarda Mint Dr",
  "addressWithheld": false,
  "city": "Austin",
  "stateCode": "TX",
  "state": "Texas",
  "postalCode": "78754",
  "county": "Travis",
  "countyFips": "48453",
  "latitude": 30.367015769780284,
  "longitude": -97.62425231789224,
  "price": 490222,
  "pricePerSqft": 199,
  "priceReducedAmount": null,
  "lastSoldPrice": null,
  "lastSoldDate": null,
  "estimatedValue": null,
  "hoaFee": null,
  "beds": 4,
  "baths": 3,
  "bathsFull": 2,
  "bathsHalf": 1,
  "sqft": 2466,
  "lotSqft": null,
  "yearBuilt": null,
  "propertyType": "single_family",
  "stories": 2,
  "garage": 2,
  "listingStatus": "for_sale",
  "listDate": "2026-09-14T00:01:29.000000Z",
  "daysOnMarket": 0,
  "lastUpdateDate": "2026-09-14T00:01:29Z",
  "isNewListing": true,
  "isPending": false,
  "isForeclosure": false,
  "isNewConstruction": true,
  "agentName": "Cameron Place",
  "agentEmail": null,
  "brokerName": null,
  "brokerPhone": null,
  "mlsSourceId": "PULB",
  "mlsSourceType": "new_home",
  "photoCount": 1,
  "primaryPhoto": "http://nh.rdcpix.com/9c50d77ff4f6b0ce0b3c083f6a478599l-f1836003418s.jpg",
  "photos": ["http://nh.rdcpix.com/9c50d77ff4f6b0ce0b3c083f6a478599l-f1836003418s.jpg"],
  "virtualTourUrl": null,
  "hasMatterport": false,
  "openHouses": [],
  "features": ["new_construction", "two_or_more_stories", "garage_2_or_more", "kitchen_island", "..."],
  "searchLocation": "Austin, TX",
  "resolvedLocation": "Austin, TX",
  "position": 1,
  "scrapedAt": "2026-09-14T05:46:06.308Z"
}
FieldWhat it is
address / addressWithheldnull when the listing hides the address. The flag tells you which it is.
lastSoldPrice, lastSoldDateEmpty in non-disclosure states, where sale prices are not public at all.
daysOnMarketDays since listDate, on every status. See the note at the top.
agentEmail, brokerEmail, brokerPhonePresent only when the listing carries them, which is not often. agentName and brokerName are far more reliable.
featuresRealtor.com's own tag list, like kitchen_island and covered_patio.
searchLocation / resolvedLocationWhat you asked for, and what Realtor.com decided that meant. Worth checking when a result set looks wrong.
propertyDetails, taxHistory, priceHistory, schools, valueEstimates, descriptionTextOnly with includePropertyDetails on.

🧾 Reading the output

RowHow to spot itBilled
A listingIt has a propertyId and no ok keyyes
The sample row_sample: true and charged: falseno
A diagnosticok: false, _diagnostic: true and an errorCodeno

Listing rows carry no charged field. The flag is only on the sample and diagnostic rows, to mark them as not real results.

CodeWhat it means
LOCATION_NOT_FOUNDRealtor.com did not resolve that location.
NO_RESULTSThe search ran and matched nothing.
RESULT_CAPThe search matched more than Realtor.com will page through. Narrow it.
PROPERTY_NOT_FOUNDA pasted property is no longer on the site.
BAD_URLA link that is not a Realtor.com search or property page.
UNKNOWN_PROPERTY_TYPEA property type that is not one of Realtor.com's own values.
BLOCKED, NETWORK_ERROR, API_ERROR, GRAPHQL_ERROR, BAD_SEARCH_ERRORRealtor.com did not answer with usable data.

A failure part way through paging keeps the rows already delivered and adds a diagnostic, so you can tell a short result from a complete one.

▶️ How to run it

1. Open Realtor.com Scraper and click Try for free. 2. Type a city, ZIP or county into Location, one per line. 3. Pick a Listing status and any filters you want under Filters. 4. Set Maximum listings. Start around 25 to see what the rows look like. 5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$0.68 per 1,000 listings. Flat on every Apify plan, with no volume tiers.

One billed row per listing delivered. The sample row is not billed, diagnostic rows are not billed, the same home found under two of your searches is billed once, and includePropertyDetails adds fields rather than rows so it does not change the price.

💡 What people use it for

  • Comps and valuation work, pulling sold listings in one ZIP with soldWithinDays set.
  • Agent and broker lead lists, grouped on brokerName across a metro.
  • Watching new supply daily with listedWithinDays at 1, diffing on propertyId.
  • Investment screens: foreclosure on, a price ceiling, and pricePerSqft to rank what comes back.
  • Rental market snapshots by switching status to For rent and holding the rest of the filters.

🚧 What it does not do

  • United States only. Realtor.com does not cover anywhere else.
  • No more than 10,000 results per search. That is Realtor.com's paging depth, not ours. Split by

ZIP to go deeper, and watch for the RESULT_CAP row.

  • daysOnMarket is days since listing on every status, so it keeps counting after a sale.
  • No sale prices in non-disclosure states. lastSoldPrice is empty there because the number is

not public.

  • Agent and broker emails are rarely published. Do not plan an email campaign around them.
  • A street address in Location is treated as an area. Paste the property URL instead.
  • A location lookup that fails comes back as not found. If you know the place exists, re-run

rather than concluding Realtor.com has never heard of it.

🧭 Which property scraper do you need?

If you wantUse
US listings, sold prices and agents from Realtor.comThis one
US listings from Zillow, search and full detailsZillow Scraper
Homes in Spain, Italy and PortugalIdealista Scraper
Homes in Spain from FotocasaFotocasa Scraper
Brazilian listings from VivaReal and ZAPVivaReal & ZAP Imóveis Scraper

❓ Questions people ask

How do I get recently sold homes? Set Listing status to Recently sold and use Sold within the last N days. Read lastSoldPrice and lastSoldDate, not daysOnMarket.

How do I get more than 10,000 listings for a city? Split the city into its ZIP codes and put them all in Location in one run. The duplicate check is shared, so overlapping areas cost once.

Can I look up one specific home? Yes. Paste its Realtor.com property URL into Realtor.com URLs.

Why did my condo filter return nothing? Realtor.com's value is condos, plural. Pick it from the list rather than typing it.

Can I schedule it? Yes. propertyId is stable, so diffing one run against the next shows what came on and what went under contract.

Is this legal? These are public listing pages. Agent names are personal data, so have a reason for collecting them. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the location or URL you used and the run ID. The errorCode on the diagnostic row usually names the problem on its own.