# OneRoof New Zealand Property Scraper (`solidcode/oneroof-co-nz-scraper`) Actor

\[💰 $4.0 / 1K] Extract New Zealand property listings from oneroof.co.nz — for sale, for rent, sold, rural, and commercial. Get prices, addresses, beds/baths, floor & land area, GPS, photos, OneRoof estimates, and agent contacts. Search by region and type, or paste OneRoof URLs.

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

## Pricing

from $4.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.
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 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

## OneRoof New Zealand Property Scraper

Pull New Zealand property listings from OneRoof at scale — prices, full addresses, beds/baths/parking, floor and land area, GPS coordinates, photo galleries, OneRoof estimates, council rating valuations, and listing-agent contacts for homes for sale, for rent, recently sold, rural, commercial, and businesses across all 20 NZ regions. Built for NZ property investors, buyer's agents, and real-estate analysts who need fresh OneRoof listing and valuation data without copy-pasting listings one card at a time.

### Why This Scraper?

- **8 listing modes in one actor** — homes for sale, for rent, recently sold, rural/lifestyle, commercial for sale, commercial for lease, and businesses for sale, switchable from a single dropdown.
- **All 20 NZ regions plus nationwide** — from Northland and Auckland to Otago and Southland, or "All New Zealand" for the whole-country feed, selected by name with no URL building.
- **OneRoof estimate and rating valuation on every row** — capture OneRoof's own property estimate (AVM), the council rating valuation (RV), and the capital value alongside the asking price for instant equity context.
- **Verified listing-agent contacts** — agent name, phone, agency/office name on every card, plus agent email and profile link when you turn on full details.
- **Mode-aware pricing fields** — `priceValue` and sale method (Auction, Tender, By Negotiation, Deadline Sale) for sale listings, `rentPerWeek` for rentals, and `soldPrice` + `soldDate` for recently sold comps.
- **GPS coordinates, floor area, and land area** — `latitude`/`longitude` plus normalised floor and section sizes on every listing, ready to map or join to your own data.
- **6 property-type filters at source** — house, apartment, townhouse, unit, section/land, or lifestyle, applied exactly at OneRoof so you only pull the type you want.
- **Full photo galleries** — every image URL for each listing, merged from the search card and the detail page and de-duplicated, with an `imageCount` for quick filtering.
- **Up to 50,000 listings per run** — smooth page-by-page collection with automatic de-duplication on listing ID, so overlapping searches never return the same property twice.

### Use Cases

**Market Research**
- Map for-sale inventory by region across all of New Zealand
- Compare asking prices to OneRoof estimates and rating valuations by suburb
- Track rural and lifestyle-block supply in growth areas
- Benchmark commercial-for-lease availability between regions

**Investment Analysis**
- Pull recently sold listings with `soldPrice` and `soldDate` for comparable-sales models
- Compare estimate, rating valuation, and capital value to spot under- and over-priced stock
- Filter by minimum bedrooms, bathrooms, and price band to match a buy-box
- Analyse weekly rent against asking price for yield estimates

**Lead Generation**
- Build listing-agent contact lists with name, phone, agency, and email
- Target agents active in a specific region or property type
- Identify agencies dominating a suburb's for-sale or rental book
- Collect agent profile links for outreach and CRM enrichment

**Comparative Market Analysis**
- Assemble suburb-level comp sets from recently sold homes
- Pair sold prices with floor and land area for price-per-square-metre views
- Cross-reference OneRoof estimates against actual sale outcomes

**Data Enrichment & Integration**
- Enrich existing property databases with current pricing, photos, and GPS
- Feed listing and valuation data into dashboards and reports
- Power alerting on new listings and price changes in target regions

### Getting Started

#### Browse Homes For Sale in a Region

The simplest run — pick a mode and a region:

