Homes.co.nz Scraper icon

Homes.co.nz Scraper

Scrape Homes.co.nz listings by location or URL with pagination. Extract property details, valuations, agents, branch information, media and open homes.…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Homes.co.nz Scraper at a glance

Homes.co.nz Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes listing id, title, price, bucket and address, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Real Estate, Developer Tools, Automation
Region
Oceania
Pricing
$2.00 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
25 options

Scrape Homes.co.nz listings by location or URL with pagination. Extract property details, valuations, agents, branch information, media and open homes. Search multiple locations per run with filters for status, price, bedrooms and bathrooms.

What Homes.co.nz Scraper can do

  • Two clean ways to find listings. Search by location name, or paste Homes detail and map links directly. Mix multiple locations or multiple URLs in one run.
  • Reads the site's own structured data, not page HTML. Detail and map pages are resolved from the page's embedded application state and the site's gateway API, so extraction stays stable when the page layout changes.
  • Dense areas are fully covered. Map searches recursively subdivide the viewport whenever Homes' own map endpoint caps a single call's results, so listings in busy cities are not silently dropped.
  • Bedroom and bathroom minimums are double checked. Each returned listing's own room counts are verified again after the fetch, since Homes' own map filter is not reliably narrowing at low minimums.
  • Optional deep enrichment. Turn on Fetch Property Cards to add council valuation, title, branch and agent details, or turn it off to cut cost when you only need the core listing fields.
  • Built for schedules. Incremental mode tags every listing NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED against your own tracked search, and Resume continues one interrupted large pull without re-paying for listings already saved.

Choose what to collect

These inputs let you configure Homes.co.nz Scraper - Property Listings, Valuations & Agents. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredSearch mode resolves location names and expands them into listing results. URL mode accepts Homes detail URLs or map URLs directly.

Choices: search, url

locationsarrayOne or more location names to resolve through Homes and collect listings from.
urlsarrayOne or more homes.co.nz detail URLs or map URLs. Multi-URL supported. Supported shapes: /address//// and /map/[/] (lat, lng, zoom optional). Bare /map and unrecognised links are skipped with a warning. Detail URLs return a single enriched listing. Map URLs expand into structured result pages, and the Filters & sort section below applies to them.
listingStatusstringChoose which Homes listing bucket to collect: for sale, for rent, just sold, off market, or all of them together (All homes). Applies to location searches and to map URLs in URL mode (a single detail URL always returns that one property). Sold and off-market properties have no active listing, so their rows are built from the property record.

Choices: for_sale, for_rent, just_sold, off_market, all_homes

minBedroomsintegerOnly include listings with at least this many bedrooms. Verified against each returned listing's own bedroom count, so the guarantee holds even where the source feed's own filter is unreliable.
minBathroomsintegerOnly include listings with at least this many bathrooms. Verified against each returned listing's own bathroom count, so the guarantee holds even where the source feed's own filter is unreliable.
maxBedroomsintegerOnly include listings with at most this many bedrooms. Verified against each returned listing's own bedroom count (applied after the fetch, so a tight range may return fewer rows than maxListings).
Show 18 more inputs
More input fields
InputWhat it controls
maxBathroomsintegerOnly include listings with at most this many bathrooms. Verified against each returned listing's own bathroom count (applied after the fetch, so a tight range may return fewer rows than maxListings).
minPriceintegerLower price bound sent with the structured Homes query for location searches and map URLs.
maxPriceintegerUpper price bound sent with the structured Homes query for location searches and map URLs.
sortBystringApplies to the output ordering of collected listings from location searches and map URLs (a single detail URL is never reordered). Price sorting only affects records where a numeric price can be derived from the structured listing data.

Choices: default, published_desc, published_asc, price_desc, price_asc

