# Realtor.com Listings Scraper (`nice_dev/realtor-listings-scraper`) Actor

Scrape Realtor.com property listings by location: price, beds, baths, photos, description and the listing agent's contact. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/nice\_dev/realtor-listings-scraper.md
- **Developed by:** [Nice Dev](https://apify.com/nice_dev) (community)
- **Categories:** Real estate, Lead generation, MCP servers
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.67 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 is Realtor.com Listings Scraper?

**Realtor.com Listings Scraper** extracts **property listings from [Realtor.com](https://www.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.

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, value estimates, building permits and how many people viewed the listing.

### 📋 What data can you extract from Realtor.com?

One item per listing, 77 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** | **detail** — how many people viewed, clicked and enquired, per period; building permits |

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). 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 County` or `Texas` — 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, building permits, and how many people viewed the listing. The last two are sold nowhere else without a surcharge: the one Actor that has them bills them as separate events, $0.001 per listing for the view counts and $0.002 **per permit row** — about $9.10 per 1,000 listings against $0.60 here, everything included.
- 📇 **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

1. Create a free Apify account.
2. Open **Realtor.com Listings Scraper** and type a **Location** (e.g. `Austin, TX`).
3. Or paste your own Realtor.com URLs into **Start URLs**: search results pages, sold pages, rental pages, or single listing pages.
4. 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**.
5. 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.70 per 1,000 listings** — plus **$0.001 per run start** (10 cents per 100 runs). Listings read with **Extract details** on cost **$0.79 per 1,000**, the extra requests included — building permits and view counts are part of it, never charged on top. A single listing page pasted into `startUrls` is always read in full and costs the same. Higher Apify plans pay less per listing: $0.69 (Bronze), $0.68 (Silver) and $0.67 (Gold) per 1,000 — with details $0.78, $0.77 and $0.76. The Actor's own filters (listing date, excluded keywords, agent phone) are applied to every listing it reads, kept or not: **$0.05 per 1,000 listings checked** (`filter-check`); a run without them pays nothing for it. Example: 20,000 listings ≈ $14; a daily monitor of 300 new listings ≈ $0.21 a day. Platform usage (compute, proxy) is included in the price.

### ⚙️ Input

```json
{
    "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:

```json
{
    "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:

```json
{
    "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
}
```

| 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 (location, price, beds, type, radius and page are read from the URL) 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, value estimates, permits and view counts (read 25 listings per extra request, charged as its own event). Off by default.                  |
| `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):

```json
{
    "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 77 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       |
| `stats`, `buildingPermits`, `monthlyPayment`                                        | **detail** — views, clicks and enquiries per period; building permits; mortgage estimate      |
| `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.05 per 1,000) 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. Searches are then sorted by listing date, newest first (rentals: in the order they were published, which also reaches the rentals that carry no date), and a search stops once it meets 200 listings in a row that you already have — or as many as `maxItems` / `maxItemsPerQuery`, when lower. 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`, searches are sorted by newest and stop at the first page that is entirely too old.

### 🔌 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](https://mcp.apify.com), 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:

```json
{
    "location": "Austin, TX",
    "maxItems": 10
}
```

Key output fields: `url`, `status`, `listPrice`, `beds`, `baths`, `sqft`, `address`, `agentPhone`.

Cost: $0.70 per 1,000 listings plus $0.001 per run start ($0.67 per 1,000 on the Gold plan); **Extract details** 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, building permits on 16, and view counts on established listings only — the site starts counting a few days after a listing 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 `maxItemsPerQuery` still 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.
- `daysOnMarket` is counted from `listDate`: Realtor.com leaves its own field empty. For a sold home it stops at the sale day (`lastSoldDate`).
- `onlyNew` remembers 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 `listDate` and `daysOnMarket` are empty. `onlyNew` still returns the new ones (rentals are read in the order they were published); `postedAfter` / `postedBefore` leave 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 (`listingSource` is 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 `stateKey` at the same time may both return the same new listing.

**A run the platform stops without warning** (out of memory, run timeout)

- 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 `maxItems` still counts them.
- With `onlyNew`, the memory is saved once a minute: 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 up to a minute of them 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.

# Actor input Schema

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

Realtor.com search URLs (`https://www.realtor.com/realestateandhomes-search/Austin_TX/beds-3/price-300000-600000`), sold pages (`/soldhomeprices/...`) or rental pages (`/apartments/...`). Filters written in the URL are read and applied. When this list is not empty, the search fields below are ignored; caps, date filters and monitoring still apply. Max 1 000 URLs.

## `location` (type: `string`):

City, ZIP code, county or state, as typed on Realtor.com (e.g. `Austin, TX`, `78704`, `Texas`). Empty = only the locations listed below are used.

## `locations` (type: `array`):

Several locations in one run: one search per location (times each keyword below). Added to **Location** (3 keywords × 4 locations = 12 searches, max 500). Listings found by several searches are saved once.

## `query` (type: `string`):

Free-text keyword matched against the listing text, as on Realtor.com (e.g. `pool`, `waterfront`, `new roof`). Empty = no keyword filter.

## `searchQueries` (type: `array`):

Several keywords in one run: every keyword is searched in every location (3 keywords × 4 locations = 12 searches, max 500). Added to **Search keyword**.

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

Which listings to search: for sale, for rent, recently sold, pending or coming soon.

## `propertyType` (type: `array`):

Keep only these property types. Empty = all types. Values measured on Austin, TX (7 041 listings): single-family 4 424, condos 1 602, townhomes 137, multi-family 223, land 552, mobile 78, farm 25.

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

Maximum number of listings to save for the whole run (after deduplication and filters). 0 = no limit.