```json
{
    "mode": "houses-for-sale",
    "region": "auckland-35",
    "maxResults": 50
}
````

#### Filter by Type, Bedrooms, and Price

```json
{
    "mode": "houses-for-sale",
    "region": "wellington-42",
    "propertyType": "house",
    "bedroomsMin": 3,
    "priceMin": 600000,
    "priceMax": 1200000,
    "maxResults": 200
}
```

#### Recently Sold Comparables With Full Details

```json
{
    "mode": "sold",
    "region": "canterbury-45",
    "includeDetails": true,
    "maxResults": 300
}
```

#### Paste OneRoof URLs Directly

Power-user mode — paste any OneRoof search or individual listing URL and keep the filters you built in the browser:

```json
{
    "startUrls": [
        "https://www.oneroof.co.nz/search/houses-for-sale/region_auckland-35_page_1",
        "https://www.oneroof.co.nz/property/example-listing-slug"
    ],
    "includeDetails": true,
    "maxResults": 100
}
```

### Input Reference

#### Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | select | `For Sale (residential)` | What to collect: For Sale (residential), For Rent (residential), Recently Sold, Rural / Lifestyle, Commercial — For Sale, Commercial — For Lease, or Businesses For Sale. Ignored when Start URLs are provided. |
| `region` | select | `All New Zealand` | NZ region to search — All New Zealand, Northland, Auckland, Waikato, Bay of Plenty, Coromandel, Gisborne Region, Hawke's Bay, Central North Island, Taranaki, Manawatu / Whanganui, Wairarapa, Wellington, Marlborough, Nelson Bays, West Coast, Canterbury, Central Otago / Lakes District, Otago, Southland, or Pacific Islands. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `propertyType` | select | `Any` | Filter by property category: Any, House, Apartment, Townhouse, Unit, Section / Land, or Lifestyle. Applies to residential modes. |
| `bedroomsMin` | integer | *(none)* | Keep only properties with at least this many bedrooms. Leave empty for no filter. |
| `bathroomsMin` | integer | *(none)* | Keep only properties with at least this many bathrooms. Leave empty for no filter. |
| `priceMin` | integer | *(none)* | Minimum price in NZD (weekly rent for rentals). Listings with no numeric price (e.g. "Auction") are kept. |
| `priceMax` | integer | *(none)* | Maximum price in NZD (weekly rent for rentals). Listings with no numeric price are kept. |

#### Advanced & Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | `[]` | Paste OneRoof search-result or individual listing URLs. When provided, these override the Search, Property Type, and Filters settings above. |
| `includeDetails` | boolean | `false` | Open each listing's own page to add agent email, agent profile link, full description, legal description, capital (council) value, open-home times, and the complete photo set. Slower when on. |
| `maxResults` | integer | `100` | Maximum number of listings to collect across all searches and URLs. Set 0 for unlimited (up to an internal 50,000-row ceiling). |

### Output

Each property is one flat row. Here is a representative result with full details enabled:

```json
{
    "id": "2168453",
    "url": "https://www.oneroof.co.nz/property/12-example-street-remuera-auckland",
    "mode": "houses-for-sale",
    "propertyType": "House",
    "title": "Renovated Family Home in Zone",
    "address": "12 Example Street, Remuera, Auckland",
    "suburb": "Remuera",
    "locality": "Auckland City",
    "region": "Auckland",
    "postcode": "1050",
    "priceText": "Auction (By Negotiation)",
    "priceValue": null,
    "priceMethod": "Auction",
    "bedrooms": 4,
    "bathrooms": 2,
    "parking": 2,
    "floorArea": "210 m²",
    "landArea": "650 m²",
    "latitude": -36.8765,
    "longitude": 174.7891,
    "estimatedValue": "$2,150,000",
    "ratingValuation": "$1,980,000",
    "capitalValue": "$1,980,000",
    "description": "A beautifully renovated family home in a sought-after Double Grammar zone...",
    "images": ["https://media.oneroof.co.nz/example1.jpg", "https://media.oneroof.co.nz/example2.jpg"],
    "imageCount": 24,
    "agentName": "Jane Doe",
    "agentPhone": "021 555 1234",
    "agentEmail": "jane.doe@example.co.nz",
    "agentProfileUrl": "https://www.oneroof.co.nz/profile/jane-doe",
    "agencyName": "Example Realty Ltd",
    "listedDate": "2026-05-12T00:00:00Z",
    "scrapedAt": "2026-06-26T14:30:00Z"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | OneRoof listing identifier |
| `url` | string | Direct OneRoof listing URL |
| `mode` | string | Listing mode (houses-for-sale, houses-for-rent, sold, etc.) |
| `propertyType` | string | Property category (House, Apartment, Townhouse, etc.) |
| `title` | string | Listing headline |
| `bedrooms` | number | Number of bedrooms |
| `bathrooms` | number | Number of bathrooms |
| `parking` | number | Car spaces |
| `floorArea` | string | Floor area (e.g. "210 m²") |
| `landArea` | string | Land / section area (e.g. "650 m²") |
| `listedDate` | string | Date listed (ISO) |
| `daysOnMarket` | number | Days since the listing went on the market (null when unknown) |
| `scrapedAt` | string | ISO timestamp of data extraction |

#### Address & Location

| Field | Type | Description |
|-------|------|-------------|
| `address` | string | Full display address |
| `suburb` | string | Suburb |
| `locality` | string | Locality / district / town |
| `region` | string | NZ region |
| `postcode` | string | Postal code |
| `latitude` | number | GPS latitude |
| `longitude` | number | GPS longitude |

#### Pricing & Valuation

| Field | Type | Description |
|-------|------|-------------|
| `priceText` | string | Display price (e.g. "Auction", "$1,250,000", "By Negotiation") |
| `priceValue` | number | Numeric price in NZD when parseable |
| `priceMethod` | string | Sale method (Asking Price, By Negotiation, Auction, Tender, Deadline Sale, Enquiries Over) |
| `rentPerWeek` | number | Weekly rent in NZD (rental listings) |
| `soldPrice` | number | Sale price in NZD (recently sold listings) |
| `soldDate` | string | Date sold (recently sold listings) |
| `estimatedValue` | string | OneRoof property estimate (AVM) when shown |
| `ratingValuation` | string | Council rating valuation (RV) when shown |
| `capitalValue` | string | Capital / council value when shown (full details) |

#### Media, Agent & Detail

| Field | Type | Description |
|-------|------|-------------|
| `images` | string\[] | All listing photo URLs |
| `imageCount` | number | Number of photos |
| `agentName` | string | Listing agent name |
| `agentPhone` | string | Listing agent phone |
| `agentEmail` | string | Listing agent email (full details) |
| `agentProfileUrl` | string | Agent profile URL (full details) |
| `agencyName` | string | Agency / office name |
| `description` | string | Full listing description (full details) |
| `legalDescription` | string | Legal / title description (full details) |
| `openHomes` | array | Scheduled open-home times (full details) |

### Tips for Best Results

- **Start small** — set `maxResults` to 20–50 on your first run to confirm the data matches your needs, then scale up.
- **Turn on `includeDetails` for agent email and full descriptions** — it adds agent email, profile link, legal description, capital value, open-home times, and the complete photo set, at the cost of a slower run.
- **Use `sold` mode for comparables** — recently sold listings carry `soldPrice` and `soldDate`, the gold standard for valuation and CMA work; pair with a single region for a tight comp set.
- **Set min/max price and bedrooms to focus a buy-box** — these refine results after collection, so on sparse regions a run can stop early once several pages return no matches; widen the filters or pick "All New Zealand" for more volume.
- **Listings with no numeric price are always kept** — "Auction" and "By Negotiation" properties stay in the results even when a price filter is set, so you never lose off-market stock.
- **Paste OneRoof URLs to reuse on-site filters** — build a filtered search in your browser, then drop the URL into `startUrls` to preserve every filter exactly.
- **Compare `estimatedValue` and `ratingValuation` to the asking price** — the gap between OneRoof's estimate, the council RV, and the listed price is a fast signal for spotting under- and over-priced listings.

### Pricing

**From $4.00 per 1,000 results** — undercutting comparable OneRoof actors while returning richer, cleaner data. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows the total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.48 | $0.45 | $0.43 | $0.40 |
| 1,000 | $4.80 | $4.50 | $4.30 | $4.00 |
| 10,000 | $48.00 | $45.00 | $43.00 | $40.00 |
| 100,000 | $480.00 | $450.00 | $430.00 | $400.00 |

A "result" is one property row in the output dataset. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

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

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

### Legal & Ethical Use

This actor is designed for legitimate real estate research, market analysis, and lead generation. You are responsible for complying with applicable laws and OneRoof's Terms of Service. Do not use extracted data for spam, harassment, or any unlawful purpose, and handle any personal data (such as agent contact details) in line with New Zealand's Privacy Act and other relevant regulations.

# Actor input Schema

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

Choose which kind of listings to collect. Ignored when Start URLs are provided.

## `region` (type: `string`):

New Zealand region to search. Choose 'All New Zealand' to cover the whole country.

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

Filter by property category. Choose 'Any' to include all types. Applies to residential modes; ignored for commercial, rural, and business modes.

## `bedroomsMin` (type: `integer`):

Only keep properties with at least this many bedrooms. Applied after each page is collected (OneRoof has no exact minimum-bedrooms filter in its results URL), so on sparse regions a run may stop early after several pages return no matches. Leave empty for no filter.

## `bathroomsMin` (type: `integer`):

Only keep properties with at least this many bathrooms. Applied after each page is collected (no exact bathrooms filter exists in the OneRoof results URL). Leave empty for no filter.

## `priceMin` (type: `integer`):

Only keep listings at or above this price in New Zealand dollars. For rentals this is the weekly rent. Applied after each page is collected (OneRoof only exposes bucketed price bands, not an exact minimum). Listings with no numeric price (e.g. 'Auction', 'By Negotiation') are kept. Leave empty for no minimum.

## `priceMax` (type: `integer`):

Only keep listings at or below this price in New Zealand dollars. For rentals this is the weekly rent. Applied after each page is collected (OneRoof only exposes bucketed price bands, not an exact maximum). Listings with no numeric price (e.g. 'Auction', 'By Negotiation') are kept. Leave empty for no maximum.

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

Power-user input. Paste oneroof.co.nz search-result URLs (e.g. https://www.oneroof.co.nz/search/houses-for-sale/region\_auckland-35\_page\_1) or individual listing URLs. When provided, these override the What to Collect, Region, Property Type, and Filters settings above. Any filters you set on the OneRoof site (price, beds, type) are preserved this way.

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

Open each listing's own page to add the agent email, agent profile link, full description, legal description, capital (council) value, open-home times, and the complete photo set. Turn off (the default) for faster, cheaper runs that still return everything on the search card — price, address, beds/baths/parking, area, GPS, photos, OneRoof estimate, rating valuation, and the agent's name and phone. Slower when on: it makes one extra request per listing.

## `maxResults` (type: `integer`):

Maximum number of listings to collect across all searches and URLs. Set 0 for unlimited (an internal upper limit of 50,000 rows per run still applies to prevent runaway pagination). Results are collected in full pages, so the final page may overshoot this cap by a few records.

## Actor input object example

```json
{
  "mode": "houses-for-sale",
  "region": "all-new-zealand-1",
  "propertyType": "any",
  "startUrls": [],
  "includeDetails": false,
  "maxResults": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped listings with key fields — price, beds, baths, property type, address, region, and URL.

## `details` (type: `string`):

Full per-listing fields including photos, GPS coordinates, floor/land area, OneRoof estimate, rating valuation, agent and agency contact details, and listing dates.

# 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": "houses-for-sale",
    "region": "all-new-zealand-1",
    "propertyType": "any",
    "startUrls": [],
    "includeDetails": false,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/oneroof-co-nz-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": "houses-for-sale",
    "region": "all-new-zealand-1",
    "propertyType": "any",
    "startUrls": [],
    "includeDetails": False,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/oneroof-co-nz-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": "houses-for-sale",
  "region": "all-new-zealand-1",
  "propertyType": "any",
  "startUrls": [],
  "includeDetails": false,
  "maxResults": 100
}' |
apify call solidcode/oneroof-co-nz-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "OneRoof New Zealand Property Scraper",
        "description": "[💰 $4.0 / 1K] Extract New Zealand property listings from oneroof.co.nz — for sale, for rent, sold, rural, and commercial. Get prices, addresses, beds/baths, floor & land area, GPS, photos, OneRoof estimates, and agent contacts. Search by region and type, or paste OneRoof URLs.",
        "version": "1.0",
        "x-build-id": "JhqiRgh83eadVIitv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~oneroof-co-nz-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-oneroof-co-nz-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solidcode~oneroof-co-nz-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-oneroof-co-nz-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solidcode~oneroof-co-nz-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-oneroof-co-nz-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "What to Collect",
                        "enum": [
                            "houses-for-sale",
                            "houses-for-rent",
                            "sold",
                            "rural",
                            "commercial-property-for-sale",
                            "commercial-property-for-lease",
                            "businesses-for-sale"
                        ],
                        "type": "string",
                        "description": "Choose which kind of listings to collect. Ignored when Start URLs are provided.",
                        "default": "houses-for-sale"
                    },
                    "region": {
                        "title": "Region",
                        "enum": [
                            "all-new-zealand-1",
                            "northland-34",
                            "auckland-35",
                            "waikato-36",
                            "bay-of-plenty-37",
                            "coromandel-48",
                            "gisborne-region-38",
                            "hawke-s-bay-39",
                            "central-north-island-55",
                            "taranaki-40",
                            "manawatu-whanganui-56",
                            "wairarapa-52",
                            "wellington-42",
                            "marlborough-51",
                            "nelson-bays-43",
                            "west-coast-44",
                            "canterbury-45",
                            "central-otago-lakes-district-50",
                            "otago-46",
                            "southland-47",
                            "pacific-islands-54"
                        ],
                        "type": "string",
                        "description": "New Zealand region to search. Choose 'All New Zealand' to cover the whole country.",
                        "default": "all-new-zealand-1"
                    },
                    "propertyType": {
                        "title": "Property Type",
                        "enum": [
                            "any",
                            "house",
                            "apartment",
                            "townhouse",
                            "unit",
                            "section",
                            "lifestyle"
                        ],
                        "type": "string",
                        "description": "Filter by property category. Choose 'Any' to include all types. Applies to residential modes; ignored for commercial, rural, and business modes.",
                        "default": "any"
                    },
                    "bedroomsMin": {
                        "title": "Minimum Bedrooms",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Only keep properties with at least this many bedrooms. Applied after each page is collected (OneRoof has no exact minimum-bedrooms filter in its results URL), so on sparse regions a run may stop early after several pages return no matches. Leave empty for no filter."
                    },
                    "bathroomsMin": {
                        "title": "Minimum Bathrooms",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Only keep properties with at least this many bathrooms. Applied after each page is collected (no exact bathrooms filter exists in the OneRoof results URL). Leave empty for no filter."
                    },
                    "priceMin": {
                        "title": "Minimum Price (NZD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only keep listings at or above this price in New Zealand dollars. For rentals this is the weekly rent. Applied after each page is collected (OneRoof only exposes bucketed price bands, not an exact minimum). Listings with no numeric price (e.g. 'Auction', 'By Negotiation') are kept. Leave empty for no minimum."
                    },
                    "priceMax": {
                        "title": "Maximum Price (NZD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only keep listings at or below this price in New Zealand dollars. For rentals this is the weekly rent. Applied after each page is collected (OneRoof only exposes bucketed price bands, not an exact maximum). Listings with no numeric price (e.g. 'Auction', 'By Negotiation') are kept. Leave empty for no maximum."
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Power-user input. Paste oneroof.co.nz search-result URLs (e.g. https://www.oneroof.co.nz/search/houses-for-sale/region_auckland-35_page_1) or individual listing URLs. When provided, these override the What to Collect, Region, Property Type, and Filters settings above. Any filters you set on the OneRoof site (price, beds, type) are preserved this way.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeDetails": {
                        "title": "Include Full Listing Details",
                        "type": "boolean",
                        "description": "Open each listing's own page to add the agent email, agent profile link, full description, legal description, capital (council) value, open-home times, and the complete photo set. Turn off (the default) for faster, cheaper runs that still return everything on the search card — price, address, beds/baths/parking, area, GPS, photos, OneRoof estimate, rating valuation, and the agent's name and phone. Slower when on: it makes one extra request per listing.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of listings to collect across all searches and URLs. Set 0 for unlimited (an internal upper limit of 50,000 rows per run still applies to prevent runaway pagination). Results are collected in full pages, so the final page may overshoot this cap by a few records.",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
