# Realtor.com Scraper - Homes for Sale & Rent Listings (`sweet_stickball/realtor-scraper`) Actor

Scrape Realtor.com listings for a city or ZIP code: price, beds, baths, square feet, lot size, property type, status, list date, days on market, coordinates and photos, for sale or for rent. Realtor.com real estate scraper with flat JSON output.

- **URL**: https://apify.com/sweet_stickball/realtor-scraper.md
- **Developed by:** [CrawlKit](https://apify.com/sweet_stickball) (community)
- **Categories:** Real estate
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

## Realtor.com Scraper - Homes for Sale & Rent Listings

Scrapes real estate listings from Realtor.com for a given location or ZIP code, for sale or for rent. Each listing includes price, status, beds, baths, square footage, lot size, property type, list date, days on market, coordinates, photos and the listing agent.

Data is read from the JSON search endpoint that realtor.com's own search page uses, so no HTML parsing or browser is involved. Results are returned newest listings first.

This actor is a complement to the Zillow Scraper, covering the same US real estate market from a different source.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `location` | string | | City and state ("San Francisco, CA"), neighborhood, county or ZIP code. Either `location` or `zipCode` is required. |
| `zipCode` | string | | ZIP code to search. Used if `location` is not provided. |
| `maxItems` | integer | 20 | Maximum number of listings to return. |
| `type` | string | "sale" | Listing type: "sale" or "rent". |
| `minPrice` | integer | | Minimum list price in USD (monthly rent for rentals). |
| `maxPrice` | integer | | Maximum list price in USD (monthly rent for rentals). |

Example:

```json
{ "location": "San Francisco, CA", "maxItems": 10 }
```

### Output

One item per listing:

```json
{
  "propertyId": "9344017827",
  "listingId": "3002133677",
  "address": "20 NE 11th St Apt 2809",
  "city": "Miami",
  "state": "FL",
  "zipCode": "33132",
  "county": "Miami-Dade",
  "price": 765000.0,
  "priceMin": null,
  "priceMax": null,
  "currency": "USD",
  "status": "for_sale",
  "beds": 1,
  "baths": 1.0,
  "sqft": 617,
  "lotSqft": null,
  "yearBuilt": 2026,
  "propertyType": "condos",
  "propertySubType": "condo",
  "listDate": "2026-10-21T20:10:15+00:00",
  "daysOnMarket": 0,
  "lastSoldPrice": null,
  "lastSoldDate": null,
  "priceReducedAmount": null,
  "isPending": false,
  "isContingent": false,
  "isNewConstruction": true,
  "isForeclosure": false,
  "latitude": 25.784504,
  "longitude": -80.19352,
  "url": "https://www.realtor.com/realestateandhomes-detail/20-NE-11th-St-Apt-2809_Miami_FL_33132_M93440-17827",
  "primaryPhoto": "https://ap.rdcpix.com/22ac35ce85ce87336a0c6bfc466bf31al-m1625467538s.jpg",
  "images": ["https://ap.rdcpix.com/22ac35ce85ce87336a0c6bfc466bf31al-m1625467538s.jpg"],
  "agent": { "name": "Richard Alexander Acosta", "phone": "3059061631", "office": "Luxe Properties" },
  "query": "Miami, FL",
  "scrapedAt": "2026-10-21T20:20:35.810341+00:00"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `propertyId` / `listingId` | string | Realtor.com identifiers (results are de-duplicated on `propertyId`) |
| `address`, `city`, `state`, `zipCode`, `county` | string | Location |
| `price` | number | List price in USD (monthly rent for rentals; lowest price for price ranges) |
| `priceMin` / `priceMax` | number | Price range, for rental communities that publish one |
| `status` | string | `for_sale`, `for_rent`, ... |
| `beds` | integer | Bedrooms |
| `baths` | number | Bathrooms (2.5 = 2 full + 1 half) |
| `sqft` / `lotSqft` | integer | Living area / lot size in square feet |
| `yearBuilt` | integer | Year built |
| `propertyType` / `propertySubType` | string | e.g. `single_family`, `condos`, `townhomes`, `multi_family`, `land` |
| `listDate` | string | Listing date (ISO 8601) |
| `daysOnMarket` | integer | Days since `listDate` |
| `lastSoldPrice` / `lastSoldDate` | number / string | Previous sale, when known |
| `priceReducedAmount` | number | Most recent price reduction |
| `isPending`, `isContingent`, `isNewConstruction`, `isForeclosure` | boolean | Listing flags |
| `latitude` / `longitude` | number | Coordinates |
| `url` | string | Realtor.com listing page |
| `primaryPhoto` / `images` | string / array | Photo URLs |
| `agent` | object | Listing agent name, phone and office, as shown on the listing |

### Pricing

Pay-per-event, **no start fee**: **$0.70 per 1,000 listings** on the Apify Free plan, with lower prices on paid plans. Each listing pushed to the dataset is one event.

| Event | Free | Starter | Scale | Business | Enterprise |
|-------|------|---------|-------|----------|------------|
| Property listing (`LISTING`) | $0.70 | $0.59 | $0.52 | $0.42 | $0.42 |

Prices in USD per 1,000 events.

#### Cost examples (Free plan)

| Scenario | Listings | Cost |
|----------|----------|------|
| Quick look | 20 | $0.014 |
| One city | 500 | $0.35 |
| Several cities | 5,000 | $3.50 |

### Limitations

- Some Apify datacenter IP addresses are refused by Realtor.com (HTTP 403). The actor switches to a new proxy session when that happens and falls back to US residential proxies after five datacenter sessions.
- Realtor.com may change its internal search endpoint or its client identification at any time; the actor then fails with an explicit message instead of returning empty results.
- Only active listings (for sale or for rent) are returned; sold listings are not supported.
- A location that Realtor.com cannot resolve makes the run fail with "could not resolve location". Use "City, ST" or a 5-digit ZIP code.
- Some listings have no coordinates, square footage or agent; these fields are then `null`.
- Photo URLs are served by Realtor.com and may change.

### Running locally

```bash
pip install -r requirements.txt
python -m src.main
```

### Tests

```bash
pip install pytest
python -m pytest src/tests -q
```

### Related Actors

- [Zillow Scraper API - Listings, Zestimate & Coordinates](https://apify.com/sweet_stickball/zillow-scraper) — Scrape Zillow homes for sale or rent: price, Zestimate, beds, baths, sqft, address and coordinates. Real estate data API by city or ZIP, no login.
- [Airbnb Scraper API - Listings, Prices & Map Coordinates](https://apify.com/sweet_stickball/airbnb-scraper) — Scrape Airbnb listings for any city: nightly/total prices, ratings, reviews, room type and coordinates. Vacation rental data API, JSON or CSV, no login.
- [Booking.com Scraper API - Hotel Prices & Ratings, No Login](https://apify.com/sweet_stickball/booking-scraper) — Scrape Booking.com hotels for any city and dates: prices, ratings, reviews, stars, coordinates and free cancellation. Hotel data API, no login needed.

# Actor input Schema

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

City and state (e.g. 'San Francisco, CA'), neighborhood, county or ZIP code, as typed in the Realtor.com search box. Either location or zipCode is required.

## `zipCode` (type: `string`):

ZIP code to search. Used if location is not provided.

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

Maximum number of listings to return (newest listings first).

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

Type of listing to search for.

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

Minimum list price in USD (monthly rent for rentals).

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

Maximum list price in USD (monthly rent for rentals).

## Actor input object example

```json
{
  "location": "Austin, TX",
  "zipCode": "94102",
  "maxItems": 10,
  "type": "sale"
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset items shown with the 'listings' view.

# 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 Francisco, CA",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("sweet_stickball/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 Francisco, CA",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("sweet_stickball/realtor-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": "San Francisco, CA",
  "maxItems": 10
}' |
apify call sweet_stickball/realtor-scraper --silent --output-dataset

```

## MCP server setup

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