maxListingsintegerHard ceiling on listings output across the whole run, pagination stops as soon as this is hit, in both Search and URL modes. Use 0 for no explicit cap. The schema maximum is 1,000,000.
maxPagesintegerHow many output pages to emit for each search target or map URL. Leave empty to walk every result page: the walk is then bounded only by Max Listings and the site's own candidate ceiling. Set a number only for an explicit page cap below that natural stop.
pageSizeintegerNumber of listings to emit on each output page.
fetchPropertyCardsbooleanInclude extra valuation, title, branch, and agent data when available. Adds one additional request per listing, disable to cut cost when you only need core fields.
includeRawApiResponsesbooleanInclude the raw structured API payloads in each output item for debugging.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large walk-all pull: listings already saved by that run are loaded before scraping starts and skipped, so this run only appends new listings. Leave empty for a normal fresh run. Independent of Incremental mode below, see that field for recurring/scheduled monitoring instead.
incrementalModebooleanFor a scraper you schedule repeatedly against the SAME search/URLs: the actor remembers the previous run itself (no need to paste a run ID) and tags each listing changeType NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED, with changedFields / firstSeenAt / lastSeenAt. Every returned field is compared (price, status, bedrooms, estimates, media and the rest of the listing record) except our own crawl bookkeeping (fetchedAt, pageIndex, sourceEndpoints, seedContext) and any fields you list under 'Ignore fields when detecting changes'. Capped or partial runs never emit EXPIRED. Off by default (normal one-off scrape). See 'Resume from a prior run' above for continuing ONE interrupted run instead - that is a different feature.
stateKeystringOnly used when Incremental mode is on. Leave empty to auto-derive the tracked search's identity from mode + locations/URLs + filters + fetchPropertyCards (recommended). Set your own text only if you need two runs with different other settings (e.g. different maxListings) to share one baseline, or to keep two similar searches from colliding.
emitUnchangedbooleanOnly used when Incremental mode is on. When off (default), a listing identical to the last run is not pushed again, so a recurring run only bills for what changed. Turn on to get a full refreshed dataset every run - this returns and BILLS an extra row for every unchanged listing.
emitExpiredbooleanOnly used when Incremental mode is on, and only after a run completes a full pass of the tracked search (a capped/partial run never emits these). When on, a listing that was present last run but not found this run is pushed once more with changeType EXPIRED - this returns and BILLS an extra row for every listing that dropped out.
ignoreFieldsForChangesarrayOnly used when Incremental mode is on. Field names (or dotted nested paths such as 'propertyDetails.display_estimated_value_short') that must NOT trigger UPDATED or appear in changedFields. The fields are still returned in every row. Our own crawl bookkeeping (fetchedAt, pageIndex, sourceEndpoints, seedContext) is always ignored. Adding or removing a field here never causes a one-time wave of UPDATED rows.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. Notion gets a page per item; other connectors receive a best-effort write/digest. Leave empty to skip, this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idListing ID
titleTitle
pricePrice
listingBucketBucket
addressAddress
bedroomsBedrooms
bathroomsBathrooms
carSpacesCar spaces
propertyTypeProperty type
agencyNameAgency
urlLink (link)
valuationsValuations (object)
Show 11 more fields
estimatesEstimates (object)
titleRecordTitle record (object)
propertyDetailsProperty details (object)
openHomesOpen homes (array)
solarEstimateSolar estimate
solarPotentialSolar potential
propertySalesCountProperty sales count
changeTypeChange type
changedFieldsChanged fields (array)
firstSeenAtFirst seen (date)
lastSeenAtLast seen (date)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "type": "listing",
  "id": "12345678",
  "listingId": "12345678",
  "propertyId": "98765432",
  "url": "https://homes.co.nz/address/wellington/te-aro/25-26-marion-street/o02G2",
  "canonicalUrl": "https://homes.co.nz/address/wellington/te-aro/25-26-marion-street/o02G2",
  "title": "25-26 Marion Street, Te Aro, Wellington",
  "description": "Stylish two-level apartment close to the CBD.",
  "status": 1,
  "price": "Auction, 14 Oct 2026",
  "displayPrice": "Auction, 14 Oct 2026",
  "priceValue": 950000,
  "currency": "NZD",
  "publishedAt": "2026-08-20T02:00:00.000Z",
  "address": "25-26 Marion Street, Te Aro, Wellington",
  "addressParts": {
    "full": "25-26 Marion Street, Te Aro, Wellington",
    "suburb": "Te Aro",
    "city": "Wellington",
    "region": "Wellington"
  },
  "bedrooms": 3,
  "bathrooms": 2,
  "carSpaces": 1,
  "floorArea": 120,
  "landArea": 450,
  "latitude": -41.2946,
  "longitude": 174.7766,
  "propertyType": "House",
  "listingType": "residential",
  "agentNames": [
    "Jane Smith"
  ],
  "agencyName": "Sample Realty",
  "openHomes": [
    {
      "date": "2026-10-05",
      "start_time": "13:00",
      "end_time": "13:30"
    }
  ],
  "imageUrls": [
    "https://images.homes.co.nz/sample1.jpg",
    "https://images.homes.co.nz/sample2.jpg"
  ],
  "mediaCount": 18,
  "valuations": {
    "capitalValue": 820000,
    "improvementValue": 340000,
    "landValue": 480000,
    "revisionDate": "2024-09-01"
  },
  "estimates": {
    "estimatedValue": 905000,
    "estimatedValueLow": 860000,
    "estimatedValueHigh": 950000,
    "grossYield": 3.8
  },
  "titleRecord": {
    "legalDescription": "Lot 4 DP 12345",
    "certificateOfTitle": "WN123/456",
    "ownershipType": "Freehold"
  },
  "sourceEndpoints": {
    "pageUrl": "https://homes.co.nz/address/wellington/te-aro/25-26-marion-street/o02G2",
    "listingDetailApi": "https://gateway.homes.co.nz/listing/12345678/detail"
  },
  "fetchedAt": "2026-09-28T04:00:00.000Z"
}

