The Warehouse NZ Scraper | Search, URLs, Details, Reviews
Pricing
from $1.00 / 1,000 result items
The Warehouse NZ Scraper | Search, URLs, Details, 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
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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
isOnSpecialplus 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 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,REAPPEAREDorEXPIREDacross 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.
| Field | Example |
|---|---|
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 | "Small Kitchen Appliances" |
price | 49.99 |
priceMax | 59.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) |
condition | "New" |
image | main product image URL |
images | full image gallery, one URL per entry |
imageCount | 2 |
ratingValue | 4.5 |
reviewCount | 18 |
isOnSpecial | true |
offerEndsAt | "2026-10-05" (null when the site shows no end date) |
scrapedAt | "2026-09-29T02:00:00.000Z" |
Each record also carries breadcrumbs and categoryPath (the site's own category trail), 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
- Pick a mode: Search by keyword, or Scrape pasted URLs (search result, category, or product links).
- 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.
- 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.
- 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}
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}
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 ApifyClientclient = 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 classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEARED, orEXPIRED(only after a run that scanned the whole tracked search, and only withemitExpired).stateKeynames 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. 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.
- Authorize a connector once under Apify > Settings > Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto 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
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search for keyword search, or url to scrape pasted search, category, or product URLs. |
queries | array | ["toaster"] | Search keywords. Each query is searched separately. |
specialsCategory | string | (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. |
sortBy | string | relevance | Sort 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. |
urls | array | sample search URL | Search, category, or product URLs (URL mode). Pagination starts from the page encoded in the URL when present and walks forward. |
fetchDetails | boolean | true | Open each product page for description, brand, structured attributes, breadcrumbs, image gallery and availability. |
fetchReviews | boolean | false | Also collect product reviews when the page exposes them. |
maxReviewsPerProduct | integer | 10 | Cap on reviews collected per product when Fetch customer reviews is on. Note: 0 currently falls back to the default of 10 rather than meaning "all", so set a larger number (for example 100) when you want more reviews per product. |
includeUnavailable | boolean | true | Keep products marked unavailable or out of stock. Turn off to return only likely in-stock products when the page exposes availability. |
maxItems | integer | 20 | Maximum matching products to save. Leave empty or set 0 for unlimited. This is the run's only default cap. |
maxPages | integer | 0 | Leave 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. |
resumeFromRunId | string | (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. |
incrementalMode | boolean | false | Turn 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. |
stateKey | string | (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. |
emitUnchanged | boolean | false | Also return, and bill, products that have not changed since the last run, marked UNCHANGED. |
emitExpired | boolean | false | Also 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. |
mcpConnectors | array | (none) | Optional: send a summary of each product to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which product pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Minimum 1, maximum 1000. |
proxy | object | Residential, NZ | Connection 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": "Small Kitchen Appliances","breadcrumbs": ["Home & Garden", "Appliances", "Small Kitchen Appliances"],"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. The Pricing tab shows the current rates. The default connection setting (residential, New Zealand) is already the recommended production path; this site presents a bot-verification challenge that a non-residential connection may not clear.
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 only when a detail page was actually fetched for a record that reached the dataset. The Pricing tab shows the current rates. Use Max products to cap the cost of any run.
Is it legal to scrape The Warehouse NZ?
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... | ๐ผ SEEK Company Reviews From $1/1K. Scrape SEEK Australia and New Zealand company profiles and employee reviews... |
| ๐ Homes.co.nz Scraper Scrape Homes.co.nz listings by location or URL with pagination. Extract property details... | ๐ Kogan.com Scraper Scrape Kogan.com products with full details and customer reviews. Search by keyword or... |
๐ Browse all abotapi scrapers
๐ฌ Support & custom scrapers
- ๐ 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 or message Telegram @abotapi.
- โญ Enjoying it? A quick review on the actor page helps other users find it.