RealestateCo NZ $1๐Ÿ’ฐ Powerful Filters + Deep Search avatar

RealestateCo NZ $1๐Ÿ’ฐ Powerful Filters + Deep Search

Pricing

from $1.00 / 1,000 results

Go to Apify Store
RealestateCo NZ $1๐Ÿ’ฐ Powerful Filters + Deep Search

RealestateCo NZ $1๐Ÿ’ฐ Powerful Filters + Deep Search

From $1/1K. Search and extract all real estate properties for sale, rent, and sold across New Zealand from realestate.co.nz.

Pricing

from $1.00 / 1,000 results

Rating

5.0

(1)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

21

Total users

3

Monthly active users

5 days ago

Last modified

Share

realestate.co.nz Scraper: Listings, Prices, Agents and Sales History

realestate.co.nz Scraper turns realestate.co.nz into structured property data for New Zealand. Search by region, district or suburb, or paste realestate.co.nz search result links directly, across for sale, new build, for rent and sold listings. Each record carries prices, full addresses, bedrooms and bathrooms, agent and office contacts, photos, floor plans, GPS coordinates, in-zone schools and auction details, plus sale history and valuations for sold properties. Export the dataset as JSON or CSV, read it through the API, or pipe results into the apps you already use.

Why This Scraper?

  • Two ways to search. Pick region, district and suburb filters, or paste realestate.co.nz search result page URLs directly.
  • Four listing types. For sale, new builds, for rent and sold, each returning the fields specific to that type.
  • Search-page data, no detail-page visits needed. Agents, offices, schools, open homes, floor plans and auction details all come straight from the search results.
  • Structured output. Prices parsed into numeric values, addresses split into region, district and suburb, and GPS coordinates on every record.
  • Resumable by design. A same-run checkpoint survives platform restarts automatically, and a separate run ID resume can continue one earlier interrupted crawl.
  • Built for schedules. Incremental mode reports only new, updated, unchanged, expired or reappeared listings on repeat runs, so monitoring a search over time doesn't need its own diffing logic.
  • Optional delivery into your own apps through MCP connectors, on top of the dataset itself.

Use Cases

  • Property portals and comparison sites: aggregate for sale, rental and new build listings from multiple NZ regions into one feed.
  • Market research and appraisal: track sold prices, council valuations and estimated values to follow a suburb's price trend over time.
  • Agencies and agents: monitor competing listings, prices, and agent or office details in a target area.
  • Investors and buyers: filter by price, bedrooms and bathrooms, and get notified about new or changed listings on a schedule.
  • Data teams and researchers: build a historical dataset of NZ property prices, features and locations.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
id"42993480"
listingUrl"https://www.realestate.co.nz/42993480/residential/sale/10-example-street-khandallah"
listingNo"ABC123XYZ"
address.full / suburb / district / region"10 Example Street, Khandallah, Wellington City, Wellington" / "Khandallah" / "Wellington City" / "Wellington"
price.display / value / priceType"Buyer Enquiry Over $850,000" / 850000 / "enquiry_over"
features.bedrooms / bathrooms / garages3 / 2 / 1
features.landSizeInSqm / floorAreaInSqm350 / 130
propertyType / sourcePropertyType"house" / "House"
listingType"buy" (also "rent", "sold", "new_builds")
status"active"
heading"Charming Family Home with Views"
descriptionfree-text listing description
imagesarray of url, thumbnailUrl, order
floorPlansarray of url, type
agentsarray of name, phone, email, listingCount
officename, phone, email, brandColour
location.lat / lon-41.25 / 174.78
schoolsarray of name, inZone, distance, in-zone schools only
openHomesarray of startTime, endTime
auctionDate / auctionLocation"2026-03-15T12:00:00+13:00" / "On site"
publishedDate"2026-02-26T17:55:27+13:00"
isFeatured / isNewConstructionfalse / false
source.portal / scrapedAt"realestate.co.nz" / "2026-02-26T05:30:00.000Z"

Sold properties (listingType: "sold") use a different shape: instead of price, agents and office, each record carries buildingAge, latestSale (salePriceDisplay, netSalePrice, saleDate, saleMethod, sellDays), salesHistory (past sales in the same shape), estimatedValue (valueLow, valueMid, valueHigh, confidenceRating, estimatedDate) and councilEvaluations (capitalValue, landValue, improvementsValue, currentValuationDate), alongside the same address, features, propertyType, location and source fields used above.

