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

\[💰 $1.3 / 1K] Extract rent, for-sale and recently sold property listings from Domain.com.au with 18 built-in filters — property type, bedrooms, price, land size, features. Get prices, GPS coordinates, photos, agent contacts, school catchments and suburb market stats.

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

## Pricing

from $1.30 / 1,000 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/platform/actors/running/actors-in-store#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 Scraper — Rent, Sale & Sold Listings

Pull every rental, for-sale and recently-sold listing from Domain.com.au at scale — prices, GPS coordinates, photos, floorplans, agent contacts, school catchments and suburb market stats, all on one flat row. Built for Australian buyer's agents, property investors, valuers and proptech teams who need a filtered, ready-to-model listing feed without pasting URLs one at a time or maintaining a scraper of their own.

### Why This Scraper?

- **18 Domain search filters built in, not just a URL box** — 20 property types (Townhouse, Penthouse, Block of units, Rural lifestyle, Development site and more), bedrooms, bathrooms, car spaces, price band, land size, 16 named features, free-text keywords, new vs established, and retirement living. Every filter was checked against Domain's own match counts before it shipped.
- **Rent, for sale and recently sold in the same actor** — sold results carry the sale method and the sale date, which is what a CMA, an appraisal or a comparable-sales model actually runs on. One option switches between the three.
- **GPS coordinates on 100% of listings** — latitude and longitude on all 413 rows sampled across six areas (Sydney, Melbourne, Brisbane, Perth, Hawthorn, Orange) and all three search types. Street address, suburb, state, postcode and at least one photo were also on 100%.
- **The advertiser's exact price line on every listing** — `priceDisplay` ships verbatim ("$800 per week", "$650,000 to $680,000", "Auction", "Contact Agent"), with a parsed numeric `price` beside it wherever a figure is actually derivable. You always get the words the agent published, never a guess dressed up as a number.
- **Land size always travels with its unit** — Domain mixes square metres and hectares in the same result set, so a 15.7 ha rural block sits next to a 640 m² suburban one. `landSize` and `landUnit` are shipped as a pair, which is the difference between a correct dataset and a 10,000× error.
- **41 extra fields per listing on demand** — full advert text, every full-size photo and floorplan, agency phone, agent name and mobile, open-inspection times, nearby school catchment, suburb median sale price, median weekly rent, average days on market, auction clearance rate and five years of sales history.
- **Drop the sold listings with no disclosed price** — roughly one in five sold results never publishes a figure (measured 29,863 → 23,942 on a Sydney search). One option removes them, so every comparable you pay for has a number attached.
- **0.38 seconds per listing** — 100 listings in 38 seconds, and a 1,195-listing Sydney-region walk in under 7 minutes, measured on the platform rather than estimated.

### Use Cases

#### Comparable Sales & Valuation

- Build CMA and appraisal workbooks from sold searches — sale method, sale date and the disclosed price on the same row.
- Read suburb median sale price, median weekly rent, average days on market and auction clearance rate straight off any enriched listing.
- Pull five years of suburb sales history — median price, volume sold, days on market and annual growth per year.

#### Buyer's Agents & Lead Generation

- Watch a target suburb for new stock with a scheduled run sorted by most recently updated.
- Capture listing agency, agency phone, agent name and mobile on enriched rows, ready to load into a CRM.
- Shortlist against a client brief in one run: 4+ bedrooms, 2+ bathrooms, secure parking, under a set price.

#### Market Research & Analytics

- Measure supply by property type across a whole state — `area` accepts suburbs, regions and bare state codes.
- Compare rental and sale inventory in the same suburb by switching one option.
- Quantify feature prevalence — how many rentals allow pets, come furnished, or have a swimming pool.

#### Rental Portfolio & Property Management

- Track weekly asking rents by suburb and bedroom count, with the advertiser's own price wording preserved.
- Monitor competing stock — inspection times, deposit-taken status, and how long a listing has been live.
- Benchmark your own listings against the suburb median weekly rent and average days on market.

