# Domain.com.au Property Scraper (`parsebird/domain-com-au-scraper`) Actor

Scrape Domain.com.au real estate listings: price, address, bedrooms, bathrooms, agent contacts, images, and inspection times for sale and rental properties across Australia.

- **URL**: https://apify.com/parsebird/domain-com-au-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 0.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

### Domain.com.au Property Scraper

Scrape [Domain.com.au](https://www.domain.com.au/) property listings by search URL, state, or suburb — sale or rental — into clean, structured JSON with price, address, agent contacts, and photos.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Paste any Domain.com.au search URL, or pick a state or suburb, and get full listing detail back — headline, description, features, agent phone/email, floor plans, and inspection or auction times — not just the summary shown in search results.
</td>
</tr></table>

<br>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this Domain.com.au scraper: `parsebird/domain-com-au-scraper` on Apify. Call it with the `ApifyClient` (Python: `ApifyClient(token).actor("parsebird/domain-com-au-scraper").call(run_input={"state": "nsw", "maxResults": 20})`) or the equivalent JS client. Key inputs: `startUrl` (a full Domain.com.au `/sale/...` or `/rent/...` search URL — overrides `state`/`location`), `state` (an Australian state/territory code: nsw, vic, qld, wa, sa, tas, act, nt), `location` (a suburb or area name/slug, e.g. "Bondi NSW"), `maxResults` (default 20), and `proxyConfiguration` (a RESIDENTIAL proxy is strongly recommended — Domain.com.au runs Akamai Bot Manager). Output is one JSON object per unique listing: `id`, `url`, `address`, `suburb`, `state`, `postcode`, `latitude`/`longitude`, `price`, `propertyType`, `beds`, `baths`, `parking`, `landSize`, `headline`, `summaryDescription`, `features`, `images`, `agency` (name + contacts), `inspectionDetails`, `auctionDetails`, `listingType`. Full API reference: https://apify.com/parsebird/domain-com-au-scraper/api. Get an API token at https://console.apify.com/account/integrations.

### What does Domain.com.au Property Scraper do?

This Domain.com.au scraper extracts full listing detail directly from the site's own Next.js data, not just what's visible in a search results card.

- 🔍 **Any search URL** — paste a filtered `/sale/...` or `/rent/...` search link copied straight from your browser (property type, price range, and sort order all carry through).
- 📍 **State or suburb search** — no URL handy? Pick a state (`nsw`, `vic`, `qld`, `wa`, `sa`, `tas`, `act`, `nt`) or type a suburb/area (e.g. "Bondi NSW", "parramatta-nsw-2150").
- 🏠 **Full listing detail** — headline, full description, structured features, land size, and building area for every result, fetched from each listing's own page (search-result cards alone don't carry this).
- 🧑‍💼 **Agency and agent contacts** — agency name, branding logo, and every listed agent's name, phone, and email.
- 📸 **Full photo galleries, floor plans, and video/Matterport flags** for every listing.
- 🗓️ **Inspection and auction details** — open home times and auction dates where published.
- 🧹 **Automatic deduplication** — every listing is saved once, keyed by its Domain.com.au listing ID.

