# Domain.com.au $1.50/1k Scraper — Property + Full Agent Data (`memo23/domain-com-au-scraper`) Actor

Scrape Domain.com.au rent / sale / sold listings — 66 fields per row incl. coordinates, photos, school catchment, suburb profile + full agent enrichment (mobile, photo, lifetime sales/leasing stats). Pure HTTP via residential proxies, no browser. JSON or CSV out

- **URL**: https://apify.com/memo23/domain-com-au-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, Automation, Agents
- **Stats:** 15 total users, 14 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 — Rent, Sale & Sold Property + Agent Scraper

### How it works

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-domain.png" alt="How it works" width="100%" />
</p>

All-in-one Domain.com.au scraper — paste any mix of URL kinds in the same input list and the actor auto-classifies each one:

| Input | Row(s) emitted |
|---|---|
| **Rent listing** — `/rent/{suburb}-{state}-{postcode}/` | **N listing rows** — one per property (`rowType: "listing"`). Paginated automatically via `?page=N` (20 results per page). Each row carries the full property record + agency block + per-listing agent array + nearby school catchment (~13 schools) + suburb profile. |
| **Sale listing** — `/sale/{suburb}-{state}-{postcode}/` | Same flat-per-property pattern, `listingMode: "sale"`. May include `/project/...` new-development URLs in CBD areas — those emit a separate placeholder row (`rowType: "project"`). |
| **Sold listing** — `/sold-listings/{suburb}-{state}-{postcode}/` | Same flat-per-property pattern, `listingMode: "sold"`. Capped at 12 months by Domain (older sale history needs property-profile URLs — out of scope for v1). |
| **Property detail URL** — `/{slug}-{state}-{postcode}-{listingId}` | 1 listing row, no pagination. Useful for refreshing a known listing or scraping bookmarked properties. |
| **Agent profile URL** — `/real-estate-agent/{slug}-{agentId}/` | 1 agent row (`rowType: "agent"`) with full contact details, lifetime sales + leasing counts, recent listing IDs, bio. |

Bare query-string filters work too — `/rent/sydney-nsw-2000/?bedrooms=2&price=0-700` is supported because the URL passes through unchanged. JSON + CSV.

> **Listing rows are flat with the agents denormalized into every row.** Each property's `agentsEnriched[]` array carries every agent's full profile inline (no separate agent rows from listing URLs). Agents are deduped by ID across the run, so 50 listings sharing one agent = 1 agent fetch, not 50.

> Pure HTTP. No Playwright, no Puppeteer, no headless Chromium, no third-party services.

---

Under the hood the actor is built around a tight HTTP recipe with residential proxy routing, automatic retry on transient errors, and structured data parsing from each page's server-rendered state. End-to-end live test: **5/5 properties** parsed with full agent enrichment, **0 hard failures**, **0 stale rows**. Specifically:

1. **Residential proxy routing** — every request is routed through a rotating residential pool. Datacenter IPs aren't used. Defaults to Apify Residential with `country=AU`; user can override via `input.proxy`.
2. **Auto retry on transient errors** — listing pages occasionally return thin or empty bodies. The actor detects that and retries with a fresh session before giving up.
3. **Structured page parsing** — every Domain page ships rich server-rendered state with the full property record, school catchment, suburb profile, agency block, and per-listing agent array. The parser reads that directly — no DOM execution, no client-side script wait, no fragile CSS selectors.
4. **Agent dedupe cache** — each unique agent ID is fetched at most once per run, then merged into every listing that references them.
5. **Native pagination** — page navigation uses Domain's own page counters; the walk stops at `totalPages` or `maxItems`, whichever comes first.

---

### Input

