Realtor.com Scraper avatar

Realtor.com Scraper

Pricing

$1.20 / 1,000 results

Go to Apify Store
Realtor.com Scraper

Realtor.com Scraper

Search Realtor.com property listings by city, ZIP code, or URL. Export prices, addresses, home features, descriptions, photos, and optional detail data.

Pricing

$1.20 / 1,000 results

Rating

0.0

(0)

Developer

MLG Data

MLG Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Scrape Realtor.com property listings by city, ZIP code, search URL, or property detail URL. Export listing prices, addresses, home features, descriptions, and photos to CSV or JSON for housing research and property workflows. This actor offers a structured Realtor.com data feed for repeated searches without opening each listing page by hand.

Searches use public listing data. Enter a city and state such as Austin, TX, a five-digit ZIP code, or a property search URL. Results are paginated, deduplicated by property ID, and stopped at your requested output limit. An optional detail request can add more photo URLs and a reported days-on-market value to each accepted listing.

What data can you extract from Realtor.com?

Each output row represents one property. The columns stay the same whether a row comes from a location search or a direct property URL. Fields unavailable for a particular property are null or an empty photo list; no values are invented to fill gaps.

FieldDescriptionExample
propertyIdStable property identifier9960858259
listingIdIdentifier for the current listing2994450622
statusStatus reported with the listingfor_sale
urlDirect property pagehttps://www.realtor.com/realestateandhomes-detail/...
listPriceAsking price in USD924899
pricePerSqftAsking price divided by interior area, rounded to a dollar, or the reported detail value253
listDateDate supplied with the search result2026-04-23T22:41:44.000000Z
lastSoldPriceLast sold price, when availablenull
daysOnMarketReported market duration from the optional detail requestnull
addressLineStreet address365 Pear Tree Ln
addressCityCityAustin
addressStateCodeTwo-letter state codeTX
addressPostalCodePostal code78737
bedsBedroom count5
bathsBathroom count4.5
sqftInterior area in square feet3649
lotSqftLot area in square feet11500
yearBuiltConstruction year2023
propertyTypeSource property type codesingle_family
descriptionTextPublic property descriptionMOTIVATED SELLER! ...
primaryPhotoUrlMain image URLhttps://ap.rdcpix.com/...jpg
photoUrlsOne image from search, or more when detail enrichment is enabled[...]
searchLocationInput location or URL that produced the rowAustin, TX
searchTotalNumber of matching records reported for the source search14517

searchTotal describes the source search before this actor's optional local filters. It can be much larger than the number of rows delivered. For a direct property URL, searchTotal is null. The property ID is used to avoid returning the same home twice when locations overlap. A property may have a different listing ID when its listing changes; preserve both identifiers in long-running datasets.

How to scrape Realtor.com

  1. Add at least one search location or property URL. Use City, ST for a city, a five-digit ZIP code for a postal search, or a URL copied from a property search or detail page.
  2. Set maxItems to the most rows you want in the whole run. The default is 100. Set maxPages if you need to examine more or fewer search pages for each location.
  3. Optionally set price, bedroom, bathroom, type, and status filters. Turn on includeDetails when additional photos or reported days on market matter to your workflow.
  4. Run the actor and inspect the Properties table. Download the default dataset as JSON or CSV, or read it through the dataset endpoint for a recurring workflow.

For a first run, {"searchLocations":["Austin, TX"],"maxItems":30} is enough. A city search returns a broad set of properties. The optional filters are applied as rows arrive, so a narrow filter may need more pages before it reaches the requested output count.

Input

ParameterTypeDefaultDescription
searchLocationsarray of stringsemptyCity and state such as Austin, TX, or ZIP codes such as 78701.
startUrlsarray of URL objectsemptyProperty search or detail URLs. Search URLs supply the location; use the fields here for filtering.
maxItemsinteger100Maximum output rows across all locations. 0 removes this output cap.
maxPagesinteger20Maximum 30-result pages examined per location.
priceMinintegerunsetMinimum asking price in USD.
priceMaxintegerunsetMaximum asking price in USD.
bedsMinnumberunsetMinimum bedroom count.
bathsMinnumberunsetMinimum bathroom count.
propertyTypesarray of stringsempty (all)Types to include: single_family, condos, townhomes, multi_family, mobile, land, farm, duplex_triplex, coop, apartment.
statusesarray of stringsfor_saleStatuses to include: for_sale, for_rent, sold, pending, contingent. Empty means for sale only; rentals appear only when for_rent is requested.
includeDetailsbooleanfalseRequest the property detail data for each accepted row.
proxyConfigurationobjectdefault proxyOptional proxy settings.

