# Realtor.com Scraper (`shahidirfan/realtor-com-scraper`) Actor

Extract live property listings, prices, photos, and agent details from Realtor.com. Perfect for market research, competitor tracking, and real estate lead generation, all automated at scale.

- **URL**: https://apify.com/shahidirfan/realtor-com-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 20 total users, 6 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.99 / 1,000 results

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

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

### What does Realtor.com Scraper do?

Realtor.com Scraper collects public for-sale and ready-to-build property listings from Realtor.com search locations. Enter a Realtor.com search URL or a location slug such as `Austin_TX`, choose a result limit, and receive structured property records with prices, property features, addresses, coordinates, photos, listing URLs, and source-page information.

The dataset is useful for real estate market research, investment analysis, lead generation, neighborhood comparisons, listing inventories, and recurring property monitoring. Each run stores the collected records in an Apify Dataset, where you can preview, export, schedule, or connect the results to another workflow.

### Why use Realtor.com Scraper?

- **Market research** - Compare asking prices, bedroom and bathroom counts, property types, sizes, and locations across US cities, states, and ZIP codes.
- **Investment research** - Build a repeatable inventory of properties for sale or ready to build in selected markets.
- **Lead generation** - Create property lists with direct listing URLs, addresses, prices, photos, and available property attributes for further qualification.
- **Competitive monitoring** - Run the Actor on a schedule and compare listing inventories or pricing snapshots over time.
- **Photo and location data** - Collect the primary image, available gallery images, address information, and coordinates when Realtor.com publishes them.
- **Automation-ready exports** - Download data as JSON, CSV, Excel, XML, or use the Apify API and webhooks to pass results into your own systems.
- **Controlled collection** - Set both the maximum number of listings and the maximum number of search pages for predictable runs.
- **Duplicate-free results** - Repeated listings found during a run are removed before records are saved.

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

Each dataset item represents one property listing. Realtor.com may omit individual attributes for listings that do not publish them, so some nested fields are optional.

| Field | Type | Description |
|-------|------|-------------|
| `listing_id` | String | Unique listing identifier when available |
| `property_id` | String | Property identifier when available |
| `status` | String | Listing status, such as `for_sale` or `ready_to_build` |
| `list_price` | Number | Current asking price |
| `price_reduced_amount` | Number | Price reduction amount when published |
| `list_date` | String | Listing date when published |
| `description.beds` | Number | Number of bedrooms |
| `description.baths_consolidated` | String | Consolidated bathroom count, which may include half bathrooms |
| `description.sqft` | Number | Interior square footage |
| `description.lot_sqft` | Number | Lot size in square feet |
| `description.type` | String | Primary property type |
| `description.sub_type` | String | Property subtype when available |
| `description.year_built` | Number | Year the property was built |
| `location.address` | Object | Street, city, state, ZIP code, and coordinates when available |
| `photo_count` | Number | Number of published photos |
| `primary_photo` | String | Main listing photo URL |
| `photos` | Array | Available listing gallery photo URLs |
| `products` | Object | Listing product or brand metadata when published |
| `matterport` | Boolean | Whether a Matterport tour is available |
| `virtual_tours` | Array | Available virtual tour links |
| `permalink` | String | Realtor.com listing permalink identifier |
| `url` | String | Direct URL to the property detail page |
| `source_url` | String | Search URL used to find the listing |
| `page` | Number | Search page number where the listing was found |

### How to scrape Realtor.com listings

1. Open Realtor.com Scraper on Apify.
2. Paste a public Realtor.com search URL, or enter a location slug if you do not have a URL.
3. Set `results_wanted` to the maximum number of listings you need.
4. Set `max_pages` to limit how many search pages the run may process.
5. Configure Apify Proxy when you need additional stability for a larger collection.
6. Start the run and review the dataset preview.
7. Export the results or connect the dataset to your application, spreadsheet, or automation workflow.

