# Domain.com.au Scraper — AU Sale, Rent & Sold Listings (`crawloop/domain-com-au-scraper`) Actor

Scrape Domain.com.au sale, rent, and sold listings by suburb or postcode. Each row includes price, beds, address, agency, and a photo for comps and monitors.

- **URL**: https://apify.com/crawloop/domain-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 $1.50 / 1,000 listings

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Domain.com.au Scraper — AU Sale, Rent & Sold Listings

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Domain Group or its affiliates. Data is read from publicly accessible listing search results only. No login. You are responsible for complying with applicable law (including GDPR where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

**Domain.com.au scraper** for Australian **sale**, **rent**, and **sold** listings. Each dataset row has the display price, beds, baths, car spaces, address, suburb, postcode, agency, property type, and a photo. Export **JSON** or CSV. Use it as a **Domain.com.au API alternative** from **Python**, **Node.js**, **cURL**, or **Apify MCP**.

Paste a suburb such as Bondi NSW, a postcode, or a search URL. A quiet monitor run writes zero rows when nothing new is on the first unseen page.

**Best for:** suburb stock checks, sold-listing comps, rental lead lists, and a scheduled new-listing monitor. For the other major Australian portal, use the realestate.com.au Actor after this one.

| Actor | Role |
| :--- | :--- |
| Domain.com.au Scraper ◄── you are here | AU sale, rent, and sold listings |
| [realestate.com.au Scraper](https://apify.com/crawloop/realestate-com-au-scraper) | AU sold comps, postcode, and for-sale on the other major portal |
| [Rightmove Scraper](https://apify.com/crawloop/rightmove-scraper) | UK Rightmove listings (sale and rent) |
| [ImmobilienScout24 Scraper](https://apify.com/crawloop/immobilienscout24-scraper) | Germany IS24 rent and buy |
| [Subito Real Estate Scraper](https://apify.com/crawloop/subito-real-estate-scraper) | Italy property: sale, rent, private vs agency |
| [Yad2 Scraper](https://apify.com/crawloop/yad2-scraper) | Israel Yad2 listings |
| [Airbnb Occupancy Scraper](https://apify.com/crawloop/airbnb-occupancy-monitor) | Short-stay calendars next to long-term comps |

### When to use this Actor

- **Suburb or postcode pull** — Bondi, a region, or a postcode, for sale, rent, or sold.
- **Filters already in a search URL** — Beds, price, and property type on a sale, rent, or sold search link are kept.
- **One listing** — Paste a listing URL to save that record, including the public description and agent names.
- **Scheduled monitoring** — Re-run the same suburb and save only listing ids that were not stored last time.
- **Portal pair** — Run this for Domain, then the realestate.com.au Actor for the same suburb on the other board.

### When not to use this Actor

- **Agent email databases or agency roster stats** — This Actor saves the agency name on the card, and agent names only when you open a listing. It does not build a contact database.
- **Logged-in enquiry or saved-search feeds** — No login.
- **realestate.com.au comps** — Use the sibling Actor for that portal.

### Key features

- **Search cards by default** — Price, beds, address, agency, features, and the first photos come from the search result. One saved listing is one row.
- **Optional listing record** — Turn on description and agent names when you need the public write-up. Price, beds, address, and agency are already on the search card.
- **Sale, rent, sold, and share** — Set the channel, or paste the search URL.
- **Monitor** — Listing ids already seen for that same search are skipped. A quiet tick saves nothing.
- **HTTP only** — 256 MB. AU residential proxy is required because datacenter addresses are blocked before listings load.

### Input

| Field | Required | Default | What it does |
| :--- | :--- | :--- | :--- |
| Suburb or postcode | Yes, unless Start URLs is set | Bondi NSW | Suburb, region, or postcode |
| Sale, rent, or sold | No | sale | Channel. Ignored when Start URLs is set |
| Property types | No | all | House, Apartment, Townhouse, Villa, Land, and the other types in the field description |
| Minimum / maximum price | No | none | AUD bounds |
| Minimum / maximum bedrooms | No | none | Bedroom bounds |
| Start URLs | No | empty | Search or listing URLs. When set, the fields above are ignored |
| Max listings | No | 25 | Cap across the whole run (1–500) |
| Include description and agent names | No | off | Opens each listing record |
| Monitor mode | No | off | Save only new listing ids |
| Proxy | No | AU residential | Required. Do not turn proxy off |

```json
{
  "location": "Bondi NSW",
  "listingType": "sale",
  "maxItems": 25,
  "includeDetails": false,
  "monitorMode": false
}
```

A search URL keeps the filters in the link:

```json
{
  "startUrls": [
    { "url": "https://www.domain.com.au/sale/bondi-nsw-2026/?bedrooms=2-any&price=0-800000" }
  ],
  "maxItems": 50
}
```

### Output

One listing per dataset row.

| Field | Meaning |
| :--- | :--- |
| `listingId` | Domain listing id |
| `url` | Public listing URL |
| `channel` | `sale`, `rent`, `sold`, or `share` |
| `headline` | Listing headline |
| `priceDisplay` | Price text, including auction and contact-agent labels |
| `price` | Number when the text includes a dollar amount |
| `pricePeriod` | `week` or `month` on rental amounts |
| `bedrooms`, `bathrooms`, `carspaces` | Counts from the card |
| `propertyType` | Primary type |
| `address`, `suburb`, `state`, `postcode` | Address parts |
| `agency` | Agency name |
| `agentNames` | Public agent names when a listing record is opened |
| `soldDate` | Sold date when Domain publishes one |
| `description` | Public description when a listing record is opened |
| `image` | Primary photo |
| `scrapedAt` | UTC timestamp |

```json
{
  "listingId": "2021208039",
  "url": "https://www.domain.com.au/4-4-glen-street-bondi-nsw-2026-2021208039",
  "channel": "sale",
  "headline": "Sunlit Beachside Sanctuary Moments from Bondi and Tamarama",
  "priceDisplay": "Auction 24th October",
  "bedrooms": 2,
  "bathrooms": 1,
  "carspaces": 1,
  "propertyType": "Apartment",
  "address": "4/4 Glen Street, Bondi",
  "suburb": "Bondi",
  "state": "NSW",
  "postcode": "2026",
  "agency": "Example Agency",
  "image": "https://rimh2.domainstatic.com.au/example/photo.png",
  "scrapedAt": "2026-10-04T12:00:00Z"
}
```

### Use cases

- Pull for-sale apartments in one suburb for a weekly stock check.
- Export sold rows with display price and sold date for a comparable set.
- Watch a rental postcode and keep only listings that were not in the last run.
- Open one listing URL when you need the public description and agent names beside the card fields.
- Pair the same suburb with realestate.com.au when the brief covers both Australian portals.

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("crawloop/domain-com-au-scraper").call({
  location: "Bondi NSW",
  listingType: "sale",
  maxItems: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os

from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("crawloop/domain-com-au-scraper").call(run_input={
    "location": "Bondi NSW",
    "listingType": "sold",
    "maxItems": 25,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~domain-com-au-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"location":"Bondi NSW","listingType":"rent","maxItems":10}'
```

### 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 name `crawloop/domain-com-au-scraper`.

Example prompts:

- "Run Domain.com.au Scraper for Bondi NSW for-sale apartments and return the top 20 rows as JSON"
- "Scrape Domain.com.au sold listings in postcode 2026 and summarize price, beds, and agency"
- "Run Domain.com.au Scraper in monitor mode for Sydney rentals, then use realestate.com.au Scraper for the same suburb"

### Suite next step

This Actor covers Domain sale, rent, and sold cards. For sold comps and for-sale listings on the other major Australian portal, run [realestate.com.au Scraper](https://apify.com/crawloop/realestate-com-au-scraper).

### FAQ

**Does a search row include the description and agent names?**
The search card includes price, beds, address, and agency. Turn on **Include description and agent names**, or paste a listing URL, when you need the public description and agent names.

**Are agent emails or phone numbers included?**
No. Agent names are the public names on the listing record. Email and phone are not requested.

**What does monitor mode skip?**
Listing ids already stored for that same suburb, channel, and filters. Change the suburb or the channel and it is a new cursor. A run with no new ids writes zero rows.

**Why does the run need a residential proxy?**
Datacenter addresses are blocked before listing data loads. The default proxy is AU residential. Leave it on.

**What if a sold listing has no dollar price?**
`priceDisplay` still has the text Domain shows, such as an auction label. `price` is set only when that text contains a dollar amount. `soldDate` is set when Domain publishes a date.

**Can I scrape Domain.com.au sold listings by suburb?**
Yes. Set the channel to sold, or paste a sold search URL, and pass a suburb or postcode. Each row keeps the display price, beds, address, agency, and sold date when Domain publishes one.

**Can I scrape Domain.com.au rentals?**
Yes. Set the channel to rent. Weekly amounts stay in `priceDisplay`, with `price` as the number and `pricePeriod` set to `week` when the text says per week.

**Is this a Domain.com.au API alternative?**
Yes. You do not need a Domain developer key. Call the Actor from Python, Node.js, cURL, or an AI assistant through Apify MCP and read the dataset as JSON.

# Actor input Schema

## `location` (type: `string`):

Suburb, region, or postcode. Example: Bondi NSW, or 2026. Ignored when Start URLs is set.

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

Which listings to collect. Ignored when Start URLs is set.

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

Optional types: House, Apartment, Townhouse, Villa, Land, Rural, Studio, Duplex, or Terrace. Leave empty for every type. Ignored when Start URLs is set.

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

Lowest price in AUD. For rentals this is the weekly amount when the listing shows one.

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

Highest price in AUD.

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

Lowest bedroom count.

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

Highest bedroom count.

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

Domain sale, rent, or sold search URLs, or a single listing URL. When this list is set, Suburb and the filters above are ignored.

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

Maximum listing rows across all searches.

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

Open each listing record and add the public description and agent names. Price, address, beds, and agency are already on the search card. Still one charge per saved listing.

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

Save only listing ids that were not saved for this search on a previous run. A quiet tick writes zero rows.

## `monitorStateStore` (type: `string`):

Named key-value store for listing ids already seen. Used only when monitor mode is on.

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

Apify Proxy. AU residential is required. Datacenter IPs are blocked before any listings load.

## Actor input object example

```json
{
  "location": "Bondi NSW",
  "listingType": "sale",
  "maxItems": 25,
  "includeDetails": false,
  "monitorMode": false,
  "monitorStateStore": "domain-com-au-monitor",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}
```

# Actor output Schema

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

Default dataset items — one 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 = {
    "location": "Bondi NSW"
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/domain-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 = { "location": "Bondi NSW" }

# Run the Actor and wait for it to finish
run = client.actor("crawloop/domain-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 '{
  "location": "Bondi NSW"
}' |
apify call crawloop/domain-com-au-scraper --silent --output-dataset

```

## MCP server setup

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