# Realtor.com Scraper — US Homes for Sale, Rent & Sold (`tortuga/realtor-scraper`) Actor

Scrape Realtor.com homes for sale, for rent and recently sold from search URLs or any US city, ZIP or neighborhood: price, beds, baths, sqft, photos, agent, open houses, history.

- **URL**: https://apify.com/tortuga/realtor-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 listing scrapeds

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

## Realtor.com Scraper — US Homes for Sale, Rent & Sold

Scrape **Realtor.com** property listings for any US city, ZIP code, neighborhood, county or state: homes **for sale**, **for rent** and **recently sold**. Paste a Realtor.com search URL with your filters, or type locations and choose filters here (price, beds, baths, home type, living area, lot size, year built, HOA, days on market, pending, new construction, foreclosures, open houses). Each listing comes with price, address, coordinates, beds, baths, sqft, lot, year built, status, list date, days on market, price cuts, the full description, the feature list, all photos, the listing agent and office, and open houses. Turn on **details** to add the price history, tax history, nearby school ratings, home value estimates and flood/wildfire risk.

No login, no browser, no Unblocker: the actor reads the same data service the Realtor.com apps use, so runs are fast (about 1,000 listings in 20 seconds) and cheap.

### What data does Realtor.com Scraper extract?

| Field | Example | Notes |
|---|---|---|
| `id`, `listingId`, `url` | `7486282156`, `https://www.realtor.com/realestateandhomes-detail/...` | Property ID is stable across listings of the same home |
| `status`, `listingStatus` | `for_sale`, `pending` | `listingStatus`: for_sale, pending, contingent, coming_soon, for_rent, sold, ... |
| `price` | `195000` | List price (for sold homes: last list price) |
| `priceMin`, `priceMax` | `957`, `1832` | Rent range of apartment communities |
| `pricePerSqft`, `priceReducedAmount`, `priceReducedDate` | `431`, `15000`, `2026-09-03` | |
| `lastSoldPrice`, `lastSoldDate`, `pendingDate` | `955000`, `2026-10-09` | Sale price where the state discloses it (not in TX, UT, ...) |
| `estimate` | `202811` | Realtor.com value estimate when shown |
| `listDate`, `daysOnMarket`, `lastUpdate` | `2026-10-09T23:20:14Z`, `1` | |
| `beds`, `baths`, `bathsFull`, `bathsHalf`, `sqft`, `lotSqft`, `yearBuilt`, `garage`, `stories` | `3`, `2`, ... | Ranges (`bedsMin`/`bedsMax`, `sqftMin`/`sqftMax`, ...) for communities |
| `propertyType`, `propertySubType`, `name` | `condos`, `condo` | `name` = building / community name |
| `hoaFee` | `257` | Monthly |
| `address`, `unit`, `city`, `state`, `zip`, `county`, `countyFips`, `neighborhoods` | `1010 W 23rd St Apt 5`, `Austin`, `TX`, `78705` | |
| `latitude`, `longitude` | `30.28743`, `-97.749061` | |
| `isNewListing`, `isPending`, `isContingent`, `isComingSoon`, `isNewConstruction`, `isForeclosure`, `isShortSale`, `isPriceReduced`, `isSeniorCommunity` | `true` / `false` | |
| `description`, `features`, `tags` | text; `[{category, group, items}]` | Included in every result |
| `openHouses` | `[{start, end, timeZone, description}]` | |
| `listingAgent`, `listingOffice`, `broker`, `builder`, `agents` | `Andrew Morris`, `Real Broker, LLC` | As shown on the listing |
| `mlsId`, `mlsListingId`, `sourceType` | `AUTX`, `3863154`, `mls` | |
| `primaryPhoto`, `photos`, `photoCount`, `virtualTours` | full-size photo URLs | |
| `petPolicy` | `{cats: true, dogs: true}` | Rentals |
| **With details:** `priceHistory`, `taxHistory`, `schools`, `estimates`, `floodFactor`, `femaZone`, `fireFactor`, `monthlyPaymentEstimate`, `propertyTaxRate` | | Extra `detail` event |
| `changeType`, `previousValues` | `changed`, `{"price": 210000}` | Only with monitoring on |

### How to scrape Realtor.com listings

