# Realestate.com.au Scraper: Price Drops & Agent Leads (`kotaro001/realestate-com-au-scraper`) Actor

Extract Australian residential properties from realestate.com.au using native filters (state, suburb, postcode, price, beds, baths, land size, keywords) without pasting URLs. Track price history, days on market, new/removed listings & agent phone numbers.

- **URL**: https://apify.com/kotaro001/realestate-com-au-scraper.md
- **Developed by:** [Tuyen Tran](https://apify.com/kotaro001) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 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

### Live Sample Dataset & Verified Run Benchmark

Two runs on **2026-11-03** on Apify Cloud, build `0.1.76`. Both datasets are public: open the JSON or CSV link in a browser, no login and no run needed.

**List run** — `2B8OFQ3mAdLPdk8u7` · **30 rows** · 53 columns · 43.5 s · charged `apify-actor-start` 1, `listing-scraped` 30.
[JSON](https://actors.zapstackguides.com/samples/realestate-list.json) · [CSV](https://actors.zapstackguides.com/samples/realestate-list.csv)

**Detail run** — `QnEN7GhJaDjOFQLlt` · **3 rows** · 53 columns · 76.8 s · charged `listing-scraped` 3, `detail-scraped` 3.
[JSON](https://actors.zapstackguides.com/samples/realestate-detail.json) · [CSV](https://actors.zapstackguides.com/samples/realestate-detail.csv)

Fill rate on the 30-row list sample: `priceNumeric` 24/30, `bedrooms` 30/30, `landSizeSqm` 0/30. Empty cells are honest: the portal prints “Contact Agent”, “Auction” or “Price withheld”, so `priceNumeric` stays null instead of guessing. The detail run is the place to see agent phone, description and history.

| # | Address | Price | Beds | Baths | Type | Source |
|---|---|---|---|---|---|---|
| 1 | 92 Atherton Street, Downer | $1,090,000 | 4 | 2 | house | [Open](https://www.realestate.com.au/property-house-act-downer-152237676) |
| 2 | Address available on request, Downer | Expressions of Interest | 10 | 4 | house | [Open](https://www.realestate.com.au/property-house-act-downer-150510472) |
| 3 | 42 Gardiner Street, Downer | $995,000+ | 4 | 2 | house | [Open](https://www.realestate.com.au/property-house-act-downer-152365976) |

Open the sample, compare the three rows with the source pages, check the $2.005 and $8.005 lines below, and note the 50-row free limit. That is the whole test, under five minutes.

### What does the realestate.com.au Scraper do?

Scrape **realestate.com.au listings** by suburb, state, postcode, property type and exact bedroom count, without pasting URLs. Every row can include **price history**, **days on market**, **agent phone numbers**, agency details and the full listing description. It is an API-friendly alternative to opening the site page by page, and a run on the Free plan can return up to **50 results** for evaluation.

The actor does not log in, bypass a paywall, or read private data. It reads public listing pages and returns a flat dataset with one row per property.

### Why scrape realestate.com.au with this Actor?

A card scraper gives you today’s price. This actor gives you the market move, the contact and the timeline in the same row.

| # | Feature | What it means for you | Measured on Cloud |
|---|---|---|---|
| 1 | Filters in the form | Filter by `state`, `suburb`, `postcode`, `propertyTypes`, `bedrooms`, `minPrice` and `maxPrice`; `startUrls` is still available for an exact search URL. | Filters are applied in the actor when the site ignores price in the URL. |
| 2 | Change-only mode | Set `onlyEmitChanges: true` to return new listings, price drops, price increases and listings removed from the search. | A repeat run with no market movement returned 0 rows. |
| 3 | Price history and days on market | `priceHistory` and `daysOnMarket` are seeded from the central property warehouse, so a new `stateKey` does not start from zero. | Bondi Beach cache run: 0 detail downloads, 3 cached details. |
| 4 | Smart detail cache | `includeDetails: true` opens a listing once, then reuses the result inside its detail cache window. Detail rows are charged whether they are live or cached. | 155 s on the first run; 26.7 s from cache. Actor charges for this 3-detail run are $0.029. |
| 5 | Flat columns | CSV and Google Sheets ready: the 25 core fields are flat, and the other four Australian actors use the same core names. | 53 columns: 25 core fields plus portal and detail fields. |
| 6 | Works with your stack | Export from the Apify dataset, call the API, or connect Google Sheets, n8n, Make, Zapier, a webhook or Apify MCP for AI agents. | Dataset, API and MCP compatible. |

#### What the change feed contains

`changeStatus` uses `NEW`, `PRICE_DROP`, `PRICE_INCREASE`, `REMOVED` and `UNCHANGED`. The full `priceHistory` array keeps the dated `from` and `to` values, even when the current price is hidden. This is the field to use for a daily price-drop alert or a “new in my suburb” email.

### What data can you extract from realestate.com.au?

| Field group | Fields | Available in list mode | Needs `includeDetails: true` |
|---|---|---|---|
| Identity | `listingId`, `sourcePortal`, `listingUrl` | Yes | No |
| Address | `fullAddress`, `street`, `suburb`, `state`, `postcode`, `latitude`, `longitude` | Yes | Coordinates can be filled from the detail page |
| Price | `priceDisplay`, `priceNumeric`, `priceHistory` | Yes | No |
| Property | `propertyType`, `bedrooms`, `bathrooms`, `carSpaces`, `landSizeSqm` | Yes | No |
| Lifecycle | `changeStatus`, `daysOnMarket`, `first_seen_at` | Yes | No |
| Agent | `agent1_name`, `agent1_phone` | Name when published | **Yes** for phone |
| Agency | `agency_name` | Sometimes | **Yes** for the full agency block |
| Content | `description`, `features`, `highlights`, `inspections_text` | No | **Yes** |
| Rent-specific | `bond_amount`, `available_text` | No | **Yes** |

A missing value is `null`, never a guessed zero. Phone numbers are published for most, not all, listings; `maxDetails` controls how many pages the actor may open.

### How to scrape realestate.com.au listings and price history

1. Open the **Input** tab and choose a `channel`: `buy`, `rent` or `sold`.
2. Enter `state`, `suburb` and `postcode`, then optionally add `propertyTypes`, `bedrooms`, `minPrice` and `maxPrice`.
3. Set `maxPages` and `maxItems`. Turn on `includeDetails: true` only when you need agent phone numbers, descriptions and rental terms, and set `maxDetails` to control the spend.
4. Press **Run**. For a daily feed, save the run as a task, add a schedule at 07:00 Australia/Sydney, and set `onlyEmitChanges: true`.

The first run creates the baseline. The second run compares against it and returns only the changed rows. The central warehouse also makes the first run of a new `stateKey` useful: it can inherit the earliest `first_seen_at`, the accumulated `priceHistory` and a valid cached detail.

### How much does it cost to scrape realestate.com.au?

Pricing is **pay-per-event**. All Apify platform compute and residential/unblocker proxy usage is 100% included in the per-event price. You never pay a separate compute-unit or proxy surcharge.

- **List Mode (`includeDetails: false`): $2.005 per 1,000 listings** on the Apify Standard tier ($0.005 actor start + 1,000 × $0.002 per listing), or **~$1.60 per 1,000** on Apify Scale/Business discounted tiers.
- **Full Detail Mode (`includeDetails: true`): $8.005 per 1,000 listings with full details** on the Apify Standard tier ($0.005 actor start + 1,000 × $0.002 listing + 1,000 × $0.006 detail add-on), or **~$6.40 per 1,000** on discounted tiers. A 3-row detail test run costs exactly **$0.029**.
- **Free plan limit:** Free Apify accounts can extract **up to 50 rows per run**, enough to inspect the full schema, verify field fill rates and test a suburb before upgrading. Paid Apify plans unlock unlimited rows per run.
- Detail rows are billed whether they are live or served from the cache, because the customer receives the data in both cases.

**Pre-calculated 1,000-listing total** (one actor start plus the rows):

1. List only, `includeDetails: false`: **$2.005** on Standard (Free/Bronze), **$1.604** on Silver+.
2. Full details, `includeDetails: true`: **$8.005** on Standard (Free/Bronze), **$6.404** on Silver+.

### Input parameters and configuration examples

| Parameter | What it does | Example |
|---|---|---|
| `channel` | `buy`, `rent` or `sold` | `"buy"` |
| `state`, `suburb`, `postcode` | Location filter | `"NSW"`, `"Bondi Beach"`, `"2026"` |
| `propertyTypes` | House, unit, townhouse, villa, land or acreage | `["house"]` |
| `bedrooms` | Exact bedroom count | `3` |
| `maxPages` | Result pages to read | `3` |
| `includeDetails` | Open listing pages for agent phones and descriptions | `true` |
| `maxDetails` | Maximum detail pages per run | `25` |
| `maxItems` | Maximum rows returned | `50` |
| `onlyEmitChanges` | Return only new, changed or removed rows | `true` |
| `stateKey` | Named lifecycle state for repeat runs | `"bondi-buy"` |
| `startUrls` | Advanced: an exact search/list URL | `["https://www.realestate.com.au/..."]` |
| `minPrice`, `maxPrice` | Price filter applied after the page loads | `800000`, `1500000` |

**Suburb and postcode run**

```json
{
  "channel": "buy",
  "state": "NSW",
  "suburb": "Bondi Beach",
  "postcode": "2026",
  "propertyTypes": ["house"],
  "bedrooms": 3,
  "maxPages": 3,
  "includeDetails": true,
  "maxDetails": 25,
  "maxItems": 50
}
```

**Daily price-drop and removal run**

```json
{
  "channel": "rent",
  "state": "NSW",
  "suburb": "Newtown",
  "postcode": "2042",
  "onlyEmitChanges": true,
  "includeRemovedListings": true,
  "stateKey": "newtown-rent",
  "maxItems": 50
}
```

### Output example

A real row from a Cloud run, shortened for readability:

```json
{
  "listingId": "428550142",
  "sourcePortal": "realestate.com.au",
  "channel": "rent",
  "propertyType": "House",
  "fullAddress": "360 Edgeware Road, Newtown, NSW 2042",
  "suburb": "Newtown",
  "state": "NSW",
  "postcode": "2042",
  "priceDisplay": "$1,250 per week",
  "priceNumeric": 1250,
  "changeStatus": "UNCHANGED",
  "daysOnMarket": 0,
  "bedrooms": 3,
  "bathrooms": 3,
  "carSpaces": null,
  "landSizeSqm": null,
  "agent1_name": "Katya Kehler",
  "agent1_phone": "0450736825",
  "agency_name": "Raine & Horne - Newtown",
  "listingUrl": "https://www.realestate.com.au/property-house-nsw-newtown-428550142",
  "priceHistory": [
    {"date": "2026-11-01", "event": "listed", "from": null, "to": "$1,250 per week"}
  ]
}
```

Download the full dataset as JSON, HTML, CSV or Excel from the run’s **Dataset** tab, or read it through the Apify API.

### 🇦🇺 Australian Real Estate Data Suite (6 Portals)

| Actor | Best for | Link |
|---|---|---|
| 🏠 Realestate.com.au Scraper: Price Drops & Agent Leads | Residential buy, rent and sold listings, daily price-drop alerts, agent phone numbers | https://apify.com/kotaro001/realestate-com-au-scraper |
| 📈 Property.com.au Scraper: Sold History & Estimates | Suburb sold prices, weekly rent estimates, multi-year sales history, `years_held` and school zones | https://apify.com/kotaro001/property-com-au-scraper |
| 🏢 Realcommercial.com.au Scraper: Prices, Yield & Agents | Offices, warehouses, retail and farming; for-sale, for-lease, sold, leased and tenanted invest cashflow | https://apify.com/kotaro001/realcommercial-com-au-scraper |
| 🏡 OnTheHouse.com.au Scraper: Sold History & Valuations | Cotality AVM estimates, hidden contact-agent prices, multi-decade sale history, suburb medians and agent phones | https://apify.com/kotaro001/onthehouse-com-au-scraper |
| 🏛️ Allhomes.com.au Scraper: EER, Land Value & Rates | Canberra and ACT listings with EER, unimproved land value, UV year, annual rates and auction dates | https://apify.com/kotaro001/allhomes-com-au-scraper |
| 🌐 Domain.com.au Scraper: Prices, Schools & Suburb Trends | Sale, rent and sold listings with sale method, inspection times, school catchments, suburb medians, owner-occupier mix and agent phones | https://apify.com/kotaro001/domain-com-au-scraper |

**Tip:** run the same suburb and postcode across the six actors, export to Sheets, and join on `fullAddress` to combine prices with sold history and rent estimates.

### Frequently Asked Questions (FAQ) & Legal Disclaimer

#### Do I need to configure proxies to scrape realestate.com.au?

No. The actor brings its own Apify proxy and handles request limits. You choose the search and row limit.

#### How do I track daily price drops and removed listings?

Run once, save as a task, schedule it daily and set `onlyEmitChanges: true`. Later runs return new, repriced and removed rows; `priceHistory` keeps dated values.

#### How do I get agent phone numbers or full property details?

Set `includeDetails: true` with `maxDetails` above zero. The detail page supplies `agent1_phone`, `agency_name`, `description` and features. Cached details are still billed as detail events.

#### Can I connect this Actor to Google Sheets, n8n, or AI Agents (MCP)?

Yes. Use the dataset export for Sheets, the API for n8n, Make, Zapier or a webhook, and Apify MCP for an AI agent. The core columns need no JSON parser; history and inspections stay as lists.

#### Is it legal to scrape public property listings from realestate.com.au?

Independent tool, not affiliated with REA Group. It reads public listing pages. Your use of the data must comply with the site’s terms and Australian law.

**Custom work:** need a private suburb feed, a CRM integration or a one-off backfill? Contact **actors@zapstackguides.com** with the suburbs, fields and refresh schedule you need.

# Changelog

This Actor's version history is a separate document: https://apify.com/kotaro001/realestate-com-au-scraper/changelog.md

# Actor input Schema

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

Suburb name, for example Bondi Beach.

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

Australian state of the suburb.

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

Four-digit postcode, for example 2026.

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

Property type filter. Leave empty for every type.

## `bedrooms` (type: `integer`):

Exact bedroom count filter. Empty means any.

## `maxPages` (type: `integer`):

25 listings per page. One page is the cheap default.

## `maxDetails` (type: `integer`):

Hard cap per run, so one wide search cannot run up the bill.

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

Legacy switch for changes mode. Use onlyEmitChanges.

## `sources` (type: `array`):

Legacy raw-source input. Use channel, suburb, state and postcode.

## `max_sources` (type: `integer`):

Legacy cap used with sources. Ignored for normal suburb runs.

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

Cap on pushed rows. The default keeps the daily store check quick and cheap.

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

Native site channel: buy, rent or sold.

## `includeDetails` (type: `boolean`):

Open each listing page for agent phone, description, features and inspections. Billed per detail row, including rows served from the cache.

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

Legacy alias for channel. Kept for old tasks; channel wins when both are set.

## `startUrls` (type: `array`):

Optional list-page URLs. Use a search/list URL, never a single listing address.

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

Applied after the page is fetched; both portals ignore price in the URL.

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

Applied after the page is fetched.

## `includeRemovedListings` (type: `boolean`):

Emit a REMOVED row when a listing disappears from the search.

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

Named state slot: STATE\_<stateKey> in the key-value store.

## `onlyEmitChanges` (type: `boolean`):

Changes mode only emits new, changed or removed rows. Daily mode bills every row it emits.

## `minBedrooms` (type: `integer`):

Applied after the list page is fetched.

## `maxBedrooms` (type: `integer`):

Applied after the list page is fetched.

## `minBathrooms` (type: `integer`):

Applied after the list page is fetched.

## `minCarSpaces` (type: `integer`):

Applied after the list page is fetched.

## `minLandSize` (type: `integer`):

Applied after the list page is fetched.

## `maxLandSize` (type: `integer`):

Applied after the list page is fetched.

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

Case-insensitive words that must appear in the title or description.

## `minDaysOnMarket` (type: `integer`):

Keep only listings that have been advertised for at least this many days. 0 = no filter. Rows without a known days-on-market value are dropped when this is above 0.

## `suburbs` (type: `array`):

Optional. One or more areas such as 'Downer, ACT, 2602'. Each entry becomes its own search, and all rows land in one dataset. You can also separate entries with a semicolon in the suburb field.

## Actor input object example

```json
{
  "suburb": "Bondi Beach",
  "state": "nsw",
  "postcode": "2026",
  "propertyTypes": [
    "house"
  ],
  "bedrooms": 3,
  "maxPages": 1,
  "maxDetails": 10,
  "runMode": "daily_active",
  "max_sources": 0,
  "maxItems": 25,
  "channel": "buy",
  "includeDetails": false,
  "startUrls": [],
  "includeRemovedListings": false,
  "stateKey": "default",
  "onlyEmitChanges": false,
  "minDaysOnMarket": 0,
  "suburbs": []
}
```

# Actor output Schema

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

Dataset rows: address, price, weekly rent, bond, availability, beds, agent phone numbers, agency IDs, price history and days on market.

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

Present only when a free-plan run hit the 50-listing trial limit.

# 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 = {
    "suburb": "Bondi Beach",
    "state": "nsw",
    "postcode": "2026",
    "propertyTypes": [
        "house"
    ],
    "bedrooms": 3,
    "maxPages": 1,
    "maxDetails": 10,
    "maxItems": 25,
    "channel": "buy",
    "includeDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("kotaro001/realestate-com-au-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 = {
    "suburb": "Bondi Beach",
    "state": "nsw",
    "postcode": "2026",
    "propertyTypes": ["house"],
    "bedrooms": 3,
    "maxPages": 1,
    "maxDetails": 10,
    "maxItems": 25,
    "channel": "buy",
    "includeDetails": False,
}

# Run the Actor and wait for it to finish
run = client.actor("kotaro001/realestate-com-au-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 '{
  "suburb": "Bondi Beach",
  "state": "nsw",
  "postcode": "2026",
  "propertyTypes": [
    "house"
  ],
  "bedrooms": 3,
  "maxPages": 1,
  "maxDetails": 10,
  "maxItems": 25,
  "channel": "buy",
  "includeDetails": false
}' |
apify call kotaro001/realestate-com-au-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kotaro001/realestate-com-au-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/PluvlTi2hrtwMfQf0/builds/W2zDmYA67bFMGYtCZ/openapi.json