Ways to use this data

  • Property portals and comparison sites: mirror Homes.co.nz for sale, for rent and recently sold listings for a region into your own search experience.
  • Valuation and investment research: pull capital value, estimated value and estimated rental ranges alongside each listing to screen for opportunities.
  • Market monitoring: track a suburb or city on a schedule with Incremental mode to see new listings, price and status changes, and delistings as they happen.
  • Lead generation for agents and buyers' advocates: collect agent and agency contact details attached to active listings in your target areas.
  • Market trend analysis: build a historical dataset of prices, floor areas and listing counts for a region over time.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Homes.co.nz Scraper return?

The documented output for Homes.co.nz Scraper includes listing id, title, price, bucket, address, bedrooms, bathrooms and car spaces. Availability of each field depends on the source page and the selected mode.

How much does Homes.co.nz Scraper cost?

It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Which dataset views are available?

The dataset has three views: Overview (id, title, price, address, bedrooms, bathrooms, car spaces, property type, agency, url), Detail (address, valuations, estimates, solar estimate and potential, sales count, title record, property details, open homes, url) and Changes (address, change type, changed fields, first and last seen, url; useful in Incremental mode).

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

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then tags every listing NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED against your last run for that same search or URL list, and unchanged listings are not returned or billed unless you turn on Emit UNCHANGED.

What is the difference between "Resume from a prior run" and Incremental mode?

They solve different problems. Resume from a prior run continues one interrupted large pull: paste the earlier run or dataset ID and this run skips every listing already saved there. Incremental mode is for a search or URL list you run on a schedule: it remembers the previous run itself, with no ID to paste, and classifies each listing against that stored state. Combining the two only works for the very first incremental run for a given tracked search.

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

The run fails when it cannot read what was asked for: the input is invalid (for example Search mode with no locations), Homes' address search cannot resolve a location, a detail or map URL's page cannot be loaded or read, Homes' map API keeps failing after retries, or a Resume from a prior run ID does not match a run or dataset this Apify account can read (or is combined with Incremental mode after a baseline already exists). Once a listing has been found, a failure fetching its detail or property card after retries does not fail the run: that one listing is skipped and logged, and the run finishes with whatever it could read.

Ready to collect with Homes.co.nz Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.