# Realestate.com.au Scraper - Buy, Sold & Rent (`parsebird/realestate-au-scraper`) Actor

Scrape realestate.com.au property listings for sale, for rent, or recently sold by suburb or search URL. Extract price, beds, baths, address, agent and more. JSON, CSV, Excel.

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

## Pricing

from $0.69 / 1,000 property listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

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 - Buy, Sold & Rent

Scrape [realestate.com.au](https://www.realestate.com.au) property listings for sale, for rent, or recently sold — search by suburb, state, postcode, or a pasted search URL. Get price, beds, baths, full address with coordinates, agent and agency details, photos and more.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">Search any Australian suburb across Buy, Rent, or Sold listings, filter by price/beds/baths/property type, and get structured property data ready for analysis or integration.</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/realestate-au-scraper — scrapes realestate.com.au property listings from the search page's own server-rendered GraphQL data (camoufox browser session, no per-listing page fetch needed). Call: ApifyClient("TOKEN").actor("parsebird/realestate-au-scraper").call(run_input={"mode": "location", "locations": [{"suburb": "Sydney", "state": "NSW"}], "listingType": "buy", "maxListings": 20, "maxPages": 3, "proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["UNBLOCKER"]}}). Inputs: mode ("location" or "url"), locations (array of {suburb, state, postcode} — location mode), listingType ("buy"/"rent"/"sold"), urls (array of realestate.com.au search URLs — url mode, filters below ignored), sortBy, propertyTypes, priceMin/priceMax, bedroomsMin/bedroomsMax, bathroomsMin, includeSurrounding, maxListings (default 20), maxPages (default 3), proxyConfiguration (default UNBLOCKER — required, the site uses Kasada bot detection that plain residential proxies do not pass). Output: dataset of listings with propertyId, url, listingType, propertyType, address {street, suburb, state, postcode, full}, coordinates {latitude, longitude}, price {display}, features {bedrooms, bathrooms, parkingSpaces, hasStudy, hasBalcony, hasPool, hasGarage}, description, propertyFeatures[], media {imageCount, images[], floorplanUrl}, agent, agents[], agency, inspectionTimes, auction, tier, scrapedAt. API docs: https://docs.apify.com/api/v2  Token: https://console.apify.com/settings/integrations
```

### What does Realestate.com.au Scraper do?

Give it a suburb (or a search URL you've already refined on the site) and it walks the search results page by page, returning a structured record per listing pulled straight from the page's own search data — no per-listing detail-page fetch needed, which keeps runs fast and cheap:

- 🏠 **Property basics** — `propertyType`, `description`, `propertyFeatures`, `url`
- 📍 **Address & location** — `address` (street, suburb, state, postcode, full), `coordinates` (lat/lng)
- 💲 **Price** — `price.display`, exactly as shown on the listing
- 🛏️ **Features** — `bedrooms`, `bathrooms`, `parkingSpaces`, plus `hasStudy`/`hasBalcony`/`hasPool`/`hasGarage` flags
- 🖼️ **Media** — `images[]`, `imageCount`, `floorplanUrl`
- 👤 **Agent & agency** — `agent`, `agents[]`, `agency` (name, phone, ratings)
- 🔎 **Search or URL mode** — build a search from suburb + filters, or paste any realestate.com.au search URL directly for full control

Use it as a realestate.com.au API alternative for market research, lead generation, or feeding a property database — all with Apify's scheduling, API access, and JSON/CSV/Excel export.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `mode` | string | **Yes** | `location` | `location` (suburb + filters) or `url` (paste a search URL). |
| `locations` | array | No | Sydney, NSW | `[{suburb, state, postcode}]` — location mode only. |
| `listingType` | string | No | `buy` | `buy`, `rent`, or `sold`. Location mode only. |
| `sortBy` | string | No | `list-date` | `relevance`, `list-date`, `list-date-asc`, `price-asc`, `price-desc`. |
| `propertyTypes` | array | No | all | `house`, `apartment`, `townhouse`, `villa`, `land`, `rural`, `commercial`. |
| `priceMin` / `priceMax` | integer | No | — | Price range in AUD. |
| `bedroomsMin` / `bedroomsMax` | integer | No | — | Bedroom count range. |
| `bathroomsMin` | integer | No | — | Minimum bathrooms. |
| `includeSurrounding` | boolean | No | `true` | Include properties from surrounding suburbs. |
| `urls` | array | No | — | Search result URLs to scrape — URL mode only. Filters above are ignored. |
| `maxListings` | integer | No | `20` | Stop after this many listings. `0` = unlimited. |
| `maxPages` | integer | No | `3` | Max result pages per location. `0` = unlimited. |
| `proxyConfiguration` | object | No | UNBLOCKER | Required — realestate.com.au is protected by Kasada bot detection, which plain residential proxies don't pass. |

### Output example

```json
{
  "propertyId": "143160680",
  "url": "https://www.realestate.com.au/property-house-vic-tarneit-143160680",
  "listingType": "buy",
  "propertyType": "House",
  "address": {
    "street": "28 Chantelle Parade",
    "suburb": "Tarneit",
    "state": "Vic",
    "postcode": "3029",
    "full": "28 Chantelle Parade, Tarneit, Vic 3029"
  },
  "coordinates": { "latitude": -37.85273078, "longitude": 144.66332821 },
  "price": { "display": "$650,000 - $700,000" },
  "features": {
    "bedrooms": 4,
    "bathrooms": 2,
    "parkingSpaces": 2,
    "hasStudy": false,
    "hasBalcony": false,
    "hasPool": false,
    "hasGarage": true
  },
  "description": "Renowned Real Estate proudly presents this sensational opportunity...",
  "propertyFeatures": ["Built-in wardrobes", "Dishwasher", "Ducted heating", "Ensuites"],
  "media": {
    "imageCount": 12,
    "images": ["https://i2.au.reastatic.net/{size}/.../image.jpg"],
    "floorplanUrl": null
  },
  "agent": { "name": "Himraj", "phoneNumber": { "display": "0452060566" } },
  "agency": { "name": "Renowned Real Estate" },
  "isBuy": true,
  "isRent": false,
  "isSold": false,
  "scrapedAt": "2026-09-14T13:00:00.000Z"
}
```

Not every field is published for every listing — realestate.com.au omits fields like `price.display` (e.g. "Contact Agent" listings) or `propertyFeatures` when the agent didn't provide them. Download results in JSON, CSV, or Excel from the Console, or pull them via the [Apify API](https://docs.apify.com/api/v2).

### Use cases

- **Market research** — compare prices, sizes, and features across suburbs
- **Lead generation** — active listings with agent and agency contact details
- **Investor sourcing** — filter by price, bedrooms, and property type
- **Data pipelines** — clean JSON of listings, coordinates, and photos for your own database or map
- **Rent vs. buy analysis** — run the same suburb through `buy` and `rent` modes

### How to scrape realestate.com.au

1. Pick **Location mode** and enter a suburb + state (e.g. `Sydney`, `NSW`), or open [realestate.com.au](https://www.realestate.com.au) in your browser, apply your filters, and copy the resulting URL into **URL mode**.
2. Set `listingType` (Buy, Rent, or Sold) and any filters you want.
3. Set `maxListings` and `maxPages` to control run size and cost.
4. Click **Start** and download the dataset as JSON, CSV, or Excel — or fetch it via the [Apify API](https://docs.apify.com/api/v2) or [integrations](https://apify.com/integrations) (Zapier, Make, Google Sheets, and more).

Under the hood, the actor drives a stealth browser session (to pass the site's Kasada bot protection) and reads listings straight out of the search page's own embedded GraphQL data — no separate per-listing page fetch, which keeps runs fast and cheap.

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

Realestate.com.au Scraper uses **pay-per-result** pricing — you only pay for listings actually returned.

| Event | Price per event | Price per 1,000 |
|-------|------------------|------------------|
| `listing` | $0.00069 – $0.00099 | **$0.69 – $0.99** |

Pricing depends on your Apify plan (Free, Bronze, Silver, Gold — lower on higher plans). Scraping 1,000 listings costs between $0.69 and $0.99.

### FAQ

**Do I need a proxy?**
Yes. realestate.com.au uses Kasada bot detection, which blocks even a plain page load — and plain residential proxies don't pass it. The default (Apify Proxy, UNBLOCKER group) is required and set for you.

**What's the difference between Location mode and URL mode?**
Location mode builds a search from a suburb/state/postcode plus the filter fields. URL mode scrapes a URL you've already refined in your browser — useful for complex filter combinations — and ignores the filter fields above.

**Which filters are applied directly on the site vs. after fetching?**
`propertyTypes`, `priceMin`/`priceMax`, `bedroomsMin`/`bedroomsMax`, `bathroomsMin`, and `sortBy` (price-asc/price-desc) are applied to the listings the actor collects. This means the actor may fetch slightly more pages than a filtered on-site search would to find enough matching results.

**Can I scrape rentals or sold listings?**
Yes — set `listingType` to `rent` or `sold`, or paste a `/rent/...` or `/sold/...` URL in URL mode.

**Does it fetch individual property pages?**
No — all data comes from the search results page itself, which keeps runs fast and the cost low.

**Can I schedule it?**
Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to re-run periodically and track new listings in an area.

**Is there an API?**
Yes — every Apify Actor is callable via the [Apify API](https://docs.apify.com/api/v2) and the official [Python](https://docs.apify.com/api/client/python) and [JavaScript](https://docs.apify.com/api/client/js) clients.

### Is it legal to scrape realestate.com.au?

Scraping publicly available data, like the property listings this actor collects, is generally permitted, but you are responsible for how you use the data. Comply with realestate.com.au's Terms of Service, avoid collecting personal data beyond what's publicly listed, and consult a lawyer if you plan to use scraped data commercially. Read more in Apify's blog post on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Using the API

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("parsebird/realestate-au-scraper").call(run_input={
    "mode": "location",
    "locations": [{"suburb": "Sydney", "state": "NSW"}],
    "listingType": "buy",
    "maxListings": 20,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["address"]["full"], item["price"]["display"])
```

**JavaScript**

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('parsebird/realestate-au-scraper').call({
    mode: 'location',
    locations: [{ suburb: 'Sydney', state: 'NSW' }],
    listingType: 'buy',
    maxListings: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Related Actors

- [Daft.ie Property Scraper](https://apify.com/parsebird/daft-ie-property-scraper) — Irish real estate listings
- [Trulia Property Scraper](https://apify.com/parsebird/trulia-property-scraper) — US real estate listings
- [Immobiliare.it Scraper](https://apify.com/parsebird/immobiliare-it-scraper) — Italian real estate listings

### Issues & feedback

Found a bug or have a feature request? Open an issue on the Actor's **Issues** tab in Apify Console — feedback helps keep this realestate.com.au scraper reliable as the site evolves.

# Actor input Schema

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

Location mode builds a search from suburb + state + filters below. URL mode scrapes any search URL you already refined in a browser (recommended for complex filters).

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

Suburb, state and postcode are all optional - provide whichever you have. Example: \[{"suburb": "Sydney", "state": "NSW"}]

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

Type of property listings to scrape. Location mode only.

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

Sort order for search results. Applied after fetching, so it works in both Location and URL mode.

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

How far back to search for sold listings. Only applies when listing type is Recently Sold.

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

Filter by property type (leave empty for all).

## `priceMin` (type: `integer`):

Minimum property price (AUD).

## `priceMax` (type: `integer`):

Maximum property price (AUD).

## `bedroomsMin` (type: `integer`):

Minimum number of bedrooms.

## `bedroomsMax` (type: `integer`):

Maximum number of bedrooms.

## `bathroomsMin` (type: `integer`):

Minimum number of bathrooms.

## `includeSurrounding` (type: `boolean`):

Include properties from surrounding suburbs in results.

## `urls` (type: `array`):

Search result page URLs to scrape. Refine your search in a browser (filters, sort), then paste the resulting URL(s) here. All filter fields above are ignored in this mode.

## `maxListings` (type: `integer`):

Stop after scraping this many listings. Set to 0 for unlimited.

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

Maximum search result pages to process per location. Each page has ~20 results. Set to 0 for unlimited.

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

realestate.com.au is protected by Kasada bot detection, which needs Apify's UNBLOCKER proxy group (residential proxies alone are not enough).

## Actor input object example

```json
{
  "mode": "location",
  "locations": [
    {
      "suburb": "Sydney",
      "state": "NSW"
    }
  ],
  "listingType": "buy",
  "sortBy": "list-date",
  "dateRange": "6months",
  "includeSurrounding": true,
  "urls": [
    "https://www.realestate.com.au/buy/in-sydney,+nsw/list-1"
  ],
  "maxListings": 20,
  "maxPages": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "locations": [
        {
            "suburb": "Sydney",
            "state": "NSW"
        }
    ],
    "urls": [
        "https://www.realestate.com.au/buy/in-sydney,+nsw/list-1"
    ],
    "maxListings": 20,
    "maxPages": 3,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/realestate-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 = {
    "locations": [{
            "suburb": "Sydney",
            "state": "NSW",
        }],
    "urls": ["https://www.realestate.com.au/buy/in-sydney,+nsw/list-1"],
    "maxListings": 20,
    "maxPages": 3,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/realestate-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 '{
  "locations": [
    {
      "suburb": "Sydney",
      "state": "NSW"
    }
  ],
  "urls": [
    "https://www.realestate.com.au/buy/in-sydney,+nsw/list-1"
  ],
  "maxListings": 20,
  "maxPages": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call parsebird/realestate-au-scraper --silent --output-dataset

```

## MCP server setup

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