# Realtor.com Search Listing Scraper (`scraperx/realtor-search-listing-scraper`) Actor

- **URL**: https://apify.com/scraperx/realtor-search-listing-scraper.md
- **Developed by:** [ScraperX](https://apify.com/scraperx) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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.com Search Listing Scraper

**Bulk-scrape rich property data from any Realtor.com search URL — for-sale homes, new construction, and ready-to-build plans — across any city, state, or ZIP in the United States.** Get prices, photos, schools, tax history, mortgage estimates, builder details, and more, in one structured JSON / CSV / XLSX export.

---

### ⭐ Why Choose This Scraper?

- 🚀 **Fast & resilient** — talks to Realtor.com's own internal GraphQL API, so it avoids the slow HTML pages most scrapers fight with.
- 🛰️ **Smart proxy ladder** — runs direct by default. If Realtor.com pushes back, it automatically escalates to datacenter → residential proxies, then sticks with the highest tier for the rest of the run. You don't have to babysit it.
- 📦 **Bulk input** — paste as many search URLs or `City, ST` strings as you want.
- 📋 **Rich detail enrichment** — optional second-pass detail fetches add schools, tax history, mortgage estimates, builder info, advertisers, open houses, and full description text.
- 💾 **Live saving** — every listing is pushed to the dataset as soon as it's processed. A mid-run failure leaves a partial dataset, not nothing.
- 🗂️ **Per-section views** — each location goes into its own alias dataset so you can browse results city-by-city in the Apify Console.

---

### ✨ Key Features

- 🔗 **URL or location input** — paste a full Realtor.com search URL or just `Austin, TX`.
- 🏷️ Covers **for_sale** AND **ready_to_build** listings.
- 🧠 Auto-detects blocks (HTTP 403/429/503 + Cloudflare/Kasada/Akamai markers).
- 🔁 Per-tier retries with exponential backoff.
- 🌐 Optional Apify proxy (datacenter / residential / custom groups).
- 📈 Configurable concurrency (1–32 parallel detail fetches).
- 🗒️ Verbose, friendly logs — you always know what page is being scraped and which tier is active.

---

### 📥 Input

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| `urls` | `array<string>` | ✅ | — | Realtor.com search URLs or `City, ST` strings (bulk supported). |
| `maxItems` | `integer` | — | `10` | Maximum listings per location. |
| `fetchDetails` | `boolean` | — | `true` | Enrich each listing with full detail data. |
| `proxyConfiguration` | `object` | — | *no proxy* | Apify proxy config. Default is **no proxy** — the ladder escalates only if blocks are detected. |

#### Example input

```json
{
  "urls": [
    "https://www.realtor.com/realestateandhomes-search/Austin_TX",
    "Brooklyn, NY",
    "Miami_FL"
  ],
  "maxItems": 100,
  "fetchDetails": true,
  "proxyConfiguration": { "useApifyProxy": false }
}
````

***

### 📤 Output

Every listing is pushed live to the **default dataset** and **mirrored into a per-section alias dataset** named `section_<slug>` (e.g. `section_Austin_TX`). Each row contains the flat top-level fields plus the full nested objects from Realtor.com.

#### Example output row (abridged)

```json
{
  "section": "Austin_TX",
  "property_id": "7932650224",
  "listing_id":  "2995674375",
  "status":      "for_sale",
  "list_price":  799000,
  "address_line": "605 Texas Ave",
  "city":  "Austin",
  "state_code": "TX",
  "postal_code": "78705",
  "beds":  2,
  "baths": 1,
  "sqft":  1116,
  "lot_sqft": 7105,
  "year_built": 1935,
  "type": "single_family",
  "stories": 1,
  "garage":  1,
  "primary_photo_url": "http://ap.rdcpix.com/.../m837970272s.jpg",
  "photo_count": 28,
  "href":  "https://www.realtor.com/realestateandhomes-detail/605-Texas-Ave_Austin_TX_78705_M79326-50224",
  "list_date":        "2026-05-20T06:44:27.000000Z",
  "last_update_date": "2026-05-20T06:43:09Z",
  "flags": { "is_new_listing": true, "is_pending": false, "...": "..." },
  "location": { "address": { "...": "..." }, "county": { "...": "..." } },
  "description": { "text": "JUST LISTED! Adorable 1935 white stucco...", "...": "..." },
  "detail": {
    "schools": { "schools": [ { "name": "...", "rating": 8, "...": "..." } ] },
    "tax_history": [ { "tax": 12345, "year": 2025, "assessment": { "...": "..." } } ],
    "property_history": [ { "date": "2010-04-01", "price": 320000, "event_name": "Sold" } ],
    "mortgage": { "estimate": { "monthly_payment": 4200 } },
    "builder": null,
    "hoa":     null,
    "open_houses": []
  }
}
```

***

### 🚀 How to Use (Apify Console)

1. Log in at [console.apify.com](https://console.apify.com) → **Actors**.
2. Open **Realtor.com Search Listing Scraper**.
3. Paste one or more Realtor.com search URLs *or* `City, ST` strings into **🏡 Realtor.com Search URLs or Locations**.
4. Set the cap with **🔢 Maximum listings per location** (default 10).
5. Toggle **📋 Fetch detailed property data** on if you want schools / taxes / mortgage estimates.
6. Leave **🌐 Proxy configuration** empty (no proxy) — the actor handles fallback automatically.
7. Click **▶ Start**.
8. Watch the live log — you'll see each page being collected and each listing being saved.
9. When the run completes, open the **Output** tab → switch between the per-section views or the overview, and export to **JSON / CSV / XLSX**.

***

### 🤖 Use via API

Start a run (synchronous, returns dataset items when done):

```bash
curl -X POST "https://api.apify.com/v2/acts/<ACTOR_ID>/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{
       "urls": ["Austin, TX"],
       "maxItems": 50,
       "fetchDetails": true
     }'
