# Realtor.com Scraper - Listings, Sold Homes, Rentals & Prices (`topapi/realtor-listings-scraper`) Actor

Scrape Realtor.com listings by city, ZIP, radius or search URL (for sale, new homes, rent, sold) for $0.76 per 1,000: price, beds, baths, sqft, lot, MLS #, coordinates, photos. Add-ons: price and tax history, schools, 3 home-value estimates, climate risk, permits. Past the 10,000 cap, no login.

- **URL**: https://apify.com/topapi/realtor-listings-scraper.md
- **Developed by:** [Top Api](https://apify.com/topapi) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.76 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Realtor.com Scraper do?

**Realtor.com Scraper** extracts Realtor.com listings from [realtor.com](https://www.realtor.com) and turns a city, ZIP code, county, neighborhood, state or Realtor.com search URL into structured rows: one row per home for sale, new-construction plan, rental, sold home or off-market property, with price, address, beds, baths, square feet, lot size, MLS number, coordinates and photos. Built for real estate investors, analysts and proptech teams who need Realtor.com data in a spreadsheet or an API without copying listings by hand.

Realtor.com scraper · Realtor.com API alternative · Realtor data scraper · Realtor.com listings scraper · Realtor.com sold homes scraper · Realtor.com rentals scraper

<a href="https://console.apify.com/actors/uhxllHnx2TBXKydeH"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/realtor-listings-scraper-source.png" alt="Realtor.com listings for sale in Austin, TX from a Realtor.com Scraper run, plotted by their coordinates" style="width:70%"></a>

- **Every Realtor.com search:** for sale (including new construction), for rent, recently sold and off market, with the same filters as realtor.com - price, beds, baths, square feet, lot, year built, HOA, property type, days listed, price cuts, open houses, pending / contingent / foreclosure / 55+, 3D tours, feature tags and keywords.
- **Past the 10,000-result limit:** Realtor.com serves 10,000 results per search. Realtor.com Scraper splits a bigger search into price (or sold-date) bands by itself: 10,300 Austin sold homes came back in 134 seconds on a test run.
- **Property details on demand:** price and sale history, tax history with assessments, nearby schools with ratings, three home value estimates and their history, mortgage estimate, flood / wildfire / heat / wind / air risk scores, every photo.
- **Look up single homes** by Realtor.com URL, property ID, street address or MLS number.
- **Monitoring:** schedule it daily and get only the listings you have not received before (each search remembers up to 500,000), optionally with price and status changes.
- **No login, cookies or Realtor.com API key.**
- **Export anywhere:** JSON, CSV, Excel, XML; schedules, webhooks, Make, Zapier, n8n, Google Sheets; the Apify API and MCP server.

### What data can you get from Realtor.com?

<table>
<tr>
<td>🆔 Property and listing ID (`id`, `listingId`)</td>
<td>💲 List price, price per sq ft (`listPrice`)</td>
<td>🏷️ Status: for sale, rent, sold, off market</td>
</tr>
<tr>
<td>💵 Last sold price and date (`lastSoldPrice`, `soldOn`)</td>
<td>📅 List date, days on market, last update</td>
<td>📉 Price cuts (`priceReducedAmount`, last change)</td>
</tr>
<tr>
<td>🛏️ Beds, baths (full / half), square feet</td>
<td>🌳 Lot size, year built, stories, garage</td>
<td>🏘️ Property type and sub type</td>
</tr>
<tr>
<td>📍 Street, city, state, ZIP, county, FIPS</td>
<td>🗺️ Latitude / longitude, Street View link</td>
<td>🗂️ MLS name and MLS number (`source`)</td>
</tr>
<tr>
<td>📝 Listing description and feature tags</td>
<td>📷 Main photo, photo count, all photos</td>
<td>🚩 Pending, contingent, foreclosure, new construction flags</td>
</tr>
<tr>
<td>🏠 Home value estimate (`estimate`)</td>
<td>🏢 HOA fee, pet policy (rentals)</td>
<td>🔑 Open houses, virtual tours, 3D tour</td>
</tr>
<tr>
<td>📜 Price / sale history and tax history</td>
<td>🎓 Nearby schools with ratings and district</td>
<td>🌊 Flood, wildfire, heat, wind and air risk</td>
</tr>
<tr>
<td>📈 Views, clicks, saves, shares (stats add-on)</td>
<td>🛠️ Building permits (permit add-on)</td>
<td>📐 Floor plans (floor-plan add-on)</td>
</tr>
</table>

On a 100-row Austin, TX for-sale run, 100% of rows had a price, ZIP, coordinates, MLS number, description and photo count; 91% had beds and square feet. Texas does not publish sale prices, so `lastSoldPrice` was empty there; on a 1,000-row Phoenix, AZ sold run it was 100% filled.

### How to scrape Realtor.com with Realtor.com Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) - $5 of monthly credit, no card needed.
2. Open [Realtor.com Scraper](https://apify.com/TopApi/realtor-listings-scraper) and click **Try for free**.
3. Type a city, ZIP code or county into **Locations** (or paste a Realtor.com search URL), pick the **Listing status** and set **Max results**.
4. Click **Start**. Rows stream into the dataset as they are found.
5. Open the **Storage** tab and **Export** as JSON, CSV or Excel - or let a schedule run it for you.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | |
| `searchLocations` | List | Cities, ZIP codes, counties, neighborhoods or states, e.g. `Austin, TX`, `78704`, `Travis County, TX`, `TX`. |
| `listingStatus` | Select | `for_sale` (default, includes new construction), `for_rent`, `sold`, `off_market`, `ready_to_build`. |
| `startUrls` | List | Realtor.com search URLs (their filters are kept) or property URLs. |
| `propertyIds` · `addresses` · `mlsListingIds` | List | Single homes by Realtor.com property ID, street address or MLS number. Returned with full details. |
| **🎯 Filters** (applied by Realtor.com) | | |
| `radiusMiles` | Integer | Also search this many miles around each location. |
| `propertyTypes` | Select | Single family, condo, townhome, multi family, mobile, land, farm, co-op and more. Default: all. |
| `minPrice` / `maxPrice` | Integer | Price in USD - monthly rent for rentals, sale price for sold homes. |
| `minBeds` `maxBeds` `minBaths` `maxBaths` `minSqft` `maxSqft` `minLotSqft` `maxLotSqft` `minYearBuilt` `maxYearBuilt` `maxHoaFee` | Number | Ranges as on realtor.com. |
| `listedWithinDays` | Integer | Only listings that went live in the last N days. |
| `soldWithinMonths` | Select | Sold homes: 1, 3, 6 (default), 12, 24, 36 months or any time. |
| `onlyWith` / `excludeListingTypes` | Select | Narrow to pending, contingent, foreclosure, new construction, open house, price reduced, virtual tour, 3D tour, 55+ or no HOA; hide pending, contingent, foreclosure, new construction or 55+. |
| `tags` · `keywords` | Text | Realtor.com feature tags (e.g. `swimming_pool`, `garage_2_or_more`) and keyword search. |
| `pets` · `moveInBy` | Select / date | Pets allowed (rentals); move-in ready by (new construction). |
| `sortBy` | Select | Default newest first (sold: latest sale first), or lowest / highest price, sold date, recently reduced, largest, lot size and more. |
| `customQuery` | JSON | Extra Realtor.com search keys, merged last. |
| **✂️ Refine results** | | |
| `minDaysOnMarket` · `withPhotosOnly` | Number / Boolean | Keep stale listings only; keep listings with photos only. |
| **➕ Extra data** | | |
| `includeDetails` | Boolean | Price and tax history, schools, 3 home value estimates, mortgage, climate risk, all photos - charged as **property-details**. |
| `includeListingStats` | Boolean | Views, clicks, saves, shares and inquiries for the last 1-28 days - charged as **listing-stats**. |
| `includePermitHistory` | Boolean | Building permits with date, type of work, project and status - charged per **permit record**. |
| `includeFloorplans` | Boolean | 2D / 3D / interactive floor plans - charged as **floor-plans**. |
| `includePhotos` | Boolean | Every photo URL on each row. No extra charge. |
| **🔁 Monitoring** | | |
| `monitorMode` · `trackPriceChanges` · `monitorStoreName` | Boolean / Text | Return only listings not delivered by previous runs of the same search (up to 500,000 remembered per search); optionally also price and status changes. |
| **📦 Output** | | |
| `maxItems` | Integer | Default `100`; `0` = no limit (the run ends when the search is finished, at your maximum charge, or 40 seconds before the run's timeout). |
| `maxItemsPerSearch` · `compact` · `flatOutput` · `customMapFunction` | | Per-search cap, core fields only (add-ons you turn on stay in the row), dot-named columns, your own row mapping. |

#### Input JSON

```json
{
  "searchLocations": ["Austin, TX", "78704"],
  "listingStatus": "for_sale",
  "minBeds": 3,
  "maxPrice": 900000,
  "includeDetails": true,
  "maxItems": 500
}
```

#### Pick the listing status before anything else

`listingStatus` decides which Realtor.com tab is searched: for sale (with new construction), for rent, recently sold or off market. Prices filter the rent for rentals and the sale price for sold homes. A search URL keeps its own status.

#### Paste a Realtor.com search URL to keep every filter you set on the site

Set up the search on realtor.com, copy the address bar and paste it into `startUrls`, e.g. `https://www.realtor.com/realestateandhomes-search/Austin_TX/beds-3/price-na-900000`. Beds, baths, price, square feet, lot, age, type, radius, days listed, keyword, HOA, open house, new construction, pending and pet filters in the URL are applied; a URL part the actor does not recognise is named in the log and left out. The URL above returned 3,819 homes, the same number realtor.com showed for it.

#### Go past 10,000 results with maxItems 0 or a big number

Realtor.com stops at 10,000 results per search. With a bigger `maxItems`, the search is split into price bands (sold-date bands for sold homes) until each band fits.

### ⬆️ Output

Every listing becomes one dataset item. Here is the table view of a run for `Phoenix, AZ` with property details and listing stats on:

<a href="https://console.apify.com/actors/uhxllHnx2TBXKydeH"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/realtor-listings-scraper-output.png" alt="Realtor.com Scraper output table with prices, MLS numbers, estimates, history and schools" style="width:70%"></a>

And one row as JSON (shortened):

```json
{
  "id": "1843684497",
  "url": "https://www.realtor.com/realestateandhomes-detail/4613-W-Desert-Hollow-Dr_Phoenix_AZ_85083_M18436-84497",
  "status": "for_sale",
  "listPrice": 1150000,
  "pricePerSqft": 453,
  "beds": 4, "baths": 3, "sqft": 2538, "lotSqft": 22216, "yearBuilt": 1994,
  "type": "single_family",
  "listDate": "2026-09-10T20:53:24.000000Z",
  "daysOnMarket": 27,
  "lastSoldPrice": 990000, "soldOn": "2026-03-27",
  "hoaFee": 15,
  "address": { "street": "4613 W Desert Hollow Dr", "locality": "Phoenix", "region": "AZ", "postalCode": "85083", "county": "Maricopa" },
  "coordinates": { "latitude": 33.714167, "longitude": -112.15957 },
  "source": { "name": "ArizonaRegionalMLS", "listingId": "7078215" },
  "estimates": [
    { "source": "Cotality", "estimate": 980400, "estimateLow": 919100, "estimateHigh": 1041700, "date": "2026-09-08" },
    { "source": "Collateral Analytics", "estimate": 964000, "date": "2026-09-15" },
    { "source": "Quantarium", "estimate": 1128846, "date": "2026-09-30" }
  ],
  "history": [{ "date": "2026-09-10", "eventName": "Listed", "price": 1150000, "sourceName": "ArizonaRegionalMLS" }],
  "local": { "flood": { "score": 1, "severity": "minimal", "femaZone": ["X (shaded)"] }, "wildfire": { "score": 5, "severity": "Major" } }
}
```

#### Fields

Fill measured on platform runs: Austin, TX for sale (100 rows), Phoenix, AZ sold (1,000 rows) and Phoenix, AZ for sale with property details and listing stats (100 rows).

| Field | Type | What it is | Fill |
|---|---|---|---|
| `id`, `url`, `status`, `listPrice`, `listDate` | string / number | Property ID, page, status, price, list date | 100% |
| `address`, `coordinates` | object | Street, city, state, ZIP, county; latitude / longitude | 99-100% |
| `beds`, `baths`, `sqft` | number | Bedrooms, bathrooms, living area | 76-99% |
| `lotSqft`, `yearBuilt` | number | Lot size, year built | 76-99% |
| `lastSoldPrice`, `soldOn` | number / string | Last sale | 100% on sold rows (not published in Texas) |
| `daysOnMarket` | number | Days since list date (active listings) | 100% |
| `priceReducedAmount` | number | Total price cut | 42-53% |
| `source.name`, `source.listingId` | string | MLS and MLS number | 100% |
| `description`, `tags`, `primaryPhoto` | string / list | Listing text, feature tags, main photo | 90-100% |
| `estimate` | object | Realtor.com home value estimate | 59% (Austin) - 98% (Phoenix) |
| `hoaFee` | number | Monthly HOA fee | 87-98% |
| `virtualTours`, `openHouses` | list | Tours and upcoming open houses | 4-30%, 0-8% |
| `history`, `nearbySchools`, `details`, `mortgage` | list / object | Property details add-on | 100% |
| `taxHistory` | list | Property details add-on | 84% |
| `estimates`, `estimateHistory` | list | Property details add-on: 3 sources | 97% |
| `local` | object | Property details add-on: climate risk | 98% |
| `popularity` | list | Listing stats add-on (1, 7, 14, 21, 28 days) | 100% |
| `permits`, `hasRoofPermit` | list / boolean | Permit add-on | 13 of 50 homes had permits |
| `floorplans` | list | Floor-plan add-on | mostly new-construction communities |

### How can I use Realtor.com data?

- 🏘️ **Real estate investors** - pull every listing in a market with price per square foot, days on market and price cuts, and spot stale or reduced listings.
- 📊 **Market analysts** - track inventory, list prices and sold prices by ZIP code or county week over week.
- 🧮 **Appraisers and lenders** - sold comps with sale price, date, facts, tax assessments and three home value estimates.
- 🏗️ **Builders and proptech teams** - new-construction plans, communities, floor plans and building permits.
- 🛡️ **Insurers** - flood, wildfire, heat, wind and air risk scores with FEMA zones per address.

### How much does it cost to scrape Realtor.com?

Realtor.com Scraper is pay-per-result: **$0.76 per 1,000 listings** (`listing`, $0.00076 each), no start fee. Add-ons, each only for rows that carry them: **property details $0.95 per 1,000** (`property-details`), **listing stats $0.95 per 1,000** (`listing-stats`), **floor plans $0.95 per 1,000** (`floor-plans`), **building permits $1.90 per 1,000 permit records** (`permit-history`). A home looked up by URL, property ID, address or MLS number is one listing plus its details: $0.00171.

| Rows | Listings only | With property details | With details + stats |
|---:|---:|---:|---:|
| 10 | $0.0076 | $0.0171 | $0.0266 |
| 100 | $0.076 | $0.171 | $0.266 |
| 1,000 | $0.76 | $1.71 | $2.66 |
| 10,000 | $7.60 | $17.10 | $26.60 |

Apify's platform usage is included. Measured on 256 MB: 100 listings in 2 seconds, 100 listings with property details and stats in 6 seconds, 1,000 sold homes in 9 seconds, 10,300 sold homes in 134 seconds.

### Integrations, API, scheduling & MCP

- **Schedules:** run Realtor.com Scraper daily or weekly from the **Schedules** tab; with `monitorMode` each run returns only new listings.
- **Webhooks:** fire a URL when a run finishes - push listings to your CRM, Slack or a sheet.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable, Slack via [Apify integrations](https://docs.apify.com/integrations).
- **API:** call it from Node.js or Python with `apify-client` - code on the [API tab](https://apify.com/TopApi/realtor-listings-scraper/api/python) and the [Apify API reference](https://docs.apify.com/api/v2).
- **MCP / AI assistants:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/TopApi/realtor-listings-scraper/api/mcp) and ask for Realtor.com listings in plain language.

### More scrapers from TopApi

<table>
<tr>
<td>💬 <a href="https://apify.com/TopApi/facebook-comments-scraper">Facebook Comments Scraper</a> - comments and replies on local real estate posts</td>
<td>⭐ <a href="https://apify.com/TopApi/google-maps-reviews-scraper">Google Maps Reviews Scraper</a> - reviews of local businesses around a property</td>
<td>💼 <a href="https://apify.com/TopApi/indeed-jobs-scraper">Indeed Jobs Scraper</a> - hiring and salaries in a housing market</td>
</tr>
<tr>
<td>🔎 <a href="https://apify.com/TopApi/facebook-search-posts-scraper">Facebook Search Posts Scraper</a> - local posts by keyword and location</td>
<td>🎵 <a href="https://apify.com/TopApi/tiktok-scraper">TikTok Scraper</a> - home-tour and neighborhood videos by hashtag</td>
<td>▶️ <a href="https://apify.com/TopApi/youtube-shorts-scraper">YouTube Shorts Scraper</a> - real estate Shorts by keyword</td>
</tr>
<tr>
<td colspan="3">🧭 <a href="https://apify.com/TopApi">All TopApi actors</a></td>
</tr>
</table>

### Limits & empty runs

- **Results per search:** Realtor.com serves 10,000 results per search, 200 per call. Bigger searches are split into price bands (sold-date bands for sold homes); listings with no price cannot be reached through a price band (12 of 6,654 Austin rentals) and are counted in `RUN_SUMMARY`.
- **Run length:** `maxItems` `0` sets no row limit. The run then ends when the search is finished, when your maximum charge is reached, or 40 seconds before the run's timeout (1 hour by default; a run with no timeout has no time limit). When the time limit cuts a search short, the status message says so and `RUN_SUMMARY` has `stoppedBy: "timeLimit"`; listings still waiting for add-ons at that moment are left out and not charged (`leftOutWaitingForAddOns`). Raise Timeout in the run options, or split the search, to get the rest.
- **Monitoring:** each search keeps its own memory, named by what you set - the location or search URL, status, filters as you typed them and sort - so `soldWithinMonths` `6` or `listedWithinDays` `7` keeps the same memory from one day to the next; change any of them and the search starts a new memory. A search remembers up to 500,000 listings; past that the oldest are forgotten and can come back as new. A run that Apify restarts on another server keeps what it delivered before the restart, and a run that you abort or that fails keeps what it delivered too: each write is remembered as soon as it is in the dataset, so only the rows of a write still in progress at the moment of an abort can come again in the next run.
- **Sold prices:** not published in non-disclosure states such as Texas; the sale date still is.
- **Listing stats:** Realtor.com fills the 1, 7, 14, 21 and 28-day periods; its 30-day period is empty and is left out.
- **Move-in dates:** published for new-construction homes only, so `moveInBy` does not apply to rentals.
- **Listing remarks:** a phone number, e-mail address or licence number (such as `License #`, `DRE#` or `NMLS`) written into the remarks text is shown as `[phone removed]` / `[email removed]` / `[license removed]`.
- **Sort order:** Realtor.com's own relevant order changes on every call (two identical Austin searches shared 4 of their first 200 homes), so paging through it repeats some homes and never reaches others. The actor pages in a fixed order instead: newest first by default (sold homes: latest sale first; off-market homes: Realtor.com's own fixed order), with price as the tie-breaker, so pages no longer reshuffle between calls. A listing added or removed on Realtor.com while the run pages can still shift the later pages by one, so a few homes can come twice (the repeat is dropped and not charged) or be missed. Rows are written to the dataset in that order, add-ons on or off; several searches, or one search split into price bands, are read side by side, so their rows interleave page by page. When your maximum charge or the time limit stops a run, the rows kept are the first ones in that order.
- **Search URLs:** the filters listed above are applied; a URL part the actor does not recognise is named in the log and skipped. Sorting comes from `sortBy`, not from the URL.
- **Empty dataset:** the status message says why - Realtor.com has no listings for these filters, the location was not recognised, your refine filters removed every listing, or monitoring found nothing new. There is no start fee, so a run that delivers no rows has no charges.

### FAQ

#### How many listings can Realtor.com Scraper collect in one run?

As many as Realtor.com has for the search: past 10,000 results the search is split into bands. Set `maxItems` to `0` for no limit, or a number to cap the bill. The run also stops at your maximum charge and 40 seconds before its timeout (1 hour by default), and the status message says when either one cut the search short. A 10,300-row sold search took 134 seconds.

#### Is there a Realtor.com API?

Realtor.com Scraper reads the same public listings a visitor sees and returns them as JSON, so you can use it like a Realtor.com API through Apify, with no key.

#### Can I run Realtor.com Scraper on a schedule to get new listings automatically?

Yes. Save your input as a task, open **Schedules**, pick the cadence and switch on `monitorMode`: each run then returns only listings not delivered before by the same search (up to 500,000 remembered per search). Relative windows such as sold within 6 months or listed within 7 days keep the same memory from day to day. Add `trackPriceChanges` to also get listings whose price or status changed. A run that finds nothing new costs nothing in listing charges.

#### How do I get price history, tax history, schools and home value estimates with Realtor.com Scraper?

Switch on `includeDetails`. Every row then carries `history`, `taxHistory`, `nearbySchools`, `estimates` (Cotality, Collateral Analytics, Quantarium), `estimateHistory`, `mortgage`, `local` climate risk, `details` and every photo.

#### Can I scrape Realtor.com rentals, sold homes and new construction with Realtor.com Scraper?

Yes. Set `listingStatus` to `for_rent`, `sold` or `ready_to_build` (new-construction plans; they are also part of `for_sale`). Sold rows carry the sale date and, where the state publishes it, the sale price.

#### Can I integrate Realtor.com Scraper with other apps?

Yes - Make, Zapier, n8n, Google Sheets, Slack and more via [Apify integrations](https://docs.apify.com/integrations), or use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger an action when a run finishes.

#### Can I use Realtor.com Scraper with the Apify API or in Python?

Yes. Use `apify-client` for [Node.js](https://apify.com/TopApi/realtor-listings-scraper/api/javascript) or [Python](https://apify.com/TopApi/realtor-listings-scraper/api/python); the API tab has ready-to-paste code.

#### Can I use Realtor.com Scraper through an MCP server?

Yes. Open the [MCP tab](https://apify.com/TopApi/realtor-listings-scraper/api/mcp), connect your MCP client (Claude Desktop, Cursor and others) and ask for Realtor.com listings in plain language. Turn on `compact` for rows sized for AI assistants.

#### Do I need a Realtor.com account, cookies or an API key?

No. Realtor.com Scraper reads only what Realtor.com shows publicly; you pass locations, URLs, property IDs, addresses or MLS numbers and nothing else.

#### Why did my Realtor.com Scraper run return no results?

Most often the filters match no homes (check the same filters on realtor.com), the location was not recognised (try "City, ST" or a ZIP code), or monitoring found nothing new since the last run. The status message and the `RUN_SUMMARY` record name the cause.

#### Is it legal to scrape Realtor.com data?

Realtor.com Scraper extracts publicly available property data such as prices, addresses and listing details. Results can still contain personal information, which is protected by regulations such as GDPR; scrape personal data only with a legitimate reason, and consult a lawyer if unsure. See Apify's post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

#### Your feedback

We keep improving Realtor.com Scraper. Found a bug or missing a field? Open an issue on the [Issues tab](https://apify.com/TopApi/realtor-listings-scraper/issues/open).

# Actor input Schema

## `searchLocations` (type: `array`):

Cities, ZIP codes, counties, neighborhoods or states, one per line, e.g. "Austin, TX", "78704", "Travis County, TX", "Zilker, Austin, TX", "TX".

## `listingStatus` (type: `string`):

Which listings to search for Locations. Search URLs keep the status set in the URL.

## `startUrls` (type: `array`):

Search pages (filters in the URL are kept), e.g. https://www.realtor.com/realestateandhomes-search/Austin_TX/beds-3/price-na-900000, or property pages (/realestateandhomes-detail/...\_M98926-80270) for one row with full details. One URL per line.

## `propertyIds` (type: `array`):

Realtor.com property IDs, e.g. 9892680270 or M98926-80270. Each becomes one row with full property details.

## `addresses` (type: `array`):

Street addresses, e.g. "244 Zonetail Cv, Austin, TX 78737". Each is matched to its Realtor.com property and returned with full details.

## `mlsListingIds` (type: `array`):

MLS numbers, e.g. 1014136. MLS numbers are not unique across MLSs, so one number can return more than one home.

## `radiusMiles` (type: `integer`):

Also search this many miles around each location, e.g. 5. 0 = the location's own boundary.

## `propertyTypes` (type: `array`):

Only these property types. Empty = all types.

## `minPrice` (type: `integer`):

Lowest price in USD, e.g. 300000. Monthly rent for rentals; the sold price for sold listings.

## `maxPrice` (type: `integer`):

Highest price in USD, e.g. 900000. Monthly rent for rentals; the sold price for sold listings.

## `minBeds` (type: `integer`):

At least this many bedrooms, e.g. 3. 0 includes studios.

## `maxBeds` (type: `integer`):

At most this many bedrooms.

## `minBaths` (type: `number`):

At least this many bathrooms, e.g. 2.

## `maxBaths` (type: `number`):

At most this many bathrooms.

## `minSqft` (type: `integer`):

Smallest living area in square feet, e.g. 1500.

## `maxSqft` (type: `integer`):

Largest living area in square feet.

## `minLotSqft` (type: `integer`):

Smallest lot in square feet (1 acre = 43,560), e.g. 5000.

## `maxLotSqft` (type: `integer`):

Largest lot in square feet.

## `minYearBuilt` (type: `integer`):

Earliest year built, e.g. 2000.

## `maxYearBuilt` (type: `integer`):

Latest year built, e.g. 2020.

## `maxHoaFee` (type: `integer`):

Highest monthly HOA fee in USD, e.g. 200.

## `listedWithinDays` (type: `integer`):

Only listings that went live in the last N days, e.g. 7. Pairs well with a daily schedule.

## `soldWithinMonths` (type: `string`):

For Recently sold: how far back to look. Default 6 months.

## `onlyWith` (type: `array`):

Narrow to listings with all of these. Empty = no requirement.

## `excludeListingTypes` (type: `array`):

Leave these listings out. Pending and contingent listings are included by default, as on realtor.com.

## `tags` (type: `array`):

Realtor.com feature tags every listing must carry, e.g. swimming_pool, garage_2_or_more, waterfront, single_story, central_air, fireplace, horse_facilities.

## `keywords` (type: `string`):

Realtor.com's keyword filter on the listing text, e.g. "pool" or "pool, guest house" (comma = all of them).

## `pets` (type: `array`):

For rent only: rentals that allow these pets.

## `moveInBy` (type: `string`):

New-construction homes ready to move in on or before this date, e.g. 2026-12-01. Realtor.com publishes no move-in dates for rentals, so this is ignored for For rent.

## `sortBy` (type: `string`):

Order of the results. With a result limit, this decides which listings you get. Realtor.com's own relevant order changes on every call, so the default returns the newest listings first (sold homes: latest sale first; off-market homes: Realtor.com's own fixed order). Ties are broken by price (by list date when sorting by price), so pages do not reshuffle between calls.

## `customQuery` (type: `object`):

Extra keys for realtor.com's search criteria, merged last, e.g. {"garage": {"min": 2}, "has_tour": true}.

## `minDaysOnMarket` (type: `integer`):

Keep only active listings on the market at least this many days, e.g. 60 for stale listings.

## `withPhotosOnly` (type: `boolean`):

Keep only listings that have at least one photo.

## `includeDetails` (type: `boolean`):

Adds price history, tax history, nearby schools, 3 home-value estimates and their history, mortgage estimate, flood / fire / heat / wind / air risk, features and all photos. $0.00095 per listing that gets them.

## `includeListingStats` (type: `boolean`):

Adds Realtor.com views, clicks, saves, shares and inquiries for the last 1, 7, 14, 21 and 28 days. $0.00095 per listing that has them.

## `includePermitHistory` (type: `boolean`):

Adds the building-permit history (date, type of work, project, status) and a hasRoofPermit flag. $0.0019 per permit record returned; homes without permits cost nothing.

## `includeFloorplans` (type: `boolean`):

Adds 2D / 3D / interactive floor-plan links (mostly new-construction and community listings). $0.00095 per listing that has floor plans.

## `includePhotos` (type: `boolean`):

Adds every listing photo URL (with Realtor.com's room tags) to each row. No extra charge.

## `monitorMode` (type: `boolean`):

Remember delivered listings per search (named key-value store) and skip them next time. Pairs with a daily schedule. A search is the location or URL, status, filters as you set them and sort, so relative windows (sold within 6 months, listed within 7 days) keep their memory from day to day. Up to 500,000 listings remembered per search; past that the oldest are forgotten.

## `trackPriceChanges` (type: `boolean`):

With monitoring: also return a listing seen before when its price or status changed, with monitorChange, previousPrice and previousStatus.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the memory. Use a different name per independent schedule.

## `maxItems` (type: `integer`):

Total rows for the run. 0 = no limit: the run then ends when the search is finished, when your maximum charge is reached, or 40 seconds before the run's timeout (1 hour by default), and the status message says which. Realtor.com serves 10,000 results per search; past that the actor splits the search into price (or sold-date) bands.

## `maxItemsPerSearch` (type: `integer`):

Limit per location or URL when you pass several. 0 = no per-search limit.

## `compact` (type: `boolean`):

Core fields only (price, address, beds, baths, sqft, estimate, link) as flat columns - sized for AI assistants and MCP. Add-ons you turn on stay in each row, so you get every add-on you are charged for.

## `flatOutput` (type: `boolean`):

Nested objects become dot-named columns (address.street, coordinates.latitude) for spreadsheets.

## `customMapFunction` (type: `string`):

Optional JavaScript that receives each row and returns the row to keep, e.g. (object) => ({ id: object.id, price: object.listPrice }). Returning null drops the row (not charged).

## `proxyConfiguration` (type: `object`):

Leave as is: the actor starts on Apify's own connection and adds Apify datacenter proxy sessions by itself. Choosing a proxy here replaces both.

## `maxConcurrency` (type: `integer`):

Requests in flight at once. Default 4.

## Actor input object example

```json
{
  "searchLocations": [
    "Austin, TX"
  ],
  "listingStatus": "for_sale",
  "soldWithinMonths": "6",
  "sortBy": "relevant",
  "withPhotosOnly": false,
  "includeDetails": false,
  "includeListingStats": false,
  "includePermitHistory": false,
  "includeFloorplans": false,
  "includePhotos": false,
  "monitorMode": false,
  "trackPriceChanges": false,
  "monitorStoreName": "realtor-listings-monitor",
  "maxItems": 50,
  "maxItemsPerSearch": 0,
  "compact": false,
  "flatOutput": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 4
}
```

# Actor output Schema

## `listings` (type: `string`):

The dataset of Realtor.com listings (one item per listing or property).

## `summary` (type: `string`):

Per-search counts (the Realtor.com total, calls, read, filtered, duplicates, seen before, delivered, band splits), add-ons delivered and charged, lookups not found or unreachable, connection stats.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchLocations": [
        "Austin, TX"
    ],
    "listingStatus": "for_sale",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/realtor-listings-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchLocations": ["Austin, TX"],
    "listingStatus": "for_sale",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/realtor-listings-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchLocations": [
    "Austin, TX"
  ],
  "listingStatus": "for_sale",
  "maxItems": 50
}' |
apify call topapi/realtor-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,topapi/realtor-listings-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/uhxllHnx2TBXKydeH/builds/GnrLpEczxX5qrLKfr/openapi.json