The Actor collects for-sale and ready-to-build results returned for the selected Realtor.com location. It does not apply price, bedroom, or property-type filters inside the run. For those filters, start with a Realtor.com search URL that already contains the desired search settings, or filter the resulting dataset after collection.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | String | No | - | Public Realtor.com search URL. When provided, the Actor uses this URL to identify the search location. |
| `location` | String | No | - | Location slug used when `startUrl` is not provided, such as `Jacksonville_FL`, `Austin_TX`, or another Realtor.com location value. |
| `results_wanted` | Integer | No | `20` | Maximum number of unique listings to save. Must be at least `1`. |
| `max_pages` | Integer | No | `5` | Maximum number of search pages to process. Must be at least `1`. |
| `proxyConfiguration` | Object | No | No proxy | Apify Proxy configuration for larger or repeated runs. |

If both `startUrl` and `location` are omitted, the Actor uses its default Jacksonville, Florida search location. If both are provided, `startUrl` takes priority for the search location.

### Usage Examples

#### Basic City Search

Collect 20 listings from a Realtor.com search URL using a small page limit for an initial check:

```json
{
  "startUrl": "https://www.realtor.com/realestateandhomes-search/Jacksonville_FL",
  "results_wanted": 20,
  "max_pages": 3
}
```

#### Search by Location Slug

Use a city and state slug when you do not want to paste a complete search URL:

```json
{
  "location": "Austin_TX",
  "results_wanted": 50,
  "max_pages": 5
}
```

#### Larger Collection with Apify Proxy

Collect up to 200 listings across more search pages and enable a residential Apify Proxy group:

