# realestate.com.au Scraper — AU Sold Comps, Postcode & Monitor (`crawloop/realestate-com-au-scraper`) Actor

Scrape realestate.com.au sold comps, for-sale, and rental listings by postcode or suburb. Get sold price, sold date, beds, land m², GPS, photos, and agent phone. Monitor new sales. realestate.com.au API alternative for Python, Node.js, and MCP.

- **URL**: https://apify.com/crawloop/realestate-com-au-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (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.99 / 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?

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

## realestate.com.au Scraper — AU Sold Comps, Postcode & Monitor

> **Disclaimer:** This is an unofficial integration developed independently. It is not affiliated with, sponsored by, or endorsed by REA Group, realestate.com.au, or any of its subsidiaries.

> **realestate.com.au** and related names are trademarks of their respective owners. Data is read from publicly accessible Australian listing search. No realestate.com.au account login is required.

> This Actor is provided **for informational, research, CMA, lead-generation, and market monitoring purposes**. You are solely responsible for complying with applicable laws (including Australian privacy rules), realestate.com.au's terms of use, and your organization's policies when processing listing and agent data.

**realestate.com.au scraper** for AU **sold comps**, **for-sale**, and **for-rent** listings — export sold price, sold date, beds, baths, land m², $/m², postcode, GPS, photos, and listing-agent phone into JSON/CSV. Use it as a **realestate.com.au API alternative** from **Python**, **Node.js**, **cURL**, or **Apify MCP** / AI assistants: paste postcodes, a suburb, or any search / `/property-` URL.

**Best for:** postcode-farm sold comps, CMA worksheets, new-sale monitors, and AU coverage next to the EU/UK/US portal Actors — not another buy-inventory dump.

