# Realtor Scraper (`maximedupre/realtor-scraper`) Actor

Scrape Realtor.com property listings by city, ZIP code, county, or address. Export prices, addresses, listing IDs, photos, agents, offices, coordinates, and property details.

- **URL**: https://apify.com/maximedupre/realtor-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 1 total users, 0 monthly users, 96.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.50 / 1,000 property 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🏡 Realtor scraper for property listings

Realtor Scraper collects public property listings from [Realtor.com](https://www.realtor.com/) and saves them as structured rows you can export, schedule, or use through the Apify API. Search by city, ZIP code, county, or full address, then get listing prices, addresses, property URLs, source IDs, photos, agents, offices, coordinates, property details, estimates, and scrape timestamps.

Use this Realtor scraper when you need a clean real estate dataset for market research, listing monitoring, investment analysis, lead research, brokerage operations, or local property reports. For a small first run, keep the prefilled `Austin, TX`, set `Properties per location` to `25`, and review the dataset before scaling up.

### 🔎 What this Realtor.com scraper does

- Searches Realtor.com by city, ZIP code, county, or full street address.
- Supports `for_sale`, `for_rent`, `sold`, and `pending` listing types.
- Saves one dataset item per accepted property listing.
- Extracts property URLs, listing IDs, property IDs, prices, dates, address data, coordinates, county data, descriptions, photos, tags, agents, offices, and estimates when Realtor.com returns them.
- Lets you sort by relevance, listing date, last update, price, beds, baths, square feet, or sold date.
- Lets you filter by minimum price, maximum price, minimum bedrooms, and minimum bathrooms.
- Works with Apify exports, API clients, schedules, webhooks, and integrations.

The Actor focuses on public Realtor.com listing data. It does not log in, contact agents, submit lead forms, value properties, scrape private dashboards, or enrich listings from third-party databases.

### 📦 Data you can extract

Each dataset item is one Realtor.com property listing. Some fields can be empty when Realtor.com does not show or return that value for a listing.

- `searchLocation` and `searchLocationIndex` - submitted location and its input position
- `resultPosition` - listing position within that location's results
- `propertyId`, `listingId`, `propertyUrl`, and `permalink`
- `status`, `mlsStatus`, listing dates, sold dates, and update dates
- `listPrice`, `listPriceMin`, `listPriceMax`, `pricePerSqft`, and sold price when available
- `address` - street line, city, state code, ZIP code, and formatted address
- `coordinates` - latitude and longitude
- `county` - county name and FIPS code
- `description` - property type, text, beds, baths, square feet, lot size, year built, garage, and stories
- `primaryPhoto` and `photos`
- `agents` and `office` contact details when shown by the source
- `tags`, `details`, `estimates`, `scrapedAt`, and `source`

### 🚀 How to run it

1. Open the Input tab.
2. Add one or more Realtor.com locations such as `Austin, TX`, `78704`, `Travis County, TX`, or a full address.
3. Choose the listing types you want to collect.
4. Keep the property limits small for your first run.
5. Optionally set price, bedroom, bathroom, or sort filters.
6. Run the Actor and open the dataset.

You can export the finished dataset as JSON, CSV, Excel, XML, RSS, or HTML. You can also consume the same rows through the Apify API, schedule repeated checks, or send results to another tool with webhooks.

### ⚙️ Input options

- `Locations`: Realtor.com search locations such as cities, ZIP codes, counties, or full addresses.
- `Listing types`: listing statuses to collect: for sale, for rent, sold, or pending.
- `Properties per location`: maximum listings saved from each location.
- `Total properties`: run-wide listing limit.
- `Sort by`: Realtor.com result ordering.
- `Sort direction`: ascending or descending order for supported sorts.
- `Minimum price` and `Maximum price`: optional list price filters in US dollars.
- `Minimum bedrooms` and `Minimum bathrooms`: optional property filters.

### 🧾 Example input

```json
{
	"locations": ["Austin, TX"],
	"listingTypes": ["for_sale"],
	"maxItemsPerLocation": 25,
	"maxTotalItems": 25,
	"sortBy": "list_date",
	"sortDirection": "desc"
}
```

### 📊 Example output

```json
{
	"searchLocation": "Austin, TX",
	"resultPosition": 1,
	"propertyId": "8776072630",
	"listingId": "2996139258",
	"propertyUrl": "https://www.realtor.com/realestateandhomes-detail/10506-Yucca-Dr_Austin_TX_78759_M87760-72630",
	"status": "for_sale",
	"listPrice": 675000,
	"address": {
		"line": "10506 Yucca Dr",
		"city": "Austin",
		"stateCode": "TX",
		"postalCode": "78759",
		"formatted": "10506 Yucca Dr, Austin, TX, 78759"
	},
	"coordinates": {
		"latitude": 30.415,
		"longitude": -97.773
	},
	"description": {
		"type": "single_family",
		"beds": 3,
		"bathsFull": 2,
		"sqft": 1864,
		"yearBuilt": 1974
	},
	"photos": ["https://ap.rdcpix.com/example.jpg"],
	"agents": [
		{
			"name": "Listing agent",
			"email": "agent@example.com",
			"phones": ["5125550100"]
		}
	],
	"scrapedAt": "2026-05-28T22:00:00.000Z",
	"source": "realtor.com"
}
```

Field availability varies by listing. The example is shortened to show the row shape.

### 💵 Pricing

This Actor uses pay-per-event pricing. You pay a small Actor-start fee and then pay for each Realtor.com property listing saved to the dataset. Runs that find fewer matching properties save fewer paid property events.

Use a small limit such as `25` for the first run when you are checking a new location or filter set.

### ⚠️ Limits and caveats

- Results depend on what Realtor.com returns for the submitted location and filters.
- Some listings do not include every field, photo, agent detail, office detail, or estimate.
- Very broad locations can have many results, so use `Total properties` to control run size.
- Pending and sold inventory can vary by market and source availability.
- The Actor does not provide legal, financial, valuation, or investment advice.

### ❓ FAQ

#### Can I scrape Realtor.com listings by ZIP code?

Yes. Add a ZIP code such as `78704` to `Locations`. You can mix ZIP codes, cities, counties, and full addresses in the same run.

#### Does this Actor return agent contact data?

It returns agent and office details when Realtor.com includes them in the listing result. Some listings may have partial or missing contact fields.

#### Can I monitor new listings?

Yes. Use `Sort by` set to newest listings, keep a reasonable property limit, and schedule the Actor to run repeatedly from Apify Console.

#### Does it require a Realtor.com account?

No. The Actor is built for public Realtor.com listing data and does not ask for Realtor.com cookies, login credentials, or API keys.

### 📝 Changelog

- 0.1: Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~realtor-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Other actors

- [Business Address Scraper ↗](https://apify.com/maximedupre/business-address-scraper) - Find public business addresses from company websites.
- [SEMrush Free Website Stats Scraper ↗](https://apify.com/maximedupre/semrush-free-website-stats-scraper) - Collect public domain authority, traffic, backlink, and search metrics.
- [LinkedIn Company Scraper ↗](https://apify.com/maximedupre/linkedin-company-scraper) - Export public company profile data from LinkedIn pages.
- [Website Emails Scraper ↗](https://apify.com/maximedupre/website-emails-scraper) - Find public contact emails from websites you submit.
- [Google Shopping Ads Scraper ↗](https://apify.com/maximedupre/google-shopping-ads-scraper) - Track sponsored product listings, prices, stores, and landing pages.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Enter Realtor.com search locations such as Austin, TX, 78704, Travis County, TX, or a full street address. Each location is searched separately.

## `listingTypes` (type: `array`):

Choose the Realtor.com listing statuses to collect. For sale is the best starting point for a first run.

## `maxItemsPerLocation` (type: `integer`):

Maximum properties to save from each location before moving to the next one. Use 25 for a small test run.

## `maxTotalItems` (type: `integer`):

Maximum properties to save across the whole run.

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

Choose the Realtor.com result order. Relevance follows the source default; newest listings uses list date.

## `sortDirection` (type: `string`):

Choose ascending or descending order when the selected sort supports direction.

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

Optional minimum list price in US dollars.

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

Optional maximum list price in US dollars.

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

Optional minimum number of bedrooms.

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

Optional minimum number of bathrooms. Decimals such as 1.5 are accepted.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "listingTypes": [
    "for_sale"
  ],
  "maxItemsPerLocation": 100,
  "maxTotalItems": 250,
  "sortBy": "relevance",
  "sortDirection": "desc"
}
```

# Actor output Schema

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

Open the dataset with Realtor.com listings, prices, addresses, listing IDs, agents, offices, photos, coordinates, and scrape timestamps.

# 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 = {
    "locations": [
        "Austin, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/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 = { "locations": ["Austin, TX"] }

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

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

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

```

## CLI example

```bash
echo '{
  "locations": [
    "Austin, TX"
  ]
}' |
apify call maximedupre/realtor-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/realtor-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/tP5HQoViDQIdLrdHi/builds/6Ow4HKlqA7IXcxVaI/openapi.json
