# Realestate.com.au Scraper - Australia Property (`scrapesage/realestate-com-au-scraper`) Actor

Scrape Australia property listings from realestate.com.au search URLs: price, bedrooms, bathrooms, parking, land size, full address, agency and agents, inspections, auctions and images. Buy, rent and sold channels. Bypasses anti-bot protection. Paste search URLs or import a file.

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

## Pricing

from $1.65 / 1,000 listing scrapeds

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 - Australia Property Listings

> **Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by REA Group Ltd or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "realestate.com.au" is referenced only to describe the publicly available website this Actor collects data from.

> This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by realestate.com.au or
> REA Group. All trademarks mentioned are the property of their respective owners.

Scrape property listings from **realestate.com.au**, Australia's #1 property portal, straight into **JSON, CSV or
Excel**. Paste any realestate.com.au search URL - **buy**, **rent** or **sold**, any suburb, region or filter set

- and get clean rows with **price**, **bedrooms**, **bathrooms**, **parking**, **land size**, **full address**,
  **agency and agents**, **inspection and auction times**, and **photos**.

realestate.com.au sits behind enterprise anti-bot protection that blocks ordinary HTTP scrapers and ordinary
headless browsers. This actor **handles that for you**: no proxy setup, no browser fingerprinting, no captcha
service, and **no API key on your side**. You paste a search URL and get rows.

### What you get per listing

| Field | Type | Meaning |
|---|---|---|
| `id` / `url` | string | Listing id and canonical `realestate.com.au/property-...` link |
| `channel` | string | `buy`, `rent` or `sold` - matches the search you pasted |
| `title` / `fullAddress` | string | Full street address, e.g. *"3403/38 York Street, Sydney, NSW 2000"* |
| `priceText` | string | The price exactly as the agent published it: *"$1,100,000 - $1,125,000"*, *"$750 per week"*, *"Auction"*, *"Contact Agent"* |
| `price`, `priceFrom`, `priceTo` | number | Parsed numerics whenever the agent publishes numbers (ranges split for you) |
| `pricePeriod` | string | `week` / `month` on rentals, `null` on sales |
| `propertyType` | string | Apartment, House, Townhouse, Unit... as typed by the source |
| `bedrooms`, `bathrooms`, `parkingSpaces`, `studies` | number | Real numeric feature counts (a true `0` stays `0`) |
| `landSize` / `buildingSize` (+ units) | number | Land and building sizes where the listing publishes them |
| `suburb`, `state`, `postcode`, `shortAddress` | string | Address components for clean grouping and joins |
| `description` | string | The listing description, HTML stripped |
| `agencyName`, `agencyId`, `agencyUrl`, `agencyLogo` | string | The listing agency, with its canonical agency page |
| `agencyAvgRating`, `agencyTotalReviews` | number | The agency's own review score and volume on the portal |
| `agents` / `agentName` | array / string | Every listed agent with job title, plus the lead agent |
| `listingTier` | string | REA's paid placement tier (`premiere`, `feature`...) - premium listings identified |
| `badge` | string | Card badge when shown |
| `auctionDate` | string | Auction time on auction listings |
| `nextInspection` / `inspectionCount` | string / number | Next scheduled inspection and how many are booked |
| `dateSold` | string | Sold date on `sold`-channel rows |
| `images` / `image` / `imageCount` | - | Up to 10 photo URLs (800x600) |
| `hasFloorplan`, `hasVideo`, `has3DTour` | boolean | Media flags |
| `matchType` | string | `exact` for in-area results; `surrounding` rows (nearby-area suggestions) are labelled so you can filter them |
| `type`, `sourceUrl`, `scrapedAt` | - | Record type (`listing`), originating search URL, fetch timestamp |

