The Warehouse NZ Scraper - Products, Prices, Stock & Reviews avatar

The Warehouse NZ Scraper - Products, Prices, Stock & Reviews

Pricing

from $1.00 / 1,000 result items

Go to Apify Store
The Warehouse NZ Scraper - Products, Prices, Stock & Reviews

The Warehouse NZ Scraper - Products, Prices, Stock & Reviews

Scrape The Warehouse New Zealand search results, category pages, and direct product URLs. Extract prices, availability, brand, images, breadcrumbs, attributes, product details, and optional customer reviews. Supports search mode, URL mode, sorting, pagination, and MCP connector export.

Pricing

from $1.00 / 1,000 result items

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

The Warehouse NZ Scraper: Products, Prices, Specials and Reviews

The Warehouse NZ Scraper turns thewarehouse.co.nz into structured product data. Search by keyword, browse The Warehouse's own Specials collections, or paste search, category, or product URLs to collect prices, availability, images, brand, category paths and current specials from this New Zealand general retailer. Turn on detail enrichment to pull description, structured attributes and full image galleries from each product page, and turn on review collection to add normalized customer reviews. Export the result as JSON, CSV or Excel, or read it straight through the API.

Why This Scraper?

  • Two ways to find products. Search by keyword across the whole catalog, or paste search, category, or product URLs when you already know where you're going.
  • Specials, not just full price. Browse The Warehouse's own Specials collections, including a dedicated Mega Toy Sale, and get isOnSpecial plus an offer end date on every match the site itself asserts one for.
  • Pagination on autopilot. Each query, URL, or Specials category walks its own result pages and stops once the storefront reports no next page or Max products is reached, no manual page counting.
  • Detail-page enrichment on demand. Turn on Fetch product details to add description, structured attributes, breadcrumbs (falling back to the listing category path when the product page has none) and full image galleries beyond the search snippet, and pay the enrichment fee only for products that actually reach the dataset.
  • Normalized customer reviews. Collect ratings, review text, verified-purchaser badges and vote counts in one consistent shape, capped per product.
  • Built for monitoring. Incremental mode classifies every product NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED across scheduled runs, and Resume skips products an earlier run already saved (see its known limitation under How to Use).
  • Send results where you work. Pipe a condensed summary of each product into Notion, Linear, Airtable or Apify through MCP connectors, while the full record stays in the dataset.

Use Cases

  • Price and stock monitoring: track price changes, specials and availability for a watchlist of products over time.
  • Retail and market research: benchmark New Zealand general-merchandise pricing and promotions across categories.
  • Catalog and assortment analysis: build a dataset of products, brands and category paths for a specific department.
  • Review analytics: collect ratings and review text for products you sell or compete with.
  • Deal and specials tracking: monitor The Warehouse's Specials collections and the Mega Toy Sale for markdowns worth alerting on.

Data You Get

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