Field | Type | Required | Notes
--- | --- | --- | ---
`startUrls` | `string[]` | yes | Any mix of listing / detail / agent URLs (or bare query-string-filtered URLs). Auto-classified.
`enrichAgent` | `boolean` | no | Default `true`. Fetches each unique agent profile to populate `agentsEnriched[]` with full contact details + lifetime stats + bio. Cached by agent ID, so duplicate references across listings share one fetch. Disable for cheaper property-only runs (~40% faster).
`maxItems` | `integer` | no | Safety cap on **total dataset rows**, not URLs. A rent URL with 935 results emits up to 935 listing rows. Default `200`. Free-tier users are capped at `100`.
`maxConcurrency` | `integer` | no | Detail pages fetched in parallel. Default `8`. Sweet spot 6–10.
`minConcurrency` | `integer` | no | Minimum parallelism. Default `1`.
`maxRequestRetries` | `integer` | no | Per-URL retry budget. Transient errors are auto-detected and don't count against this. Default `5`.
`proxy` | `object` | no | Default: Apify Residential AU (`{ useApifyProxy: true, apifyProxyGroups: ["RESIDENTIAL"], apifyProxyCountry: "AU" }`). Override with your own residential pool if desired.

#### Example input

```json
{
  "startUrls": [
    "https://www.domain.com.au/rent/sydney-nsw-2000/",
    "https://www.domain.com.au/sale/melbourne-vic-3000/?bedrooms=2-any&price=0-800000",
    "https://www.domain.com.au/sold-listings/brisbane-qld-4000/",
    "https://www.domain.com.au/38-bridge-st-sydney-nsw-2000-18121983",
    "https://www.domain.com.au/real-estate-agent/cherie-xue-1487822/"
  ],
  "enrichAgent": true,
  "maxItems": 500,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "AU" }
}
````

That yields up to **500 rows**: rent + sale + sold listings paginated through, 1 direct detail row, and 1 standalone agent row. The agent referenced by the 38 Bridge St listing is deduped against any earlier listing referencing the same agent.

***

### Output schema

Three row shapes, distinguished by the `rowType` field: `listing`, `agent`, `project`.

#### `rowType: "listing"`

```jsonc
{
  "rowType":             "listing",
  "sourceUrl":           "https://www.domain.com.au/38-bridge-st-sydney-nsw-2000-18121983",
  "canonicalUrl":        "https://www.domain.com.au/38-bridge-st-sydney-nsw-2000-18121983",
  "listingId":           18121983,
  "listingMode":         "rent",            // "rent" / "sale" / "sold"
  "listingType":         "RESIDENTIAL",     // RESIDENTIAL / COMMERCIAL / RURAL / PROJECT
  "status":              "LIVE",            // LIVE / LEASED / SOLD / WITHDRAWN

  "headline":            "Furnished CBD studio with city views",
  "description":         "...HTML-stripped, line-break-preserving body...",
  "propertyType":        "APARTMENT_UNIT_FLAT",
  "propertyTypes":       ["APARTMENT_UNIT_FLAT"],
  "bedrooms":            1,
  "bathrooms":           1,
  "carspaces":           0,
  "landAreaSqm":         null,
  "buildingAreaSqm":     null,
  "isRural":             false,
  "energyEfficiencyRating": null,
  "structuredFeatures": [
    { "category": "Indoor", "name": "Built in wardrobes", "source": "SUGGESTED" }
    /* up to ~20 features */
  ],

  "address": {
    "displayAddress":    "38 Bridge St, Sydney NSW 2000",
    "streetNumber":      "38",
    "unitNumber":        null,
    "street":            "Bridge St",
    "suburb":            "Sydney",
    "state":             "NSW",
    "postcode":          "2000",
    "lat":               -33.8632149,
    "lng":               151.2106999
  },

  "priceDisplay":        "$800 per week",
  "priceExact":          800,
  "priceFrom":           null,
  "priceTo":             null,
  "canDisplayPrice":     true,
  "bondAmount":          3200,                  // rent only — null for sale/sold

  "dateListed":          "2026-05-15T16:03:18+10:00",
  "dateCreated":         "2026-05-15T15:42:11",
  "dateUpdated":         "2026-05-15T16:03:18",
  "dateAvailable":       "2026-05-20T00:00:00",
  "leasedDate":          null,                  // rent only when LEASED
  "soldDate":            null,                  // sale/sold only

  "photos":              [ /* up to ~30 imgix-hosted CDN URLs */ ],
  "floorplans":          [],
  "photosCount":         7,
  "floorplansCount":     0,
  "hasPhoto":            true,
  "hasFloorplan":        false,
  "virtualTourUrl":      null,
  "matterportUrl":       null,

  "inspections": [
    { "openingDateTime": "2026-05-18T10:00:00", "closingDateTime": "2026-05-18T10:30:00" }
  ],
  "inspectionsCount":              1,
  "inspectionByAppointmentOnly":   false,
  "auctionDateTime":               null,        // auction sale listings only
  "saleMethod":                    null,        // PRIVATE_TREATY / AUCTION / EOI / etc.

  "agency": {
    "agencyId":           6877,
    "name":               "Sydney Cove Property",
    "phone":              "02 92411288",
    "website":            "http://www.sydneycoveproperty.com.au",
    "profileUrl":         "https://www.domain.com.au/real-estate-agencies/sydneycoveproperty-6877",
    "logoUrl":            "https://rimh2.domainstatic.com.au/...",
    "bannerUrl":          "https://rimh2.domainstatic.com.au/...",
    "backgroundColour":   "#FFFFFf",
    "isArchived":         false
  },
  "agentNames":          ["Cherie Xue", "Robert McFadden"],
  "agentIds":             [1487822, 1951517],
  "agentsEnriched": [
    {
      "agentId":             1487822,
      "agentIdInternal":     "6877-A31464",
      "fullName":            "Cherie Xue",
      "jobTitle":            "Sales representative",
      "profileTier":         "platinum",
      "hasEmail":            true,
      "mobileNumber":        null,
      "landlineNumber":      "02 9241 1288",
      "photoUrl":            "https://rimh2.domainstatic.com.au/.../contact_1487822.jpeg",
      "agencyId":            6877,
      "agencyName":          "Sydney Cove Property",
      "agencyAddress":       "Level 1 / 111 George St, The Rocks NSW 2000",
      "personalWebsiteUrl":  "http://sydneycoveproperty.com/agents/.../Cherie-Xue",
      "facebookUrl":         "https://www.facebook.com/Sydneycoveproperty",
      "twitterUrl":          "https://twitter.com/sydneycove",
      "instagramUrl":        "https://www.instagram.com/Sydney_Cove/",
      "linkedInUrl":         "",
      "youTubeChannelUrl":   "",
      "agentVideoUrl":       "https://www.youtube.com/watch?v=...",
      "totalForSale":        0,
      "totalForRent":        31,
      "totalSold":           0,
      "totalLeased":         147,
      "totalJointLeased":    101,
      "totalSoldAndAuctioned":  0,
      "recentListingIds":    [18122017, 18121983, 18118956 /* ... */],
      "bio":                 "Rui (Cherie) Xue - Licence No: ..."
    }
    /* + remaining agents on this listing */
  ],

  "schoolsCount": 13,
  "schools": [
    {
      "schoolId":          "4299",
      "name":              "Fort Street Public School",
      "educationLevel":    "primary",
      "sector":            "Government",
      "gender":            "CoEd",
      "yearRange":         null,
      "distance":          612.4,
      "distanceUnit":      "m",
      "rating":            null,
      "inCatchment":       true
    }
    /* + ~12 more, mix of primary and secondary, government and non-government */
  ],

  "suburbProfile": {
    "type":              "SUBURB",
    "address":           { "suburb": "Sydney", "state": "NSW", "postcode": "2000" },
    "statistics":        { /* median price, days-on-market, demographic highlights, property age distribution */ }
  },

  // Denormalised page-info flags (Domain's own digitalData layer)
  "daysListed":              0,
  "displayedLabels":         "New listing",
  "hasDescription":          true,
  "descriptionHasEmail":     false,
  "descriptionHasPhone":     true,
  "hasSOI":                  false,             // Statement of Information (Victoria-mandated)
  "hasDisplayPrice":         true,
  "hasVirtualTour":          false,

  "providerAdId":            "R2637954",        // Third-party feed ID
  "providerSystem":          "alchemy",

  // Search context — populated when the row came from a listing-URL fan-out.
  // `null` when the row came from a direct detail URL.
  "searchContext": {
    "discoveryUrl":  "https://www.domain.com.au/rent/sydney-nsw-2000/",
    "resultPosition": 1,              // 1-based position within the search page (1..20)
    "pageNumber":     1,
    "totalPages":     47,
    "totalResults":   935,             // total result count across all pages
    "mode":           "rent"           // rent / sale / sold
  },

  "scrapedAt":               "2026-05-15T20:39:45.418Z"
}
```

**Total fields per listing row: 66** (counting `agentsEnriched[]` items as one field, not N, and the `searchContext` block as one field).

#### `rowType: "agent"`

Emitted only when an agent profile URL is in `startUrls`. Standalone agent rows. The same agent data is also denormalized into every listing row's `agentsEnriched[]`, so you don't need to scrape agent URLs separately unless you want flat agent rows.

```jsonc
{
  "rowType":         "agent",
  "sourceUrl":       "https://www.domain.com.au/real-estate-agent/cherie-xue-1487822",
  "agentId":         1487822,
  "agentIdInternal": "6877-A31464",
  "fullName":        "Cherie Xue",
  "jobTitle":        "Sales representative",
  "profileTier":     "platinum",                // platinum / gold / silver / standard
  "hasEmail":        true,
  "mobileNumber":    null,                      // null if agent only lists landline
  "landlineNumber":  "02 9241 1288",
  "photoUrl":        "https://rimh2.domainstatic.com.au/.../contact_1487822.jpeg",
  "agencyId":        6877,
  "agencyName":      "Sydney Cove Property",
  "agencyAddress":   "Level 1 / 111 George St, The Rocks NSW 2000",
  "personalWebsiteUrl": "http://sydneycoveproperty.com/agents/.../Cherie-Xue",
  "facebookUrl":     "https://www.facebook.com/Sydneycoveproperty",
  "twitterUrl":      "https://twitter.com/sydneycove",
  "instagramUrl":    "https://www.instagram.com/Sydney_Cove/",
  "linkedInUrl":     "",
  "youTubeChannelUrl": "",
  "agentVideoUrl":   "https://www.youtube.com/watch?v=...",
  // Lifetime stats from Domain's own ContactStatistics record
  "totalForSale":    0,
  "totalForRent":    31,
  "totalSold":       0,
  "totalLeased":     147,
  "totalSoldAndAuctioned":      0,
  "totalJointSoldAndAuctioned": 0,
  "totalJointLeased":           101,
  "totalAuctioned":             0,
  "recentListingIds": [18122017, 18121983, 18118956, 18118228 /* ... */ ],
  "bio":             "Rui (Cherie) Xue - Licence No: 2 0 3 0 3 4 6 8 Born in the Shandong Province in China, Cherie moved to Australia in 2006...",
  "scrapedAt":       "2026-05-15T20:39:45.418Z"
}
```

#### `rowType: "project"`

Emitted when Domain serves a `/project/{id}/{slug}/` URL inside a listing-search results page (common in CBD sale searches for new-development apartments). v1 emits a placeholder with the source URL; the full project schema (developer, available stock, completion date, price range) is on the v2 roadmap.

```jsonc
{
  "rowType":   "project",
  "sourceUrl": "https://www.domain.com.au/project/1923/380-melbourne-melbourne-vic/",
  "scrapedAt": "2026-05-15T20:39:45.418Z",
  "note":      "Project listing — full schema lands in v2. See sourceUrl for the page."
}
```

***

### Pricing

Pay-per-event. The default plan charges per dataset row, with no separate event for the (cached) agent enrichment fetches — those are bundled into the listing row cost.

Event | When billed | Suggested rate
\--- | --- | ---
`outputrecord` | Every row pushed to the dataset (1 listing = 1 row, 1 agent URL = 1 row, 1 project URL = 1 row) | **$1.50 / 1000 rows**

This sits at the premium end of property scrapers (most Domain actors price $0.50–$1.00/1k) because of the 66-field rich row + agent enrichment + school catchment + suburb profile included. If your use case only needs slim 5-field property rows, set `enrichAgent: false` for ~40% faster runs (price unchanged — same `outputrecord` event).

#### Free tier

Non-paying Apify users get capped at **100 items per run**. A paying account removes the cap (`maxItems` still enforced, default `200`).

***

### What makes this richer than the competition

We surveyed the Domain.com.au actors on the Apify marketplace (May 2026). Most are running stale code from 2024 and have not kept pace with Domain's modernised site. This actor is a clean-slate build with substantially richer output:

Capability | Competitor actors | **This actor**
\--- | --- | ---
Returns reliable data on the live site (May 2026) | hit-and-miss | ✅ Live-tested clean |
Three modes (rent + sale + sold) in **one actor** | ❌ (split across separate SKUs) | ✅ |
URL auto-classification (paste any mix) | ❌ | ✅ |
Pure HTTP, no headless browser | mixed (some use Puppeteer) | ✅ |
No paid third-party services | mixed | ✅ |
Per-listing **agent enrichment** (mobile, photo, lifetime stats, social, bio) | partial (1 actor surfaces names only) | ✅ |
**Agent dedupe cache** — each unique agent fetched once per run | ❌ (others either skip agents or re-fetch per listing) | ✅ |
**School catchment** included (~13 schools per listing) | ❌ | ✅ |
**Suburb profile** included (median price, demographics, market activity) | ❌ | ✅ |
Per-listing lat/lng from Domain's own geolocation | partial (some geocode externally) | ✅ |
Per-row **search context** (resultPosition, pageNumber, totalResults) | ❌ | ✅ |
Flat row shape — no nested arrays you have to flatten | mixed | ✅ |
Auto-paginates with native page counters | partial | ✅ |
66 fields per listing row | typical 12–25 | ✅ |

Most older Domain actors emit 12–25 fields per row and don't enrich agents. This actor returns property + agent + school + suburb data in one row, with strict freshness on Domain's current site behaviour.

***

### Notes & limitations

- **Site evolution.** Domain.com.au occasionally rotates its page structure or anti-bot policy. When that happens, the actor may need a 1-day patch. We monitor live runs and ship updates within 24–48 hours when behaviour shifts.
- **Agent emails are gated behind a contact form** on Domain. We surface `hasEmail: true|false` so you know who's contactable, but the email itself isn't in the public HTML. Same applies to many agent mobile numbers — Domain hides mobile when the agent didn't opt-in to public display (`mobileNumber: null`).
- **`/sold-listings/` caps at 12 months** by Domain. Older sale history needs `/property-profile/{slug}` URLs — out of scope for v1, on the v2 roadmap.
- **Commercial listings** live on `commercialrealestate.com.au` (a Domain sibling site) and are out of scope for v1.
- **New-development `/project/{id}/` listings** are emitted as placeholder rows (just `sourceUrl`). The full project schema lands in v2.
- **Apify free-tier cap** at 100 items per run. Upgrade to a paying plan to lift the cap.
- **Domain occasionally A/B tests** the page structure — we monitor parser drift and patch within 24–48 hours when fields shift.
- **No API alternative.** Domain Group runs a paid B2B Developer Portal with structured access. If you have enterprise volume and budget, that's the right path. This actor is for ad-hoc lead generation, market analytics, and pricing research — no contract, pay-per-row.

***

### Support

Issues, feature requests, or custom output shapes? Open a ticket on the actor's Apify page or message the maintainer.

***

### ⚠️ Disclaimer

This Actor accesses publicly available data on Domain.com.au for legitimate research, market intelligence, and business-analysis purposes. Use of this Actor must comply with Domain.com.au's Terms of Service and all applicable laws including the **Australian Privacy Act 1988**, GDPR (where the data subject is in the EU), and the **Spam Act 2003** (for any subsequent agent outreach). The Actor's authors are not responsible for any misuse. Users must:

- Respect rate limits and avoid overloading Domain.com.au's infrastructure
- Not use scraped data to violate user privacy or terms — agent contact details in particular are subject to the Australian Privacy Principles and may not be used for unsolicited commercial communications without consent
- Use the data in compliance with applicable jurisdictions
- Not republish scraped content in violation of copyright

**Domain.com.au is a registered trademark of Domain Holdings Australia Limited (ASX: DHG).** This Actor is not affiliated with, endorsed by, or sponsored by Domain Holdings Australia. If you are Domain Holdings Australia and would like to discuss commercial access via the official Domain Group Developer Portal, please contact the maintainer.

We do not store any scraped data; the Actor returns it directly to your Apify dataset for your authorized use.

***

### SEO Keywords

domain.com.au scraper, domain.com.au api, domain.com.au property data, australian real estate scraper, sydney property scraper, melbourne property scraper, brisbane property scraper, perth property scraper, adelaide property scraper, australia rental listings scraper, australia property for sale scraper, australia sold listings scraper, real estate agent data scraper, domain.com.au listings api, australian property market data, australian housing market scraper, real estate api australia, agent enrichment scraper, suburb profile data australia, school catchment data australia, australia auction data scraper, sold property history australia, apify domain.com.au, domain.com.au crawler, residential property data api, australian property comps data

# Actor input Schema

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

Full domain.com.au URLs to crawl. Listing URLs are paginated automatically until `Maximum items to scrape` is reached.

## `enrichAgent` (type: `boolean`):

When enabled, each unique real-estate agent referenced in a listing is fetched once per run to enrich the row with full agent details: full name, job title, mobile / landline, photo, agency, lifetime sales + leasing counts, recent listing ids, and bio. Cached by agent id, so duplicate references across listings share a single fetch. Default ON — disable for cheaper property-only runs.

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

Hard cap on the number of properties collected. Domain listings paginate 20 results per page; use this cap to control billing.

## `maxConcurrency` (type: `integer`):

Maximum number of detail pages processed in parallel. Higher = faster but more proxy bandwidth + higher risk of transient errors. 6-10 is the sweet spot.

## `minConcurrency` (type: `integer`):

Minimum number of detail pages processed in parallel.

## `maxRequestRetries` (type: `integer`):

Number of retries before a failed request is given up. Transient errors (thin or empty bodies) are auto-detected and retried; this counter covers other failures too.

## `proxy` (type: `object`):

Defaults to Apify Residential with `country=AU` — the recommended pool for reliable Domain.com.au runs. Override with your own residential proxy provider if you prefer.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.domain.com.au/rent/sydney-nsw-2000/"
  ],
  "enrichAgent": true,
  "maxItems": 200,
  "maxConcurrency": 8,
  "minConcurrency": 1,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}
```