**Field coverage, measured on a real unlocked Sydney buy page (25 listings):** `url`, `channel`, `priceText`,
`propertyType`, `bedrooms`, `bathrooms`, `parkingSpaces`, `suburb`, `state`, `postcode`, `description`,
`agencyName`, `agencyUrl`, `agencyAvgRating`, `agencyTotalReviews`, `agents`, `listingTier`, `images` were
present on **25 of 25**; `fullAddress` on **24 of 25** (one address-suppressed listing). Numeric `price` parsed
on **48%** - the rest are *"Contact Agent"* / auction listings where the agent publishes no number (`priceText`
still tells you exactly what the card says). `landSize` fills mainly on houses (CBD apartments carry none), and
`auctionDate` / `nextInspection` / `dateSold` fill only on listings that actually have an auction, a booked
inspection, or a sale - that is the source's behaviour, not an extraction gap.

### Example output

One real row, exactly as written to the dataset (truncated to the highlights):

```json
{
  "type": "listing",
  "id": "150113016",
  "url": "https://www.realestate.com.au/property-apartment-nsw-sydney-150113016",
  "channel": "buy",
  "matchType": "exact",
  "title": "3403/38 York Street, Sydney, NSW 2000",
  "priceText": "$1,100,000 - $1,125,000",
  "price": 1100000,
  "priceFrom": 1100000,
  "priceTo": 1125000,
  "propertyType": "Apartment",
  "bedrooms": 1,
  "bathrooms": 1,
  "parkingSpaces": 0,
  "suburb": "Sydney",
  "state": "NSW",
  "postcode": "2000",
  "agencyName": "Sydney Cove Property - The Rocks",
  "agencyUrl": "https://www.realestate.com.au/agency/sydney-cove-property-the-rocks-PUHSYD",
  "agencyAvgRating": 5,
  "agencyTotalReviews": 185,
  "agentName": "Monique Lavers",
  "agents": [{ "name": "Monique Lavers", "jobTitle": "Executive Sales" }, { "name": "Bryn Fowler", "jobTitle": "Executive Sales" }],
  "listingTier": "premiere",
  "image": "https://i2.au.reastatic.net/800x600/d1d664db.../image.jpg",
  "imageCount": 10,
  "hasFloorplan": true,
  "sourceUrl": "https://www.realestate.com.au/buy/in-sydney,+nsw/list-1",
  "scrapedAt": "2026-08-26T18:04:21.007Z"
}
```

### Input

```json
{
  "startUrls": ["https://www.realestate.com.au/buy/in-sydney,+nsw/list-1"],
  "maxPagesPerUrl": 5,
  "maxItems": 1000
}
```

- **realestate.com.au search URLs** - build the search you want on realestate.com.au (suburb, price, beds,
  property type, any filter), then paste the URL from the address bar. One per line, as many as you want. Every
  filter is carried through, because the actor scrapes exactly the URL you gave it.
- **Import URLs from a file** - paste a whole list, or give a single link to a public `.txt`/`.csv`, a Google
  Sheet or Drive link, or an Apify key-value-store record. Blank lines and `#` comments are ignored. A file that
  cannot be read tells you so and charges nothing.
- **Max pages per URL** - 25 listings per page (default 10 pages; the site itself serves at most ~24 pages per
  search - see Honest limits).
- **Max listings** - overall cap across all URLs.
- **Output fields** - tick only the columns you want and every record is trimmed to exactly those, which keeps
  CSV and Google Sheets exports lean.

Leave everything empty and the run scrapes a small one-page sample search, so you can see the output shape before
committing to a real job.

### Which realestate.com.au URLs work

| Search type | URL pattern | Status |
|---|---|---|
| For sale | `realestate.com.au/buy/in-<suburb>,+<state>/list-1` | Validated |
| For rent | `realestate.com.au/rent/in-<suburb>,+<state>/list-1` | Same embedded data model |
| Sold prices | `realestate.com.au/sold/in-<suburb>,+<state>/list-1` | Same embedded data model |
| Any filtered search | `.../buy/property-house-in-...` and query filters | Carried through verbatim |

Pagination is automatic (`/list-2`, `/list-3`, ...) up to your page limit, and the actor stops early on its own
when the search's own result count - or the site's own page cap - is reached, so you never pay for a page of
repeats. Rows are de-duplicated by listing URL across every start URL in the run.

### Reliability