```

Start asynchronously (returns a `runId` you can poll for status):

```bash
curl -X POST "https://api.apify.com/v2/acts/<ACTOR_ID>/runs?token=$APIFY_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{
       "urls": ["https://www.realtor.com/realestateandhomes-search/Brooklyn_NY"],
       "maxItems": 100
     }'
```

***

### 💡 Best Use Cases

- 📊 **Market intelligence** — track new listings, price reductions, days-on-market across multiple cities.
- 🏘️ **Lead generation** — find active for-sale inventory by neighborhood for real-estate agents.
- 🏗️ **Builder research** — filter `ready_to_build` plans and compare builders across markets.
- 💰 **Investor sourcing** — surface foreclosures, short sales, price reductions, and rent-vs-buy comps.
- 🧠 **ML datasets** — assemble structured listing data with prices, school ratings, tax history for analytics models.

***

### 💲 Pricing

This actor uses Apify's **Pay-per-event (PPE)** model with **one** billable event:

| Event | When it fires | What it means for you |
|-------|---------------|------------------------|
| 🏡 `listing_result` | Each time a listing is successfully pushed to the dataset | Pay per listing returned — nothing more. |

**You only pay for results.** If the actor produces no output (target site fully blocks every tier, empty search location, invalid URL), **no charges are emitted**. There is no fixed "actor start" fee and no separate dataset-item charge — just the one event, billed only when real data is saved.

If your account's spend limit (`ACTOR_MAX_TOTAL_CHARGE_USD`) is hit mid-run, the actor stops cleanly and the dataset still contains everything saved up to that point.

***

### ❓ Frequently Asked Questions

**Do I need a proxy?**
No. By default the actor talks directly to Realtor.com's GraphQL API, which (unlike the HTML pages) is not behind Kasada. If it ever starts blocking, the actor automatically escalates to datacenter and then residential proxies.

**What if I paste a URL with filters (price range, beds, etc.)?**
Right now the actor reads the *location* from the URL and runs a fresh search for that location. Custom filter parameters from the URL are ignored — set them in the input fields once we expose them, or filter the output dataset afterward.

**Why are some listings missing `listing_id`?**
`ready_to_build` plan listings have no concrete `listing_id` because the home hasn't been built yet. The actor calls the GraphQL `home()` resolver with only `property_id` in that case, which the schema supports.

**Why are some `flags` fields `false` instead of `null`?**
Realtor.com returns `null` to mean "not in this state" for tri-state booleans. The actor normalizes those to `false` so downstream consumers don't have to handle the tri-state.

**Can I scrape rentals?**
Not yet — the current actor focuses on `for_sale` and `ready_to_build`. Rental support can be added on request.

***

### ⚖️ Cautions / Legal

- Data is collected only from **publicly available** Realtor.com listings.
- Do not use scraped data in ways that violate Realtor.com's Terms of Service or applicable law (GDPR, CCPA, anti-spam, etc.).
- The end user is responsible for legal compliance and respectful rate-limiting.

***

### 💬 Support & Feedback

Found a bug or want a new feature? Open an issue or message us on the actor's Apify page — we read every report.

# Actor input Schema

## `urls` (type: `array`):

Paste one or more Realtor.com search URLs (e.g. `https://www.realtor.com/realestateandhomes-search/Austin_TX`) or `City, ST` strings (e.g. `Brooklyn, NY`). Bulk input supported.

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

Maximum number of listings to scrape per search URL / location.

## `fetchDetails` (type: `boolean`):

Enrich each listing with detailed information — schools, tax history, mortgage estimates, builder, advertisers, open houses, and full description text. Slower but produces a much richer dataset.

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

Optional override for this run. Recommended: leave off unless you need a specific proxy setup.

## Actor input object example

```json
{
  "urls": [
    "https://www.realtor.com/realestateandhomes-search/Austin_TX"
  ],
  "maxItems": 10,
  "fetchDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

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

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Realtor.com Search Listing Scraper",
        "version": "0.1",
        "x-build-id": "1yFQfhFgdiqtiy8jN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scraperx~realtor-search-listing-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scraperx-realtor-search-listing-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/scraperx~realtor-search-listing-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scraperx-realtor-search-listing-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/scraperx~realtor-search-listing-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scraperx-realtor-search-listing-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": [
                    "urls"
                ],
                "properties": {
                    "urls": {
                        "title": "🏡 Realtor.com Search URLs or Locations",
                        "minItems": 1,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Paste one or more Realtor.com search URLs (e.g. `https://www.realtor.com/realestateandhomes-search/Austin_TX`) or `City, ST` strings (e.g. `Brooklyn, NY`). Bulk input supported.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "🔢 Maximum listings per location",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Maximum number of listings to scrape per search URL / location.",
                        "default": 10
                    },
                    "fetchDetails": {
                        "title": "📋 Fetch detailed property data",
                        "type": "boolean",
                        "description": "Enrich each listing with detailed information — schools, tax history, mortgage estimates, builder, advertisers, open houses, and full description text. Slower but produces a much richer dataset.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "🌐 Proxy configuration",
                        "type": "object",
                        "description": "Optional override for this run. Recommended: leave off unless you need a specific proxy setup.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