How to Use

  1. Pick a Search mode: location (region, district and suburb filters below) or url (paste realestate.co.nz search result page links).
  2. In location mode, choose a Listing Type and any price, bedroom or bathroom filters. In URL mode the listing type is detected from the URL and these filters are ignored.
  3. Set Maximum Listings and Maximum Pages to control run size and cost, then click Start.
  4. Download the dataset as JSON or CSV, or read it through the API.

For sale properties in Auckland:

{
"mode": "location",
"locations": [{ "region": "Auckland" }],
"listingType": "buy",
"maxListings": 50,
"maxPages": 5
}

A specific suburb, with filters:

{
"mode": "location",
"locations": [{ "region": "Auckland", "district": "Manukau City", "suburb": "Papatoetoe" }],
"listingType": "buy",
"priceMax": 900000,
"bedroomsMin": 3,
"maxListings": 100
}

Sold properties in Wellington:

{
"mode": "location",
"locations": [{ "region": "Wellington" }],
"listingType": "sold",
"maxListings": 50
}

Paste a search result URL:

{
"mode": "url",
"urls": ["https://www.realestate.co.nz/residential/sale/auckland?by=latest"],
"maxListings": 50
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/realestate-co-nz-scraper").call(run_input={
"mode": "location",
"locations": [{"region": "Auckland"}],
"listingType": "buy",
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing["address"]["full"], listing["price"]["display"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/realestate-co-nz-scraper').call({
mode: 'location',
locations: [{ region: 'Auckland' }],
listingType: 'buy',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

URL mode shapes

Each URL is read as a single results page (about 20 listings). Behaviour change: URL mode run with the field untouched now scrapes one example of every shape below instead of nothing (capped by maxListings).

ShapeExampleResult
Region search (sale)/residential/sale/auckland?by=latestscraped
Rental region/residential/rental/wellingtonscraped
Sold region/residential/sold/aucklandscraped (sold records)
Paginated ?page=N/residential/sale/auckland?page=2scraped from that page; a partial scope, so never marks listings EXPIRED
Nationwide/residential/salescraped
Property-type category/residential/sale/auckland/apartmentscraped
District / suburb/residential/rental/auckland/auckland-city/ponsonbyscraped
Map view ?view=map/residential/sale/auckland?by=latest&view=mapscraped
Filtered ?maxp= etc./residential/sale/auckland?by=price-asc&maxp=900000&minb=2scraped, filters kept as the site applies them
Legacy ?lct= district/residential/sale/auckland/auckland-city?lct=r35%2Cd225scraped (site redirects)
Non-www hosthttps://realestate.co.nz/residential/sale/aucklandscraped (moved to www)
Property detail page/43147757/residential/sale/20a-gibson-road-tuakaunot scraped: a warning is logged for that URL; paste the search page that lists it
Agent directory/agentsnot scraped: a warning is logged for that URL

If every pasted URL is an unsupported shape, the run fails with INVALID_INPUT rather than finishing empty. In location mode the region you type ("hawke's bay", "Nelson and Bays") is matched to the site's region list; an unknown region fails with the list of valid regions.

Location granularity and filters

Each entry in Locations needs a Region and can optionally narrow to a District and Suburb. A region-only search covers everything in that region; adding a district or suburb narrows it. You can list multiple locations to search them all in one run. Price, bedroom and bathroom filters apply only in location mode; URL mode uses whatever filters are already baked into the pasted URL.

Resume and recurring updates

  • Resume from checkpoint (resumeFromCheckpoint, on by default) continues the same run after a platform migration or a manual restart. Nothing to configure.
  • Resume from run ID (resumeFromRunId) pastes a previous run or dataset ID to continue one specific interrupted crawl; listing ids already collected there are skipped so the run only adds new ones.
  • Incremental mode (incrementalMode) is for running this same search on a schedule. Every row gets a changeType of NEW, UPDATED (with changedFields), UNCHANGED (suppressed unless emitUnchanged is on), EXPIRED, or REAPPEARED. EXPIRED is only produced after a run that scans the complete tracked search end to end, with no page or listing cap cutting it short, no active resume, and at least one matching listing read, and only when emitExpired is on. REAPPEARED marks a listing that an earlier complete scan (with emitExpired on) recorded as gone, and that is found again on any later incremental run, complete or not. stateKey names or shares the stored baseline, or is derived automatically from your search and filter settings so different searches never mix state by accident. What is compared: every output field of the listing (price, status, address, features, description, photos, agents, open homes and the rest). What is excluded by default: the scrape timestamp (source), the isFeatured and isShowcased placement flags, each agent's listingCount, and the order of openHomes; they stay in every row but never turn a listing into UPDATED. Add your own with ignoreFieldsForChanges (dot for nested fields, [] for every list element, e.g. agents[].email); changing that list does not trigger a wave of UPDATED rows. A run that reads only part of the search (a pasted ?page=2 URL, a page or listing cap, a filtered sub-scope) never marks listings EXPIRED. With incremental mode off, output is unchanged from before this feature existed.

Output views

The dataset has five views in the Console: Overview (id, change type, listing and property type, address, price, features, link, status), Media (images, floor plans, hero image), Agents & Offices, Location & Schools (coordinates, schools, auction and publish dates) and Changes (incremental) (change type, changed fields, first and last seen, id, link, price). Newer fields on each record include land and floor area units, total parking spaces and the full offices list (the first office is also in office); a field the site does not report is null. The first incremental run after these fields were added does not mark every listing UPDATED.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape; the Apify dataset itself is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title (the listing's full address) and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify > Settings > Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. If the picker is empty, you haven't authorized a connector yet.
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringlocationSearch mode: location or url.
locationsarraynone (prefill: [{"region": "Auckland"}]); required in location modeRegion, district and suburb to search. District and suburb are optional.
urlsarrayone example of each supported shape (13 URLs, same as the prefill)realestate.co.nz search result page URLs. No pagination in this mode: each URL is read as one page. See URL mode shapes below.
listingTypestringbuybuy, rent, sold, or new_builds. Auto-detected from the URL in url mode.
propertyTypesarraynone (all types)Filter by property type, e.g. house, apartment, townhouse.
priceMinintegernoneMinimum price in NZD.
priceMaxintegernoneMaximum price in NZD.
bedroomsMinintegernoneMinimum number of bedrooms.
bathroomsMinintegernoneMinimum number of bathrooms.
includeNeighbouringSuburbsbooleanfalseInclude neighbouring suburbs; most useful at suburb level.
sortstringlatestlatest, price-asc, price-desc, or default. Sold listings use latest-sale order automatically.
maxPagesinteger100 in the input form; the actor's own fallback if this field is left out of a raw input entirely is 2Maximum search result pages per location; each page has about 20 results.
maxListingsinteger25Stop after scraping this many listings.
outputFormatarray["json"]Informational only. The Apify dataset can always be downloaded as JSON, CSV or Excel regardless of this setting.
proxyConfigurationobjectnone in a raw input; the Console proxy field is preselected to Apify Proxy unless changedProxy connection settings for the run.
resumeFromCheckpointbooleantrueContinue the same run after an interruption.
resumeFromRunIdstringnoneContinue one interrupted crawl from a previous run or dataset id.
incrementalModebooleanfalseRemember this search across scheduled runs and flag NEW/UPDATED/UNCHANGED/EXPIRED/REAPPEARED.
stateKeystringnone (auto-derived from your search settings)Optional label for the incremental-mode baseline.
ignoreFieldsForChangesarray[]Incremental mode only: fields that never count as a change (kept in the output, left out of the comparison).
emitUnchangedbooleanfalseAlso output UNCHANGED listings (bills extra rows).
emitExpiredbooleanfalseAlso output EXPIRED listings after a complete scan (bills extra rows).
mcpConnectorsarraynoneOptional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstringnoneNotion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"id": "42993480",
"listingUrl": "https://www.realestate.co.nz/42993480/residential/sale/10-example-street-khandallah",
"listingNo": "ABC123XYZ",
"address": {
"full": "10 Example Street, Khandallah, Wellington City, Wellington",
"displayAddress": "10 Example Street, Khandallah",
"streetNumber": "10",
"streetName": "Example Street",
"suburb": "Khandallah",
"district": "Wellington City",
"region": "Wellington",
"postcode": "6035",
"country": "New Zealand",
"countryCode": "NZ"
},
"price": {
"display": "Buyer Enquiry Over $850,000",
"value": 850000,
"currency": "NZD",
"priceType": "enquiry_over"
},
"features": {
"bedrooms": 3,
"bathrooms": 2,
"garages": 1,
"landSizeInSqm": 350,
"floorAreaInSqm": 130
},
"propertyType": "house",
"sourcePropertyType": "House",
"listingType": "buy",
"listingCategoryCode": "res_sale",
"status": "active",
"heading": "Charming Family Home with Views",
"images": [
{
"url": "https://images.realestate.co.nz/listings/42993480/abc123.crop.140x178.jpg",
"thumbnailUrl": "https://images.realestate.co.nz/listings/42993480/abc123.crop.70x89.jpg",
"order": 1
}
],
"agents": [
{
"id": "100001",
"firstName": "Jane",
"lastName": "Smith",
"name": "Jane Smith",
"phone": "027 123 4567",
"email": "jane@example.co.nz",
"listingCount": 15
}
],
"office": {
"id": "5001",
"name": "Example Realty Ltd",
"colloquialName": "Example Realty",
"phone": "04 123 4567",
"email": "info@example.co.nz"
},
"location": { "lat": -41.25, "lon": 174.78 },
"schools": [
{ "name": "Sample Primary School", "inZone": true, "distance": "0.5km" }
],
"openHomes": [],
"auctionDate": "2026-03-15T12:00:00+13:00",
"auctionLocation": "On site",
"publishedDate": "2026-02-26T17:55:27+13:00",
"isFeatured": false,
"isNewConstruction": false,
"source": {
"portal": "realestate.co.nz",
"scrapedAt": "2026-02-26T05:30:00.000Z"
}
}

Plan Requirement

Leave Connection & proxy on Apify Proxy (the default) and run. The actor tries the Apify proxy connection you selected first and, if the site refuses it, steps to backup connections on its own, remembering what your account is allowed to use. No tier has been measured as sufficient on its own for every page, so a paid Apify plan is recommended for reliable runs, especially at scale or across many locations.

What you may see in the run log:

  • Free plan, selected connection unavailable. A boxed warning: "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable." Upgrade at https://apify.com/pricing or supply your own proxy URLs.
  • Backup connection served data. One info line: "Served over the backup connection (the default connection was unavailable)."
  • Free plan, nothing loaded. The run fails with: "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested realestate.co.nz pages."
  • Every connection refused. The run fails with: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required." If you entered your own proxy URLs, check their credentials.
  • Any other total failure. The run fails with: "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later."

A failed run is never reported as an empty success.

FAQ

How much does it cost?

Pay per event: $0.002 per result on the Free plan, falling with your Apify plan tier to $0.001 per result (Gold and above), plus a one-time $0.08 Actor start charge per run on the Free plan. The Pricing tab on the actor page always shows the current rates. Each pushed row bills as one result; with Incremental mode on, UNCHANGED rows are neither output nor billed unless Emit unchanged listings is on, and EXPIRED rows only appear when Emit expired listings is on. Use Maximum Listings and Maximum Pages to cap the cost of any run.

This actor collects only publicly available property listing data. You are responsible for how you use it: follow realestate.co.nz's terms and the laws that apply to you, and get legal advice before any commercial redistribution. Agent and office contact details are public business information; handle any personal data you collect according to the privacy law that applies to you.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then reports every listing as NEW, UPDATED, UNCHANGED, EXPIRED or REAPPEARED, and UNCHANGED rows are not output or billed unless you also turn on Emit unchanged listings.

What's the difference between Resume from checkpoint, Resume from run ID, and Incremental mode?

Resume from checkpoint only continues the same run after a platform interruption, with nothing to configure. Resume from run ID continues one specific earlier run by pasting its run or dataset ID. Incremental mode is for scheduling the same search repeatedly and remembers it on its own, keyed by a state key, with no ID to paste. They solve different problems and can be combined once, to bootstrap an incremental baseline from an existing run.

Why did my run fail instead of returning an empty dataset?

The run fails when zero listings were read and at least one result page failed to load or could not be parsed, when the input is invalid or contradictory (for example, pointing resumeFromRunId at an Incremental mode state that already has tracked listings, or at a run or dataset ID your account can't read), or when an unexpected error stops the scan. A search that loads correctly but genuinely matches nothing still succeeds, with zero rows and a status message on the run.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable once the scrape finishes.

๐Ÿ”— Want more Realestate data?

Pair this actor with these related scrapers from the same team:

๐Ÿ  Real Estate AU
Extract detailed Australian real estate property listings with 30+ structured fields...
๐Ÿ  Homes.co.nz Scraper
Scrape Homes.co.nz listings by location or URL with pagination. Extract property details...
๐Ÿ  View.com.au Scraper
Scrape View.com.au properties for sale, rent and recently sold across Australia. Search...
๐Ÿ  Real Estate AU Agents Scraper
Scrape Australian real estate agent and agency profiles by suburb or profile URLs...
๐Ÿ  Domain.com.au
Extract enriched Domain.com.au property listings across buy, rent, and sold, with...
๐Ÿ  OnTheMarket Scraper
Scrape onthemarket.com for-sale, to-rent and new-homes listings with 85+ fields: price...

๐Ÿ‘‰ Browse all abotapi scrapers

๐Ÿ’ฌ Support

  • ๐Ÿž Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • ๐Ÿ› ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • โญ Enjoying it? A quick review on the actor page helps other users find it.