realestate.com.au is protected by enterprise anti-bot - plain scrapers and plain headless browsers get blocked.
This actor routes every request through a premium unblocking layer that clears the challenge and returns the real
page, then parses the site's own embedded GraphQL result cache (typed JSON, not brittle CSS selectors).

On top of that:

- **Short-render detection.** The unlocking layer occasionally returns a page whose listing data did not finish
  rendering. The actor reads each page's own result count and pagination block, refetches any page that falls
  short of what the search says it should hold (keeping the best of up to 3 fetches), and never mistakes a bad
  render for the end of the search. A page that stays short even after refetching is disclosed in the run's
  status message instead of being passed off as complete.
- **Burst pacing.** Requests are deliberately paced and backed off, because the unblocking layer rate-limits
  bursts on this domain - the actor treats that as a retryable condition, never as page content.
- **Wall-clock budget.** Long runs stop cleanly before the platform timeout, save everything collected up to that
  point, and say so in the run status instead of dying as TIMED-OUT.
- **Every ending explains itself.** A run that finds nothing tells you why - bad search URL, unreadable import
  file, or a fetch that failed - and bills **$0**.

### What people use it for

- **Comparables and appraisals** - pull a suburb's full for-sale stock with beds/baths/parking already numeric.
- **Sold-price research** - the `sold` channel gives dated sale records for price benchmarking.
- **Rental yield analysis** - scrape the same suburb on `buy` and `rent` and divide.
- **Market monitoring** - schedule a daily run per suburb and track new supply, price movements and days on market.
- **Agency and agent intelligence** - every row carries the agency, its portal rating and review volume, and the
  named agents with job titles: who lists what, where, at what volume.
- **Auction and inspection planning** - `auctionDate` and `nextInspection` straight from the source.
- **Feeding AI agents and data pipelines** - see the MCP section below.

### Honest limits

- **realestate.com.au itself serves at most ~24 pages (~600 listings) per search.** The site enforces this cap on
  everyone, browsers included. For full coverage of a big market, split the search by suburb or price band - the
  run's status message reminds you when a search hits the cap.
- **Numeric `price` exists only when the agent publishes a number.** Many AU sale listings say *"Auction"* or
  *"Contact Agent"* by design - `priceText` always carries exactly what the card says, and rentals almost always
  parse. Measured: 48% numeric on a Sydney CBD buy page.
- **Agent phone numbers are not on the results cards.** realestate.com.au keeps them behind its enquiry flow, so
  this actor does not claim them. You still get the agency, its rating, and every agent's name and job title.
- **`landSize`, `auctionDate`, `nextInspection`, `dateSold` and `badge` are conditional fields** - they fill when
  the listing actually has them (houses, auctions, booked inspections, sold records).
- **A page can rarely still come back short.** The actor detects short renders against the search's own count and
  refetches automatically; if a page stays short after all refetches, the run's status message says so - and you
  are only billed for rows actually delivered.
- **Runs are a little slower than an unprotected site**, because every page goes through the unblocking layer
  with deliberate pacing.

### Pricing

**Pay per listing** - you are charged only for listings actually written to the dataset. A run that finds
nothing, or that cannot read your import file, costs **$0**. The rate covers the premium anti-bot unblocking that
makes realestate.com.au scrapable at all, and it drops automatically on higher Apify plans (tiered pay-per-event
pricing).

### Output views

- **Listings** - a table of address, price, beds, baths, property type, suburb and the listing URL, ready to
  eyeball or export to CSV, Excel, JSON or Google Sheets. The full record with every field is always in the
  dataset behind it.

### Use with AI assistants (MCP)

Available through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp), so an assistant or
agent can pull live Australian property listings past realestate.com.au's anti-bot in a single call - compare
suburbs, watch a market for new supply, or check sold prices without anyone touching a browser.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### Automate & schedule

Run this Actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** - start runs, fetch datasets and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** - official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** - run it hourly, daily or weekly and keep your dataset current.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** - trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/realestate-com-au-scraper').call({
    "startUrls": [
        "https://www.realestate.com.au/buy/in-sydney,+nsw/list-1"
    ],
    "maxPagesPerUrl": 1
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} records`);
```