1. Open [realtor.com](https://www.realtor.com), search a place, set filters, and copy the address bar into **Start URLs**. Search pages (`/realestateandhomes-search/...`), rentals (`/apartments/...`), recently sold (`.../show-recently-sold`) and property pages (`/realestateandhomes-detail/...`) all work.
2. Or leave Start URLs empty and type **Locations** such as `Austin, TX`, `78704`, `South Congress, Austin, TX`, `Travis County, TX` or `Brooklyn, NY`, then pick **For sale / For rent / Recently sold** and filters.
3. Set **Max items** and run. Download the results as JSON, CSV or Excel, or read them through the API.

### Input example

```json
{
  "locations": ["Austin, TX", "78704"],
  "listingType": "for_sale",
  "propertyTypes": ["single_family", "townhomes"],
  "minBeds": 3,
  "maxPrice": 600000,
  "listedWithinDays": 30,
  "sort": "newest",
  "maxItems": 500,
  "includeDetails": false
}
```

Start URL example: `{"startUrls": [{"url": "https://www.realtor.com/realestateandhomes-search/Denver_CO/beds-2/price-na-900000/show-recently-sold"}], "maxItems": 200}`. Filters set in the input are added on top of the URL's own filters.

### Output example

```json
{
  "id": "7486282156",
  "url": "https://www.realtor.com/realestateandhomes-detail/1010-W-23rd-St-Apt-5_Austin_TX_78705_M74862-82156",
  "status": "for_sale",
  "listingStatus": "for_sale",
  "price": 195000,
  "pricePerSqft": 431,
  "estimate": 202811,
  "listDate": "2026-10-09T23:20:14Z",
  "daysOnMarket": 1,
  "propertyType": "condos",
  "beds": 1,
  "baths": 1,
  "sqft": 452,
  "lotSqft": 536,
  "yearBuilt": 1975,
  "hoaFee": 257,
  "address": "1010 W 23rd St Apt 5",
  "city": "Austin",
  "state": "TX",
  "zip": "78705",
  "county": "Travis",
  "latitude": 30.28743,
  "longitude": -97.749061,
  "isNewListing": true,
  "description": "Discover an excellent investment opportunity in Austin's vibrant West Campus neighborhood! ...",
  "features": [{"category": "Appliances", "group": "Interior", "items": ["Dishwasher", "Disposal", "Microwave"]}],
  "listingAgent": "Andrew Morris",
  "listingOffice": "Real Broker, LLC",
  "broker": "Real Broker, LLC - Broker",
  "mlsId": "AUTX",
  "photos": ["https://ap.rdcpix.com/693e083134ad13f1405c8216064d8e28l-m1864688514od.jpg"],
  "photoCount": 15,
  "detailsFetched": true,
  "priceHistory": [{"date": "2026-10-09", "event": "Listed", "price": 195000, "source": "UnlockMLS"}],
  "taxHistory": [{"year": 2026, "tax": 3904, "assessedTotal": 190782}],
  "schools": [{"name": "Bryker Woods Elementary School", "rating": 8, "levels": ["elementary"], "distanceMiles": 1.2}],
  "estimates": [{"source": "Quantarium", "estimate": 202811, "low": 192670, "high": 212951, "isBest": true}],
  "floodFactor": 1,
  "fireFactor": 1,
  "monthlyPaymentEstimate": 2204,
  "search": "Austin, TX (for sale)",
  "scrapedAt": "2026-10-10T02:41:51Z"
}
```

### How many listings can I get per search?

Realtor.com serves at most 10,000 listings per search. When a search has more (a big city, a whole state) and **Max items** asks for more, the actor cuts it into price bands automatically, so every listing is reachable; bands come lowest price first. Results are de-duplicated by property ID across bands, pages and searches.

### Can I scrape rentals and recently sold homes?

Yes. Choose **For rent** or **Recently sold**, or paste a `/apartments/...` or `.../show-recently-sold` URL. Apartment communities come with a rent range (`priceMin`/`priceMax`) and bed/bath/sqft ranges; sold homes come with the sale date and, in states that disclose it, the sale price. Use **Sold in the last N days** to limit sold searches.

### Does it work without login? What about agent contacts?

No login is needed. The actor returns what a listing shows publicly: the listing agent's name, office and broker. It does not collect phone numbers, email addresses or anything behind a contact form.

### Do I need a proxy?

The default Apify datacenter proxy works (every request succeeded in tests; blocked requests are retried on a new IP). Residential proxies work too but are billed per GB (a few MB per 1,000 listings).

### Monitor changes on a schedule

Turn on **Only new or changed items** to watch a search. Each run remembers what earlier runs returned and outputs only new listings and listings whose price, rent range or status changed (for example active to pending, pending to sold, or a price cut). Unchanged listings are dropped before any detail request, so they are not charged. **Max items** then sets how many listings are checked per run; keep the "Newest" sort, e.g. 100-300 for a ZIP code. Save the input as a task in Apify and add a Schedule (for example daily); give each watch its own **Monitoring key** if several schedules use the same search. Every output item gets `changeType` (`new` or `changed`), and changed items get `previousValues` with the old values, e.g. `{"price": 525000, "listingStatus": "for_sale"}`.

### Pricing

You pay per listing saved ($0.90 per 1,000), plus $0.80 per 1,000 for the optional property details; description, features and photos are included in the base price. There is no start fee and no per-search fee. Apify platform usage is billed to you separately and is small (about $0.006 per 1,000 listings in tests, mostly dataset writes; about $0.009 with details).

### Integrations and API

Run it from the Apify API, the Python or JavaScript client, Make, Zapier, n8n, or schedule it in Apify Console. Results can go to Google Sheets, a webhook or your database.

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

The actor collects listing data that anyone can see on Realtor.com without logging in: property facts, prices, photos and the agent or office named on the listing. It does not log in and does not collect contact details. Agent names are personal data in some jurisdictions; you are responsible for having a legitimate purpose for processing them and for respecting Realtor.com's terms of use. If in doubt, ask a lawyer.

### Support

Found a bug or need a field that is not there? Open an issue on the Issues tab with the input you used and the run link.

# Actor input Schema

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

Realtor.com search URLs with filters set in the browser (copy the address bar, e.g. https://www.realtor.com/realestateandhomes-search/Austin_TX/beds-3/price-300000-500000, https://www.realtor.com/apartments/Brooklyn_NY or .../Denver_CO/show-recently-sold), or property URLs (.../realestateandhomes-detail/...\_M94164-97984), which return that property with full details. Leave empty if you use Locations below.

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

US cities, ZIP codes, neighborhoods, counties or states, one per line, e.g. 'Austin, TX', '78704', 'South Congress, Austin, TX', 'Travis County, TX', 'Brooklyn, NY', 'Texas'. Each is searched separately.

## `listingType` (type: `string`):

Which listings the Locations searches return (start URLs keep their own: /apartments/ = for rent, show-recently-sold = sold).

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

Only these home types. Leave empty for all.

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

Minimum list price, or minimum monthly rent for rentals, in US dollars.

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

Maximum list price, or maximum monthly rent for rentals, in US dollars.

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

Minimum number of bedrooms.

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

Maximum number of bedrooms.

## `minBaths` (type: `integer`):

Minimum number of bathrooms.

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

Minimum interior living area in square feet.

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

Maximum interior living area in square feet.

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

Minimum lot size in square feet (1 acre = 43,560 sq ft).

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

Maximum lot size in square feet (1 acre = 43,560 sq ft).

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

Only homes built in or after this year.

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

Only homes built in or before this year.

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

Maximum monthly HOA fee.

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

Only listings that came on the market in the last N days (days on market <= N), e.g. 1, 7 or 30.

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

Recently sold searches only: homes sold in the last N days, e.g. 30, 90 or 180. Leave empty for all sold homes Realtor.com keeps.

## `hidePendingContingent` (type: `boolean`):

For-sale searches show pending and contingent listings by default (like the site); turn this on to keep only active ones.

## `newConstruction` (type: `string`):

Show, keep only, or hide new construction (builder homes and plans).

## `foreclosures` (type: `string`):

Show, keep only, or hide foreclosures.

## `onlyOpenHouses` (type: `boolean`):

Only listings with an open house scheduled in the next 14 days.

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

Widen each location by this many miles around it (e.g. 5 around a ZIP code).

## `sort` (type: `string`):

Order of the results (what you get first when Max items is lower than the number of listings). 'Newest' = newest listings first; for sold searches it means most recently sold first.

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

Stop after this many listings in total (all searches together). Each listing is one charged result. A single search reaches up to 10,000 listings; larger ones are split automatically (see below).

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

Also load each property's record: full price/listing history, tax history with assessments, nearby school ratings, home value estimates (several providers), flood and wildfire risk, and the monthly payment estimate. Charged as an extra 'detail' event per listing. Description and features are included without this.

## `splitLargeSearches` (type: `boolean`):

Realtor.com serves at most 10,000 listings per search. When a search has more and Max items asks for more, it is cut into price bands so every listing is reachable (a few tiny count requests).

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new items or items whose price/status changed. Use with a Schedule; unchanged items are not charged. With this on, Max items is the number of listings checked per run (e.g. the newest 200).

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input

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

The actor reads Realtor.com's own data API, which answers Apify datacenter proxies (the default, included in Apify plans; no per-GB charge). Blocked requests are retried on a new IP. RESIDENTIAL works too but is billed per GB (a few MB per 1,000 listings). Unblocker is not needed.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.realtor.com/realestateandhomes-search/Austin_TX"
    }
  ],
  "listingType": "for_sale",
  "sort": "newest",
  "maxItems": 100,
  "includeDetails": false,
  "splitLargeSearches": true,
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.realtor.com/realestateandhomes-search/Austin_TX"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/realtor-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 = {
    "startUrls": [{ "url": "https://www.realtor.com/realestateandhomes-search/Austin_TX" }],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/realtor-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 '{
  "startUrls": [
    {
      "url": "https://www.realtor.com/realestateandhomes-search/Austin_TX"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/realtor-scraper --silent --output-dataset

```

## MCP server setup

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