# Realtor.com Property Listings Scraper ($1 per 1,000 results) (`zapticx/realtor-com-property-listings-scraper`) Actor

Scrape Realtor.com property listings for sale, sold and rent with prices, addresses, property details, photos and agent or brokerage information when available. Search by location, Realtor.com URL or radius and export structured real estate data.

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

## Pricing

$1.00 / 1,000 listing returneds

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

## Realtor.com Property Listings Scraper

Scrape Realtor.com property listings and export clean, structured US real estate data. This Realtor.com
scraper collects homes for sale, recently sold properties and rental listings with prices, addresses,
coordinates, property details, photos, and agent or brokerage information when Realtor.com publishes it.

Search by location, by a Realtor.com search URL you paste in, by several locations at once, or within a
radius of a map point. Results arrive as a tidy dataset you can export to JSON, CSV or Excel, or pull
straight from the Apify API into a spreadsheet, database, CRM or data pipeline.

**$1 per 1,000 results.** No Realtor.com account, no API key and no proxy required.

***

### What you can scrape

Every field below is produced by this Actor and was measured on live Realtor.com data. Availability
varies by listing, so the table says how often each field is actually filled.

#### Always present

`listingId` · `propertyId` · `status` · `url` · `city` · `state` · `stateCode` · `zipCode` · `county` ·
`propertyType` · `currency` · `lastUpdatedDate` · `scrapedAt` · `source`

#### Location and address

| Field | Availability |
|---|---|
| `address`, `unit` | address on ~99–100% of listings |
| `latitude`, `longitude` | ~97–100% |
| `county` | 100% |

#### Prices

| Field | Notes |
|---|---|
| `listPrice` | The asking price for homes for sale (100%) |
| `rentPrice` | Monthly rent where Realtor.com publishes a single figure |
| `rentPriceMin`, `rentPriceMax` | Rent range where Realtor.com publishes one instead, common for apartment communities |
| `lastSoldPrice` | The most recent historical sale price Realtor.com exposes for the property, **where it provides one** — see Limitations |
| `lastSoldDate` | The date of that most recent historical sale |
| `pricePerSqft`, `priceReducedAmount` | When published |

#### Property details

`beds` · `bedsMin` · `bedsMax` · `baths` · `bathsFull` · `bathsHalf` · `sqft` · `lotSqft` · `yearBuilt` ·
`stories` · `garageSpaces` · `hoaFee` · `propertySubType` · `features` · `description`

Beds, baths and square footage are filled on roughly 91–99% of for-sale and sold listings. Rentals are
sparser and vary a lot by market — apartment communities often publish a bedroom *range*
(`bedsMin`/`bedsMax`) instead of a single count, and may omit square footage entirely.

#### Photos

`primaryPhoto` · `photos` · `photoCount` — high-resolution property image URLs when available, present on
roughly 93–100% of listings. Images are requested at up to 1024 pixels wide; most come back at 1024 px
and smaller source images are served at their own size rather than upscaled. These are Realtor.com's own
hosted images, not the original camera files.

How many images a listing has varies by category: around 27 for homes for sale and around 26 for sold
listings in disclosure states, about 13 for rentals, but often only one for sold listings in
non-disclosure states such as Texas.

#### Agent, advertiser and brokerage — when available on Realtor.com

`agentName` · `agentType` · `agentEmail` · `agentPhone` · `officeName` · `officeEmail` · `officePhone` ·
`brokerName`

This is the contact Realtor.com publishes on the listing, and it is **not always an individual agent**.
Use `agentType` to tell which kind you have — it carries Realtor.com's own role for that contact:

| `agentType` | What it means |
|---|---|
| `seller`, `co_seller` | An individual listing agent |
| `management`, `unit_rental` | A property manager or rental feed, common on apartment listings |
| `community` | A new-build community or builder, so the name is a development, not a person |

Contact details are **not on every listing**, and how often they appear varies a lot by market and
category. In live sampling a contact name was present on most for-sale and sold listings and on roughly
three quarters of rentals, while email and phone ranged from almost always present in some sold markets
down to absent altogether in some rental markets. Treat these as a bonus, not a guaranteed contact
database, and filter on `agentType` if you specifically need individual agents.

#### Status flags and open houses

`isPending` · `isContingent` · `isForeclosure` · `isNewConstruction` · `isPriceReduced` · `openHouses`
(start, end and timezone, on listings that have one scheduled) · `listedDate` · `mlsSource`

***

### Supported searches

#### Location

Enter one or more places — a city and state (`Austin, TX`), a ZIP code (`78704`), a county
(`Travis County, TX`) or a neighborhood.