Example search for homes in two locations with a price ceiling:

{
"searchLocations": ["Austin, TX", "78701"],
"maxItems": 150,
"maxPages": 20,
"priceMax": 800000,
"bedsMin": 3,
"propertyTypes": ["single_family"],
"includeDetails": false
}

The limit is global: it applies to the combined rows from both locations. Search order follows the order of your inputs, with URL inputs processed before location strings. If you need a distinct allowance for each city, run each city separately. Repeated homes across inputs are returned once. The first matching search supplies the row's searchLocation value.

A search URL such as https://www.realtor.com/realestateandhomes-search/Austin_TX selects Austin, Texas. A direct property URL whose path contains the site's numeric property ID returns that one property. A URL can contain additional search path segments for site filters; this actor uses the location segment and its own input filters. It does not claim to reproduce every control visible on the site.

Output example

This item came from a successful 30-row Austin run. The description is shortened here for readability; the dataset contains the available full public description.

{
"propertyId": "9960858259",
"listingId": "2994450622",
"status": "for_sale",
"url": "https://www.realtor.com/realestateandhomes-detail/365-Pear-Tree-Ln_Austin_TX_78737_M99608-58259",
"listPrice": 924899,
"pricePerSqft": 253,
"listDate": "2026-04-23T22:41:44.000000Z",
"lastSoldPrice": null,
"daysOnMarket": null,
"addressLine": "365 Pear Tree Ln",
"addressCity": "Austin",
"addressStateCode": "TX",
"addressPostalCode": "78737",
"beds": 5,
"baths": 4.5,
"sqft": 3649,
"lotSqft": 11500,
"yearBuilt": 2023,
"propertyType": "single_family",
"descriptionText": "MOTIVATED SELLER! Buyer's incentive package offered...",
"primaryPhotoUrl": "https://ap.rdcpix.com/65edbe9b7824cbd2136bfc1bafc5f621l-m3264626651s.jpg",
"photoUrls": ["https://ap.rdcpix.com/65edbe9b7824cbd2136bfc1bafc5f621l-m3264626651s.jpg"],
"searchLocation": "Austin, TX",
"searchTotal": 14517
}

The example shows why maxItems and searchTotal answer different questions. The source reported 14,517 results for the broad Austin search, while the run intentionally stopped at 30 delivered rows. The address and price describe the listing as returned at the time of the run and can change later.

Use cases

  • Local market review: Compare asking prices, home sizes, and property types across nearby ZIP codes. Keep the original location and property URL beside each row so an analyst can inspect unusual listings.
  • Housing inventory tracking: Schedule the same city searches periodically, store property and listing IDs, and compare snapshots for additions, removals, and price changes.
  • Buyer research: Collect a shortlist that meets a price ceiling and minimum bedroom count, then open the property URLs for a closer inspection.
  • Neighborhood comparisons: Run several city or ZIP inputs, calculate price per interior square foot, and group results by location. Check the area field before comparing properties of very different types.
  • Listing content review: Find property descriptions and primary photos for a set of public listing pages. Enable details only if a larger photo set is needed.
  • Data quality checks: Compare reported list prices and listing IDs against an existing property inventory, while keeping null values visible when a source field is absent.

How much does it cost to scrape Realtor.com?

The configured output price is $1.20 per 1,000 delivered listings, or $0.0012 per result. The charge follows the number of rows pushed to the dataset. Filtering out a row does not create an output event. Extra requests from includeDetails do not create extra output rows, though they take more time and may increase run usage. Check the run's cost display for its final amount.

At that output rate, 100 delivered listings cost about $0.12, 1,000 cost about $1.20, and 5,000 cost about $6.00 in result charges. A 30-row check run would produce about $0.036 in result charges. These examples assume the run actually reaches those row counts. A run can end sooner because the search has fewer results, the page limit is reached, filters reject many listings, or requests fail.

Choose a realistic maxItems before running a large search. The cap is shared by all locations, so adding locations does not multiply the maximum spend without changing the cap. The actor also stops pushing data when the run's event budget is reached. A zero maxItems value removes the actor's row cap; use it only when a page limit or run budget supplies an appropriate bound.

Tips for best results

Use a precise city and two-letter state code, or a five-digit ZIP code. The input parser does not infer a state from a city name alone. For overlapping cities and ZIP codes, place your preferred source first, because the first accepted occurrence supplies searchLocation. Keep maxItems low while checking a new query, then raise it after reviewing the returned rows.

