# Realtor US Scraper - Real Estate Listings (`igolaizola/realtor-us-scraper`) Actor

Extract United States Realtor.com homes for sale, rentals, and sold listings by city, ZIP code, or coordinate radius. Filter by price, beds, baths, size, property type, pets, tours, status, and dates, then export results as JSON, CSV, Excel, or API data for market research and lead generation.

- **URL**: https://apify.com/igolaizola/realtor-us-scraper.md
- **Developed by:** [Iñigo Garcia Olaizola](https://apify.com/igolaizola) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Listings Scraper

Collect U.S. residential property listings by city, ZIP code, or a coordinate radius. Search homes for sale, rentals, or recently sold homes, apply practical market filters, and download structured results for research, comparables, and market monitoring.

### 🏠 What you can collect

- Current homes for sale, rentals, and sold-home listings
- Prices, dates, bedrooms, bathrooms, living area, lot size, and property type
- Listing links and primary photos
- Street address, city, state, ZIP code, and coordinates, with place matching for text locations
- Listing status signals, such as pending, contingent, new construction, price reductions, and foreclosures
- Advertiser, office, and source details when available

### 🚀 Quick start

1. In the Apify Console, enter a U.S. city or five-digit ZIP code in **Location**.
2. Choose a **Listing type**, result limit, and optional filters.
3. Click **Start** and download the dataset as JSON, CSV, Excel, or through the Apify API.

### Input reference

| Input | Description |
| --- | --- |
| `location` | U.S. city, five-digit ZIP code, or other place text. Matching results are ranked and the best one is selected. Optional when latitude, longitude, and radiusMiles are supplied. |
| `locationType` | Optional preference for auto, city, or ZIP code matching. |
| `latitude`, `longitude`, `radiusMiles` | Optional coordinate search. Provide all three; the radius is 1–50 miles and takes precedence over `location`. |
| `listingType` | For sale, for rent, or sold homes. |
| `maxItems` | Maximum number of listings to collect. Use `0` for unlimited results; Apify runs remain subject to the available run allowance. |
| `sortBy` | Best match, newest, lowest price, or highest price. |
| `fetchDetails` | Add expanded property, photo, pet-policy, promotion, and contact fields. Adds one request per listing and increases runtime and usage. |
| `minPrice`, `maxPrice` | Price range in U.S. dollars. |
| `minBeds`, `maxBeds` | Bedroom range. |
| `minBaths`, `maxBaths` | Bathroom range. |
| `minSqft`, `maxSqft` | Interior living-area range in square feet. |
| `minLotSqft`, `maxLotSqft` | Lot-size range in square feet. |
| `minYearBuilt`, `maxYearBuilt` | Construction-year range. |
| `maxHoaFee`, `noHoaFee` | Homeowners association fee filters. |
| `homeCategories`, `propertyTypes` | Home category and property-type choices. |
| `cats`, `dogs`, `noPetsAllowed` | Rental pet-policy filters. |
| `foreclosure`, `newConstruction`, `promotionPresent` | Listing attributes to require. |
| `excludePendingContingent` | Exclude pending and contingent homes. |
| `hasOpenHouse`, `hasTour`, `hasVirtualTour`, `has3dTour` | Viewing and tour availability filters. |
| `listedSince`, `priceReducedSince`, `moveInDate` | Dates in `YYYY-MM-DD` format. |

#### Example: homes for sale in Austin

```json
{
  "location": "Austin",
  "locationType": "city",
  "listingType": "sale",
  "maxItems": 100,
  "sortBy": "newest",
  "minBeds": 3,
  "maxPrice": 750000,
  "propertyTypes": ["singleFamilyHome"]
}
```

#### Example: rentals with pet and tour filters

```json
{
  "location": "78701",
  "locationType": "zip",
  "listingType": "rent",
  "maxItems": 50,
  "dogs": true,
  "hasVirtualTour": true,
  "moveInDate": "2026-09-01",
  "fetchDetails": true
}
```

#### Example: coordinate-radius search

```json
{
  "location": "Austin",
  "latitude": 30.2672,
  "longitude": -97.7431,
  "radiusMiles": 5,
  "listingType": "sale",
  "maxItems": 50
}
```

### 📊 Results

Each dataset item represents one listing. The **Overview** dataset view highlights identifiers, a primary photo, listing link, price and dates, address and coordinates, property details, listing-status flags, and advertiser/source information.

Common result fields include:

- `property_id`, `listing_id`, `status`, `href`, `primary_photo.href`, and `photo_count`
- `list_price`, `list_date`, `price_reduced_date`, `price_reduced_amount`, `last_sold_date`, and `last_sold_price`
- `location.address.line`, `location.address.city`, `location.address.state_code`, and `location.address.postal_code`
- `description.type`, `description.beds`, `description.baths`, `description.sqft`, and `description.lot_sqft`
- `flags`, `advertisers`, and `source` details when available
- With `fetchDetails: true`, `_details` contains expanded photos, open houses, tours, pet policy, promotions, and contact-oriented fields when available.

### 💡 Tips and common recipes

- Use a five-digit ZIP code for a tightly defined area; set `locationType` to `zip` to avoid ambiguity.
- For a map-style search, provide latitude, longitude, and `radiusMiles` together; coordinates take precedence over the city or ZIP value.
- Use `sortBy: "newest"` with `listedSince` to monitor fresh inventory.
- Use `listingType: "sold"` with price, size, and year filters to build comparable-sales lists.
- Start with `fetchDetails: false` for broad searches, then enable it for a small, high-value result set.

### ❓ FAQ

**Does the actor support rentals?** Yes. Set `listingType` to `rent`; pet and move-in-date filters are useful for rental searches.

**Can I search a two-word city?** Yes. Enter the complete city name, such as `New York` or `San Antonio`, and leave `locationType` on `auto` or choose `city`.

**Why are some contact fields empty?** Availability varies by listing and advertiser. The actor preserves fields supplied with each listing.

**How much slower is `fetchDetails`?** It makes one additional detail request per emitted listing, so use it with a bounded `maxItems` value.

### ⚖️ Responsible use

Use collected data in accordance with applicable laws, privacy obligations, and the source site's terms. This independent actor is not affiliated with or endorsed by Realtor.com.

### 🛟 Support

Questions, feedback, or feature requests? Contact the author at [igolaizola.com/#contact](https://igolaizola.com/#contact).

# Actor input Schema

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

U.S. city, ZIP code, or other place text to search. Matching places are discovered and the best result is selected.

## `locationType` (type: `string`):

Optional place type to prefer when matching Location. Auto selects the highest-ranked match; City and ZIP code narrow the match.

## `latitude` (type: `number`):

Optional latitude for a radius search. Provide it together with longitude and radius.

## `longitude` (type: `number`):

Optional longitude for a radius search. Provide it together with latitude and radius.

## `radiusMiles` (type: `number`):

Search radius around the coordinates, from 1 to 50 miles. Coordinates take precedence over Location.

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

Choose whether to collect homes for sale, rent, or recently sold homes.

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

Maximum number of listings to collect. Use 0 for unlimited results (subject to the available run allowance).

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

Fetch additional property, photo, pet-policy, promotion, and contact fields for each listing. Adds one request per listing and increases runtime and usage.

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

Choose how listings are ordered.

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

Minimum listing price in U.S. dollars.

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

Maximum listing price in U.S. dollars.

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

Minimum number of bedrooms.

## `maxBeds` (type: `integer`):

Maximum number of bedrooms.

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

Minimum number of bathrooms.

## `maxBaths` (type: `number`):

Maximum number of bathrooms.

## `minSqft` (type: `integer`):

Minimum interior living area in square feet.

## `maxSqft` (type: `integer`):

Maximum interior living area in square feet.

## `minLotSqft` (type: `integer`):

Minimum lot size in square feet.

## `maxLotSqft` (type: `integer`):

Maximum lot size in square feet.

## `minYearBuilt` (type: `integer`):

Earliest construction year.

## `maxYearBuilt` (type: `integer`):

Latest construction year.

## `maxHoaFee` (type: `integer`):

Maximum homeowners association fee in U.S. dollars.

## `noHoaFee` (type: `boolean`):

Include only listings without a homeowners association fee.

## `homeCategories` (type: `array`):

Choose the kind of home listing to include.

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

Choose one or more property types to include.

## `cats` (type: `boolean`):

Include rental listings that allow cats.

## `dogs` (type: `boolean`):

Include rental listings that allow dogs.

## `noPetsAllowed` (type: `boolean`):

Include rental listings that do not allow pets.

## `foreclosure` (type: `boolean`):

Include foreclosure listings only.

## `newConstruction` (type: `boolean`):

Include new-construction listings only.

## `promotionPresent` (type: `boolean`):

Include promoted listings only.

## `excludePendingContingent` (type: `boolean`):

Exclude pending and contingent listings.

## `hasOpenHouse` (type: `boolean`):

Include listings with an open house.

## `hasTour` (type: `boolean`):

Include listings with a property tour.

## `hasVirtualTour` (type: `boolean`):

Include listings with a virtual tour.

## `has3dTour` (type: `boolean`):

Include listings with a 3D tour.

## `listedSince` (type: `string`):

Earliest listing date, in YYYY-MM-DD format.

## `priceReducedSince` (type: `string`):

Earliest price-reduction date, in YYYY-MM-DD format.

## `moveInDate` (type: `string`):

Earliest rental availability date, in YYYY-MM-DD format.

## Actor input object example

```json
{
  "location": "Austin",
  "locationType": "auto",
  "listingType": "sale",
  "maxItems": 100,
  "fetchDetails": false,
  "sortBy": "relevance",
  "minPrice": 0,
  "maxPrice": 0,
  "minBeds": 0,
  "maxBeds": 0,
  "minBaths": 0,
  "maxBaths": 0,
  "minSqft": 0,
  "maxSqft": 0,
  "minLotSqft": 0,
  "maxLotSqft": 0,
  "minYearBuilt": 0,
  "maxYearBuilt": 0,
  "maxHoaFee": 0,
  "noHoaFee": false,
  "cats": false,
  "dogs": false,
  "noPetsAllowed": false,
  "foreclosure": false,
  "newConstruction": false,
  "promotionPresent": false,
  "excludePendingContingent": false,
  "hasOpenHouse": false,
  "hasTour": false,
  "hasVirtualTour": false,
  "has3dTour": false
}
```

# Actor output Schema

## `results` (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 = {
    "location": "Austin"
};

// Run the Actor and wait for it to finish
const run = await client.actor("igolaizola/realtor-us-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": "Austin" }

# Run the Actor and wait for it to finish
run = client.actor("igolaizola/realtor-us-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 '{
  "location": "Austin"
}' |
apify call igolaizola/realtor-us-scraper --silent --output-dataset

```

## MCP server setup

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