### Integrate with any app

Connect the dataset to thousands of apps - no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** - multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** - push new records straight into your CRM or spreadsheet.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** - get notified when a scheduled run finds something new.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** - auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** - pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** - trigger runs from commits or releases.

### More scrapers from scrapesage

Related Actors in the same category:

- **[Real Estate Scraper for Redfin](https://apify.com/scrapesage/redfin-scraper)** - Listings, Sold Comps & Leads
- **[BizBuySell Scraper](https://apify.com/scrapesage/bizbuysell-scraper)** - Businesses For Sale & Broker Leads
- **[VivaReal & ZAP Imóveis Scraper](https://apify.com/scrapesage/vivareal-zap-imoveis-scraper)** - Brazil Real Estate
- **[PropertyGuru Scraper](https://apify.com/scrapesage/propertyguru-scraper)** - Singapore Property & Agent Leads
- **[Airbnb Scraper & Market Monitor](https://apify.com/scrapesage/airbnb-scraper)**

### FAQ

**Do I need a realestate.com.au account, API key or proxies?**
No. Everything needed to reach realestate.com.au is built in.

**Can I scrape rentals and sold prices as well as sales?**
Yes. `rent` and `sold` search URLs work exactly like `buy` ones - `channel` on each row tells you which it came
from, and sold rows carry `dateSold`.

**How many listings will I get per search URL?**
Up to 25 per page, and the site serves at most ~24 pages per search (~600 listings). For more, add more searches

- one per suburb or price band - in the same run. You only ever pay for the rows you actually receive, and
  duplicates across overlapping searches are dropped before billing.

**Can I run it on a schedule?**
Yes - schedule the actor or any saved task in Apify and the results land in a dataset each time, ready for the
API, a webhook, or an export to Sheets, S3 or your warehouse.

**Does it open every listing's detail page?**
No. It reads the search results' own embedded data model, which already carries everything in the field table
above - that is what keeps it fast and cheap across thousands of listings.

### Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by realestate.com.au or
REA Group. All trademarks mentioned are the property of their respective owners. It collects only publicly
available listing information and is intended for lawful research, market analysis and comparable-pricing use.
You are responsible for how you use the data, including compliance with applicable law.

### Need help?

Open an issue on the Actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome - this Actor is actively maintained.

# Actor input Schema

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

realestate.com.au search URLs, one per line. Build a search on realestate.com.au with your filters (suburb, price, beds...), then paste the URL from the address bar. Buy, rent and sold channels all work. <b>Leave empty and the run returns a small free sample.</b>

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

Bulk-load realestate.com.au URLs. Either <b>paste the whole list</b> (one per line), or give <b>a single link</b> to a public <code>.txt</code>/<code>.csv</code>, a Google Sheet/Drive link, or an Apify key-value-store record. A file that cannot be read says so and charges nothing.

## `maxPagesPerUrl` (type: `integer`):

How many result pages to follow for each start URL (25 listings per page; realestate.com.au itself serves at most ~24 pages per search).

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

Overall cap across all URLs. You are only charged for listings actually saved.

## `outputFields` (type: `array`):

Pick the fields you want and every record is trimmed to exactly those - handy for lean CSV/Sheets exports.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.realestate.com.au/buy/in-sydney,+nsw/list-1"
  ],
  "maxPagesPerUrl": 10,
  "maxItems": 1000
}
```

# Actor output Schema

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

Each listing - price, bedrooms, bathrooms, address, agency and agents - as a JSON item in the default dataset.

# 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 = {
    "startUrls": [
        "https://www.realestate.com.au/buy/in-sydney,+nsw/list-1"
    ],
    "startUrlsFromFile": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/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 = {
    "startUrls": ["https://www.realestate.com.au/buy/in-sydney,+nsw/list-1"],
    "startUrlsFromFile": "",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/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 '{
  "startUrls": [
    "https://www.realestate.com.au/buy/in-sydney,+nsw/list-1"
  ],
  "startUrlsFromFile": ""
}' |
apify call scrapesage/realestate-com-au-scraper --silent --output-dataset

```

## MCP server setup

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