| Actor | Role |
| :--- | :--- |
| realestate.com.au Scraper ◄── you are here | AU sold comps, postcode, for-sale & rent |
| [Rightmove Scraper](https://apify.com/crawloop/rightmove-scraper) | UK Rightmove listings (sale & rent) |
| [Idealista Scraper](https://apify.com/crawloop/idealista-scraper) | Spain Idealista listings + agency leads |
| [ImmobilienScout24 Scraper](https://apify.com/crawloop/immobilienscout24-scraper) | Germany IS24 rent & buy |
| [Yad2 Scraper](https://apify.com/crawloop/yad2-scraper) | Israel Yad2 listings |
| [Airbnb Occupancy Scraper](https://apify.com/crawloop/airbnb-occupancy-monitor) | STR calendars vs long-term comps |

### When to use this Actor

- **Sold comps by postcode** — Drop `2026`, `3000`, or a farm list. Default status is **sold**, sorted by sold date, last 30 days.
- **CMA windows past six months** — Set **Sold within (days)** to 90, 180, or 365. Search is date-sorted; the Actor stops once listings fall outside the window.
- **Exact suburb, not neighbours** — Surrounding suburbs are **off** by default (REA otherwise blends in listings from across the water).
- **For-sale or rental pull** — Switch listing status, or paste a `/buy/` or `/rent/` search URL with type / beds / price already in the path.
- **Scheduled monitoring** — Re-run the same postcodes and emit only **new** or **status/price-changed** rows (new sold this week).
- **One listing** — Paste a `/sold/property-house-nsw-bondi-151817252` URL to fetch that property.

### When not to use this Actor

- **Nationwide agent directories, email enrichment, or Domain.com.au** — This version is listing comps on realestate.com.au only.
- **Authenticated REA feeds** — No login, saved searches, or contact-unlock walls.
- **A $0.90 buy-inventory dump** — Default is sold comps. Switch to for-sale only when you need live stock.

### Key features

- **HTTP first, Patchright fallback** — Cheap curl\_cffi when it works; patched Chromium when Kasada 429s. 2048 MB RAM.
- **Postcode-first builder** — `postcodes[]` is the primary input; suburbs and Start URLs are optional.
- **Sold recency you control** — 1–730 days via sold date, default 30, sort sold-date desc.
- **Search + listing URLs** — Path filters (`property-house`, `with-3-bedrooms`, `between-min-max`) are kept.
- **Price-band split** — Automatic when a query hits the ~2,000-result / 80-page REA window (Bondi sold is 40k+).
- **Monitor mode** — Key-value store remembers listing IDs plus status/price/sold date across runs.
- **Residential AU proxy** — Required on Apify Cloud; datacenter IPs get Kasada 429. The Actor warms a patched Chrome session through AU residential.

### Input

| Field | What it does |
| :--- | :--- |
| **Postcodes** | Primary builder. One search per 4-digit AU postcode with the filters below. |
| **Suburbs / locations** | `Bondi, NSW 2026` style fallback when you do not have postcodes. |
| **Start URLs** | Search (`/sold/`, `/buy/`, `/rent/`) or listing (`/property-`) links. |
| **Listing status** | `sold` (default), `for_sale`, or `for_rent`. Builder only. |
| **Sold within (days)** | Recency window for sold searches (1–730). Default 30. |
| **Property types / price / beds / baths / land** | Optional filters. Price is sold price, or list/weekly rent. |
| **Include surrounding suburbs** | Off by default. Surrounding rows are flagged `isSurrounding`. |
| **Max listings** | Cap per run across all postcodes and URLs. |
| **Scrape full details** | Off by default. Adds agent/agency phone and GPS. |
| **Monitor mode** | Save only new or changed listings on scheduled re-runs. |

```json
{
  "postcodes": ["2026"],
  "listingStatus": "sold",
  "soldWithinDays": 30,
  "maxItems": 50,
  "includeDetails": false,
  "monitorMode": false
}
```

### Output

One dataset row per property.

| Field | Meaning |
| :--- | :--- |
| `id` / `listingId` | realestate.com.au listing id |
| `url` | Canonical listing URL |
| `status` | `sold`, `for_sale`, or `for_rent` |
| `soldPrice` / `soldDate` | Numeric AUD close price and ISO date when sold |
| `listPrice` / `priceDisplay` | List or weekly rent, plus the portal display string |
| `pricePerSqm` | AUD per land or building m² |
| `beds` / `baths` / `parking` / `landSqm` / `buildingSqm` | Size |
| `address` / `suburb` / `state` / `postcode` / `latitude` / `longitude` | Location (GPS on detail fetch) |
| `agentName` / `agentPhone` / `agencyName` / `agencyPhone` | Agent as shown publicly (phones on detail fetch) |
| `photos` / `floorplans` / `description` | Media and copy |
| `isSurrounding` | True when REA blended a neighbouring suburb |
| `scrapedAt` | UTC timestamp |

```json
{
  "id": "151817252",
  "url": "https://www.realestate.com.au/sold/property-house-nsw-bondi-151817252",
  "status": "sold",
  "soldPrice": 2750000,
  "soldDate": "2026-08-25",
  "priceDisplay": "$2,750,000",
  "propertyType": "house",
  "beds": 3,
  "baths": 2,
  "parking": 1,
  "postcode": "2026",
  "suburb": "Bondi",
  "state": "NSW",
  "agentName": "James Dunn",
  "agencyName": "Sydney Sotheby's International Realty - Double Bay"
}
```

### Use cases

- **Postcode CMA** — Pull 30- or 90-day solds for a farm, then chart $/m² by beds.
- **New-sale alerts** — Schedule daily with monitor mode; only newly sold rows land in the dataset.
- **Investor screens** — For-sale list in the same postcode next to recent solds for spread vs comps.
- **AU vs UK pipeline** — Same field style as Rightmove / Idealista / ImmobilienScout24 for a multi-country warehouse.

### Integration examples

Replace `YOUR_TOKEN` with your Apify API token. Actor name: `crawloop/realestate-com-au-scraper`.

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('crawloop/realestate-com-au-scraper').call({
  postcodes: ['2026'],
  listingStatus: 'sold',
  soldWithinDays: 30,
  maxItems: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("crawloop/realestate-com-au-scraper").call(
    run_input={
        "postcodes": ["2026"],
        "listingStatus": "sold",
        "soldWithinDays": 30,
        "maxItems": 25,
    }
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items[:5])
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~realestate-com-au-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "postcodes": ["2026"],
    "listingStatus": "sold",
    "soldWithinDays": 30,
    "maxItems": 25
  }'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp).
Connect your Apify account, then call this Actor by its Store ID / name (`crawloop/realestate-com-au-scraper`).

Example prompts:

- "Run realestate.com.au Scraper for postcode 2026 sold last 30 days, max 20, and return address, soldPrice, soldDate, landSqm as JSON"
- "Scrape realestate.com.au 3000 for-sale houses and summarize median list price vs beds"
- "Pull Bondi NSW 2026 sold comps with realestate.com.au Scraper, then compare the field set with Rightmove Scraper for an AU vs UK pipeline"

### Suite next step

After AU sold comps, add UK sale/rent coverage with [Rightmove Scraper](https://apify.com/crawloop/rightmove-scraper), or Spain agency leads with [Idealista Scraper](https://apify.com/crawloop/idealista-scraper).

### FAQ

**Is this an official realestate.com.au API?**\
No. It is an unofficial **realestate.com.au scraper** / API alternative that reads the public listing search payload. It is not affiliated with REA Group. You can call it from **Python**, **Node.js**, **cURL**, or **MCP**.

**How do I scrape realestate.com.au sold listings by postcode with Python or Node.js?**\
Pass `postcodes` plus `listingStatus: "sold"` (the default). Use the snippets above. Add `soldWithinDays` for the CMA window and `monitorMode` on a schedule for new closed sales.

**How far back do sold comps go?**\
Public sold search is date-sorted and often spans years, but REA caps a single query at about 80 pages (~2,000 rows). This Actor splits by price band past that window. Coverage still depends on what the portal exposes for that postcode.

**Why is agent phone empty on some rows?**\
Sold search cards show agent name and agency, not the mobile. Turn on **Scrape full property details** for `agentPhone`, `agencyPhone`, and GPS.

**Do I need a proxy?**\
On Apify Cloud, **AU RESIDENTIAL** is required. HTML search pages return Kasada 429 from datacenter IPs.

### Related Actors

| Actor | Role |
| :--- | :--- |
| [Rightmove Scraper](https://apify.com/crawloop/rightmove-scraper) | UK sale and rent listings |
| [Idealista Scraper](https://apify.com/crawloop/idealista-scraper) | Spain sale/rent listings + agency phones |
| [ImmobilienScout24 Scraper](https://apify.com/crawloop/immobilienscout24-scraper) | Germany rent and buy |
| [Yad2 Scraper](https://apify.com/crawloop/yad2-scraper) | Israel classifieds |
| [Airbnb Occupancy Scraper](https://apify.com/crawloop/airbnb-occupancy-monitor) | STR occupancy calendars |

# Actor input Schema

## `postcodes` (type: `array`):

Australian 4-digit postcodes (primary builder). Each postcode is a separate sold/buy/rent search with the filters below. Example: 2026, 3000, 4000.

## `locations` (type: `array`):

Fallback when you do not have postcodes. Examples: Bondi, NSW 2026 or Melbourne VIC 3000.

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

Paste realestate.com.au search URLs (/sold/, /buy/, /rent/) or /property- listing links. Path filters (type, beds, price) are applied automatically.

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

Builder only (ignored when the Start URL already encodes sold/buy/rent). Default is sold comps.

## `soldWithinDays` (type: `integer`):

Keep sold listings whose sold date is in the last N days (1–730). Applies to sold searches. Default 30. Public sold search is date-sorted — unlike dump scrapers that default to buy inventory.

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

Optional. Leave empty for all types.

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

Minimum sold price (sold) or list/rent price. Rent is weekly AUD.

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

Maximum sold price (sold) or list/rent price. Rent is weekly AUD.

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

Minimum bedroom count. Studios are 0.

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

Maximum bedroom count.

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

Minimum bathroom count. REA search honours a floor only.

## `minParking` (type: `integer`):

Minimum car spaces. REA search honours a floor only.

## `minLandSqm` (type: `integer`):

Minimum land size in square metres.

## `includeSurroundingSuburbs` (type: `boolean`):

REA blends neighbouring suburbs into search pages. Off by default so postcode/suburb comps stay geographic. Surrounding rows are flagged isSurrounding when this is on.

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

Maximum number of listings to save per run (across all postcodes/URLs).

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

Fetch each listing page for agent/agency phone and GPS. Off by default — sold search cards already include sold price, sold date, beds, land m², photos, and description.

## `monitorMode` (type: `boolean`):

On scheduled re-runs, save only listings that are new or whose status/price/sold date changed since the last run on this Actor. Use for 'new sold this week' comps.

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

How many listing-detail requests to run in parallel when details are on. Default 8.

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

Apify Proxy. AU RESIDENTIAL is required — datacenter IPs hit Kasada 429 on realestate.com.au.

## Actor input object example

```json
{
  "postcodes": [
    "2026"
  ],
  "listingStatus": "sold",
  "soldWithinDays": 30,
  "includeSurroundingSuburbs": false,
  "maxItems": 10,
  "includeDetails": false,
  "monitorMode": false,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}
```

# Actor output Schema

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

Default dataset items — one realestate.com.au listing per row.

# 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 = {
    "postcodes": [
        "2026"
    ],
    "soldWithinDays": 30,
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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 = {
    "postcodes": ["2026"],
    "soldWithinDays": 30,
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/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 '{
  "postcodes": [
    "2026"
  ],
  "soldWithinDays": 30,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}' |
apify call crawloop/realestate-com-au-scraper --silent --output-dataset

```

## MCP server setup

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