# RealEstate\[com.au & co.nz] 💰$1💰 Search By URLs and Keywords (`memo23/realestate-au-listings`) Actor

realestate.com.au listings from official services APIs. Input: buy/rent/sold list URLs or direct property pages. Output: one row per listing with flat columns (title, price, agents, images, address) plus full listing and withIdsResponse; includes originalSearchUrl and apiRequestUrl.

- **URL**: https://apify.com/memo23/realestate-au-listings.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Stats:** 25 total users, 20 monthly users, 87.1% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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

### Overview

Extract structured **property listings** from **Australia** and **New Zealand**:

- **Australia — [realestate.com.au](https://www.realestate.com.au/)** via **`services.realestate.com.au`**: **buy / rent / sold** search URLs (or direct property pages), **`listings/search/byUrl`**, pagination via **`_links.next`**, then **`listings/withIds`** per listing.
- **New Zealand — [realestate.co.nz](https://www.realestate.co.nz/)** via **`platform.realestate.co.nz`**: residential (and related) **search** URLs on **`www.realestate.co.nz`** (HTML once for suburb ids), then **`GET /search/v1/listings`** for search pages, and **two detail calls per listing**: **`GET /search/v1/listings/{id}`** (full card: title, price, address, photos, agents) and **`GET /search/v1/listings/{id}/listing-fibre`** (broadband plans). Fibre failures are non-fatal; the property row is still saved.

The default pipeline uses an **internal Impit-based handler** (no Cheerio for those requests). Optional **CheerioCrawler + Impit** remains for AU when **`REALESTATE_USE_INTERNAL_HANDLER`** is disabled.

You get **one dataset row per listing** with **`country`**: **`AU`** or **`NZ`**, **flat columns** when **`flattenOutput`** is **true** (the default), plus nested payloads (**`listing`** + **`withIdsResponse`** for AU; **`listing`** + **`nzListingResponse`** / **`listingFibreResponse`** for NZ).

Use it to **monitor markets**, **export price and agency data**, or **warehouse raw API payloads** with traceable **`originalSearchUrl`** and request URLs.

---

### Features

- **Multiple entry URLs** (all routed automatically):
  - **Search / list pages**: `https://www.realestate.com.au/buy/…`, **`/rent/…`**, **`/sold/…`** — paths like **`…/list-1?…`** (and `source=refinement` when present). First request: **`search/byUrl`** with path + query; next pages: **`_links.next`** → **`search?query=…`** until **`maxItems`** listings are queued or there is no next link.
  - **Direct property URL**: numeric id path or **`property-…-{id}`** — one **`withIds`** call only.

- **New Zealand (`www.realestate.co.nz`)**:
  - **Search URLs** — Paths such as **`/residential/sale/…`**, **`/residential/rent/…`**, rural/commercial variants supported by the mapper. Suburb filters are read from listing HTML (`filter[suburbId][]`), then the platform **listings** search API is paginated.
  - **Direct listing URL** — Property pages whose first path segment is a **listing id** (numeric or slug) trigger **detail-only** requests (same dual **`listings/{id}`** + **`listing-fibre`** flow).
  - **Headers** — Mobile-style **`reconz-app`** fingerprint by default (`User-Agent`, **`x-application`**, **`x-device-id`**). Override with **`REALESTATE_NZ_CLIENT=browser`**, **`REALESTATE_NZ_DEVICE_ID`**, etc.
  - **Output** — NZ rows use **`source: "realestate_nz_listing"`**. Flat columns align with the AU export where possible (**`title`**, **`price`** as display string, **`agents`**, **`images`** as **`mediaserver.realestate.co.nz`** URLs, …). **`listing`** holds a **competitor-friendly** shape in places (e.g. **`listing.price.display`**, structured **`listing.address`**). **`dateSold`** is not populated yet; **`advertising`** is absent. Fibre columns (**`fibreProducts`**, …) appear when **`listing-fibre`** returns **200**.

- **Pagination**:
  - Search pages chained via **`_links.next.href`** (absolute or relative URLs supported).
  - Safety cap: env **`REALESTATE_MAX_SEARCH_PAGES`** (default **500**) per run.

- **Listing IDs**:
  - Collected from every **`tieredResults`** tier (organic and any sponsored-style rows that use the same card shape), preferring **`listingId`** on each card.

- **Output modes** (**`flattenOutput`** in input):
  - **`true` (default)**: flat **spreadsheet-style** fields **plus** nested payloads — **AU**: **`listing`** + **`withIdsResponse`**; **NZ**: **`listing`** + **`nzListingResponse`** (full listing JSON:API) + **`listingFibreResponse`** when fibre succeeds, and **`rawResponse`** as an alias of the main listing body for compatibility.
  - **`false`**: **AU**: **`listing`** + **`withIdsResponse`** without duplicate flat columns. **NZ**: **`attributes`**, **`rawResponse`**, **`nzListingResponse`**, **`listingFibreResponse`**, **`fibreStatusCode`**, **`fibreApiRequestUrl`**.

- **HTTP client**: Crawlee **CheerioCrawler** with **Impit** + **REA iOS-style** headers for **`services.realestate.com.au`**.

---

### How to Use

1. **Set Up**: Apify account and this actor (or run locally with `apify run` / `npm run start:dev`).
2. **Provide Input**: Use **either** website URLs under **`startUrls`** (and optional **`extraStartUrls`** / **`ttt`**) **or** leave all of those empty and set **`searchByFilters`** for a single AU/NZ location. **If any URL is set, URL mode wins** and **`searchByFilters` is ignored.** **`startUrls`** accepts **`www.realestate.com.au`** (AU) and/or **`www.realestate.co.nz`** (NZ). Optional **`url1`**, **`url2`**, … on the same object (see input schema).
3. **Configure**: Set **`maxItems`** (cap on **listing detail** requests), **`flattenOutput`**, concurrency, retries, and **proxy** (recommended for production).
4. **Run & Export**: Download **JSON** from the dataset for full nested data. **CSV** export in the actor’s local **`data.csv`** path unions top-level keys — nested **`listing`** / **`withIdsResponse`** are poor fit for CSV; prefer **JSON** for complete payloads.

#### Usage Limitations

**Free / non-paying Apify users** may be subject to platform limits on dataset items or charges. **Paid users** typically get higher limits; adjust **`maxItems`** to control how many **`withIds`** calls run per execution. REA may rate-limit abusive patterns—**proxy is recommended**. Dataset rows may contain **personal data** (emails, phones); handle per your privacy policy.

---

### Input Configuration

Example input:

```json
{
    "startUrls": [
        {
            "url": "https://www.realestate.com.au/rent/property-unit+apartment-villa-in-sydney+cbd,+nsw/list-1?maxBeds=3&source=refinement"
        },
        {
            "url": "https://www.realestate.com.au/sold/property-land-between-0-50000-in-adelaide+-+greater+region,+sa/list-1?source=refinement"
        },
        {
            "url": "https://www.realestate.com.au/property-unit-vic-macleod-150434352"
        }
    ],
    "flattenOutput": true,
    "maxItems": 500,
    "maxConcurrency": 10,
    "minConcurrency": 1,
    "maxRequestRetries": 3,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
````

**New Zealand–only example** (single search seed; adjust **`maxItems`** as needed):

```json
{
    "startUrls": [
        "https://www.realestate.co.nz/residential/sale/auckland/auckland-city/blockhouse-bay"
    ],
    "flattenOutput": true,
    "maxItems": 100,
    "maxConcurrency": 10,
    "proxy": { "useApifyProxy": false }
}
```

**Shared filter example** (use when **`startUrls`** / **`extraStartUrls`** / **`ttt`** are all empty; one object → one compiled search URL):

```json
{
    "searchByFilters": {
        "country": "NZ",
        "channel": "buy",
        "cityOrRegion": "Auckland",
        "district": "Auckland City",
        "suburb": "Blockhouse Bay"
    },
    "flattenOutput": true,
    "maxItems": 100
}
```

#### Input Fields Explanation

- **startUrls** (`startUrls`): Objects whose **`url`**, **`url1`**, **`url2`**, … fields are collected in order. **AU**: **`https://www.realestate.com.au/`** list URLs (**buy** / **rent** / **sold**) or a **property** URL. **NZ**: **`https://www.realestate.co.nz/`** listing search paths (**residential/sale**, **rent**, rural/commercial where supported) or a **property** URL with listing id in the path.
- **searchByFilters** (`searchByFilters`): Optional **single** object with **`country`**, **`channel`**, **`cityOrRegion`**, **`district`**, and **`suburb`**. Used only when **no** start URL is provided (see **`startUrls`**); compiled into **one** website search URL. (Legacy runs that pass an **array** still work: only the **first** element is used, with a console warning.)
  - **AU**: best results when **`cityOrRegion`** is a short region / state label such as **`VIC`**, **`NSW`**, and **`district`** is the market label used in REA URLs (for example **`Melbourne - Northern Region`**).
  - **NZ**: use **`cityOrRegion`** = region, **`district`** = district / city, **`suburb`** = suburb. **All three are required** for NZ filter rows; **`sold`** NZ filters are skipped.
- **flattenOutput** (`flattenOutput`): When **true** (default), **AU** rows include flat columns **and** **`listing`** + **`withIdsResponse`**. **NZ** rows include flat columns aligned with AU where possible **and** **`listing`**, **`nzListingResponse`**, optional **`listingFibreResponse`**, fibre plan fields when available. When **false**, shapes are minimal/nested as described in **Output modes** above.
- **maxItems** (`maxItems`): Maximum number of listings to **queue** for **`withIds`** (shared across all search pagination). Does not limit search pages except indirectly once the cap is reached.
- **maxConcurrency** / **minConcurrency** / **maxRequestRetries**: Crawlee concurrency and retries (**Impit** may cap effective concurrency when a single proxy URL is shared — see logs).
- **proxy** (`proxy`): Apify proxy or custom **`proxyUrls`** for outbound requests.
- **Environment**: **`REALESTATE_MAX_SEARCH_PAGES`** — max **search** API pages per run (default **500**). **NZ**: **`REALESTATE_NZ_PAGE_LIMIT`**, **`REALESTATE_NZ_META_AGGS`**, **`REALESTATE_NZ_DEBUG`**, **`REALESTATE_NZ_CLIENT`**, **`REALESTATE_NZ_DEVICE_ID`** — see **`realestate-nz-mapper.ts`** / **`internal-handler-nz.ts`**.

***

### Output Structure

The dataset contains **one row per listing** after **detail** requests (AU: **`withIds`**; NZ: **`listings/{id}`** ± **`listing-fibre`**).

- **`realestate_detail`** — **`source: "realestate_detail"`**, **`country: "AU"`** — Australian listings.
- **`realestate_nz_listing`** — **`source: "realestate_nz_listing"`**, **`country: "NZ"`** — New Zealand listings.

Filter with **`source`** / **`country`** when consuming mixed inputs.

When **`flattenOutput`** is **false**, the same **`source`** values apply; top-level shape differs (fewer flat columns).

#### NZ vs competitor-style fields

NZ flat rows reuse **many of the same top-level names** as the AU export (**`title`**, **`description`**, **`agents`**, **`images`**, **`channel`**, **`propertyType`**, …) so **CSV column unions** work across countries. Some **Australian competitor JSON** shapes differ: e.g. top-level **`price`** is a **string** (AU parity); nested **`listing.price.display`** matches a **`{ display }`** style. **`generalFeatures`** on the row is represented as **`bedrooms` / `bathrooms` / `carSpaces`** plus **`listing.features.general`**. **`advertising`** is not provided; **`dateSold`** is **`null`** until we parse it from NZ data.

#### Sample: `realestate_nz_listing` (NZ — `flattenOutput: true`)

After a local run, **`data.json`** is written from the dataset (see `main.ts`). If that file is not in the repo, use the same shape as below: it was generated with **`buildNzPropertyListingFlatRow`** for listing **`43004474`** from the live **`platform.realestate.co.nz`** APIs (property + fibre). **`nzListingResponse`**, **`listingFibreResponse`**, **`rawResponse`**, and **`listing`** are **truncated / stubbed** in this block; a real export contains the **full** JSON:API bodies and nested **`listing`** object. **`description`** is shortened here; the live field is the full plain-text marketing copy.

```json
{
    "source": "realestate_nz_listing",
    "country": "NZ",
    "listingId": "43004474",
    "title": "Four Homes, Endless Possibilities",
    "propertyType": "House",
    "status": "active",
    "price": "Negotiation",
    "address": "42 Bolton Street",
    "suburb": "Blockhouse Bay",
    "postcode": "0600",
    "state": "Auckland",
    "latitude": -36.9201449,
    "longitude": 174.6980028,
    "bedrooms": 9,
    "bathrooms": 5,
    "carSpaces": 2,
    "propertyFeatures": {},
    "description": "An outstanding and truly unique opportunity awaits in popular Bolton Street…",
    "featured": true,
    "constructionStatus": "established",
    "agencyListingId": "MLB61353",
    "modifiedDate": "2026-03-12T12:28:58+13:00",
    "dateSold": null,
    "signature": true,
    "productDepth": "",
    "channel": "buy",
    "url_slug": "43004474/residential/sale/42-bolton-street-blockhouse-bay",
    "isSold": false,
    "isBuy": true,
    "isRent": false,
    "isProject": false,
    "tier_signature": true,
    "tier_midtier": false,
    "tier_standard": true,
    "tier_isClassicProject": false,
    "tier_isSignatureProject": false,
    "tier_isProject": false,
    "isExactMatch": null,
    "isSurroundingMatch": null,
    "url": "https://www.realestate.co.nz/43004474/residential/sale/42-bolton-street-blockhouse-bay",
    "inspections": [],
    "statementOfInformation": null,
    "agencyName": "Anne Duncan Real Estate Ltd (Licensed: REAA 2008) - Ray White Mt Albert",
    "agencyPhone": "(09) 846 9470",
    "agencyEmail": "mtalbert.nz@raywhite.com",
    "agencyWebsite": "",
    "agencyAddress": "",
    "agencyAddress_streetAddress": "",
    "agencyAddress_suburb": "",
    "agencyAddress_state": "",
    "agencyAddress_postcode": "",
    "agencyAddress_raw": {},
    "agencyProfileUrl": null,
    "agencyLogo": "https://mediaserver.realestate.co.nz/per_orgs/6104/bcf30b21eb0a703a94ac421a4a4520e4.crop.105x134.jpg",
    "agents": [
        {
            "agentId": "6111",
            "name": "Anne Duncan",
            "jobTitle": "",
            "phoneNumber": "021 996 426",
            "emails": ["anne.duncan@raywhite.com"],
            "powerProfile": false,
            "profileUrl": "https://www.realestate.co.nz/agent/anne-duncan/",
            "image": "https://mediaserver.realestate.co.nz/per_orgs/6111/66cc397a7c57d45b4a4b4b4f026fc843.crop.160x160.jpg"
        }
    ],
    "images": [
        "https://mediaserver.realestate.co.nz/listings/43004474/594e1c909577f0a4e0c6f78d7552cd78.crop.800x600.jpg"
    ],
    "scrapedAt": "2026-04-11T19:42:12.941Z",
    "originalSearchUrl": "https://www.realestate.co.nz/residential/sale/auckland/auckland-city/blockhouse-bay",
    "statusCode": 200,
    "apiRequestUrl": "https://platform.realestate.co.nz/search/v1/listings/43004474",
    "flattenOutput": true,
    "nzListingResponse": { "_readme_note": "Omitted: full JSON:API document from GET /search/v1/listings/{id}." },
    "listingFibreResponse": { "_readme_note": "Omitted: full JSON:API document from GET /search/v1/listings/{id}/listing-fibre." },
    "fibreStatusCode": 200,
    "fibreApiRequestUrl": "https://platform.realestate.co.nz/search/v1/listings/43004474/listing-fibre",
    "rawResponse": { "_readme_note": "Omitted: same payload as nzListingResponse (alias for tooling)." },
    "listing": { "_readme_note": "Omitted: nested compat object — title, price.display, address, features.general, etc." },
    "landSize": 2344,
    "landSizeUnit": "SQM",
    "hasOnt": false,
    "currentConnection": null,
    "standardInstall": true,
    "ontUpgradeLink": "https://www.chorus.co.nz/residential/fibre-products/hyperfibre/upgrading",
    "standardInstallLink": "https://www.chorus.co.nz/getting-fibre/installation",
    "fibreProductCount": 6,
    "fibreProducts": [
        {
            "id": "fibre-starter-43004474",
            "name": "Fibre Starter 100",
            "upSpeedMbps": 100,
            "downSpeedMbps": 20,
            "priceCents": 6000,
            "available": false,
            "requiresOntUpgrade": false
        }
    ],
    "lister": {
        "agentId": "6111",
        "name": "Anne Duncan",
        "jobTitle": "",
        "phoneNumber": "021 996 426",
        "emails": ["anne.duncan@raywhite.com"],
        "powerProfile": false,
        "profileUrl": "https://www.realestate.co.nz/agent/anne-duncan/",
        "image": "https://mediaserver.realestate.co.nz/per_orgs/6111/66cc397a7c57d45b4a4b4b4f026fc843.crop.160x160.jpg"
    }
}
```

##### NZ sample — field-by-field (every top-level key)

| Field | Meaning |
|--------|---------|
| **`source`** | Always **`"realestate_nz_listing"`** for NZ listing rows from this actor. |
| **`country`** | **`"NZ"`**. |
| **`listingId`** | Listing id used on **`platform.realestate.co.nz`** (`GET …/listings/{id}`). |
| **`title`** | Marketing headline from **`attributes.header`**. |
| **`propertyType`** | e.g. **`House`** from **`listing-sub-type`**. |
| **`status`** | Platform **`listing-status`** (e.g. **`active`**). |
| **`price`** | Human-readable **`price-display`** string (not `{ display }` at top level; see **`listing.price`**). |
| **`address`** | Street line (number + street name) for spreadsheets. |
| **`suburb`** | Suburb name. |
| **`postcode`** | NZ postcode string. |
| **`state`** | Region (e.g. **`Auckland`**) — AU uses state codes; NZ uses region as the column value. |
| **`latitude`** / **`longitude`** | Parsed from **`address.latitude`** / **`address.longitude`**. |
| **`bedrooms`** | **`bedroom-count`**. |
| **`bathrooms`** | **`bathrooms-total-count`** (fallback **`bathroom-count`**). |
| **`carSpaces`** | Sum of garage + covered + other parking counts when any present. |
| **`propertyFeatures`** | Map of feature-string arrays; often **`generalFeatures`** from **`attributes.features`** (empty **`{}`** if none). |
| **`description`** | Full description with HTML stripped to plain text. |
| **`featured`** | **`true`** if **`is-featured`** or **`is-super-featured`**. |
| **`constructionStatus`** | **`new`** if **`is-new-construction`**, else **`established`**. |
| **`agencyListingId`** | Agency reference (**`listing-no`**). |
| **`modifiedDate`** | **`published-date`** or **`created-date`** from the API. |
| **`dateSold`** | **`null`** until sold-date parsing is implemented. |
| **`signature`** | **`true`** when **`is-showcased`**. |
| **`productDepth`** | Reserved; empty string (no NZ analogue mapped yet). |
| **`channel`** | **`buy`**, **`rent`**, or **`sold`** (from category + status heuristics). |
| **`url_slug`** | Path after domain (**`website-slug`** without leading slash). |
| **`isSold`** / **`isBuy`** / **`isRent`** | Booleans aligned with **`channel`**. |
| **`isProject`** | **`false`** for current NZ mapper. |
| **`tier_signature`** | Mirrors showcase / signature-style flags (**`is-showcased`**). |
| **`tier_midtier`** | Not used on NZ; **`false`**. |
| **`tier_standard`** | **`true`** when featured tier applies. |
| **`tier_isClassicProject`** / **`tier_isSignatureProject`** / **`tier_isProject`** | AU parity columns; **`false`** unless extended. |
| **`isExactMatch`** / **`isSurroundingMatch`** | **`null`** (search-context fields; not on detail card). |
| **`url`** | Public listing URL (**`website-full-url`**). |
| **`inspections`** | Copy of **`open-homes`** when present. |
| **`statementOfInformation`** | **`null`** (AU-specific PDF link not mapped for NZ). |
| **`agencyName`** | Office name from included **`office`** resource. |
| **`agencyPhone`** / **`agencyEmail`** | Office contact fields. |
| **`agencyWebsite`** | Not populated from current JSON:API slice; may be empty. |
| **`agencyAddress`** / **`agencyAddress_*`** / **`agencyAddress_raw`** | Flattened office address (often empty if not in payload). |
| **`agencyProfileUrl`** | **`null`** if no profile link extracted. |
| **`agencyLogo`** | Resolved logo URL on **`mediaserver.realestate.co.nz`**. |
| **`agents`** | Array of agent objects (see below). |
| **`images`** | Absolute photo URLs (**`.crop.800x600.jpg`** on mediaserver). |
| **`scrapedAt`** | ISO time when the row was pushed. |
| **`originalSearchUrl`** | NZ **`www`** search URL that started this branch. |
| **`statusCode`** | HTTP status of **`GET …/listings/{id}`** (e.g. **200**). |
| **`apiRequestUrl`** | Exact **listing** detail URL (not the public **`url`**). |
| **`flattenOutput`** | **`true`** when input had flattening enabled. |
| **`nzListingResponse`** | **Full** JSON:API body for **`GET /search/v1/listings/{id}`** (omitted in sample). |
| **`listingFibreResponse`** | **Full** fibre JSON:API body when fibre HTTP **200**; **`null`** if fibre failed. |
| **`fibreStatusCode`** | HTTP status of the fibre request (**`0`** if request failed before response). |
| **`fibreApiRequestUrl`** | Exact **`…/listing-fibre`** URL. |
| **`rawResponse`** | Same as **`nzListingResponse`** (compatibility alias). |
| **`listing`** | Nested object with **`title`**, **`price.display`**, structured **`address`**, **`features.general`** `{ value, type, label }` blocks, etc. (omitted in sample). |
| **`landSize`** / **`landSizeUnit`** | Land area **`land-area`** and unit (**`SQM`**, **`m2`**, …) when present. |
| **`hasOnt`** | Fibre: ONT present (**`has-ont`**). |
| **`currentConnection`** | Fibre: current connection tier string or **`null`**. |
| **`standardInstall`** | Fibre: **`standard-install`**. |
| **`ontUpgradeLink`** / **`standardInstallLink`** | Chorus / install help URLs. |
| **`fibreProductCount`** | Number of plans in **`fibreProducts`**. |
| **`fibreProducts`** | Array of plan objects (**`id`**, **`name`**, speeds, **`priceCents`**, **`available`**, **`requiresOntUpgrade`**). |
| **`lister`** | First element of **`agents`** (convenience). |

##### NZ — each key inside **`agents[]`** / **`lister`**

| Key | Meaning |
|-----|---------|
| **`agentId`** | Agent resource id from JSON:API. |
| **`name`** | Display name. |
| **`jobTitle`** | Empty if not provided by NZ payload. |
| **`phoneNumber`** | Mobile preferred, else DDI. |
| **`emails`** | Array of email strings. |
| **`powerProfile`** | **`false`** (AU parity; NZ may not expose equivalent). |
| **`profileUrl`** | **`https://www.realestate.co.nz/agent/{slug}/`**. |
| **`image`** | Agent photo URL on mediaserver. |

##### NZ — each key inside **`fibreProducts[]`**

| Key | Meaning |
|-----|---------|
| **`id`** | JSON:API resource id for the plan. |
| **`name`** | Retail plan name. |
| **`upSpeedMbps`** / **`downSpeedMbps`** | Advertised sync speeds. |
| **`priceCents`** | Monthly-style price in **cents** (ISP plan, not property price). |
| **`available`** | Whether the plan is offered for this address. |
| **`requiresOntUpgrade`** | Whether an ONT upgrade is required. |

***

#### Sample: `realestate_detail` (first object in `data.json`)

The JSON below is based on the **first record** of a real export. **`listing`**, **`withIdsResponse`**, and long **`images`** arrays are **omitted** here for size; the on-disk file contains the **full** nested objects. **`_readme_note`** is documentation-only and does not appear in live output.

```json
{
    "source": "realestate_detail",
    "listingId": "441571884",
    "title": "1 BEDROOM APARTMENT DARLING HABOUR VIEW @HAYMARKET",
    "propertyType": "unit",
    "price": "$900 per week",
    "address": "Address available on request",
    "suburb": "Sydney",
    "postcode": "2000",
    "state": "NSW",
    "latitude": null,
    "longitude": null,
    "bedrooms": 1,
    "bathrooms": 1,
    "carSpaces": 0,
    "propertyFeatures": {},
    "description": "Perfect for Couples or Friends \n\nThis versatile bed can be easily split into two…",
    "featured": false,
    "constructionStatus": "",
    "agencyListingId": "32AFEDF4-6156-4C0A-B412-877FC1A360BA",
    "productDepth": "signature",
    "channel": "rent",
    "url_slug": "property-unit-nsw-sydney-441571884",
    "isSold": false,
    "isBuy": false,
    "isRent": true,
    "isProject": false,
    "tier_signature": true,
    "tier_midtier": false,
    "tier_standard": false,
    "tier_isClassicProject": false,
    "tier_isSignatureProject": false,
    "tier_isProject": false,
    "isExactMatch": null,
    "isSurroundingMatch": null,
    "url": "https://www.realestate.com.au/property-unit-nsw-sydney-441571884",
    "inspections": [],
    "statementOfInformation": null,
    "agencyName": "Bondi Beach International Agency",
    "agencyPhone": "02 412468335",
    "agencyEmail": "rosio@bbiagency.com.au",
    "agencyWebsite": "",
    "agencyAddress": "Shop 3, 11-21 Flinders Street, Surry Hills, NSW, 2010",
    "agencyAddress_streetAddress": "Shop 3, 11-21 Flinders Street",
    "agencyAddress_suburb": "Surry Hills",
    "agencyAddress_state": "NSW",
    "agencyAddress_postcode": "2010",
    "agencyAddress_raw": {
        "streetAddress": "Shop 3, 11-21 Flinders Street",
        "suburb": "Surry Hills",
        "state": "NSW",
        "postcode": "2010"
    },
    "agencyProfileUrl": "https://www.realestate.com.au/agency/bondi-beach-international-agency-YMPIPK",
    "agencyLogo": "https://i3.au.reastatic.net/160x30/97d210b8fb2e818b4395402385458b66ca52dbb7de4a0b5ebd7e852754042e83/logo.jpg",
    "agents": [
        {
            "agentId": "2362406",
            "name": "Rosio Flynn",
            "jobTitle": "Director",
            "phoneNumber": "0412468335",
            "emails": ["rosio@bbiagency.com.au"],
            "powerProfile": false,
            "profileUrl": "https://www.realestate.com.au/agent/2362406",
            "image": "https://i3.au.reastatic.net/160x160/22650177724dfe89c0e697c50c8cd6169fb42ee392f826ceb11f98c37c41f18e/main.jpg"
        }
    ],
    "images": [
        "https://i3.au.reastatic.net/800x600-fit,format=webp/c3008b05521617c72ae1dc68fd5f807127821612e628bae00fdec7028c9b4c6f/image.jpg",
        "https://i3.au.reastatic.net/800x600-fit,format=webp/c3cb58b454deba92246fdac094d3fbcb0b75502cdd772f581ce254680ca82d95/image.jpg"
    ],
    "scrapedAt": "2026-04-04T22:10:04.036Z",
    "originalSearchUrl": "https://www.realestate.com.au/rent/property-unit+apartment-villa-in-sydney+cbd,+nsw/list-1?maxBeds=3&source=refinement",
    "statusCode": 200,
    "apiRequestUrl": "https://services.realestate.com.au/services/listings/withIds?id=441571884",
    "_readme_note": "Omitted here: full `listing` object, full `withIdsResponse`, and remaining `images` URLs — all present in live dataset when flattenOutput is true."
}
```

***

#### Output fields (`realestate_detail`) — field-by-field

##### Row identity and request metadata

- **`source`** — Always **`"realestate_detail"`** for listing rows from this actor.
- **`listingId`** — REA **numeric listing id** (string), same id used in **`withIds`**.
- **`scrapedAt`** — ISO **timestamp** when the row was pushed to the dataset.
- **`originalSearchUrl`** — The **`www.realestate.com.au`** URL from input that started this crawl branch (search/list page or direct property URL); **`null`** if not set.
- **`statusCode`** — HTTP **status** of the **`withIds`** response (**200** when OK).
- **`apiRequestUrl`** — Exact **`withIds`** request URL for this row (includes **`id=`** query).

##### Flat property core (convenience columns)

- **`title`** — Listing **headline** from the API (same idea as on the website card).
- **`propertyType`** — REA **property type** string (e.g. **`unit`**, **`house`**, **`residential land`**).
- **`price`** — Human-readable **display price** from **`price.display`** (e.g. **`$900 per week`**, **`Price on Application`**).
- **`address`** — **Street / unit line** from **`address.streetAddress`** (may be **“Address available on request”**).
- **`suburb`** — **Suburb** (from **`address.suburb`** or **`address.locality`**).
- **`postcode`** — **Postcode** (from **`address.postcode`** or **`address.postCode`**).
- **`state`** — **State** (e.g. **`NSW`**, **`Vic`**).
- **`latitude`** / **`longitude`** — Coordinates from **`address.location`** when present; else **`null`**.
- **`bedrooms`** / **`bathrooms`** / **`carSpaces`** — From **`features.general`** (**`bedrooms`**, **`bathrooms`**, **`parkingSpaces`**).
- **`propertyFeatures`** — Object grouping **feature strings** by section from **`propertyFeatures[]`** (e.g. **`indoorFeatures`**, **`outdoorFeatures`**). Empty **`{}`** when none.
- **`description`** — **Plain text** description (**HTML `<br/>`** collapsed to newlines in the flat export).
- **`featured`** — **`true`** when the card is marked **featured** in the API.
- **`constructionStatus`** — e.g. **`established`** when provided; may be **empty string** if absent.
- **`agencyListingId`** — Agency’s **internal listing reference** (string or UUID-style).
- **`productDepth`** — REA **product tier** string for the card (e.g. **`standard`**, **`signature`**).
- **`channel`** — **`buy`**, **`rent`**, or **`sold`** (from API).
- **`url_slug`** — **`prettyUrl`** slug segment (used in canonical property paths).
- **`url`** — **Canonical property URL** on **`www.realestate.com.au`** (from **`_links.prettyUrl.href`** when available).
- **`inspections`** — Copy of **`inspectionsAndAuctions`** from the API (often **`[]`**).
- **`statementOfInformation`** — **URL string** for PDF / statement when **`statementOfInformation.href`** exists; else **`null`**.
- **`landSize`** / **`landSizeUnit`** — Present on **land** listings when **`landSize.value`** exists (e.g. **`80900`**, **`m2`**); omitted on non-land rows.

##### Boolean flags (flat)

- **`isSold`** / **`isBuy`** / **`isRent`** — From **`isSoldChannel`**, **`isBuyChannel`**, **`isRentChannel`**.
- **`isProject`** — From API **`isProject`** when present.
- **`tier_signature`** / **`tier_midtier`** / **`tier_standard`** — From **`signature`**, **`midtier`**, **`standard`** booleans on the card.
- **`tier_isClassicProject`** / **`tier_isSignatureProject`** — From **`classicProject`**, **`signatureProject`**.
- **`tier_isProject`** — Mirrors **`isProject`** in the flat mapper.
- **`isExactMatch`** / **`isSurroundingMatch`** — **`null`** in **`withIds`** output (those flags apply to **search** context; not returned on the detail card).

##### Agency (flat)

- **`agencyName`** — Office **name**.
- **`agencyPhone`** — **Phone** string.
- **`agencyEmail`** — **Email** when provided.
- **`agencyWebsite`** — **Website** URL; may be **empty string** if missing.
- **`agencyAddress`** — Single **comma-joined** office address line.
- **`agencyAddress_streetAddress`** / **`agencyAddress_suburb`** / **`agencyAddress_state`** / **`agencyAddress_postcode`** — Split office address parts.
- **`agencyAddress_raw`** — Object with the same four parts for machine parsing.
- **`agencyProfileUrl`** — Link to the **agency profile** on realestate.com.au.
- **`agencyLogo`** — Resolved **logo image URL** (default size variant when multiple exist).

##### Agents (flat array)

- **`agents`** — Array of **agent** objects (from **`listers`** / **`lister`**). Each element:
  - **`agentId`** — REA **agent id**.
  - **`name`** — Display **name**.
  - **`jobTitle`** — **Role** / title.
  - **`phoneNumber`** — Best available **phone** (mobile or office).
  - **`emails`** — Array of **email** strings (often one).
  - **`powerProfile`** — REA **power profile** flag.
  - **`profileUrl`** — **Agent profile** URL.
  - **`image`** — **Photo** URL (**160×160** transform on CDN).

##### Images (flat)

- **`images`** — Array of **absolute** photo URLs (**800×600**, **webp** transform). **Hero / main** image is **prepended** when **`mainImage`** exists; duplicates removed.

##### `listing` (full API card — nested object)

When **`flattenOutput`** is **`true`**, **`listing`** is the **complete** first (and only) listing object from **`withIds`** **`results[0]`** — same schema REA returns for a property card. Top-level keys you will typically see (names only may vary slightly by listing type):

- **`prettyUrl`** — Slug path segment for the property.
- **`standard`** / **`midtier`** / **`signature`** — Listing **tier** flags.
- **`lister`** — Primary **agent** object (**`id`**, **`name`**, **`email`**, phones, **`mainPhoto`**, **`_links`** to profile).
- **`listers`** — Array of **all** agents on the listing (when multiple).
- **`featured`** — Featured flag.
- **`_links`** — **HAL-style** links: **`prettyUrl`**, **`self`** (services listing URL), **`short`**, **`contactAgent`**, **`calculator`**, **`marketInfo`**, ad / tracking templates, etc. Some **`href`** values are **templated** (`{width}`, `{platform}`, …).
- **`channel`** — **`buy` | `rent` | `sold`**.
- **`description`** — Raw **HTML** description (**`<br/>`** etc.).
- **`showAgencyLogo`** — Whether the UI shows agency branding prominently.
- **`title`** — Title string.
- **`features`** — Structured **`general`** counts (**`bedrooms`**, **`bathrooms`**, **`parkingSpaces`**, …) and any other feature blocks REA includes.
- **`generalFeatures`** — Labelled **feature** entries (**`bedrooms`**, **`bathrooms`**, …) with **`label`**, **`type`**, **`value`**.
- **`price`** — **`display`** and any other **price** subfields REA returns.
- **`propertyType`** — Type string.
- **`productDepth`** — Product depth (**`standard`**, **`signature`**, …).
- **`calculator`** — **Mortgage / rent calculator** UI block (**`title`**, **`subtitle`**, **`brandingColors`**, **`_links.callToAction`**, …).
- **`images`** — Array of **`{ server, name, uri }`** (and optional flags like **`resize`**) — **not** the same as the flat **`images`** URLs; join **`server` + uri** for raw CDN paths.
- **`mainImage`** — Primary **hero** image descriptor (**`server`**, **`uri`**).
- **`address`** — Full **address** object: **`streetAddress`**, **`suburb`**, **`locality`**, **`postcode`**, **`postCode`**, **`state`**, **`subdivisionCode`**, **`location`** (**`latitude`**, **`longitude`**), **`showAddress`**, etc.
- **`classicProject`** / **`signatureProject`** — Project-related flags when applicable.
- **`agency`** — Full **agency** object: **`name`**, **`phoneNumber`**, **`email`**, **`website`**, **`address`**, **`brandingColors`**, **`branded`**, **`agencyId`**, **`logo`** (**`images[]`**, **`links`**), **`_links`** (**`agencyProfile`**, …).
- **`isSoldChannel`** / **`isBuyChannel`** / **`isRentChannel`** — Channel booleans.
- **`agencyListingId`** — Agency listing id.
- **`listingId`** — Numeric listing id (string or number in JSON).
- **`propertyFeatures`** — Array of **`{ section, label, features[] }`** blocks (source for flat **`propertyFeatures`**).
- **`inspectionsAndAuctions`** — Inspection / auction schedule entries when present.
- **`dateAvailable`** — For **rent**, often **`{ date, dateDisplay }`** when provided.
- **`landSize`** — For **land**, **`{ value, unit, display, … }`** when present.
- **`modifiedDate`** — Change metadata when REA sends it.
- **`applyOnline`** — Apply-online flag when present.
- **Other occasional keys** — REA may add fields (e.g. **project** links, **eco** data); they appear here unchanged.

##### `withIdsResponse` (full API envelope)

- **`totalResultsCount`** — Number of listings in this **`withIds`** response (usually **1** for a single **`id`**).
- **`results`** — Array of **listing** objects; for our actor typically **one** element, **identical in content** to **`listing`** when both are present.

##### When **`flattenOutput`** is **false**

Rows include **`source`**, **`listingId`**, **`url`** (request URL), **`statusCode`**, **`originalSearchUrl`**, **`scrapedAt`**, **`listing`** (or full body fallback), and **`withIdsResponse`**, without the duplicate flat competitor-style fields above.

***

### Benefits

- **One row per listing** with **flat columns** for quick filters **plus** full nested payloads (**AU**: **`withIdsResponse`**; **NZ**: **`nzListingResponse`** / **`listingFibreResponse`**).
- **Official JSON APIs** for listing data (AU **services**; NZ **platform** — HTML only once per NZ search seed for suburb ids).
- **Pagination** — AU via **`_links.next`**; NZ via **`page[offset|limit]`** — both with a **hard cap** on search pages (**`REALESTATE_MAX_SEARCH_PAGES`**).
- **Traceability**: **`originalSearchUrl`**, **`apiRequestUrl`**, **`scrapedAt`**, **`country`**, **`source`**.

***

### Why Choose This Actor?

Built for **Australian** and **New Zealand** residential (and related) research: **realestate.com.au** and **realestate.co.nz**, **pagination**, and **rich listing payloads** for **analytics**, **alerts**, or **CRM** enrichment.

**Use cases:**

- Track new / changed listings for a **saved search** URL (AU or NZ).
- Export **agency + agent + media** with **coordinates** when exposed.
- Store **raw JSON** (**`withIdsResponse`** / **`nzListingResponse`**) for schema changes without losing fields.
- **NZ**: Optional **fibre / broadband plan** data per listing alongside the property card.

***

### Technical Implementation

**Default (internal Impit handler — `main.ts` + `internal-handler.ts`):**

1. **URL routing** (`realestate-mapper.ts`, **`realestate-nz-mapper.ts`**, **`main.ts`**): AU **`.com.au`** vs NZ **`.co.nz`** hosts; shared dedupe **`pushedListingIds`** across seeds.
2. **AU** (`internal-handler.ts`): Search chain **`buildSearchByUrlApiUrl`** → **`extractListingIdsFromSearchJson`** → **`fetchAndPushDetail`** (**`buildWithIdsApiUrl`**). Flat rows from **`buildRealestateFlatListingRow`** (`realestate-flat-export.ts`).
3. **NZ** (`internal-handler-nz.ts`): Search chain loads **HTML** for suburb ids → **`buildNzListingsSearchApiUrl`** → ids from **`data[]`** → **`Promise.all`** per listing: **`buildNzListingFullApiUrl`** + **`buildNzListingDetailApiUrl`** (fibre). Flat rows from **`buildNzPropertyListingFlatRow`** (`realestate-nz-listing-flat-export.ts`); fibre columns from **`appendNzFibreFlatFields`** (`realestate-nz-flat-export.ts`).

**Optional Cheerio path (`REALESTATE_USE_INTERNAL_HANDLER=0`):**

1. **CheerioCrawler** requests (`main.ts`) with **`userData`** (**`maxItems`**, **`flattenOutput`**, **`realestateOriginalUrl`**, …).
2. **Search handler** (`routes.ts` — **`REALESTATE_SEARCH`**): **`tieredResults`**, enqueue **`REALESTATE_DETAIL`**, **`_links.next`**, **`maxItems`**, **`REALESTATE_MAX_SEARCH_PAGES`**.
3. **Detail handler** (`routes.ts` — **`REALESTATE_DETAIL`**): **`withIds`** JSON; **`buildRealestateFlatListingRow`** + **`withIdsResponse`** when **`flattenOutput`**.

***

### Explore More Scrapers

If you found this actor useful, check out other scrapers at [memo23's Apify profile](https://apify.com/memo23).

***

### Support

- For issues or feature requests, use the **Issues** section of this actor on Apify.
- For further assistance, contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

***

### Additional Services

- Request customization or a full dataset: <muhamed.didovic@gmail.com>
- Need other platforms scraped? Contact <muhamed.didovic@gmail.com>
- For API services of this actor, reach out to <muhamed.didovic@gmail.com>
- Custom integrations and automation solutions available

# Actor input Schema

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

Scrape by URLs of realestate search or property pages. All options in the **Search by filters** section will be ignored when at least one URL is provided here (or in **`extraStartUrls`** / **`ttt`**). Instead of using structured filters, you can configure the search directly on the website, copy the final filtered URL from your browser, and paste it here. **Australia:** buy/rent/sold list pages or property URLs on `https://www.realestate.com.au/` (`/find-agent/...` and `/agent/...` are skipped). **New Zealand:** residential/rural/commercial search or listing URLs on `https://www.realestate.co.nz/`. For each NZ listing the actor calls **`GET …/search/v1/listings/{id}`** and **`GET …/listings/{id}/listing-fibre`**. Env `REALESTATE_MAX_SEARCH_PAGES` (default 500) caps search pages per chain.

## `searchByFilters` (type: `object`):

Instead of scraping by URLs, search for listings using one shared location filter. If you use filters, leave the **Start URLs** section empty. The actor compiles this form into one website search URL and then scrapes that result page. **AU:** `cityOrRegion` is usually the state / region (for example `VIC`) and `district` is the market / city label (for example `Melbourne - Northern Region`). **NZ:** `cityOrRegion` = region, `district` = district / city, and `suburb` = suburb (all three are required). **NZ `sold`** is not supported and will be skipped.

## `flattenOutput` (type: `boolean`):

When enabled (default): **Australia** — flat columns, full `listing`, and `withIdsResponse`. **New Zealand** — flat fibre fields (`hasOnt`, `currentConnection`, `fibreProducts`, …) plus full `rawResponse`. When disabled, NZ items use `attributes` + `rawResponse` only (no wide flat fields).

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

Maximum listings **per listing-search URL**. Direct property URLs always fetch one listing. Total rows can be up to `(listing search URLs × maxItems) + (property URLs)`.

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

Maximum concurrent requests.

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

Minimum concurrent requests.

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

Retries per failed request (includes HTTP 429 / 502 / 503 and 5xx from REA). Optional env REALESTATE\_RETRY\_BACKOFF\_MS (default 2500) sets the base delay; waits grow exponentially between attempts.

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

Proxy settings for the crawler.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.realestate.co.nz/residential/sale/auckland/auckland-city/blockhouse-bay",
    "https://www.realestate.com.au/buy/between-0-125000-in-melbourne+-+northern+region,+vic/list-1?source=refinement",
    "https://www.realestate.com.au/sold/property-land-between-0-50000-in-adelaide+-+greater+region,+sa/list-1?source=refinement",
    "https://www.realestate.com.au/rent/property-unit+apartment-villa-in-sydney+cbd,+nsw/list-1?maxBeds=3&source=refinement"
  ],
  "searchByFilters": {
    "country": "NZ",
    "channel": "rent",
    "cityOrRegion": "Auckland",
    "district": "Auckland City",
    "suburb": "Blockhouse Bay"
  },
  "flattenOutput": true,
  "maxItems": 10000,
  "maxConcurrency": 100,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.realestate.co.nz/residential/sale/auckland/auckland-city/blockhouse-bay",
        "https://www.realestate.com.au/buy/between-0-125000-in-melbourne+-+northern+region,+vic/list-1?source=refinement",
        "https://www.realestate.com.au/sold/property-land-between-0-50000-in-adelaide+-+greater+region,+sa/list-1?source=refinement",
        "https://www.realestate.com.au/rent/property-unit+apartment-villa-in-sydney+cbd,+nsw/list-1?maxBeds=3&source=refinement"
    ],
    "searchByFilters": {
        "country": "NZ",
        "channel": "rent",
        "cityOrRegion": "Auckland",
        "district": "Auckland City",
        "suburb": "Blockhouse Bay"
    },
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/realestate-au-listings").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.realestate.co.nz/residential/sale/auckland/auckland-city/blockhouse-bay",
        "https://www.realestate.com.au/buy/between-0-125000-in-melbourne+-+northern+region,+vic/list-1?source=refinement",
        "https://www.realestate.com.au/sold/property-land-between-0-50000-in-adelaide+-+greater+region,+sa/list-1?source=refinement",
        "https://www.realestate.com.au/rent/property-unit+apartment-villa-in-sydney+cbd,+nsw/list-1?maxBeds=3&source=refinement",
    ],
    "searchByFilters": {
        "country": "NZ",
        "channel": "rent",
        "cityOrRegion": "Auckland",
        "district": "Auckland City",
        "suburb": "Blockhouse Bay",
    },
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/realestate-au-listings").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.realestate.co.nz/residential/sale/auckland/auckland-city/blockhouse-bay",
    "https://www.realestate.com.au/buy/between-0-125000-in-melbourne+-+northern+region,+vic/list-1?source=refinement",
    "https://www.realestate.com.au/sold/property-land-between-0-50000-in-adelaide+-+greater+region,+sa/list-1?source=refinement",
    "https://www.realestate.com.au/rent/property-unit+apartment-villa-in-sydney+cbd,+nsw/list-1?maxBeds=3&source=refinement"
  ],
  "searchByFilters": {
    "country": "NZ",
    "channel": "rent",
    "cityOrRegion": "Auckland",
    "district": "Auckland City",
    "suburb": "Blockhouse Bay"
  },
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/realestate-au-listings --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RealEstate[com.au & co.nz] 💰$1💰 Search By URLs and Keywords",
        "description": "realestate.com.au listings from official services APIs. Input: buy/rent/sold list URLs or direct property pages. Output: one row per listing with flat columns (title, price, agents, images, address) plus full listing and withIdsResponse; includes originalSearchUrl and apiRequestUrl.",
        "version": "0.0",
        "x-build-id": "9SlOvx8Alm66Ckear"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~realestate-au-listings/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-realestate-au-listings",
                "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~realestate-au-listings/runs": {
            "post": {
                "operationId": "runs-sync-memo23-realestate-au-listings",
                "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~realestate-au-listings/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-realestate-au-listings",
                "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": "Start URLs",
                        "type": "array",
                        "description": "Scrape by URLs of realestate search or property pages. All options in the **Search by filters** section will be ignored when at least one URL is provided here (or in **`extraStartUrls`** / **`ttt`**). Instead of using structured filters, you can configure the search directly on the website, copy the final filtered URL from your browser, and paste it here. **Australia:** buy/rent/sold list pages or property URLs on `https://www.realestate.com.au/` (`/find-agent/...` and `/agent/...` are skipped). **New Zealand:** residential/rural/commercial search or listing URLs on `https://www.realestate.co.nz/`. For each NZ listing the actor calls **`GET …/search/v1/listings/{id}`** and **`GET …/listings/{id}/listing-fibre`**. Env `REALESTATE_MAX_SEARCH_PAGES` (default 500) caps search pages per chain.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchByFilters": {
                        "title": "Search by filters",
                        "required": [
                            "country",
                            "channel"
                        ],
                        "type": "object",
                        "description": "Instead of scraping by URLs, search for listings using one shared location filter. If you use filters, leave the **Start URLs** section empty. The actor compiles this form into one website search URL and then scrapes that result page. **AU:** `cityOrRegion` is usually the state / region (for example `VIC`) and `district` is the market / city label (for example `Melbourne - Northern Region`). **NZ:** `cityOrRegion` = region, `district` = district / city, and `suburb` = suburb (all three are required). **NZ `sold`** is not supported and will be skipped.",
                        "properties": {
                            "country": {
                                "title": "Country",
                                "description": "Target site: **AU** builds URLs on `realestate.com.au`; **NZ** builds URLs on `realestate.co.nz`.",
                                "type": "string",
                                "enum": [
                                    "AU",
                                    "NZ"
                                ],
                                "enumTitles": [
                                    "Australia",
                                    "New Zealand"
                                ],
                                "editor": "select"
                            },
                            "channel": {
                                "title": "Channel",
                                "description": "**Buy** or **rent** (and **sold** for AU only). NZ **sold** is skipped.",
                                "type": "string",
                                "enum": [
                                    "buy",
                                    "rent",
                                    "sold"
                                ],
                                "enumTitles": [
                                    "Buy",
                                    "Rent",
                                    "Sold"
                                ],
                                "editor": "select"
                            },
                            "cityOrRegion": {
                                "title": "City or region",
                                "type": "string",
                                "description": "Shared location field. AU: often state / region (for example `VIC`, `NSW`). NZ: region (for example `Auckland`, `Bay of Plenty`).",
                                "editor": "textfield"
                            },
                            "district": {
                                "title": "District",
                                "type": "string",
                                "description": "AU: market / city label (for example `Melbourne - Northern Region`). NZ: district / city (for example `Auckland City`, `Manukau City`).",
                                "editor": "textfield"
                            },
                            "suburb": {
                                "title": "Suburb",
                                "type": "string",
                                "description": "Optional for AU, recommended for NZ.",
                                "editor": "textfield"
                            }
                        }
                    },
                    "flattenOutput": {
                        "title": "Flattened output",
                        "type": "boolean",
                        "description": "When enabled (default): **Australia** — flat columns, full `listing`, and `withIdsResponse`. **New Zealand** — flat fibre fields (`hasOnt`, `currentConnection`, `fibreProducts`, …) plus full `rawResponse`. When disabled, NZ items use `attributes` + `rawResponse` only (no wide flat fields).",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Results limit",
                        "type": "integer",
                        "description": "Maximum listings **per listing-search URL**. Direct property URLs always fetch one listing. Total rows can be up to `(listing search URLs × maxItems) + (property URLs)`.",
                        "default": 10000
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "type": "integer",
                        "description": "Maximum concurrent requests.",
                        "default": 100
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "type": "integer",
                        "description": "Minimum concurrent requests.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "type": "integer",
                        "description": "Retries per failed request (includes HTTP 429 / 502 / 503 and 5xx from REA). Optional env REALESTATE_RETRY_BACKOFF_MS (default 2500) sets the base delay; waits grow exponentially between attempts.",
                        "default": 100
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings for the crawler.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