#### Realtor.com search URL

Build the search you want on Realtor.com, copy the address bar, and paste it in. For-sale, sold
(`/soldhomeprices/`) and rental (`/apartments/`) links all work, and price, beds, baths, square feet and
property-type filters in the link are applied.

If a link contains a filter this Actor cannot reproduce exactly, **the run reports it as an error rather
than quietly running a broader search than you asked for**, so you never get results that silently do not
match your link.

#### Multiple locations

Pass several locations and each is searched separately. **Maximum listings is a total for the whole run**,
shared evenly between locations — 300 listings across 3 cities gives about 100 from each, and whatever a
location does not use rolls over to the next. Listings that appear in more than one location (a ZIP inside
a city, say) are removed automatically, so the dataset has no repeats.

#### Radius

Search within a distance of a map point using Realtor.com's own radius search. Set `centerPoint` to
`"latitude, longitude"` — for example `"30.2672, -97.7431"`, which you can copy from Google Maps — and
`radiusMiles` to the distance. **Realtor.com supports a radius of up to 50 miles.** Coordinates are
required because Realtor.com does not offer a way to turn a place name into a map point.

***

### Supported listing categories

| Category | What it returns |
|---|---|
| **For sale** | Homes currently listed for sale |
| **Sold** | Recently sold properties, with sale dates |
| **For rent** | Rental listings, including apartment communities |

Rental listings may publish either an exact monthly price (`rentPrice`) or a minimum/maximum range
(`rentPriceMin`/`rentPriceMax`), and some publish no price at all. Which is which varies by market and by
listing type. Nothing is inferred — see Limitations.

***

### Filters

All optional, and all tested against live data:

- **Price** — minimum and maximum (monthly rent for rentals)
- **Bedrooms** — minimum and maximum
- **Bathrooms** — minimum
- **Square feet** — minimum
- **Property types** — house, condo, townhome, apartment, co-op, multi-family, mobile/manufactured, land,
  farm/ranch, commercial, other
- **Pending** · **Contingent** · **Foreclosure** · **New construction** · **Has an open house** — these are
  separate filters on Realtor.com rather than listing statuses, so combine them with a category above

***

### Output

One row per listing. A real record from a production run, shortened for display:

```json
{
  "listingId": "3000848501",
  "propertyId": "7404131298",
  "status": "for_sale",
  "url": "https://www.realtor.com/realestateandhomes-detail/2114-Goodrich-Ave-Apt-7_Austin_TX_78704_M74041-31298",
  "address": "2114 Goodrich Ave Apt 7",
  "unit": "Apt 7",
  "city": "Austin",
  "state": "Texas",
  "stateCode": "TX",
  "zipCode": "78704",
  "county": "Travis",
  "latitude": 30.249411,
  "longitude": -97.773666,
  "listPrice": 599900,
  "lastSoldPrice": null,
  "lastSoldDate": "2016-06-01",
  "pricePerSqft": 416,
  "currency": "USD",
  "propertyType": "condos",
  "propertySubType": "condo",
  "beds": 2,
  "baths": 3,
  "bathsFull": 2,
  "bathsHalf": 1,
  "sqft": 1443,
  "lotSqft": 4774,
  "yearBuilt": 1999,
  "stories": 2,
  "garageSpaces": 2,
  "hoaFee": 300,
  "listedDate": "2026-09-17T18:49:51.000Z",
  "lastUpdatedDate": "2026-09-18T17:54:09.000Z",
  "agentName": "Stefan Benteler",
  "agentEmail": "stefan@realtyaustin.com",
  "agentPhone": "5124879993",
  "officeName": "Compass RE Texas",
  "officePhone": "(512) 241-1300",
  "brokerName": "Realty Austin Compass",
  "openHouses": [
    { "start": "2026-09-19T08:00:00.000Z", "end": "2026-09-19T10:00:00.000Z", "timezone": "CST" }
  ],
  "photoCount": 34,
  "primaryPhoto": "http://ap.rdcpix.com/22cd9a32134517a9772d1f1b58899c18l-m3672614351s.jpg",
  "photos": ["http://ap.rdcpix.com/22cd9a32134517a9772d1f1b58899c18l-m3672614351s.jpg", "… 33 more"],
  "features": ["central_air", "central_heat", "dishwasher", "fireplace", "…"],
  "description": "Tucked into one of Austin's most beloved neighborhoods, this move-in-ready condo…",
  "mlsSource": "AUTX",
  "scrapedAt": "2026-09-18T22:02:59.833Z",
  "source": "realtor.com"
}
```