```json
{
  "startUrl": "https://www.realtor.com/realestateandhomes-search/Orlando_FL",
  "results_wanted": 200,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

### Sample Output

The following example shows one realistic dataset item. Optional fields are included only when the source provides them.

```json
{
  "listing_id": "2981057150",
  "property_id": "5249218121",
  "status": "for_sale",
  "list_price": 1900000,
  "price_reduced_amount": 50000,
  "list_date": "2026-07-15T12:00:00Z",
  "description": {
    "beds": 5,
    "baths_consolidated": "4.5",
    "sqft": 3509,
    "lot_sqft": 903870,
    "type": "single_family",
    "year_built": 1997
  },
  "location": {
    "address": {
      "line": "455 County Road 217",
      "city": "Jacksonville",
      "state_code": "FL",
      "postal_code": "32234",
      "coordinate": {
        "lat": 30.3322,
        "lon": -81.6557
      }
    }
  },
  "photo_count": 24,
  "primary_photo": "https://ap.rdcpix.com/example-primary-od.jpg",
  "photos": [
    "https://ap.rdcpix.com/example-primary-od.jpg",
    "https://ap.rdcpix.com/example-gallery-od.jpg"
  ],
  "matterport": true,
  "virtual_tours": [
    {
      "href": "https://my.matterport.com/show/?m=example"
    }
  ],
  "permalink": "455-County-Road-217_Jacksonville_FL_32234_M52492-18121",
  "url": "https://www.realtor.com/realestateandhomes-detail/455-County-Road-217_Jacksonville_FL_32234_M52492-18121",
  "source_url": "https://www.realtor.com/realestateandhomes-search/Jacksonville_FL",
  "page": 1
}
```

### Tips for Best Results

- **Validate the location first** - Run 20 to 50 listings before starting a larger collection.
- **Use Realtor.com search URLs** - Apply any available search settings on Realtor.com before copying the URL when you need a narrower result set.
- **Keep page limits intentional** - Increase `max_pages` when you need wider coverage, but keep it low during testing.
- **Use a location slug carefully** - Common values follow a city and two-letter state pattern, such as `Austin_TX` or `Jacksonville_FL`.
- **Enable proxy for larger runs** - Apify Proxy can improve consistency when collecting larger datasets or running repeated jobs.
- **Expect optional fields** - A listing may not include a lot size, year built, coordinates, photos, or virtual tour. Empty source attributes are not replaced with guesses.
- **Schedule snapshots** - Run the Actor daily or weekly when you need to compare listing availability and prices over time.

### Integrations

- **Google Sheets** - Review and share listing inventories with a team.
- **Airtable** - Build a searchable property database with views and filters.
- **Make or Zapier** - Send new dataset results to downstream business tools.
- **Webhooks** - Notify your application when an Actor run completes.
- **Apify API** - Start runs and read dataset items programmatically.

#### Export Formats

Apify Dataset results can be downloaded as JSON, CSV, Excel, XML, and other supported formats. JSON is suitable for applications and data pipelines, while CSV and Excel are convenient for analysis and reporting.

### Frequently Asked Questions

#### What type of Realtor.com listings does this Actor collect?

It collects public `for_sale` and `ready_to_build` property listings returned for the selected search location.

#### Can I collect listings from a ZIP code?

Yes. Use a Realtor.com search URL for the ZIP code, or provide the corresponding location value when Realtor.com supports it.

#### Can I scrape multiple locations in one run?

The input schema accepts one `startUrl` or one `location` value per run. For multiple locations, run the Actor separately for each search or automate multiple runs with the Apify API and schedules.

#### Can I filter by price, bedrooms, or property type?

The Actor does not expose separate price, bedroom, or property-type input fields. Use a Realtor.com search URL with the desired filters, or filter the saved dataset in your downstream workflow.

#### Why are some fields missing?

Realtor.com does not publish every attribute for every listing. The Actor keeps the available source data and removes empty values, so fields such as lot size, coordinates, photos, and virtual tours may be absent for some records.

#### How many listings can I collect?

Set `results_wanted` to the number of unique listings you want and use `max_pages` as a safety limit. Start with a smaller run, then increase both values after checking the dataset preview.

#### Can I schedule recurring runs?

Yes. Create an Apify Schedule to run the Actor hourly, daily, weekly, or on a custom interval for market snapshots and listing monitoring.

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

Public data collection may be subject to website terms, contracts, copyright, privacy rules, and local laws. Review Realtor.com terms and applicable regulations before using the data, and use the results responsibly. You are responsible for deciding whether your intended use is permitted.

### Related Actors

- [iProperty Scraper](https://apify.com/shahidirfan/iproperty-scraper) - Collect Malaysian property listings, prices, locations, and agent information.
- [Propertyfinder Scraper](https://apify.com/shahidirfan/propertyfinder-scraper) - Collect UAE sale and rental listings with property details, locations, images, and broker data.
- [Zameen.com Scraper](https://apify.com/shahidirfan/zameen-com-scraper) - Collect property listings for Pakistan, including houses, plots, and commercial properties.
- [Hemnet.se Scraper](https://apify.com/shahidirfan/hemnet-se-scraper) - Collect Swedish property listings for real estate research and market analysis.

### Support

For bugs, feature requests, or questions about a run, use the Issues tab on the Actor page in Apify Console. Include the input JSON, the affected search location, and a short description of the dataset result so the issue can be investigated efficiently.

### Legal Notice

This Actor is intended for legitimate collection of publicly available property listing data. Users are responsible for complying with Realtor.com terms of service, applicable laws, privacy requirements, and any restrictions on storing, sharing, or using listing content and images.

# Actor input Schema

## `startUrl` (type: `string`):

Start scraping from a specific Realtor.com search URL. If provided, this URL is used directly.

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

Location slug used in Realtor search URLs, for example Jacksonville_FL.

## `results_wanted` (type: `integer`):

Maximum number of listings to collect.

## `max_pages` (type: `integer`):

Safety cap for paginated Realtor search pages.

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

Use Apify Proxy for best reliability.

## Actor input object example

```json
{
  "startUrl": "https://www.realtor.com/realestateandhomes-search/Jacksonville_FL",
  "location": "Jacksonville_FL",
  "results_wanted": 20,
  "max_pages": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.realtor.com/realestateandhomes-search/Jacksonville_FL",
    "location": "Jacksonville_FL",
    "results_wanted": 20,
    "max_pages": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/realtor-com-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 = {
    "startUrl": "https://www.realtor.com/realestateandhomes-search/Jacksonville_FL",
    "location": "Jacksonville_FL",
    "results_wanted": 20,
    "max_pages": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/realtor-com-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 '{
  "startUrl": "https://www.realtor.com/realestateandhomes-search/Jacksonville_FL",
  "location": "Jacksonville_FL",
  "results_wanted": 20,
  "max_pages": 3
}' |
apify call shahidirfan/realtor-com-scraper --silent --output-dataset

```

## MCP server setup

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