# Realtor.com Property Listing Scraper (`data_dino/realtor-scraper`) Actor

Search Realtor.com property listings by location and filter by price, size, beds, baths, property type, listing age, and status. Get bounded, structured records with address, pricing, MLS, media, and listing-contact details in an Apify dataset.

- **URL**: https://apify.com/data\_dino/realtor-scraper.md
- **Developed by:** [Data Dino](https://apify.com/data_dino) (community)
- **Categories:** Real estate, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 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/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.com Property Listing Search

Find structured Realtor.com property listings for a location and turn them into an actionable Apify dataset. Search for homes for sale, rentals, sold properties, pending listings, off-market records, or new communities, then narrow the results by price, size, bedrooms, bathrooms, property type, listing age, and sort order.

This actor is built for real estate researchers, investors, brokers, analysts, rental teams, and data workflows that need consistent property records without manually opening and copying listing pages.

### Why use this actor?

- **Start with a place, not a complicated URL:** search by ZIP code, city, city and state, address, neighborhood, or county.
- **Control the search before collecting data:** apply price, size, bedroom, bathroom, property-type, and listing-age filters.
- **Keep runs bounded and predictable:** request from 1 to 1,000 properties per run, with a default of 20.
- **Cover more than active listings:** choose for-sale, for-rent, sold, pending, off-market, or new-community records.
- **Get practical records in one dataset row:** combine listing identity, status, price, address, property facts, MLS identifiers, media, and listing-agent or office details where provided.
- **Move quickly from collection to analysis:** export the Apify dataset as JSON or CSV, or consume it through the Apify API.

### What you can do with the data

- Build comparable-property and neighborhood datasets.
- Find homes that match an investment or acquisition screen.
- Monitor a location for new, pending, sold, or recently updated listings.
- Compare asking prices, size, property types, HOA fees, and days on market.
- Find listing-agent and brokerage contact details attached to available property records.
- Support rental discovery, market research, territory analysis, and real estate lead workflows.

### Input

Only `location` is required. All other fields are optional.

| Field | Type | Description | Default |
|---|---|---|---|
| `location` | string | ZIP code, city, city and state, address, neighborhood, or county to search. | `San Diego, CA` |
| `listingType` | string | Listing group: `for_sale`, `for_rent`, `sold`, `pending`, `off_market`, or `new_community`. | `for_sale` |
| `bedsMin` | integer | Minimum number of bedrooms. | unset |
| `bedsMax` | integer | Maximum number of bedrooms. | unset |
| `bathsMin` | number | Minimum number of bathrooms. | unset |
| `bathsMax` | number | Maximum number of bathrooms. | unset |
| `sqftMin` | integer | Minimum property size in square feet. | unset |
| `sqftMax` | integer | Maximum property size in square feet. | unset |
| `priceMin` | integer | Minimum listing price in US dollars. | unset |
| `priceMax` | integer | Maximum listing price in US dollars. | unset |
| `pastDays` | integer | Restrict listings to the past number of days. | unset |
| `pastHours` | integer | Restrict listings to the past number of hours. | unset |
| `limit` | integer | Maximum number of properties to request. Valid range: 1–1,000. | `20` |
| `sortBy` | string | Sort by `list_price`, `list_date`, `sqft`, `beds`, `baths`, or `last_update_date`. | unset |
| `sortDirection` | string | Sort direction: `asc` or `desc`. | `desc` |
| `propertyTypes` | array of strings | Optional property types such as `single_family`, `condos`, or `townhomes`. | `[]` |

#### Example input

```json
{
  "location": "San Diego, CA",
  "listingType": "for_sale",
  "bedsMin": 2,
  "bathsMin": 2,
  "priceMax": 900000,
  "sqftMin": 1000,
  "limit": 50,
  "sortBy": "list_price",
  "sortDirection": "asc",
  "propertyTypes": ["single_family", "condos"]
}
```

### Output

Each property returned by the run is pushed as one item to the Apify dataset. The exact populated fields depend on the listing and its available source data. Fields may be null when a listing does not provide a value.

Returned records include fields in these groups:

- **Listing identity:** `property_url`, `property_id`, `listing_id`, `permalink`, `mls`, and `mls_id`.
- **Status and timing:** `status`, `mls_status`, `list_date`, `pending_date`, `last_status_change_date`, `last_update_date`, and `days_on_mls`.
- **Address and geography:** formatted and street-level address fields, city, state, ZIP code, county, FIPS code, latitude, longitude, and neighborhoods.
- **Property facts:** bedrooms, full and half bathrooms, square feet, year built, stories, lot size, style, garage parking, HOA fee, and new-construction status.
- **Pricing and history:** list price ranges, sold price fields, price per square foot, assessed or estimated values, tax fields, and source-dependent historical information.
- **Listing contacts:** agent, broker, builder, and office identifiers, names, emails, MLS references, and phone arrays where provided.
- **Media and additional information:** primary and alternate photos, listing text, and nearby-school data where available.

#### Example dataset item

```json
{
  "property_url": "https://www.realtor.com/realestateandhomes-detail/example",
  "property_id": "1234567890",
  "listing_id": "9876543210",
  "status": "FOR_SALE",
  "mls_status": "Active",
  "formatted_address": "123 Example Street, San Diego, CA, 92101",
  "city": "San Diego",
  "state": "CA",
  "zip_code": "92101",
  "beds": 3,
  "full_baths": 2,
  "sqft": 1450,
  "year_built": 2005,
  "list_price": 750000,
  "price_per_sqft": 517,
  "agent_name": "Example Agent",
  "office_name": "Example Realty"
}
```

After the run, open the dataset to browse the results, export them, or continue processing them in your workflow.

### Running the actor

1. Enter a location.
2. Select a listing type and add only the filters needed for the decision you are making.
3. Set `limit` to keep the run within the desired sample size.
4. Run the actor and open the default dataset.
5. Export or connect the dataset to the next step in your workflow.

### Practical tips

- Start with a small `limit` to validate a location and filter combination.
- Use `sortBy: "list_price"` with `sortDirection: "asc"` to review lower-priced matches first.
- Use `pastDays` or `pastHours` when the workflow depends on recent listing activity.
- Keep source identifiers such as `property_id`, `listing_id`, `mls`, and `mls_id` when joining or deduplicating records.
- Treat contact, tax, estimate, school, HOA, and historical fields as source-dependent.

### Limitations and responsible use

- Results depend on Realtor.com availability and the source listing data returned for the selected location and filters.
- Listings can change, disappear, or move between statuses between runs.
- Some records will have null or missing optional fields; a field in the output shape is not a guarantee that every listing supplies a value.
- The actor is a property-listing search, not a full Realtor.com agent-directory search. Agent and office fields are included when attached to a property listing.
- The current input supports one location per run and a maximum of 1,000 requested properties.
- Do not treat listing data, prices, estimates, taxes, or contact details as verified financial, legal, appraisal, or professional advice.
- Respect Realtor.com terms, applicable laws, privacy requirements, and reasonable request limits. Use the resulting data only for authorized and lawful purposes.

# Actor input Schema

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

ZIP code, city, city and state, address, neighborhood, or county to search.

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

Which group of realtor.com listings to collect.

## `bedsMin` (type: `integer`):

Minimum number of bedrooms.

## `bedsMax` (type: `integer`):

Maximum number of bedrooms.

## `bathsMin` (type: `number`):

Minimum number of bathrooms.

## `bathsMax` (type: `number`):

Maximum number of bathrooms.

## `sqftMin` (type: `integer`):

Minimum property size in square feet.

## `sqftMax` (type: `integer`):

Maximum property size in square feet.

## `priceMin` (type: `integer`):

Minimum listing price in US dollars.

## `priceMax` (type: `integer`):

Maximum listing price in US dollars.

## `pastDays` (type: `integer`):

Limit results to listings from the past number of days.

## `pastHours` (type: `integer`):

Limit results to listings from the past number of hours.

## `limit` (type: `integer`):

Maximum number of properties to request.

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

Optional field used to sort the returned listings.

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

Direction used when sortBy is selected.

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

Optional property types such as single\_family, condos, or townhomes.

## Actor input object example

```json
{
  "location": "San Diego, CA",
  "listingType": "for_sale",
  "limit": 20,
  "sortDirection": "desc",
  "propertyTypes": []
}
```

# Actor output Schema

## `dataset` (type: `string`):

Structured realtor.com property listing records collected during the run.

# 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 = {
    "location": "San Diego, CA",
    "listingType": "for_sale",
    "limit": 20,
    "sortDirection": "desc",
    "propertyTypes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_dino/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 = {
    "location": "San Diego, CA",
    "listingType": "for_sale",
    "limit": 20,
    "sortDirection": "desc",
    "propertyTypes": [],
}

# Run the Actor and wait for it to finish
run = client.actor("data_dino/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 '{
  "location": "San Diego, CA",
  "listingType": "for_sale",
  "limit": 20,
  "sortDirection": "desc",
  "propertyTypes": []
}' |
apify call data_dino/realtor-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/3nkb4UOsqgHvuofNC/builds/LeKRCbRULaydiq7qu/openapi.json