Prices, coordinates, bedrooms and square footage are real numbers, not formatted strings, so they sort and
calculate correctly in a spreadsheet or database. Dates are ISO-8601. Lists are always lists, even when
empty. The default table view shows the columns most people want; the full record is always in the JSON.

***

### Use cases

- **Real estate market research** — pull comparable sales and current inventory for a market
- **Property monitoring** — track new listings, price cuts and pending status in areas you follow
- **Lead generation and CRM enrichment** — build agent and brokerage contact lists from public listings
- **Comparable-property datasets** — assemble sold-price datasets for valuation work
- **Rental research** — study rental inventory, asking rents and unit mixes
- **Automation workflows** — feed listings into Zapier, Make or n8n
- **Spreadsheets and databases** — export to CSV or Excel, or load into Postgres or BigQuery
- **AI and data pipelines** — supply structured US property data to models and agents

***

### Integrations

Results live in an Apify dataset, so they reach your tools the same way any Apify Actor's data does:

- **Apify API** — fetch results as JSON, CSV, Excel or XML
- **Webhooks** — trigger your own endpoint when a run finishes
- **Zapier, Make and n8n** — through their Apify integrations
- **Google Sheets** — via the dataset's CSV export
- **Databases and warehouses** — load the JSON or CSV export
- **Scheduler** — run the same search daily or weekly from Apify

***

### Pricing

**$1.00 per 1,000 results.** You pay for the listings the Actor actually returns. Set **Maximum listings**
to cap a run — it is the total for the whole run across every location and URL, so a 100-listing run costs
about $0.10.

***

### Limitations

Worth knowing before you run it:

- **Agent, brokerage and contact fields are not on every listing.** They reflect what Realtor.com
  publishes, and coverage swings widely by market and category — in live sampling email ranged from
  present on nearly every sold listing in one market to absent on every rental in another. This is not a
  complete agent contact database, and you should not assume a fixed hit rate.
- **Sale prices depend on what Realtor.com provides.** In US non-disclosure states — Texas, Idaho, Kansas,
  Utah and others — sale prices are not public record, so `lastSoldPrice` is empty there while
  `listPrice` still shows the last asking price. In disclosure states it is filled on essentially every
  sold listing.
- **`lastSoldPrice` is history, not the current deal.** It is the most recent past sale Realtor.com
  exposes for that property. On a rental it may describe a previous owner's purchase, or the sale of the
  whole apartment building — it is normal to see a multi-million `lastSoldPrice` beside a monthly rent of
  a few hundred dollars. It is never the current asking price, the rent, or the price the listing will
  sell for.
- **Some rentals publish no price at all.** Where Realtor.com exposes neither a figure nor a range,
  `rentPrice`, `rentPriceMin` and `rentPriceMax` are all empty. No value is estimated or filled in.
- **The contact is not always an individual agent.** On apartment listings it is often a property manager
  or rental feed, and on new-build listings a community or builder name. Check `agentType` — `seller` and
  `co_seller` are the individual-agent cases.
- **Rental searches may return slightly fewer listings than Realtor.com reports.** Realtor.com's own
  rental pagination repeats and skips rows; across six markets this Actor collected roughly 96–99% of the
  reported rental inventory. For-sale searches matched the reported count exactly in testing.
- **Realtor.com limits any single search to 10,000 results.** For larger searches this Actor automatically
  splits the query into price, date or property-type ranges to reach more listings, and removes duplicates
  globally. That extends the reach well beyond 10,000 but is not unlimited — for very large areas, narrow
  the location or add filters.
- **Some fields are sparse by nature.** Lot size, year built, HOA fee, stories and garage spaces are
  published on some listings and not others, particularly for rentals.
- **Images are Realtor.com's hosted copies**, requested at up to 1024 pixels wide. Where the source image
  is smaller than that it is served at its own size rather than enlarged, so a few images come back
  under 1024 px. Original camera-resolution files are not available.
- **Realtor.com can change its website at any time.** If its internal data format changes, the Actor
  reports a clear error rather than silently returning empty or wrong results.
- **Coming-soon, off-market and ready-to-build listings are not supported.** Realtor.com exposes these but
  their data is not consistent enough to publish: off-market mixes former rentals and former sales in one
  price column, and ready-to-build returns builder floor plans rather than real addressable properties.

***

### FAQ

**Do I need a Realtor.com account or API key?** No. The Actor uses publicly available listing data.

**Do I need a proxy?** No. Proxy support is available if you want it, but runs work without one.

**How fast is it?** A 100-listing run finishes in a few seconds. Around 12,000 listings takes roughly a
minute.