## `maxItemsPerQuery` (type: `integer`):

Cap for each single search (one location × one keyword), so one big city cannot eat the whole run. 0 = no per-search cap.

## `extractDetails` (type: `boolean`):

Open each listing's detail page to add price history, tax history, nearby schools, flood / fire / noise risk, value estimates, building permits and view counts. Read 25 listings per extra request (a little slower, charged as a separate event). Off = the search results only, which already carry description, photos and agent contact.

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

Order the site returns the listings in. Newest first is the one to use for monitoring.

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

Listing price, in US dollars. For rentals this is the monthly rent.

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

Listing price, in US dollars.

## `minBedrooms` (type: `integer`):

Minimum number of bedrooms.

## `maxBedrooms` (type: `integer`):

Maximum number of bedrooms.

## `minBathrooms` (type: `number`):

Half bathrooms count as 0.5 (e.g. `2.5`).

## `maxBathrooms` (type: `number`):

Maximum number of bathrooms, half bathrooms counted as 0.5.

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

Interior living area, in square feet.

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

Maximum interior living area, in square feet.

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

Lot size, in square feet (1 acre = 43 560 sqft).

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

Maximum lot size, in square feet.

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

Maximum monthly homeowners association fee, in US dollars. Listings without a fee are kept.

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

Keep only properties built in this year or later.

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

Keep only properties built in this year or earlier.

## `minGarage` (type: `integer`):

Minimum number of garage spaces.

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

Widen the search around the location, in miles (Realtor.com's own radius). 0 = the location's own boundary. Measured on Austin, TX: 7 041 listings without, 10 297 with a 5-mile radius.

## `soldWithinDays` (type: `integer`):

Only listings sold in the last N days, counted in US calendar days (New York time) from the day the run started, that day included. Applies to **Sold** listings only. 0 = no limit.

## `foreclosureOnly` (type: `boolean`):

Only properties in foreclosure. Measured on Austin, TX: 72 of 7 041 listings.

## `newConstructionOnly` (type: `boolean`):

Only newly built properties. Measured on Austin, TX: 1 152 of 7 041 listings.

## `openHousesOnly` (type: `boolean`):

Only listings with an open house scheduled.

## `virtualTourOnly` (type: `boolean`):

Only listings that come with a virtual tour or a 3D walkthrough.

## `noHoaFeeOnly` (type: `boolean`):

Only listings without homeowners association fees.

## `excludePending` (type: `boolean`):

Homes for sale only: leave out the listings already under contract. Realtor.com keeps them in its for-sale results: from 1 in 7 (Houston) to 1 in 3 (Chicago).

## `mlsOnly` (type: `boolean`):

Only listings published through an MLS by a licensed agent. Leaves out builders' new-home plans and the apartments that rental companies post themselves (from 3 rentals in 10 in Houston to 9 in 10 in Seattle).

## `petsAllowed` (type: `array`):

Rentals that accept these pets. Only for **For rent** listings: with any other status the input is refused before the run starts, since Realtor.com rejects it.

## `postedAfter` (type: `string`):

Keep listings put on the market on or after this date — the listing's `listDate`. Absolute (`2026-09-01`, or a full ISO timestamp) or relative (`7 days`, `24 hours`, `2 weeks`). Listings filtered out are not saved, and the search, read newest first, stops at the first page that is entirely older.

## `postedBefore` (type: `string`):

Keep listings put on the market on or before this date — the listing's `listDate`. Same formats as above.

## `excludeKeywords` (type: `array`):

Drop a listing when one of these words appears in its address, city or description (case and accents ignored). Applied after the site's own filters.

## `requirePhone` (type: `boolean`):

Drop listings whose agent has no phone number.

## `onlyNew` (type: `boolean`):

Return only the listings that were not delivered by a previous run with the same **State key**. The first run returns everything and remembers it.

## `stateKey` (type: `string`):

Name of the memory used by **Only new listings**. Use a different key for each saved search so they do not share their history.

## `resetState` (type: `boolean`):

Forget everything remembered under this **State key** before starting, so the next run returns every listing again.

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

Leave the default: the proxy is included in the price. Residential proxies are not available for this Actor.

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

Maximum number of requests running at the same time.

## `maxRequestsPerMinute` (type: `integer`):

Upper bound on the request rate, to stay polite with the site.

## `maxRequestRetries` (type: `integer`):

How many times a failed request is retried before it is given up.

## `debugLog` (type: `boolean`):

Log every request and every filter decision. Useful to report a problem.

## Actor input object example

```json
{
  "startUrls": [],
  "location": "Austin, TX",
  "locations": [],
  "searchQueries": [],
  "listingStatus": "for_sale",
  "propertyType": [],
  "maxItems": 100,
  "maxItemsPerQuery": 0,
  "extractDetails": false,
  "sortBy": "list_date:desc",
  "radiusMiles": 0,
  "soldWithinDays": 0,
  "foreclosureOnly": false,
  "newConstructionOnly": false,
  "openHousesOnly": false,
  "virtualTourOnly": false,
  "noHoaFeeOnly": false,
  "excludePending": false,
  "mlsOnly": false,
  "petsAllowed": [],
  "excludeKeywords": [],
  "requirePhone": false,
  "onlyNew": false,
  "stateKey": "default",
  "resetState": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 8,
  "maxRequestsPerMinute": 120,
  "maxRequestRetries": 5,
  "debugLog": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "location": "Austin, TX",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nice_dev/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 = {
    "location": "Austin, TX",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("nice_dev/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 '{
  "location": "Austin, TX",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call nice_dev/realtor-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/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/MA4adNWRBZ6SjpenG/builds/laGDo80a9Z61M3Y8B/openapi.json
