# OneRoof Scraper — NZ Property Listings + Agents (Phone) (`haketa/oneroof-scraper`) Actor

Scrape New Zealand property listings from OneRoof with the marketing agent for each one: price, category, bedrooms, bathrooms, land area, full address, GPS, rateable value, building age and agent name + phone. Filter by search URL. No login or API key. Export JSON, CSV, Excel.

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

## Pricing

from $1.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## OneRoof Scraper — NZ Property + Agents 🇳🇿🏠

Extract **New Zealand property listings from OneRoof — with the marketing agent for every listing** — at scale, without an account or API key. Export clean JSON, CSV or Excel: **price, property type, bedrooms, bathrooms, land area, full address, GPS, rateable value (RV), building age — plus the agent's name and phone number.**

Perfect for **real-estate agent lead generation, property market research, investor sourcing and NZ housing datasets.**

***

### 🔑 What this scraper does

- 🏠 **Property listings** — houses, townhouses, apartments and more, for sale across New Zealand.
- 👤 **Marketing agents** — the agent's **name and phone number** for every listing (great for lead gen).
- 💰 **Price & RV** — the asking price/method *and* the rateable value (RV).
- 🛏️ **Property details** — bedrooms, bathrooms, car spaces, land area and building age.
- 📍 **Location** — full address, suburb, district, region and GPS coordinates.
- 🔗 **Any search** — paste a OneRoof search URL (region, price band, property type…) and paginate it automatically.

No login, no cookies to paste, no API key. Paste a search URL, press start, export.

***

### 📋 Example output

```json
{
  "id": 2517247,
  "url": "https://www.oneroof.co.nz/property/auckland/new-lynn/1-143-portage-road/6vj5u",
  "price": "Asking price $849,000",
  "listingType": "Residential for sale",
  "category": "Townhouse",
  "bedrooms": 4,
  "bathrooms": 2,
  "carspaces": 1,
  "landAreaSqm": 138,
  "address": "1/143 Portage Road, New Lynn, Waitakere City, Auckland",
  "suburb": "New Lynn",
  "region": "Auckland",
  "lat": -36.9195,
  "lng": 174.6912,
  "rateableValue": "$780,000",
  "buildingAge": "2022",
  "listingCode": "940864",
  "agents": [
    { "name": "Amish Patel", "phone": "021 025 06577", "photo": "https://s.oneroof.co.nz/image/..." }
  ],
  "scrapedAt": "2026-09-15T10:00:00.000Z"
}
```

***

### 🗂️ Fields you get

| Field | Description |
|---|---|
| `id`, `url` | Listing ID and link |
| `price` | Asking price / price method as shown |
| `listingType`, `category` | Listing type and property category |
| `bedrooms`, `bathrooms`, `carspaces` | Room and parking counts |
| `landAreaSqm`, `floorArea` | Land and floor area |
| `address`, `street`, `suburb`, `district`, `region` | Full and split address |
| `lat`, `lng` | GPS coordinates |
| `rateableValue` | Rateable value (RV) |
| `buildingAge` | Year built / age |
| `listingCode` | OneRoof listing code |
| `image` | Cover photo |
| `agents` | Marketing agents: **name, phone, photo** |
| `scrapedAt` | Scrape timestamp |

> Every listing comes with price, type, beds/baths, address, region and its marketing agent(s). Rateable value and land/floor area are included when published.

***

### 🚀 How to use

1. Click **Try for free**.
2. Browse OneRoof, apply your filters (region, price, property type…), and copy the URL from your browser.
3. Paste it into **Search URLs** (you can add several), set **Max Items** / **Max Pages**, then **Start**.
4. Export as **JSON, CSV, Excel, HTML, RSS**, or via the **Apify API**.

> **Tip:** a search URL looks like `https://www.oneroof.co.nz/search/houses-for-sale/region_auckland-35_page_1`. Change the region (and other filters) right on OneRoof, then copy the URL.

***

### 📝 Example inputs

#### 1. Auckland houses for sale

```json
{ "startUrls": ["https://www.oneroof.co.nz/search/houses-for-sale/region_auckland-35_page_1"], "maxItems": 400 }
```

#### 2. Several regions at once

```json
{
  "startUrls": [
    "https://www.oneroof.co.nz/search/houses-for-sale/region_auckland-35_page_1",
    "https://www.oneroof.co.nz/search/houses-for-sale/region_wellington-32_page_1"
  ],
  "maxItems": 1000,
  "maxPagesPerUrl": 25
}
```

***

### 💡 Popular use cases

#### 🎯 Real-estate agent lead generation