**Can I schedule it?** Yes — use Apify's scheduler to run the same search daily or weekly.

**How fresh is the data?** Each run fetches from Realtor.com as it goes, so results reflect what
Realtor.com is showing at that moment. It is not a live feed — re-run the Actor, or schedule it, to pick
up changes.

# Actor input Schema

## `searchLocations` (type: `array`):

One or more places to search on Realtor.com. Enter a city and state ("Austin, TX"), a ZIP code ("78704"), a county ("Travis County, TX") or a neighborhood. Each location is searched separately, and the Maximum listings budget is shared evenly between them — 300 listings across 3 cities gives about 100 from each, and anything a location does not use rolls over to the next. Duplicate listings that appear in overlapping locations are removed automatically.

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

Which kind of Realtor.com listings to collect: homes for sale, recently sold properties, or rentals.

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

The total number of listings this run will output, across every location and search URL combined — not a limit per location. Collection stops as soon as this number is reached, so a small value keeps the run fast and cheap. You are billed per listing returned.

## `searchUrls` (type: `array`):

Paste Realtor.com search links to run them exactly as they are, for example https://www.realtor.com/realestateandhomes-search/Austin\_TX/price-200000-500000/beds-3. Links from the for-sale, sold (/soldhomeprices/) and rentals (/apartments/) sections all work. Price, beds, baths, square feet and property-type filters in the link are applied. If a link contains a filter this Actor cannot reproduce exactly, the run reports it as an error instead of quietly running a broader search than you asked for.

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

A single place to search, if you prefer one field. Ignored when Locations is filled in.

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

Five-digit US ZIP code.

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

City name, for example "Austin". Pair it with the state code to avoid matching a same-named city in another state.

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

Two-letter US state code, for example "TX". Used together with City or County.

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

County name, for example "Travis". Pair it with the state code.

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

Neighborhood name, used together with City and State code.

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

The point to search around, written as "latitude, longitude" — for example "30.2672, -97.7431". You can copy this straight from Google Maps. Use it together with Radius in miles. Coordinates are required because Realtor.com does not offer a way to turn a place name into a map point.

## `radiusMiles` (type: `integer`):

How far from the center point to search, in miles. Realtor.com supports up to 50 miles.

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

Limit results to these property types. Leave empty to include every type. Types are applied as Realtor.com defines them, and which types exist varies by market.

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

Lowest price to include, in US dollars. For rentals this is the monthly rent.

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

Highest price to include, in US dollars. For rentals this is the monthly rent.

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

Fewest bedrooms to include.

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

Most bedrooms to include.

## `minBaths` (type: `integer`):

Fewest bathrooms to include.

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

Smallest interior size to include, in square feet.

## `pending` (type: `boolean`):

Limit results to listings Realtor.com marks as pending.

## `contingent` (type: `boolean`):

Limit results to listings Realtor.com marks as contingent.

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

Limit results to listings Realtor.com marks as foreclosures.

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

Limit results to listings Realtor.com marks as new construction.

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

Limit results to listings that have an open house scheduled on Realtor.com.

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

Which field Realtor.com sorts by. A sort is always applied because Realtor.com returns results in an unpredictable order otherwise. The default is chosen per listing status for the most complete results: listing date for homes for sale, sold date for sold properties, and last updated for rentals. Change it only if you need a particular order.

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

Sort order for the field above.

## `maxConcurrency` (type: `integer`):

How many requests to send at once. The default balances speed against being gentle on Realtor.com.

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

Optional. This Actor works without a proxy, so leave it switched off unless your runs start getting rate limited.

## Actor input object example

```json
{
  "searchLocations": [
    "Austin, TX"
  ],
  "status": "for_sale",
  "maxItems": 100,
  "pending": false,
  "contingent": false,
  "foreclosure": false,
  "newConstruction": false,
  "hasOpenHouse": false,
  "sortDirection": "desc",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every listing collected in this run, in the default table view.

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

Agent and brokerage details for the collected listings, where Realtor.com provides them.

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

The same listings as a CSV file for Excel or Google Sheets.

# 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 = {
    "searchLocations": [
        "Austin, TX"
    ],
    "status": "for_sale",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("zapticx/realtor-com-property-listings-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 = {
    "searchLocations": ["Austin, TX"],
    "status": "for_sale",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("zapticx/realtor-com-property-listings-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 '{
  "searchLocations": [
    "Austin, TX"
  ],
  "status": "for_sale",
  "maxItems": 100
}' |
apify call zapticx/realtor-com-property-listings-scraper --silent --output-dataset

```

## MCP server setup

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