# 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:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Realtor Scraper",
        "description": "Scrape Realtor.com property listings by city, ZIP code, county, or address. Export prices, addresses, listing IDs, photos, agents, offices, coordinates, and property details.",
        "version": "0.1",
        "x-build-id": "6Ow4HKlqA7IXcxVaI"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~realtor-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-realtor-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/maximedupre~realtor-scraper/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-realtor-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/maximedupre~realtor-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-realtor-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "locations"
                ],
                "properties": {
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Enter Realtor.com search locations such as Austin, TX, 78704, Travis County, TX, or a full street address. Each location is searched separately.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "listingTypes": {
                        "title": "Listing types",
                        "type": "array",
                        "description": "Choose the Realtor.com listing statuses to collect. For sale is the best starting point for a first run.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "for_sale",
                                "for_rent",
                                "sold",
                                "pending"
                            ],
                            "enumTitles": [
                                "For sale",
                                "For rent",
                                "Sold",
                                "Pending"
                            ]
                        },
                        "default": [
                            "for_sale"
                        ]
                    },
                    "maxItemsPerLocation": {
                        "title": "Properties per location",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum properties to save from each location before moving to the next one. Use 25 for a small test run.",
                        "default": 100
                    },
                    "maxTotalItems": {
                        "title": "Total properties",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum properties to save across the whole run.",
                        "default": 250
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "relevance",
                            "list_date",
                            "last_update_date",
                            "list_price",
                            "beds",
                            "baths",
                            "sqft",
                            "sold_date"
                        ],
                        "type": "string",
                        "description": "Choose the Realtor.com result order. Relevance follows the source default; newest listings uses list date.",
                        "default": "relevance"
                    },
                    "sortDirection": {
                        "title": "Sort direction",
                        "enum": [
                            "desc",
                            "asc"
                        ],
                        "type": "string",
                        "description": "Choose ascending or descending order when the selected sort supports direction.",
                        "default": "desc"
                    },
                    "minPrice": {
                        "title": "Minimum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional minimum list price in US dollars."
                    },
                    "maxPrice": {
                        "title": "Maximum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional maximum list price in US dollars."
                    },
                    "minBeds": {
                        "title": "Minimum bedrooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional minimum number of bedrooms."
                    },
                    "minBaths": {
                        "title": "Minimum bathrooms",
                        "minimum": 0,
                        "type": "number",
                        "description": "Optional minimum number of bathrooms. Decimals such as 1.5 are accepted."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