# 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 = {
    "startUrls": [
        "https://www.domain.com.au/rent/sydney-nsw-2000/"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "startUrls": ["https://www.domain.com.au/rent/sydney-nsw-2000/"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/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 '{
  "startUrls": [
    "https://www.domain.com.au/rent/sydney-nsw-2000/"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}' |
apify call memo23/domain-com-au-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Domain.com.au $1.50/1k Scraper — Property + Full Agent Data",
        "description": "Scrape Domain.com.au rent / sale / sold listings — 66 fields per row incl. coordinates, photos, school catchment, suburb profile + full agent enrichment (mobile, photo, lifetime sales/leasing stats). Pure HTTP via residential proxies, no browser. JSON or CSV out",
        "version": "0.0",
        "x-build-id": "nCk5w7wSMwBOOU2cy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~domain-com-au-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-domain-com-au-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~domain-com-au-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-domain-com-au-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~domain-com-au-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-domain-com-au-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "Domain.com.au URLs",
                        "type": "array",
                        "description": "Full domain.com.au URLs to crawl. Listing URLs are paginated automatically until `Maximum items to scrape` is reached.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "enrichAgent": {
                        "title": "Fetch agent profile details (mobile, email, photo, lifetime sales/leasing counts, suburbs covered)",
                        "type": "boolean",
                        "description": "When enabled, each unique real-estate agent referenced in a listing is fetched once per run to enrich the row with full agent details: full name, job title, mobile / landline, photo, agency, lifetime sales + leasing counts, recent listing ids, and bio. Cached by agent id, so duplicate references across listings share a single fetch. Default ON — disable for cheaper property-only runs.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Maximum items to scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on the number of properties collected. Domain listings paginate 20 results per page; use this cap to control billing.",
                        "default": 200
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of detail pages processed in parallel. Higher = faster but more proxy bandwidth + higher risk of transient errors. 6-10 is the sweet spot.",
                        "default": 8
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum number of detail pages processed in parallel.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Number of retries before a failed request is given up. Transient errors (thin or empty bodies) are auto-detected and retried; this counter covers other failures too.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Defaults to Apify Residential with `country=AU` — the recommended pool for reliable Domain.com.au runs. Override with your own residential proxy provider if you prefer."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
