# Harcourts Scraper (`crawlerbros/harcourts-scraper`) Actor

Scrape Harcourts Australia and New Zealand property listings (buy, rent, sold) and agent/office profiles. Filter by country, state/region, listing type, and location, or fetch specific listing or agent profile URLs directly. Extracts price, address, bedrooms, bathrooms, car spaces, photos, agent

- **URL**: https://apify.com/crawlerbros/harcourts-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Agents, Automation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Harcourts Scraper – AU & NZ Property Listings & Agents

Scrape **buy, rent, and sold** property listings — and agent/office profiles — from [Harcourts Australia](https://harcourts.net/au/listings) and [Harcourts New Zealand](https://harcourts.net/nz/listings), one of Australasia's largest real estate networks. Extract price, address, bedrooms, bathrooms, car spaces, land size, photos, agent details (name, phone, email, bio, active listings), and office information. No login or API key required.

### What data you can get

#### Property listing records

| Field | Description |
|---|---|
| `url` | Full listing URL |
| `listingId` | Harcourts listing ID (e.g. `l28432594`) |
| `propertyId` | Internal property/card ID (searchListings mode; not always present) |
| `listingType` | `buy`, `rent`, or `sold` |
| `country` | `au` or `nz` |
| `headline` | Property marketing title |
| `price` | Asking price, rent, or sold price |
| `address` | Full street address |
| `street`, `suburb`, `postcode` | Address components |
| `state` | Australian state/territory abbreviation (AU listings only — NZ addresses don't carry a real region in the source data, so this is omitted rather than faked) |
| `bedrooms` | Number of bedrooms |
| `bathrooms` | Number of bathrooms |
| `carSpaces` | Garage / car space count |
| `landSize` | Land area (e.g. `443 m²`, `1.2 ha`) |
| `description` | Property marketing description |
| `heroImage` | Main property photo URL (1000×750) |
| `photos` | All gallery photo URLs (800×600) |
| `badge` | Status badge (Just Listed, Auction, Sold) |
| `agentName` | Listing agent name |
| `agentPhotoUrl` | Agent photo URL |
| `agentUrl` | Agent's Harcourts profile URL |
| `agentPhone` | Agent contact number (may be partially masked on listing cards) |
| `officeName` | Harcourts office name |
| `officeSlug` | Office URL slug |
| `scrapedAt` | ISO 8601 scrape timestamp |

> **Note:** `bedrooms`, `bathrooms`, `carSpaces`, `landSize`, `description`, and full `photos` are only populated when **Fetch full listing details** is enabled (or automatically, when using `getByUrl` mode on a listing URL).

#### Agent / office profile records (`getByUrl` mode on a `/people/` URL)

| Field | Description |
|---|---|
| `recordType` | Always `"agent"` for these records |
| `agentUrl` | The profile URL you supplied |
| `agentName` | Agent's full name |
| `agentTitle` | Job title (e.g. "Business Owner/Property Representative") |
| `agentPhotoUrl` | Agent profile photo |
| `agentPhone` | Unmasked contact phone number |
| `agentEmail` | Contact email address |
| `agentBio` | Full biography text from the profile page |
| `officeName`, `officeSlug` | Harcourts office the agent belongs to |
| `listingUrls` | URLs of properties currently attributed to the agent (for sale / for rent / sold / leased) |
| `listingCount` | Number of `listingUrls` found |
| `country` | `au` or `nz` |

### How to use

#### Search listings (default)

1. Set **Mode** to `Search Listings`
2. Choose **Country**: Australia or New Zealand
3. Choose **Listing type**: For Sale, For Rent, or Recently Sold
4. Optionally filter by **State / Region** (must match the selected country)
5. Optionally enter a **Location / suburb** (e.g. `Sydney`, `Auckland CBD`)
6. Set **Max items** and optionally enable **Fetch full listing details**
7. Click **Start**

#### Fetch specific listings or agent profiles by URL

1. Set **Mode** to `Get by URL`
2. Paste one or more Harcourts listing URLs or agent/office profile URLs into **Start URLs**
3. Click **Start** — the actor detects listing vs. agent-profile URLs automatically and returns the country (`au`/`nz`) based on the URL itself

Example URL formats:

```
https://harcourts.net/au/office/west-coast/listing/l28432594-8b-wilsdon-street-queenstown-tas-7467
https://harcourts.net/au/office/west-coast/people/rodney-triffett
https://harcourts.net/nz/office/takapuna/listing/l41718705-2-3-dominion-street-takapuna-nz-0622
```

### Input parameters

| Parameter | Type | Description |
|---|---|---|
| `mode` | select | `searchListings` or `getByUrl` |
| `country` | select | `au` or `nz` (searchListings only — `getByUrl` infers it from each URL) |
| `listingType` | select | `buy`, `rent`, or `sold` (searchListings only) |
| `state` | select | AU state/territory or NZ region slug, or `all` |
| `location` | string | Suburb or city name to search within |
| `startUrls` | list | Listing or agent-profile URLs to scrape (getByUrl mode) |
| `includeDetails` | boolean | Fetch detail pages for richer data (slower) |
| `maxItems` | integer | Maximum number of records to return (1–5000) |
| `proxyConfiguration` | proxy | Optional Apify proxy settings |

### Example output

#### Property listing

```json
{
  "url": "https://harcourts.net/au/office/west-coast/listing/l28432594-8b-wilsdon-street-queenstown-tas-7467",
  "listingId": "l28432594",
  "listingType": "buy",
  "country": "au",
  "headline": "Packed With Potential and Ready for Its Next Chapter!",
  "price": "$250,000",
  "address": "8B Wilsdon Street, QUEENSTOWN, TAS 7467",
  "street": "8B Wilsdon Street",
  "suburb": "QUEENSTOWN",
  "state": "TAS",
  "postcode": "7467",
  "bedrooms": 3,
  "bathrooms": 1,
  "carSpaces": 2,
  "landSize": "443 m²",
  "heroImage": "https://listings-photos.cloudhi.io/properties/851219/21bebbab.jpg/1000x750",
  "photos": ["https://listings-photos.cloudhi.io/properties/851219/21bebbab.jpg/800x600", "..."],
  "badge": "just listed",
  "agentName": "Rodney Triffett",
  "agentPhone": "0427512***",
  "officeName": "Harcourts West Coast",
  "officeSlug": "west-coast",
  "scrapedAt": "2026-06-13T07:20:49Z"
}
```

#### Agent profile

```json
{
  "recordType": "agent",
  "agentUrl": "https://harcourts.net/au/office/west-coast/people/rodney-triffett",
  "agentName": "Rodney Triffett",
  "agentTitle": "Business Owner/Property Representative",
  "officeName": "Harcourts West Coast",
  "officeSlug": "west-coast",
  "agentPhotoUrl": "https://assets.cloudhi.io/system/team-members/ba529768-737f-4107-a804-10de5eca19bc.jpg",
  "agentPhone": "0427512242",
  "agentEmail": "hwcsales@harcourts.com.au",
  "agentBio": "Rodney Triffett is a proud local of Tasmania's West Coast...",
  "listingUrls": ["https://harcourts.net/au/office/west-coast/people/rodney-triffett/listing/l19576021-9-austin-street-queenstown-tas-7467", "..."],
  "listingCount": 13,
  "country": "au",
  "scrapedAt": "2026-07-20T12:00:00Z"
}
```

### Frequently asked questions

**Do I need an API key or login?**
No. All data is publicly available on harcourts.net without authentication.

**How many listings can I scrape?**
Up to 5,000 per run. The site typically shows 12 listings per page.

**Does it work for all Australian states?**
Yes — you can browse national results or filter by ACT, NSW, NT, QLD, SA, TAS, VIC, or WA.

**Does it work for New Zealand?**
Yes — set **Country** to New Zealand and filter by any of the 14 supported NZ regions (Northland, Auckland, Waikato, Bay of Plenty, Gisborne, Hawke's Bay, Taranaki, Manawatu-Whanganui, Wellington, Marlborough, West Coast, Canterbury, Otago, Southland), or `all` for nationwide results. NZ property records don't include a `state` field — the underlying Harcourts NZ data doesn't expose a real region per listing (it's a placeholder token), so the actor omits it rather than emitting a fake value. `suburb`, `postcode`, and the full `address` string are still populated.

**Can I scrape an agent's profile instead of a listing?**
Yes — set **Mode** to `Get by URL` and paste an agent/office profile URL (format: `https://harcourts.net/{au|nz}/office/{office}/people/{agent-slug}`). You'll get the agent's name, title, photo, phone, email, bio, and the URLs of properties currently attributed to them.

**When should I enable "Fetch full listing details"?**
Enable it when you need bedrooms, bathrooms, car spaces, land size, full description, and all gallery photos. It visits each listing's detail page, so it's slower but returns significantly more data.

**How fresh is the data?**
Data is scraped live from harcourts.net each time you run the actor.

**Can I filter by suburb?**
Yes — enter a suburb name in the **Location / suburb** field (e.g. `Bondi`, `Takapuna`). The actor uses the Harcourts location search API (for the selected country) to filter results.

**Are photos accessible?**
Yes — all photo and agent photo URLs are direct links to Harcourts' CDN (`listings-photos.cloudhi.io`, `assets.cloudhi.io`) and are publicly accessible.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. 'searchListings' browses buy/rent/sold listings with optional state/region and location filters. 'getByUrl' fetches specific listing URLs or agent/office profile URLs you provide.

## `country` (type: `string`):

Which Harcourts country site to scrape (only used in searchListings mode — getByUrl infers the country from each URL).

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

Type of property listings to scrape (only used in searchListings mode).

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

Filter listings to a specific state/territory (Australia) or region (New Zealand) — must match the selected Country. 'All' returns national results.

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

Suburb or location name to search within (e.g. 'Sydney', 'Auckland CBD'). Leave blank to browse all listings for the selected state/region.

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

List of Harcourts listing URLs or agent/office profile URLs to scrape directly (e.g. https://harcourts.net/au/office/west-coast/listing/l28432594-... or https://harcourts.net/au/office/west-coast/people/rodney-triffett).

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

When enabled, visits each listing detail page to extract description, property type, land size, and additional photos. Slower but more complete.

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

Maximum number of listings to return.

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

Optional Apify proxy settings. AUTO datacenter proxy may help if your IP is rate-limited.

## Actor input object example

```json
{
  "mode": "searchListings",
  "country": "au",
  "listingType": "buy",
  "state": "all",
  "includeDetails": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Dataset containing all scraped Harcourts property listings and agent profiles.

# 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 = {
    "mode": "searchListings",
    "country": "au",
    "listingType": "buy",
    "state": "all",
    "includeDetails": false,
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/harcourts-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 = {
    "mode": "searchListings",
    "country": "au",
    "listingType": "buy",
    "state": "all",
    "includeDetails": False,
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/harcourts-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 '{
  "mode": "searchListings",
  "country": "au",
  "listingType": "buy",
  "state": "all",
  "includeDetails": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call crawlerbros/harcourts-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/4D7scR1z5JEab3zbL/builds/e4dV0TJiylxCXd54O/openapi.json