FieldExample
url"https://www.thewarehouse.co.nz/p/sample-two-slice-toaster/R0000001.html"
productId"R0000001"
sku"SKU000001"
gtin"9400000000001"
title"Sample Two Slice Toaster"
brand"Sample Home"
description"Sample product description text describing the item."
category"homegarden-appliances-kitchen"
price49.99
priceMax59.99
priceText"$49.99"
currency"NZD"
availability"IN_STOCK" (also seen: "FIND_IN_STORE"; with Fetch product details on, the product page's own stock value is used when it has one)
imagemain product image URL
imagesfull image gallery, one URL per entry
ratingValue4.5
reviewCount18
isOnSpecialtrue
offerEndsAt"2026-10-05" (null when the site shows no end date)
wasPrice34.99 (the site's own previous price from the listing tile; null unless higher than price)
promotionFlags["badge_specials", "sale"] (listing-tile badges and promo text; null when none)
isClearancefalse (true when a tile badge says clearance; null when the tile carries no badge)
inStocktrue (derived from availability; null when unknown)
sourceUrlThe listing or product page the row came from
scrapedAt"2026-09-29T02:00:00.000Z"

category is the last breadcrumb of the product page when the page carries one, otherwise the last element of categoryPath. Each record also carries mpn, condition, imageCount, breadcrumbs and categoryPath (the site's own category trail; breadcrumbs comes from the product page when it carries one, otherwise it falls back to the same category path as categoryPath taken from the search results tile), marketplaceProduct and sellerName (set when a product is sold by a marketplace vendor rather than The Warehouse itself), attributes (a structured spec table from the product page), features (feature and benefit bullets), ratingCount (an aggregate rating count from the product page), and specialsCategory (the Specials collection a product was browsed from, when using a Specials category). When Fetch customer reviews is on, reviews holds a list of normalized review records: id, productId, rating, title, body, authorAlias, publishedAt, verifiedPurchaser, badges, secondaryRatings, and vote counts. When Incremental mode is on, every record also carries changeType, changedFields, firstSeenAt and lastSeenAt, see Resume and recurring updates below.

How to Use

  1. Pick a mode: Search by keyword, or Scrape pasted URLs (search result, category, or product links).
  2. For search mode, enter one or more Search keywords, or pick a Specials category to browse a promotional collection instead of a keyword search. For URL mode, paste the URLs.
  3. Turn on Fetch product details and, if you want reviews too, Fetch customer reviews. Set Max products and Max pages to control run size and cost.
  4. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.

Search by keyword:

{
"mode": "search",
"queries": ["toaster"],
"fetchDetails": true,
"maxItems": 20
}

Browse a Specials collection:

{
"mode": "search",
"specialsCategory": "specials_electronics_gaming",
"sortBy": "price_asc",
"maxItems": 50
}

Supported URL shapes. Each shape below was checked live. With URL mode selected and the URLs field left untouched, the run scrapes one example of each shape (a search page, a category page and a product page), so keep or replace them before running. URLs on any other page type or host are skipped with a warning in the run log.

ShapeExampleResult
Search resultshttps://www.thewarehouse.co.nz/search?q=toasterProduct rows, paginated forward
Category pagehttps://www.thewarehouse.co.nz/c/electronics-gamingProduct rows, paginated forward
Product pagehttps://www.thewarehouse.co.nz/p/living-co-2-slice-toaster-stainless-steel/R2957596.htmlOne product row, keyed on the page's own R product id

Paste URLs (search, category, or product):

{
"mode": "url",
"urls": [
"https://www.thewarehouse.co.nz/search?q=kettle",
"https://www.thewarehouse.co.nz/p/sample-product-name/R0000002.html"
],
"fetchDetails": true
}

Dataset views. The dataset has four views: overview (core listing columns), detail (description, attributes, features and gallery), reviews (one row per product with its review list) and changes (incremental changeType and changedFields).

Review billing: each saved product that carries reviews adds one detail-enrichment event unit per started block of 10 reviews (for example 25 reviews is 3 units), charged only after the product row is saved, never for unchanged or suppressed products. The default cap is 20 reviews per product (up from 10) and the maximum is 1000, so lower maxReviewsPerProduct to control cost. Reviews now include seller replies and helpful votes when available.

Collect reviews, capped per product:

{
"mode": "search",
"queries": ["air fryer"],
"fetchDetails": true,
"fetchReviews": true,
"maxReviewsPerProduct": 5,
"maxItems": 10
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/thewarehouse-co-nz-scraper").call(run_input={"mode": "search", "queries": ["toaster"], "maxItems": 20})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
print(product["title"], product["price"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/thewarehouse-co-nz-scraper').call({ mode: 'search', queries: ['toaster'], maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

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

How Max products and Max pages shape a run

By default (Max pages empty or 0), a run walks every result page for each query, URL, or Specials category, and stops on its own once the storefront reports no next page, or a page's products have all already been collected earlier in this same run, or sooner once Max products is reached. Set Max pages to a number only when you want an explicit page cap below that natural stop.

Known limitation: overlapping targets end early. "Already collected" is checked against everything collected so far in the whole run, not just the current keyword or URL. So if a later keyword's or URL's page contains only products that an earlier one already returned, that later target stops right there, and its deeper pages are silently skipped with no error. Example: you search jug kettle and then electric kettle; if every product on page 1 of electric kettle was already returned by jug kettle, the actor never reads page 2 of electric kettle, even if it holds products jug kettle never showed. The first target in a run is never affected. If your keywords or URLs overlap and you need every product, run each one as its own run (or its own scheduled task).

Resume and recurring updates

Two different things, both under the same input section:

  • Resume (resumeFromRunId) continues one specific interrupted run. Paste its run ID or dataset ID and product URLs already saved there are skipped, so this run only appends new products.
  • Incremental mode (incrementalMode) is for recurring, scheduled monitoring of the same search or URL set. Each record is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED, or EXPIRED (only after a run that scanned the whole tracked search, and only with emitExpired). stateKey names or shares the stored state; leave it empty and the actor derives one automatically from the mode, queries or URLs, specials category, sort, and detail/review/availability settings, so differently configured runs never share a baseline. UPDATED means the product's own data changed (price, price range, specials flag and offer end date, availability, title, brand, description, images, attributes, features); changedFields lists what moved. Ratings, rating counts, review counts, review text, scrapedAt, the source page a product was listed on (sourceUrl) and the changing query-string part of image URLs never trigger UPDATED; ignoreFieldsForChanges lets you exclude more fields (a name like description, or a dotted path like attributes.Colour), which stay in the output but are left out of change detection. Adding an ignored field does not cause a one-time wave of UPDATED rows. EXPIRED is only produced after a run that scanned the whole search: a Max products or Max pages cap, a pasted URL that starts partway through a listing, or Resume skips it, and EXPIRED rows count toward Max products. With Incremental mode off, output is exactly as before.

Known limitation: Resume restarts from page 1. A resumed run does not pick up at the page where the earlier run stopped. Every keyword or URL is walked again from its first page, and the "page holds only already-collected products" stop above applies to products loaded from the earlier run too. So if the earlier run already saved the whole first page of a search, which is almost always the case for an interrupted large pull, the resumed run stops on that page and returns few or no new products. The same happens when Apify migrates a run to another server or you resurrect a failed run: it picks up the products it already saved and stops at the first page that holds only those. To extend a large pull, use URL mode with a search URL that already points at a later results page (for example one ending in &start=320&sz=32), since pagination starts from the page encoded in the URL, or run the search again without Resume.

Known limitation: false EXPIRED rows. A walk that stops because a page holds only already-collected products is counted as a complete scan. When one run tracks several overlapping keywords or URLs, products the run simply did not reach can therefore be marked EXPIRED (and billed) while they are still listed. Example: you track jug kettle and electric kettle together and two products appear only on page 2 of electric kettle. On a later run, page 1 of electric kettle holds only products jug kettle already returned, so the walk stops there and both products come back as EXPIRED although nothing on the site changed. A product marked EXPIRED this way returns as REAPPEARED the next time a run reaches it. A results page that fails to load is not affected: it always blocks EXPIRED for that run. If you rely on EXPIRED, track one keyword, URL or Specials category per run (each gets its own saved state automatically), and treat an EXPIRED row as "not seen this run" rather than proof of delisting.

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 is never changed.

What gets written to the connector: a condensed, human-readable summary of each product, not the full JSON. Each item becomes one entry with a title 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
modestringsearchsearch for keyword search, or url to scrape pasted search, category, or product URLs.
queriesarray["toaster"]Search keywords. Each query is searched separately.
specialsCategorystring(none)Browse one of The Warehouse's own Specials collections instead of a keyword search. Matching products get isOnSpecial and, when the site shows one, an offer end date. Replaces keyword search for the run when set.
sortBystringrelevanceSort order for search and Specials results: relevance, price ascending or descending, top rated, newest, best sellers, or product name ascending or descending. URL mode keeps whatever sort is already encoded in the pasted URL.
urlsarrayone example search, category and product URLSearch, category, or product URLs (URL mode). Pagination starts from the page encoded in the URL when present and walks forward.
fetchDetailsbooleantrueOpen each product page for description, brand, structured attributes, breadcrumbs, image gallery and availability.
fetchReviewsbooleanfalseAlso collect product reviews when the page exposes them.
maxReviewsPerProductinteger20Cap on reviews collected per product when Fetch customer reviews is on, from 1 to 1000. 0 or empty uses the default of 20. Keep it low for large runs: every started block of 10 delivered reviews adds one detail-enrichment unit.
includeUnavailablebooleantrueKeep products marked unavailable or out of stock. Turn off to return only likely in-stock products when the page exposes availability.
maxItemsinteger20Maximum matching products to save. Leave empty or set 0 for unlimited. This is the run's only default cap.
maxPagesinteger0Leave empty or set 0 for unlimited: the run walks the whole result set for each query or URL, stopping naturally at the storefront's own end of results or at Max products if that's reached first. Set a number only for an explicit page cap below that natural stop.
resumeFromRunIdstring(none)Paste a previous run ID or dataset ID to continue a large walk-all pull: product URLs already saved there are skipped, so this run only appends new products. Leave empty for a normal fresh run. Walks restart from page 1, so see the Resume known limitation above.
incrementalModebooleanfalseTurn on for daily or recurring monitoring of the same search or URL set. Classifies each product as NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED against remembered state.
stateKeystring(none)Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to derive a key automatically.
emitUnchangedbooleanfalseAlso return, and bill, products that have not changed since the last run, marked UNCHANGED.
emitExpiredbooleanfalseAlso return, and bill, products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max products or Max pages capped it, or when Resume was used. With overlapping keywords or URLs in one run it can mark still-listed products EXPIRED; see the known limitation above.
ignoreFieldsForChangesarray[]Incremental mode only. Extra fields (name or dotted path such as attributes.Colour) that never make a product UPDATED. They stay in the output.
mcpConnectorsarray(none)Optional: send a summary of each product to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which product pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Minimum 1, maximum 1000.
proxyobjectResidential, NZConnection settings.

Output Example

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

{
"url": "https://www.thewarehouse.co.nz/p/sample-two-slice-toaster/R0000001.html",
"productId": "R0000001",
"sku": "SKU000001",
"gtin": "9400000000001",
"mpn": "MPN-0001",
"title": "Sample Two Slice Toaster",
"brand": "Sample Home",
"description": "Sample product description text describing the item.",
"category": "homegarden-appliances-kitchen",
"breadcrumbs": ["homegarden", "homegarden-appliances", "homegarden-appliances-kitchen"],
"price": 49.99,
"priceMax": 59.99,
"priceText": "$49.99",
"currency": "NZD",
"availability": "IN_STOCK",
"condition": "New",
"image": "https://www.thewarehouse.co.nz/dw/image/sample/R0000001.jpg",
"images": ["https://www.thewarehouse.co.nz/dw/image/sample/R0000001.jpg"],
"imageCount": 1,
"ratingValue": 4.5,
"ratingCount": 120,
"reviewCount": 18,
"categoryPath": ["homegarden", "homegarden-appliances", "homegarden-appliances-kitchen"],
"marketplaceProduct": false,
"sellerName": null,
"reviews": null,
"attributes": { "Colour": "Red", "Wattage": "800W" },
"isOnSpecial": true,
"offerEndsAt": "2026-10-05",
"specialsCategory": null,
"features": ["Auto shut-off", "Removable crumb tray"],
"scrapedAt": "2026-09-29T02:00:00.000Z"
}

Plan Requirement

This actor runs on Apify's pay-per-event pricing: a run start fee, a fee for each product returned, and an additional fee for each product where Fetch product details actually fetched a page for a record that reached the dataset. When Fetch customer reviews is on, one more detail-enrichment unit is charged per started block of 10 reviews delivered on a saved product (never for unchanged or suppressed products); lower Max reviews per product to cap it. The Pricing tab shows the current rates. This site sits behind a bot-verification challenge. Neither a datacenter nor a residential connection clears it on its own: both are refused when a plain request is sent. The actor runs its own clearance step before reading pages, and that step is what makes results possible, so it is always part of the run. The default connection is residential, New Zealand. Apify free plans do not include residential proxies: on a free plan the actor continues on a backup connection and logs "Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable." If the backup connection serves the pages the log says "Served over the backup connection (the default connection was unavailable)." If it cannot, the run ends 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 The Warehouse pages." Other failure messages: "The proxy connection was refused for this account, so no page could be read." and "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search." Pages can still be refused from time to time, so check the run log and retry later when a run reports a connection problem.

FAQ

How much does it cost?

This actor uses pay-per-event pricing: a run start fee, a fee per product returned, and a fee per product when a detail page was actually fetched for a record that reached the dataset, and, when Fetch customer reviews is on, one more detail-enrichment unit per started block of 10 reviews delivered on a saved product (never for unchanged or suppressed products; lower Max reviews per product to cap it). The Pricing tab shows the current rates. Use Max products to cap the cost of any run.

This actor collects only publicly available product data. You are responsible for how you use it: follow The Warehouse's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product names, prices and availability are generally facts, but images and descriptions may be subject to third-party rights.

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

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated, and reappeared records, and unchanged ones are not billed unless you turn that on too.

What's the difference between Resume and Incremental mode?

Resume (resumeFromRunId) continues one specific interrupted run you already started. Incremental mode is for running the same search or URL set again and again (for example, daily) and getting only what changed. They solve different problems and can be used together to bootstrap monitoring from an existing large pull, but only when no Incremental state exists yet for that search: if it already does, a run with both set fails straight away with a message telling you to remove Resume or set a different State key.

Why did a later keyword, or a resumed run, return fewer products than expected?

Two known limitations, described under "How Max products and Max pages shape a run" and "Resume and recurring updates". First, when one run covers several keywords or URLs, a later one stops as soon as a page holds only products an earlier one already returned, so its deeper pages are skipped. Second, a resumed run starts every search again from page 1 and stops at the first page it already saved. With Emit expired on, products a multi-keyword run did not reach are marked EXPIRED even though they are still listed, and come back as REAPPEARED on a later run. Run overlapping keywords or URLs as separate runs, extend a large pull with a URL that points at a later results page, and treat EXPIRED as "not seen this run" rather than proof of delisting.

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

This actor fails outright only when it cannot start a meaningful scrape at all: no search keywords or URLs supplied, a pasted Resume run/dataset ID that this Apify account cannot read, or Resume combined with Incremental mode for a search that already has saved Incremental state. If the site blocks or challenges some requests, you still get every product that was reached; run it again to fill in the rest. Note that a run in which every request was blocked finishes with an empty dataset rather than failing, so check the run log if you get zero products for a search you know has results.

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.

๐Ÿ”— Want more e-commerce data?

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

๐Ÿ”Œ PB Tech Scraper
Scrape pbtech.co.nz products with full specifications, price, brand, condition, per-store...
๐Ÿš— Trade Me NZ Scraper
Scrape trademe.co.nz across all five sections: Marketplace goods and auctions, Property...
๐Ÿ›’ Chemist Warehouse AU
Scrape chemistwarehouse.com.au products with prices, RRP, discounts, stock, images...
๐Ÿงฉ Distressed Property Scraper
Find mortgagee-sale and distressed-property listings in Australia and New Zealand. NZ...
๐Ÿ  Homes.co.nz Scraper
Scrape Homes.co.nz listings by location or URL with pagination. Extract property details...
๐Ÿ’ผ SEEK Company Reviews
Scrape SEEK Australia and New Zealand company profiles and employee reviews. Choose...

๐Ÿ‘‰ 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.