#### Data Enrichment & Integration

- Geocode a whole Domain search instantly — every row is map-ready without a separate geocoding step.
- Attach school catchments (name, sector, level, distance) to each property for family-buyer scoring.
- Export to JSON, CSV or Excel, or stream rows into a warehouse through the Apify API.

### Getting Started

#### Simplest run

```json
{
  "searchMode": "rent",
  "area": "sydney-nsw-2000",
  "maxItems": 100
}
```

#### A filtered search

```json
{
  "searchMode": "sale",
  "area": "parramatta-nsw-2150",
  "propertyType": "house",
  "minBedrooms": "4-any",
  "minCarSpaces": "2-any",
  "priceRange": "0-1500000",
  "includeSurroundingSuburbs": "0",
  "sortBy": "price-asc",
  "maxItems": 500
}
```

#### Sold comparables, with full details

```json
{
  "searchMode": "sold-listings",
  "area": "brisbane-city-qld-4000",
  "hidePriceWithheld": "1",
  "enrichDetails": true,
  "maxItems": 1000
}
```

#### Paste a filtered search URL from the site

Set your filters on domain.com.au, then copy the whole address bar — every filter in
it is carried through, and paging continues from whatever you pasted.

```json
{
  "searchUrls": [
    "https://www.domain.com.au/sale/melbourne-vic-3000/?bedrooms=2-any&price=0-800000",
    "https://www.domain.com.au/rent/bondi-beach-nsw-2026/",
    "https://www.domain.com.au/sold-listings/hawthorn-vic-3122/"
  ],
  "maxItems": 500
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | — | Optional. Paste one or more domain.com.au SEARCH result URLs -- set the filters you want on the website, then copy the whole address bar. When you use this, the filters below are ignored. Suburb searches (/rent/sydney-nsw-2000/), region and state searches (/sale/melbourne-region-vic/, /sale/nsw/), searches that already carry filters in the address (?bedrooms=2-any\&price=0-800000) and Domain's own filter paths (/sale/sydney-nsw-2000/house/3-bedrooms/) all work, and paging continues from whatever you pasted. A single property page works too and returns that one property. Agent and agency profile pages are not searches and will be reported as a failed search in the run log. |
| `searchMode` | string | `rent` | Rentals, listings for sale, or recently sold properties. Sold results include the sale price and sale date where the agent disclosed them. |
| `area` | string | `sydney-nsw-2000` | A Domain location slug. Suburbs look like sydney-nsw-2000 or bondi-beach-nsw-2026, regions like sydney-region-nsw or melbourne-region-vic, and a whole state is just nsw, vic, qld, wa, sa, tas, act or nt. The easiest way to get one right is to search on domain.com.au and copy the piece of the address bar that comes after /rent/ or /sale/. |
| `propertyType` | string | `""` | One property type per run. "House (all kinds)" and "Apartment or unit (all kinds)" are the site's own umbrella groups and cover every sub-type beneath them; pick a specific sub-type to narrow further. |
| `minBedrooms` | string | `""` | Domain caps this at 5, so "5 or more" is the top of the scale. Studios count as zero bedrooms and are only excluded once you set a minimum. |
| `minBathrooms` | string | `""` | Domain caps this at 5, so "5 or more" is the top of the scale. |
| `minCarSpaces` | string | `""` | Garages, carports and open parking all count. Domain caps this at 5. |
| `priceRange` | string | `""` | Written as low-high, e.g. 500000-800000. Use "any" for an open end -- 800000-any for "at least $800,000", 0-600000 for "up to $600,000". For rentals this is the WEEKLY rent, so 400-700 rather than 400000-700000. Anything that is not two numbers is rejected by Domain. |
| `landSize` | string | `""` | Written the same way as the price range, e.g. 400-any for "at least 400", or 600-1200 for a band. Set the unit below. |
| `landSizeUnit` | string | `""` | Only matters when you set a land size. Rural blocks are usually measured in hectares; suburban blocks in square metres. |
| `feature` | string | `""` | One feature per run, using Domain's own feature list. "Pets allowed" and "Furnished" are rental-oriented but work on every search type. |
| `keywords` | string | `""` | Free text matched against the agent's own listing copy -- "granny flat", "ocean views", "renovated". Multi-word phrases are fine. |
| `propertyAge` | string | `""` | "New" covers off-the-plan, house-and-land and newly built stock; "Established" is everything previously lived in. |
| `retirementOnly` | string | `""` | Restricts the search to over-55s and retirement-village listings. |
| `includeSurroundingSuburbs` | string | `""` | Domain widens a suburb search into its neighbours by default. Turning this off usually cuts the result count by roughly two thirds and every row then carries the suburb you asked for. |
| `hideUnderOffer` | string | `""` | Only for "Properties for sale". Domain rejects this option on rental and sold searches. |
| `hideDepositTaken` | string | `""` | Only for "Properties for rent". Domain rejects this option on for-sale and sold searches. |
| `hidePriceWithheld` | string | `""` | Only for "Recently sold properties". Roughly a fifth of sold listings never disclose a price; this drops them so every row you pay for has one. Domain rejects this option on for-sale and rental searches. |
| `sortBy` | string | `""` | Domain's own sort options, seven of them. Sold searches are already newest-sale-first unless you change this. |
| `maxItems` | integer | `100` | Maximum listings per search URL (0 = collect everything each search returns). Domain serves at most 50 pages for any one search -- measured at 1,195 listings on a Sydney-region walk -- so split large areas into several narrower searches. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `enrichDetails` | boolean | `false` | Add 41 extra fields per listing. Adds one request per listing and is billed at the higher rate. |
| `concurrency` | integer | `8` | How many requests to run in parallel. Lower this if you see failures. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings for the run. |

### Output

Every listing is one dataset row. Enabling `enrichDetails` adds 41 further fields to the same row — there is no second record type to join.

The example below is a real captured row. Long arrays and the advert body are trimmed for
readability, and the agent's name, mobile number and profile link are replaced with
placeholders.

```json
{
  "id": "2021012386",
  "url": "https://www.domain.com.au/2315-45-macquarie-street-parramatta-nsw-2150-2021012386",
  "listingKind": "listing",
  "propertyType": "Apartment / Unit / Flat", "propertyTypeCode": "ApartmentUnitFlat",
  "bedrooms": 2, "bathrooms": 2, "parkingSpaces": 1, "landUnit": "m²", "isRural": false, "isRetirement": false,
  "streetAddress": "2315/45 Macquarie Street", "suburb": "Parramatta", "state": "NSW", "postcode": "2150",
  "latitude": -33.81524, "longitude": 151.00093,
  "price": 700000,
  "priceDisplay": "$700,000",
  "agencyId": "22392",
  "agencyName": "Ray White Parramatta/Oatlands/Northmead",
  "agencyLogo": "https://rimh2.domainstatic.com.au/.../logo_22392.jpg",
  "agentNames": "Jane Doe",
  "images": ["https://rimh2.domainstatic.com.au/.../2021012386_1_1_260721_062351-w2000-h1333"],
  "hasVideo": false, "hasMatterport": false,
  "headline": "LUXURIOUS 5-STAR 2 BEDROOM APARTMENT AT 'V BY CROWN'",
  "description": "This is the landmark building 'V by Crown'. Positioned in the heart of Parramatta CBD with all major amenities at the doorstep ...",
  "listingMode": "buy", "listingStatus": "live", "saleMethod": "privateTreaty", "listingCategory": "residential",
  "fullAddress": "2315/45 Macquarie Street, Parramatta NSW 2150",
  "streetName": "Macquarie Street", "streetNumber": "45", "unitNumber": "2315",
  "suburbProfileUrl": "https://www.domain.com.au/suburb-profile/parramatta-nsw-2150",
  "listingStats": [{"key": "buildingArea", "value": 97}],
  "propertyLastSoldDate": "2015-10-22T00:00:00",
  "suburbMedianSalePrice": 642500, "suburbMedianRentPrice": 720, "suburbEntryLevelPrice": 489400,
  "suburbLuxuryLevelPrice": 839200, "suburbAvgDaysOnMarket": 42, "suburbAuctionClearance": 63, "suburbSoldLastYear": 633,
  "suburbSalesGrowth": [{"year": "2026", "medianSoldPrice": 642500, "annualGrowth": 0.0362, "numberSold": 633, "daysOnMarket": 42}],
  "agencyPhone": "02 9891 3333",
  "agencyProfileUrl": "https://www.domain.com.au/real-estate-agencies/raywhiteparramattaoatlandsnorthmead-22392/",
  "agencyBanner": "https://rimh2.domainstatic.com.au/.../banner_22392.png",
  "agents": [{"name": "Jane Doe", "phone": "02 9891 3333", "mobile": "04XX XXX XXX", "photo": "https://rimh2.domainstatic.com.au/.../contact_1775106.jpeg", "agentProfileUrl": "https://www.domain.com.au/real-estate-agent/jane-doe-1775106"}],
  "photosFullSize": ["https://rimh2.domainstatic.com.au/.../2021012386_1_1_260721_062351-w2000-h1333"],
  "heroImage": "https://rimh2.domainstatic.com.au/.../2021012386_1_1_260721_062351-w2000-h1333",
  "media": {"items": [{"type": "image", "imageUrl": "https://rimh2.domainstatic.com.au/.../2021012386_1_1.jpg"}], "floorplanUrl": "https://rimh2.domainstatic.com.au/.../2021012386_29_3_260721_062351-w1713-h2667"},
  "createdOn": "2026-07-21T16:23:49.527", "modifiedOn": "2026-07-27T20:09:10.023", "propertyId": "OI-7458-RE",
  "schools": [{"name": "Indie School Parramatta", "educationLevel": "secondary", "type": "Private", "distance": 156.53, "address": "Parramatta, NSW 2150", "status": "Open"}],
  "demographics": {"population": 25793, "avgAge": "20 to 39", "owners": 0.292, "renters": 0.708, "families": 0.551, "singles": 0.449},
  "faqs": [{"question": "How many bedrooms does 2315/45 Macquarie Street, Parramatta have?", "answer": [{"text": "2315/45 Macquarie Street, Parramatta is a 2 bedroom apartment."}]}],
  "inspectionTimes": [{"dayOfWeek": "Saturday", "day": "1", "month": "August", "time": "10:30am - 10:45am", "openingDateTime": "2026-08-01T10:30:00"}],
  "nextInspection": "Sat 10:30am", "inspectionByAppointmentOnly": false, "timeZone": "Australia/Sydney"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Listing ID |
| `url` | string | Listing URL |
| `listingKind` | string | Record kind (listing or project) |
| `propertyType` | string | Property type |
| `propertyTypeCode` | string | Property type (code) |
| `bedrooms` | number | Bedrooms |
| `bathrooms` | number | Bathrooms |
| `parkingSpaces` | number | Parking spaces |
| `landSize` | number | Land size |
| `landUnit` | string | Land size unit |
| `isRural` | boolean | Rural listing |
| `isRetirement` | boolean | Retirement living |
| `statusTag` | string | Status label |

#### Price & Value

| Field | Type | Description |
|-------|------|-------------|
| `price` | number | Price (AUD) |
| `priceDisplay` | string | Price (as advertised) |
| `auctionDateTime` | string | Auction date/time |

#### Location

| Field | Type | Description |
|-------|------|-------------|
| `streetAddress` | string | Street address |
| `suburb` | string | Suburb |
| `state` | string | State |
| `postcode` | string | Postcode |
| `latitude` | number | Latitude |
| `longitude` | number | Longitude |

#### Agency & Media

| Field | Type | Description |
|-------|------|-------------|
| `agencyId` | string | Agency ID |
| `agencyName` | string | Agency |
| `agencyLogo` | string | Agency logo |
| `agentNames` | string | Listing agents |
| `images` | array | Photo URLs |
| `hasVideo` | boolean | Has video |
| `hasMatterport` | boolean | Has 3D walkthrough |
| `projectName` | string | Development project |

#### With `enrichDetails` enabled (1 of 2)

| Field | Type | Description |
|-------|------|-------------|
| `headline` | string | Advert headline |
| `description` | string | Description |
| `structuredFeatures` | array | Property features |
| `listingMode` | string | Listing mode |
| `listingStatus` | string | Listing status |
| `saleMethod` | string | Sale method |
| `listingCategory` | string | Listing category |
| `fullAddress` | string | Full address |
| `streetName` | string | Street |
| `streetNumber` | string | Street number |
| `unitNumber` | string | Unit number |
| `suburbProfileUrl` | string | Suburb profile URL |
| `statementOfInformationUrl` | string | Statement of Information (PDF) |
| `listingStats` | array | Bond, land area, building area, available-from |
| `propertyLastSoldDate` | string | Property last sold on |
| `suburbMedianSalePrice` | number | Suburb median sale price |
| `suburbMedianRentPrice` | number | Suburb median weekly rent |
| `suburbEntryLevelPrice` | number | Suburb entry-level price |
| `suburbLuxuryLevelPrice` | number | Suburb luxury-level price |
| `suburbAvgDaysOnMarket` | number | Suburb average days on market |
| `suburbAuctionClearance` | number | Suburb auction clearance (%) |
| `suburbSoldLastYear` | number | Suburb sales in the last year |
| `suburbSalesGrowth` | array | Suburb 5-year sales history |
| `agencyPhone` | string | Agency phone |
| `agencyProfileUrl` | string | Agency profile URL |

#### With `enrichDetails` enabled (2 of 2)

| Field | Type | Description |
|-------|------|-------------|
| `agencyBanner` | string | Agency banner image |
| `agents` | array | Agents (name, phone, mobile, photo, profile URL) |
| `photosFullSize` | array | Full-size image URLs (photos & floorplans) |
| `heroImage` | string | Hero image |
| `media` | object | Floorplans, video, virtual tour & full media list |
| `createdOn` | string | First listed |
| `modifiedOn` | string | Last updated |
| `propertyId` | string | Property ID |
| `schools` | array | Nearby schools & catchment |
| `demographics` | object | Suburb demographics |
| `faqs` | array | Listing Q\&A |
| `inspectionTimes` | array | Open-for-inspection times |
| `nextInspection` | string | Next inspection |
| `inspectionByAppointmentOnly` | boolean | Inspection by appointment only |
| `auctionLocation` | string | Auction location |
| `timeZone` | string | Listing time zone |

### Tips for Best Results

- **Plan around Domain's 50-page ceiling** — any single search serves at most 50 pages, so a Sydney-region search that reports 26,653 matches still returns about 1,195 listings. To cover a whole region, split it by suburb, price band or property type and paste every URL into `searchUrls` — rows are de-duplicated across searches, so you are never billed twice for the same listing.
- **On a capped search, `sortBy` decides which listings you get** — seven orders are available. Use price-lowest-first for entry-level stock, most-recently-updated to monitor a market, or sale-date-newest-first when you are building comparables.
- **Read `price` next to `priceDisplay`** — Domain publishes no numeric price, only the advertiser's own wording. `priceDisplay` carries that wording on every listing and is the field to audit against; `price` is the figure derived from it, and where the agent wrote "Auction" or "Contact Agent" there is nothing to derive.
- **Turn off `includeSurroundingSuburbs` when you need one suburb only** — Domain widens suburb searches into their neighbours by default. Switching it off took a Parramatta search from 1,185 matches to 301, and every returned row then carried the suburb asked for.
- **For comparables, set `hidePriceWithheld`** — about a fifth of sold results never disclose a figure. Dropping them at the source is cheaper than filtering them out afterwards, and leaves a comparables set where every row has a price.
- **`enrichDetails` is where the contacts and catchments live** — across the 84-record enriched sample, agency phone, agent name, nearby schools, suburb medians and the full advert text were on every record, and 81 of those 84 also carried a direct agent mobile. Leave it off for a fast inventory sweep; turn it on for lead work, valuation and listing analysis.
- **Filter to `listingKind == "listing"` for individual properties** — a small share of search results (11 of 413 sampled) are developer project cards, which advertise a whole new-build development rather than one property. They carry no address, no price and no detail page, and this field is how you drop them.

### Pricing

**From $1.30 per 1,000 results** (search only) or **from $2.30 per 1,000 results** (with full details).

| Results | Search Only | With Full Details |
|---------|-------------|-------------------|
| 100 | $0.13 | $0.23 |
| 1,000 | $1.30 | $2.30 |
| 10,000 | $13.00 | $23.00 |
| 100,000 | $130.00 | $230.00 |

Those are the rates on Gold and above. Higher-volume plans pay less per result:

| Your Apify plan | Search Only | With Full Details |
|-----------------|-------------|-------------------|
| No discount | $1.55 | $2.75 |
| Bronze | $1.45 | $2.60 |
| Silver | $1.40 | $2.45 |
| **Gold and above** | **$1.30** | **$2.30** |

Per 1,000 results.

A "result" is any listing row in the output dataset. When you run several searches at once, a listing matching more than one of them is de-duplicated before it reaches the dataset, so you are never charged twice for the same listing. The full-details rate applies only to rows that actually came back enriched — if a listing's detail record is unavailable, the row is still delivered and charged at the search-only rate. Platform fees (compute, storage) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

**This is an unofficial scraper. It is not affiliated with, endorsed by, or connected to Domain.com.au, Domain Holdings Australia, or its operators in any way.** All trademarks belong to their respective owners.

This actor is intended for legitimate market research and analytics. You are responsible for complying with applicable laws and with Domain.com.au's Terms of Service.

Results may include personal data such as agent contact details. Treat them accordingly: do
not use them for spam, harassment, or any unlawful purpose, and follow applicable
privacy rules when storing or processing them.

# Actor input Schema

## `searchUrls` (type: `array`):

Optional. Paste one or more domain.com.au SEARCH result URLs -- set the filters you want on the website, then copy the whole address bar. When you use this, the filters below are ignored. Suburb searches (/rent/sydney-nsw-2000/), region and state searches (/sale/melbourne-region-vic/, /sale/nsw/), searches that already carry filters in the address (?bedrooms=2-any\&price=0-800000) and Domain's own filter paths (/sale/sydney-nsw-2000/house/3-bedrooms/) all work, and paging continues from whatever you pasted. A single property page works too and returns that one property. Agent and agency profile pages are not searches and will be reported as a failed search in the run log.

## `searchMode` (type: `string`):

Rentals, listings for sale, or recently sold properties. Sold results include the sale price and sale date where the agent disclosed them.

## `area` (type: `string`):

A Domain location slug. Suburbs look like sydney-nsw-2000 or bondi-beach-nsw-2026, regions like sydney-region-nsw or melbourne-region-vic, and a whole state is just nsw, vic, qld, wa, sa, tas, act or nt. The easiest way to get one right is to search on domain.com.au and copy the piece of the address bar that comes after /rent/ or /sale/.

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

One property type per run. "House (all kinds)" and "Apartment or unit (all kinds)" are the site's own umbrella groups and cover every sub-type beneath them; pick a specific sub-type to narrow further.

## `minBedrooms` (type: `string`):

Domain caps this at 5, so "5 or more" is the top of the scale. Studios count as zero bedrooms and are only excluded once you set a minimum.

## `minBathrooms` (type: `string`):

Domain caps this at 5, so "5 or more" is the top of the scale.

## `minCarSpaces` (type: `string`):

Garages, carports and open parking all count. Domain caps this at 5.

## `priceRange` (type: `string`):

Written as low-high, e.g. 500000-800000. Use "any" for an open end -- 800000-any for "at least $800,000", 0-600000 for "up to $600,000". For rentals this is the WEEKLY rent, so 400-700 rather than 400000-700000. Anything that is not two numbers is rejected by Domain.

## `landSize` (type: `string`):

Written the same way as the price range, e.g. 400-any for "at least 400", or 600-1200 for a band. Set the unit below.

## `landSizeUnit` (type: `string`):

Only matters when you set a land size. Rural blocks are usually measured in hectares; suburban blocks in square metres.

## `feature` (type: `string`):

One feature per run, using Domain's own feature list. "Pets allowed" and "Furnished" are rental-oriented but work on every search type.

## `keywords` (type: `string`):

Free text matched against the agent's own listing copy -- "granny flat", "ocean views", "renovated". Multi-word phrases are fine.

## `propertyAge` (type: `string`):

"New" covers off-the-plan, house-and-land and newly built stock; "Established" is everything previously lived in.

## `retirementOnly` (type: `string`):

Restricts the search to over-55s and retirement-village listings.

## `includeSurroundingSuburbs` (type: `string`):

Domain widens a suburb search into its neighbours by default. Turning this off usually cuts the result count by roughly two thirds and every row then carries the suburb you asked for.

## `hideUnderOffer` (type: `string`):

Only for "Properties for sale". Domain rejects this option on rental and sold searches.

## `hideDepositTaken` (type: `string`):

Only for "Properties for rent". Domain rejects this option on for-sale and sold searches.

## `hidePriceWithheld` (type: `string`):

Only for "Recently sold properties". Roughly a fifth of sold listings never disclose a price; this drops them so every row you pay for has one. Domain rejects this option on for-sale and rental searches.

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

Domain's own sort options. Sold searches are already newest-sale-first unless you change this.

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

Maximum listings per search URL (0 = collect everything each search returns). Domain.com.au pages through at most 5,000 listings per search, so use several narrower searches to collect more.

## `enrichDetails` (type: `boolean`):

Add 41 extra fields per listing. Adds one request per listing and is billed at the higher rate.

## `concurrency` (type: `integer`):

How many requests to run in parallel. Lower this if you see failures.

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

Proxy settings for the run.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.domain.com.au/rent/sydney-nsw-2000/"
  ],
  "searchMode": "rent",
  "area": "sydney-nsw-2000",
  "propertyType": "",
  "minBedrooms": "",
  "minBathrooms": "",
  "minCarSpaces": "",
  "priceRange": "",
  "landSize": "",
  "landSizeUnit": "",
  "feature": "",
  "keywords": "",
  "propertyAge": "",
  "retirementOnly": "",
  "includeSurroundingSuburbs": "",
  "hideUnderOffer": "",
  "hideDepositTaken": "",
  "hidePriceWithheld": "",
  "sortBy": "",
  "maxItems": 100,
  "enrichDetails": false,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `core` (type: `string`):

Core Fields for each listing.

## `financial` (type: `string`):

Price & Value for each listing.

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

Location for each listing.

## `contact` (type: `string`):

Contacts for each listing.

## `media` (type: `string`):

Media for each listing.

## `meta` (type: `string`):

Details & Timestamps for each listing.

# 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 = {
    "searchUrls": [
        "https://www.domain.com.au/rent/sydney-nsw-2000/"
    ],
    "area": "sydney-nsw-2000"
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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 = {
    "searchUrls": ["https://www.domain.com.au/rent/sydney-nsw-2000/"],
    "area": "sydney-nsw-2000",
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/domain-com-au-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchUrls": [
    "https://www.domain.com.au/rent/sydney-nsw-2000/"
  ],
  "area": "sydney-nsw-2000"
}' |
apify call solidcode/domain-com-au-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/domain-com-au-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/8BA5usauZWG2rhmsR/builds/Tk754p5IaYQDck0V2/openapi.json