The actor requests 30 search records at a time. Price, bedroom, bathroom, status, and type filters are sent to realtor.com with the search, so every page is already filtered and the reported search total reflects your filters. With the default of 20 pages, at most 600 listings are returned per location; split larger markets into ZIP codes.

Use includeDetails sparingly. A broad search without enrichment typically needs one data request per page. Detail enrichment adds a request for each accepted listing, and a detail request can fail while the base listing still remains useful. When detail data succeeds, photoUrls can contain up to 20 links and daysOnMarket can be populated if the source reports it. Without enrichment, photoUrls normally contains only the primary image and daysOnMarket is usually null.

For a recurring inventory, retain propertyId, listingId, listPrice, status, and the date you ran the collection. The actor deduplicates within a run, but it does not keep a history or suppress repeats across separate runs. Compare snapshots in your own storage if you need change detection. A property can be listed again under a different listing ID, so one identifier alone may not capture every event you care about.

Limits

The current search path returns property listings. It does not extract agent profiles, contact details, sale history, permit records, school assignments, valuation estimates, or every filter shown on the website. A copied search URL contributes its city and state or ZIP; filters embedded in the rest of its path do not transfer into the data request. Use this actor's documented filter inputs for supported filtering.

The source can change its data fields, ranking, or access controls. Search pages were unavailable during development, so the actor uses a public data endpoint that returned listing records in the verified run. The endpoint can also intermittently fail; the fetch layer retries blocked or failed requests and can rotate its network route. A direct property URL may return no row if its property ID is missing or the property is not available from the endpoint.

Prices and home characteristics vary in completeness. Vacant land, new construction, and unusual properties may have no bedroom count or interior area. pricePerSqft is null when it cannot be calculated, and a calculated value is rounded. listDate is the date carried by the search record, not a guarantee that the home first appeared on the market then. searchTotal is a source-reported count, not the number of pages this actor can necessarily retrieve. Large searches should be divided by city or ZIP and checked for coverage.

Use with automated workflows

An automated workflow can submit a bounded input such as {"searchLocations":["Austin, TX"],"maxItems":50} and read the default dataset after the run completes. For a targeted lookup, submit a single property URL and maxItems: 1. Each row has stable identifiers, a direct URL, and a consistent set of flat columns, making it straightforward to compare runs or load a table.

Two useful requests for an automated assistant are: “Collect up to 100 Austin listings with at least three bedrooms and an asking price below $800,000, then group them by ZIP code,” and “Fetch this property URL, show its price and square footage, and give me the direct page link.” Keep a human review step for decisions involving current availability or material financial commitments; listing data can change between runs.

FAQ

Is the data public? The actor reads publicly available property listing data. Review the site's terms and applicable privacy and data-use rules for your particular purpose. Avoid using property information in ways that create misleading claims about owners or occupants.

Do I need to provide a proxy? No. The default configuration uses the actor's network route. You can supply a proxy configuration if your account and workflow require it.

How fast is a search? A basic location search collects up to 30 records per data request. Speed depends on the number of pages, filters, network retries, and whether detail enrichment is enabled. A verified 30-row run completed successfully; larger runs can take longer.

Can I schedule a search and compare runs? Yes. Schedule the same input and export each dataset. The actor deduplicates within each run; a downstream comparison of property and listing IDs is needed for cross-run monitoring.

Can I export to a spreadsheet? Yes. Download the dataset as CSV and open it in a spreadsheet, or use the dataset endpoint to feed an existing reporting pipeline. JSON retains arrays such as photoUrls more naturally.

Why is a field empty? The source may not report it for that property, or the field may require detail enrichment. Empty numeric fields remain null so they are distinguishable from zero. Check includeDetails when you need more photo URLs or reported market duration.

Why did my filter return fewer rows than maxItems? Filters are applied after each search page is retrieved. The actor may reach maxPages, exhaust the source results, or encounter incomplete fields before enough rows pass your filter. Raise maxPages or use a narrower location.

Integrations

Use the dataset endpoint to read JSON rows, export CSV for spreadsheets, or connect the completed run to a webhook. Scheduling lets you collect periodic snapshots. A workflow service can take the rows, store them in a database, and compare property IDs, listing IDs, prices, and statuses over time. Keep the listing URL in downstream records so a person can verify any property before acting on it.

Support

Open an issue on the Issues tab; we reply within 24h and add fields on request. Include the input that produced the issue, the affected property URL if relevant, and a brief description of the expected field so the case can be reproduced.