# Domain.com.au Property Scraper: Price, Beds, Agent (`themineworks/domain-property-scraper`) Actor

Scrape Domain.com.au for sale and for rent listings by suburb: price, beds, baths, parking, land size, property type, agent and agency, with photos and coordinates. Australia residential proxy, no login, pay per property.

- **URL**: https://apify.com/themineworks/domain-property-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Real estate, Lead generation, MCP servers
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 properties

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

## Domain.com.au Property Scraper: Price, Beds, Agent

> Domain sits behind Akamai bot management. This actor clears it through Apify's own unblocking proxy network rather than fighting it with a request that never had a chance.

> You are only charged for a property that actually lands in your dataset. A blocked or empty page is never billed.

### Overview

Domain is one of the two major real estate portals in Australia, alongside realestate.com.au, and this actor turns any Domain suburb search into structured rows: price, bedrooms, bathrooms, parking, land size, property type, agent and agency, photos and coordinates.

Give it one or more Domain location slugs, such as "chatswood nsw 2067", choose sale or rent, and it returns the full result set Domain itself would show you for that suburb.

Full listing detail, not just a headline price ✅ · Agent and agency captured on every row ✅ · Coordinates included for mapping ✅ · MCP ready for AI agents ✅

### Why this needs an unblocking proxy

Domain protects its listing pages with Akamai, and this was tested carefully. A plain request, even one shaped to look exactly like a real browser's request from a residential IP address, gets served a bot-check page with no listing data on every path. This actor instead routes every fetch through Apify's UNBLOCKER proxy network, which resolves that check server-side and returns the real, fully rendered page.

Because Domain server-renders its full result set directly into the page rather than calling a separate API you could intercept, this actor reads that embedded data straight from the page once it loads — a single parse, no extra requests, and no browser to run.

### Input

```json
{
  "locations": ["chatswood-nsw-2067"],
  "listingType": "sale",
  "maxItemsPerLocation": 40,
  "minBedrooms": 3,
  "maxPrice": 1500000,
  "propertyType": "house"
}
```

| Field | What it takes |
| --- | --- |
| `locations` | One or more Domain location slugs, copied straight from a Domain search URL, for example "chatswood nsw 2067". |
| `listingType` | `sale` or `rent`. |
| `maxItemsPerLocation` | Hard cap per location. Domain returns 20 properties per page, so this is your main cost and runtime control. |
| `minBedrooms` | Optional minimum bedroom count. |
| `minPrice` / `maxPrice` | Optional price band. For sale listings this is a sale price; for rent listings this is weekly rent in AUD. |
| `propertyType` | Optional filter such as house, apartment, townhouse, unit, villa or land. |

### Output

```json
{
  "listing_id": "2021072202",
  "listing_type": "sale",
  "display_address": "76C Beaconsfield Road, Chatswood, NSW, 2067",
  "suburb": "Chatswood",
  "state": "NSW",
  "postcode": "2067",
  "latitude": -33.803368,
  "longitude": 151.16888,
  "price_label": "Auction - Contact Agent",
  "bedrooms": 5,
  "bathrooms": 4,
  "parking": 2,
  "property_type": "House",
  "land_size": 450,
  "land_unit": "m²",
  "agent_names": "Adam Wong, Nathan Zhuang",
  "agency_name": "DiJones - Chatswood",
  "url": "https://www.domain.com.au/76c-beaconsfield-road-chatswood-nsw-2067-2021072202",
  "scraped_at": "2026-08-13T21:00:00.000Z"
}
```

| Field | Description |
| --- | --- |
| 🆔 `listing_id` | Domain listing ID, stable for deduplication across runs |
| 🏠 `display_address` | Full street address as shown |
| 📍 `suburb` / `state` / `postcode` | Parsed address components |
| 🗺️ `latitude` / `longitude` | Coordinates for mapping |
| 💰 `price_label` | Price exactly as the agent wrote it |
| 💵 `price_value` | Numeric price, parsed when the label contains a clean figure |
| 🛏️ `bedrooms` / 🛁 `bathrooms` / 🚗 `parking` | Core feature counts |
| 📐 `land_size` / `land_unit` | Land size, when disclosed |
| 👤 `agent_names` / 🏢 `agency_name` | Listing agent and agency |
| 🖼️ `image_url` / `image_count` | Primary photo and total photo count |
| 🔗 `url` | Direct link to the listing on Domain |