Because it runs on the [Apify platform](https://apify.com), you also get scheduling (track new listings and price changes daily), instant API and webhook access, and one-click export to JSON, CSV, Excel, HTML, or XML.

### What data can you extract from Domain.com.au?

| Field | Description |
|-------|-------------|
| `id`, `url` | Domain.com.au's internal listing ID and direct listing URL |
| `address`, `unitNumber`, `streetNumber`, `street`, `suburb`, `state`, `postcode` | Flattened address fields |
| `latitude`, `longitude` | GPS coordinates |
| `price`, `propertyType`, `propertyTypes` | Cleaned display price and property type label(s) |
| `beds`, `baths`, `parking`, `landSize`, `buildingArea` | Core property specs |
| `headline`, `summaryDescription`, `features`, `labels` | Listing headline, description excerpt, feature list, and badges (e.g. "New") |
| `images`, `hasFloorPlan`, `hasVideo`, `hasMatterport` | Photo gallery and media flags |
| `inspectionDetails`, `auctionDetails`, `dateListed` | Open home times, auction info, and listing date |
| `agency` | Agency name, branding logo, and agent contacts (name, phone, email) |
| `listingType`, `isNew`, `isRetirement`, `isRural` | Sale/Rent, and new-development/retirement/rural flags |

### How to scrape Domain.com.au property data

1. Open the [Domain.com.au Property Scraper](https://apify.com/parsebird/domain-com-au-scraper) page on Apify.
2. Either search on [domain.com.au](https://www.domain.com.au/) and paste the resulting URL into `startUrl`, or just set `state` or `location` instead.
3. Set `maxResults` (how many unique listings to collect).
4. Turn on a RESIDENTIAL proxy under `proxyConfiguration` — Domain.com.au runs Akamai Bot Manager, so this materially improves reliability.
5. Click **Start** and watch results land in the dataset in real time.
6. Export the finished dataset as JSON, CSV, Excel, HTML, or XML, or pull it via the [API](https://apify.com/parsebird/domain-com-au-scraper/api) / [integrations](https://docs.apify.com/platform/integrations).

### Input / Output

Search a specific state:

```json
{ "state": "nsw", "maxResults": 100 }
```

Search a suburb:

```json
{ "location": "Bondi NSW", "maxResults": 50 }
```

Paste a pre-filtered search URL, sale or rent:

```json
{
  "startUrl": "https://www.domain.com.au/sale/sydney-region-nsw/house/?excludeunderoffer=1&sort=dateupdated-desc",
  "maxResults": 200
}
```

Output example:

```json
{
  "id": "2021150308",
  "url": "https://www.domain.com.au/8-318-bondi-road-bondi-nsw-2026-2021150308",
  "address": "8/318 Bondi Road, Bondi NSW 2026",
  "suburb": "Bondi",
  "state": "NSW",
  "postcode": "2026",
  "latitude": -33.8945734,
  "longitude": 151.2700842,
  "price": "$1,200,000",
  "propertyType": "Apartment / Unit / Flat",
  "beds": 2,
  "baths": 1,
  "parking": 0,
  "headline": "Art Deco haven with study, moments from the beach",
  "listingType": "Sale",
  "agency": {
    "name": "Wiesner Property",
    "contacts": [{ "name": "Jeremy Wiesner", "phone": "0411 099 199", "email": "jeremy@wiesnerproperty.com" }]
  }
}
```

Download results as **JSON, CSV, Excel, HTML, or XML** from the Console, or via the [Apify API](https://docs.apify.com/api/v2).

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/domain-com-au-scraper").call(run_input={
    "state": "qld",
    "maxResults": 200,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["address"], item["price"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('parsebird/domain-com-au-scraper').call({
    state: 'qld',
    maxResults: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use cases

- **Market research** — analyze prices, property types, and sizes across a state or suburb.
- **Price monitoring** — schedule daily runs on a search URL to track new listings and price changes over time.
- **Lead generation** — pull agency and agent contact details for a target market segment.
- **Rental analysis** — point `startUrl` at a `/rent/...` search to collect leasing data instead of sales.
- **Portfolio and map building** — use the GPS coordinates and address fields to plot listings or feed a geospatial dashboard.

### How it works

1. The Actor solves Domain.com.au's Akamai Bot Manager challenge once per run with a headless browser, then reuses the resulting session for every subsequent request — fast, and far cheaper than running a full browser per page.
2. It reads the same Next.js data the Domain.com.au search page itself loads to collect candidate listing IDs, then fetches each listing's own page for full detail (description, features, agent contacts, inspection times) that a search-result card alone doesn't carry.
3. For `state` searches, Domain.com.au doesn't expose a single flat results grid for an entire state — the Actor searches the state's primary market (its capital city) to return real, individual listings rather than the curated "browse" content Domain shows for state-wide URLs. For full control over which suburbs or regions are covered, use `location` or a `startUrl`.
4. Every listing is deduplicated by its Domain.com.au listing ID as it's found, and pushed to the dataset immediately up to your `maxResults` cap.

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

This Actor uses the [Pay-Per-Event](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-pricing-model) pricing model — you only pay for what you get, with no separate compute charge.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| Listing (per 1,000) | $0.99 | $0.89 | $0.79 | $0.69 |

Collecting 1,000 unique listings costs $0.99 on the Free plan, down to $0.69 on Gold. Apify's monthly platform usage credits apply to any plan.

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

Yes — scraping publicly available data is generally legal, as confirmed in cases like *hiQ Labs v. LinkedIn*. This Actor only collects property information that's publicly visible on domain.com.au to anyone browsing the site. You are responsible for how you use the collected data — always check the target site's terms of service and applicable law before reusing scraped data commercially. See Apify's [blog post on web scraping legality](https://blog.apify.com/is-web-scraping-legal/) for more detail.

### FAQ

**Does this use an official Domain.com.au API?**
No — Domain.com.au does not offer a public listings API for third-party use. This Actor reads the same data the domain.com.au website itself loads, structured into clean JSON.

**Why does `state` only return listings from the capital city?**
Domain.com.au doesn't support browsing an entire state as one paginated results grid — a state-wide URL shows curated "browse" content (new developments, market stats) instead of individual listings. The Actor searches the state's primary market instead so you get real listings. For other regions, use `location` (a specific suburb/area) or paste a `startUrl`.

**Do I need a proxy?**
Yes, effectively — Domain.com.au runs Akamai Bot Manager, and results are meaningfully more reliable with a RESIDENTIAL proxy (`proxyConfiguration`). The Actor rotates to a fresh IP automatically if a session gets blocked mid-run.

**Can I scrape rentals instead of sales?**
Yes — paste a `domain.com.au/rent/...` search URL into `startUrl`; the Actor handles either listing type. `state` and `location` search sale listings by default.

**Can I schedule this to run automatically?**
Yes. Use Apify's [Scheduler](https://docs.apify.com/platform/schedules) to run it daily, weekly, or at any interval, and combine it with [Apify's storage integrations](https://docs.apify.com/platform/integrations) (Google Sheets, Slack, Make, Zapier, webhooks) to get notified of new listings.

**I found a bug or missing field — where do I report it?**
Open an issue on the Actor's **Issues** tab in Apify Console, or use the [API](https://apify.com/parsebird/domain-com-au-scraper/api) directly for programmatic access.

# Actor input Schema

## `startUrl` (type: `string`):

A Domain.com.au search URL to collect from, e.g. a filtered `/sale/...` or `/rent/...` link copied from your browser. Overrides State/Location when set.

## `state` (type: `string`):

Limit the search to an Australian state or territory. Ignored if Search URL or Location is set.

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

A suburb or area, e.g. "Bondi NSW" or "parramatta-nsw-2150". Overrides State when set; ignored if Search URL is set.

## `maxResults` (type: `integer`):

Maximum number of listings to collect.

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

Domain.com.au is protected by Akamai Bot Manager. A residential proxy is strongly recommended for reliable results.

## Actor input object example

```json
{
  "startUrl": "https://www.domain.com.au/sale/sydney-region-nsw/house/?excludeunderoffer=1&sort=dateupdated-desc",
  "state": "",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}
```

# 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 = {
    "startUrl": "https://www.domain.com.au/sale/sydney-region-nsw/house/?excludeunderoffer=1&sort=dateupdated-desc",
    "location": "",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "startUrl": "https://www.domain.com.au/sale/sydney-region-nsw/house/?excludeunderoffer=1&sort=dateupdated-desc",
    "location": "",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "startUrl": "https://www.domain.com.au/sale/sydney-region-nsw/house/?excludeunderoffer=1&sort=dateupdated-desc",
  "location": "",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}' |
apify call parsebird/domain-com-au-scraper --silent --output-dataset

```

## MCP server setup

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