Every listing carries its marketing agent's name and phone — build targeted lists of active NZ agents by region, price band or property type.

#### 📊 Property market research

Aggregate prices, RVs, beds/baths and land areas by suburb and region to map the NZ market and spot trends.

#### 💼 Investor & buyer sourcing

Filter for the property types, regions and price bands you invest in, with RV and building age to assess deals fast.

#### 🏷️ Pricing & CMA support

Pull comparable listings with price, RV and property details to support comparative market analyses.

#### 🤖 AI, LLM & data products

Feed clean, structured NZ property + agent data into your own models, dashboards or products.

***

### 👥 Who uses this

- **Agencies, recruiters & vendors** generating leads from active NZ agents.
- **Analysts & researchers** studying the New Zealand property market.
- **Investors & buyers' agents** sourcing and comparing listings.
- **Developers & AI builders** who need NZ property data via API.

***

### 🎛️ Options

- **Search URLs** — one or more OneRoof search URLs (paginated automatically).
- **Max Items** — cap total listings (`0` = unlimited).
- **Max Pages per URL** — pages per search URL (`0` = all; about 40 listings per page).
- **Proxy** — Apify Proxy is enabled by default and just works.

***

### ❓ FAQ

**Do I need an account or API key?**
No. Paste a search URL and run — no login, no key.

**Do I really get the agent's phone number?**
Yes. Each listing includes its marketing agent(s) with name and phone number, plus a photo where available.

**How do I target a specific region or filter?**
Set the filters on OneRoof itself, then copy the resulting search URL into **Search URLs**. The scraper paginates it for you.

**What is the RV?**
The rateable value — the council's valuation of the property, useful alongside the asking price for context.

**How many listings can I get?**
As many as the search returns, paged 40 at a time. Use `maxItems` / `maxPagesPerUrl` to control volume, or set them to `0` for everything.

**What export formats are supported?**
JSON, CSV, Excel, HTML table, RSS, and the Apify API. Connect to Make, Zapier, Google Sheets, Slack, webhooks or an MCP server.

**Is the data structured and clean?**
Yes. Each listing is a flat, typed JSON object (agents as a nested list), de-duplicated by ID.

***

### 🔌 Integrations

- Export to **JSON, CSV, Excel, HTML, RSS**.
- Pull via the **Apify API** or client libraries (JavaScript, Python).
- Connect to **Make, Zapier, Google Sheets, Slack, webhooks** and more.
- Use from an **MCP server** in your AI agent / LLM workflow.
- Schedule recurring runs with the **Apify Scheduler** to catch new listings.

***

### ⚖️ Legal & responsible use

This scraper collects **publicly available** listing information only — the same data any visitor can see on OneRoof without logging in. It does not access private messages, accounts, or anything behind authentication.

You are responsible for how you use the collected data. Please:

- Respect OneRoof's Terms of Service and all applicable laws, including New Zealand's Privacy Act.
- Use any personal or company data (including agent contact details) lawfully and only for legitimate purposes.
- Avoid excessive request rates and scrape responsibly.

This tool is provided for lawful purposes such as market research, lead generation and business intelligence. It is not affiliated with, endorsed by, or connected to OneRoof.

# Actor input Schema

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

OneRoof search result URLs to scrape (each is paginated automatically). Browse OneRoof, apply filters (region, price, beds…), copy the URL and paste it here. Example: https://www.oneroof.co.nz/search/houses-for-sale/region\_auckland-35\_page\_1

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

Maximum number of listings to collect across all search URLs. 0 = unlimited.

## `maxPagesPerUrl` (type: `integer`):

How many result pages to scrape per search URL (each page has about 40 listings). 0 = all available pages.

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

Datacenter proxy works out of the box.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.oneroof.co.nz/search/houses-for-sale/region_auckland-35_page_1"
    }
  ],
  "maxItems": 200,
  "maxPagesPerUrl": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open to view and export all scraped listings (JSON, CSV, Excel).

# 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": [
        {
            "url": "https://www.oneroof.co.nz/search/houses-for-sale/region_auckland-35_page_1"
        }
    ],
    "maxItems": 200,
    "maxPagesPerUrl": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/oneroof-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": [{ "url": "https://www.oneroof.co.nz/search/houses-for-sale/region_auckland-35_page_1" }],
    "maxItems": 200,
    "maxPagesPerUrl": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/oneroof-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.oneroof.co.nz/search/houses-for-sale/region_auckland-35_page_1"
    }
  ],
  "maxItems": 200,
  "maxPagesPerUrl": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/oneroof-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/oneroof-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UVVF3fHnQAb4wepr7/builds/hGEoBEdUJNIXbfO03/openapi.json