### Common use cases

**Market research.** Track asking prices, land sizes and property mix in a suburb over time to see where supply and pricing are actually moving.

**Buyer and investor alerts.** Run on a schedule against a shortlist of suburbs and price bands to catch new listings the day they go live.

**Agent and agency intelligence.** See which agencies dominate a suburb, how they price, and how they photograph and describe their listings.

**Portfolio and comparable analysis.** Pull every current listing in a postcode to build a real comparables set instead of relying on a handful of recent sales.

**AI agents.** Feed live Domain listings into an agent that answers "what is actually for sale in Chatswood right now under 1.5 million?"

### Pricing

| Event | Price | You pay when |
| --- | --- | --- |
| Property delivered | $0.0012 | A property lands in your dataset |

**$1.20 per 1,000 properties.** A search that returns nothing costs nothing.

### Run it on a schedule

1. Run once with the locations you want repeated, then click **Save as a task**.
2. In the Apify Console go to **Schedules, Create new**.
3. Pick a frequency and attach the saved task.
4. Wire the dataset to Sheets, Slack or a webhook from the **Integrations** tab.

Deduplicate on `listing_id` so a repeated schedule only surfaces genuinely new listings.

### FAQ

**Do I need a Domain account?**
No. The actor reads Domain's own public search results only.

**Why does this cost more per result than a plain HTTP actor?**
Domain's listing pages are actively protected, and clearing that protection reliably needs Apify's unblocking proxy network rather than a bare request. The price reflects that real cost, not an arbitrary markup.

**Why did I get fewer properties than my cap?**
Because the suburb has fewer matching listings, or the result set was exhausted before the cap. The run reports what it actually found rather than padding the count.

**Does this also cover new project or off the plan listings?**
Yes, where Domain includes them in the same search results, though those rows may have fewer of the detail fields (price is often "contact agent" rather than a figure) than a standard resale listing.

### Use from Claude, ChatGPT and any MCP agent

```
https://mcp.apify.com/?tools=themineworks/domain-property-scraper
```

Or call it programmatically:

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

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

const run = await client.actor('themineworks/domain-property-scraper').call({
  locations: ['chatswood-nsw-2067'],
  listingType: 'sale',
  maxItemsPerLocation: 40,
});

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

Questions, or need a field we do not return yet? Reach out through the Apify profile.

# Actor input Schema

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

One or more Domain location slugs, for example "chatswood-nsw-2067" or "bondi-beach-nsw-2026". Copy the slug straight from a Domain search URL, or use a suburb and state like "chatswood-nsw".

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

Search for sale listings or rental listings.

## `maxItemsPerLocation` (type: `integer`):

Hard cap per location searched. Domain returns 20 properties per page, so this is your main cost and runtime control.

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

Optional. Only return listings with at least this many bedrooms.

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

Optional. For sale listings this is a sale price; for rent listings this is weekly rent in AUD.

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

Optional. For sale listings this is a sale price; for rent listings this is weekly rent in AUD.

## `propertyType` (type: `string`):

Optional Domain property type filter, for example house, apartment, townhouse, unit, villa or land.

## Actor input object example

```json
{
  "locations": [
    "chatswood-nsw-2067"
  ],
  "listingType": "sale",
  "maxItemsPerLocation": 40
}
```

# Actor output Schema

## `results` (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": [
        "chatswood-nsw-2067"
    ],
    "listingType": "sale",
    "maxItemsPerLocation": 40,
    "propertyType": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/domain-property-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": ["chatswood-nsw-2067"],
    "listingType": "sale",
    "maxItemsPerLocation": 40,
    "propertyType": "",
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/domain-property-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": [
    "chatswood-nsw-2067"
  ],
  "listingType": "sale",
  "maxItemsPerLocation": 40,
  "propertyType": ""
}' |
apify call themineworks/domain-property-scraper --silent --output-dataset

```

## MCP server setup

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