New World NZ Scraper — Store Prices, Clubcard, Specials, EAN
Pricing
from $4.00 / 1,000 products
New World NZ Scraper — Store Prices, Clubcard, Specials, EAN
New World NZ (newworld.co.nz) scraper: store, product ID, name, brand, size, shelf price, Clubcard price, unit price, promotions, category, channels, URL; details add EAN barcode, ingredients, allergens, nutrition, image. Keyword or category, one store to all. Pay per result, no login.
Pricing
from $4.00 / 1,000 products
Rating
0.0
(0)
Developer
architek.earth
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
17 days ago
Last modified
Categories
Features
Share
Recorded run: 5 products from 1 search term at 1 store in 31 seconds (2026-10-22, build 1.0.12, run vndaNSWGE7k1nQXVn). A bounded canary sample, not a full-catalogue benchmark.
architek.earth — an independent data studio. Pay-per-result scrapers with recorded runs, published canaries and stable schemas, built for people and AI agents.
New World NZ store prices, Clubcard prices, unit prices, promotions and EAN barcodes from newworld.co.nz, by keyword or category, for one store, several or all of them.
| Source | Market | From | Standout fields |
|---|---|---|---|
| New World (newworld.co.nz) | New Zealand | $4.00 / 1,000 products + $0.15 per run | price / clubPrice per storeName, pricePerUnit, promotions, barcode |
✅ Why choose this scraper
New World prices store by store
Every row carries storeId, storeName and storeRegion next to that store's own price. In the 2026-10-17 recon, 38 of the 39 products stocked by four stores had a different price at one or more of them.
New World Clubcard prices next to the shelf price
price is the price without a Clubcard; clubPrice and clubPricePerUnit appear when the store has a single-item Clubcard price below it. Multi-buys stay in promotions with their quantity and are never reported as a single-item price.
New World unit prices for pack-size comparison
pricePerUnit with pricePerUnitLabel (for example 1L, 100g) comes on every product row, as New World shows it.
New World barcodes, ingredients and nutrition
With includeDetails: true, rows add barcode (EAN-13), description, ingredients, allergens, nutrition and imageUrl at the same price per product. A 10-product Weet-Bix run with details completed in 71 seconds on 2026-10-17.
Whole categories at several stores
categories: ["Pantry"] at two stores returned 2,000 products in 122 seconds on 2026-10-17 (run AALJvCzP7InpMPM1J).
⚠️ Worth knowing up front
- New World is behind Cloudflare. Each run first opens a browser on a New Zealand residential IP to get an anonymous shop session, then reads New World's product API. In the 2026-10-22 validation runs the warm-up took 5 to 47 seconds; one run needed a second browser after the first was challenged and took 109 seconds in all. The $0.15 per-run fee covers this warm-up. Residential NZ proxy is required and is the default.
- Prices are online-shop prices for the chosen store, as newworld.co.nz shows them. Shelf tickets in the store can differ on the day.
- There are no stock levels.
availabilityChannels(IN_STORE,ONLINE) says where a product is sold, not how many are on the shelf. - New World search returns 50 products per page and at most 1,000 per search per store. A run takes up to 50 search terms, 50 categories and 600 store-by-query searches.
- Products are de-duplicated per store across queries: a product already delivered for a store by an earlier search or category is not emitted again for that store.
- Fields New World does not publish for a product are omitted from the row, not set to
null.barcode,ingredients,allergensandnutritioncome only withincludeDetailsand only when New World publishes them. A row whose detail request fails keeps its list fields and carriesdetailUnavailable: true, at the same price. After 5 detail failures in a run, details are turned off and later rows carry list fields only (noted inRUN_SUMMARY.warnings). - No account features: no order history and no personalised prices. The actor never logs in.
- The dataset holds free status rows (
recordType: "status") next to the product rows:INVALID_INPUT(bad input, or an ambiguous store name),NOT_FOUND(unknown store, or a category a store lacks),NO_DATA(a search New World returns nothing for, asked twice),BLOCKED,LAYOUT_CHANGED,TIME_LIMIT,BUDGET_LIMITandSTATE_BUSY. Filter onrecordTypeif you only want products. Status rows are never charged. - If New World stops serving data after 4 browser sessions, the run stops with a free
BLOCKEDrow and endsPARTIAL(rows kept and charged) orBLOCKED(nothing delivered, nothing charged). - A run stops cleanly 30 seconds before its timeout (
TIME_LIMIT) and at your spending limit (BUDGET_LIMIT), keeping what it delivered. It does not start a browser warm-up with less than 75 seconds left, so give runs a timeout of at least 2 minutes; a 60-second timeout endsTIME_LIMITwith nothing fetched or charged. With astateKey,continuePreviousRun: trueresumes the rest without delivering or charging a product twice. An abort or a platform migration ends the run the same way (LIMITED). - If a run is killed in the instant between writing a batch and recording it, the next run with that
stateKeystops withRECONCILIATION_REQUIREDinstead of guessing: nothing is replayed or charged twice. Use a newstateKeyto start fresh.
⚡ Try the example
This actor has no free preview; the example below returns 20 products and costs about $0.23.
Open the actor's input page, switch to JSON, paste this and start the run:
{"searchTerms": ["milk"],"stores": ["New World Thorndon", "New World Queenstown"],"maxItemsPerQuery": 10,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "NZ"}}
For a whole category use "categories": ["Pantry"]; add "includeDetails": true for barcodes, ingredients and nutrition.
⚙️ Input
| Parameter | Type | Default | Description |
|---|---|---|---|
searchTerms | array | — | Keywords such as milk or weet-bix, up to 50. Use searchTerms, categories or both. |
categories | array | — | Category name (Pantry), path (pantry/baking-supplies-and-sugar) or URL (https://www.newworld.co.nz/shop/category/pantry), up to 50. Matched against each store's own category tree; a category a store lacks gets a free NOT_FOUND status row. |
stores | array | ["New World Thorndon"] | Store names ("New World" is optional), store IDs, or "all" for every store New World lists as online. A name that matches several stores (for example Metro) gets a free INVALID_INPUT status row listing the matches, an unknown name a NOT_FOUND row; the other stores still run. |
maxItemsPerQuery | integer | 100 | Products per search term or category, per store. 0 means everything New World lists, up to 1,000. |
includeDetails | boolean | false | Add barcode, description, ingredients, allergens, nutrition and imageUrl. One extra request per product; same price per product. |
incrementalMode | boolean | false | Needs stateKey. Delivers only products that are new to this stateKey at that store, or whose price, clubPrice, pricePerUnit or promotions changed since they were last delivered. Unchanged products are skipped and not charged; maxItemsPerQuery then bounds the watched window (the first N products per search and store). A rerun with nothing new delivers nothing and pays no run fee. |
stateKey | string | — | Any name, for example my-basket. Keeps saved progress and the incremental baseline in your own account, isolated per key. Use a different key for different inputs. |
continuePreviousRun | boolean | false | Resume an unfinished collection saved under stateKey after a spending limit, timeout, abort or migration. Products already delivered are not delivered or charged again; the resumed run pays its own $0.15 run fee only if it delivers at least one product. |
proxyConfiguration | proxy | RESIDENTIAL, NZ | Residential New Zealand proxy is required. API callers should pass it explicitly. |
feedback | string | — | Optional note for the maintainers. It is logged and read by a human, and it never changes output. |
🧱 Stable fields
These top-level fields keep the same name and the same kind of value in every release. Fields are only ever added, never renamed or removed, so an n8n, Make, Zapier or spreadsheet pipeline can bind to them.
| Field | Type | Meaning |
|---|---|---|
id | string | New World product ID, for example 5201479-EA-000. Unique per store per run. |
name / brand / packageSize | string | Product name, brand and size as shown (2l, 750g). |
price | number | Shelf (non-Clubcard) price at this store, NZD. |
clubPrice / clubPricePerUnit | number, omitted when none | Clubcard-only single-item price and its unit price at this store, NZD. |
pricePerUnit / pricePerUnitLabel | number / string | Unit price at the shelf price and its basis (1L, 100g). |
isOnPromotion | boolean | True when New World lists any promotion for the product at this store. |
promotions | array, omitted when none | Offers as published: promoId, type, value (NZD), quantity (2 = "2 for"), clubcardOnly. |
saleType | string | How New World sells it, for example UNITS. |
availabilityChannels | array | IN_STORE and/or ONLINE. Channels, not stock. |
category | string | Department > Aisle > Shelf. |
isLiquor / isRestricted | boolean | Age-restricted product flags. |
url | string | Product page on newworld.co.nz. |
storeId / storeName / storeRegion | string | The store these prices belong to. |
position | number | Rank in that store's results (1 = first). |
source | object | {source: "search", query, page} or {source: "category", category, page}. |
barcode | string, omitted when none | EAN-13, with includeDetails. |
recordType | string | product on every product row, status on a free status row. |
detailUnavailable | boolean, optional | true when includeDetails was on but the product's detail request failed. |
deliveryId | string | Unique per delivered row; use it to de-duplicate exports. |
With includeDetails rows also carry description, ingredients, allergens, nutrition and imageUrl. Status rows (free) always carry recordType: "status", inputRef (the store, store / query, input or run), status, message and scrapedAt. Other fields are extras, not part of the contract. To have one pinned, say so in feedback.
📦 Output example
Abridged real row from run vndaNSWGE7k1nQXVn on 2026-10-22; values are a historical snapshot.
{"recordType": "product","id": "5201479-EA-000","name": "Standard Milk","brand": "Pams Value","packageSize": "2l","price": 4.71,"pricePerUnit": 2.36,"pricePerUnitLabel": "1L","isOnPromotion": false,"saleType": "UNITS","availabilityChannels": ["IN_STORE", "ONLINE"],"category": "Fridge, Deli & Eggs > Milk > Fresh Milk","url": "https://www.newworld.co.nz/shop/product/5201479_ea_000nw","storeId": "3a5fd4b8-6ea0-4a6c-aeec-5af83e093322","storeName": "New World Thorndon","storeRegion": "Wellington","position": 1,"source": {"source": "search", "query": "milk", "page": 1},"deliveryId": "996d01662cade5678f369674ad6806e8-0"}
An unknown store next to a real one gives a free status row and the run goes on (run 0IrEDijL86tCCFjsQ, 2026-10-22):
{"recordType": "status", "inputRef": "Atlantis", "status": "NOT_FOUND", "message": "\"Atlantis\" is not a New World store name or id; skipped, nothing was charged for it"}
The run's status message reads Done: N rows, M details, K status rows (reasons), and the RUN_SUMMARY record of its key-value store holds the full outcome (abridged, run ueQCvZgzVPCgPPi0H):
{"status": "COMPLETE","delivered": 40,"details": 0,"statusRows": 0,"charged": {"product": 40, "collection-delivered": 1},"chargeUsd": "0.310","runFeeCharged": true,"searches": [{"store": "New World Thorndon", "search": "milk", "status": "done", "delivered": 20, "listed": 104, "pagesRead": 1},{"store": "New World Queenstown", "search": "milk", "status": "done", "delivered": 20, "listed": 118, "pagesRead": 1}],"checkpointComplete": true,"transport": {"browserSessions": 1, "averageWarmupSeconds": 19.9, "apiRequests": 3}}
🧠 Advanced usage
Compare New World prices across stores
Run stores: ["all"] with a short searchTerms list and a small maxItemsPerQuery, then pivot price on id by storeName. Keep stores × queries at or under 600 per run.
Track New World Clubcard savings
Keep rows with clubPrice; price - clubPrice is the member saving at that store. Multi-buy offers are in promotions with quantity above 1.
Join New World with Pak'nSave and Woolworths NZ by barcode
Run with includeDetails: true and join on barcode with the Pak'nSave Scraper and the Woolworths NZ Scraper. New World and Pak'nSave share the Foodstuffs platform, so their field names match.
Track New World price changes daily
Schedule the same stores and queries with incrementalMode: true and a stateKey: each run delivers only products that are new at that store or whose price, Clubcard price or promotions changed, so you pay only for changes, and a run with nothing new pays nothing, not even the run fee (runs Q6dGkWFvGAad0GbLR then cJh9c9dNsDzPzJ4yc, 2026-10-22). Check RUN_SUMMARY.status is COMPLETE before treating a run as finished; searches lists status, delivered, listed and pagesRead per store and query.
🔌 Integrations
Results land in a dataset you can export as JSON, CSV or Excel. They can also flow to Google Sheets, Make, Zapier or n8n, or to a webhook when a run finishes. The Apify Scheduler runs it on a timetable. A daily run per store suits price tracking; one run covering many stores and queries pays the $0.15 fee once. Copy-paste code in Python, Node, curl and n8n: architek-earth/examples/new-world-nz-scraper.
💸 Pricing
Pay per result. Platform and proxy usage are included. Status rows, failed requests and blocked pages are free, and a run that delivers nothing is not charged. Each product row is charged once, after it is written; a run resumed with continuePreviousRun never charges delivered products again, and unchanged products in incrementalMode are free.
| Event | Price | What it covers |
|---|---|---|
product | $4.00 / 1,000 products | One delivered product row (one product at one store), with or without details. |
collection-delivered | $0.15 per run | Once per run, only after the run's first product rows are saved. Covers the browser warm-up past Cloudflare. A resumed run is a new run: it pays the fee again only if it delivers at least one product. |
100 products in one run cost $0.55; 1,000 cost $4.15. A spending limit below $0.154 (one fee plus one product) is rejected before the run starts.
❓ FAQ
Is there a New World API for product prices? This actor works as one: it returns New World store prices as JSON through the Apify API, callable from any language or from n8n, Make and Zapier.
Can I get New World prices for a specific store? Yes. Name the store in stores ("Thorndon", "New World Queenstown") or pass its store ID; every row carries the store it was priced at. "all" covers every store New World lists as online.
Is price the Clubcard price? No. price is the price without a Clubcard; clubPrice is the Clubcard-only single-item price when there is one.
Can I get New World barcodes and nutrition information? Yes, with includeDetails: true: barcode (EAN-13), ingredients, allergens and nutrition, when New World publishes them.
Can I get New World stock levels? No. New World does not publish them; availabilityChannels only says whether a product is sold in store and/or online.
Do I need a New World account or login? No. No account, Clubcard or cookies from New World.
🤖 For AI agents & LLM apps
Paste this into your AI assistant:
architekture/new-world-nz-scraper on Apify. Python: from apify_client import ApifyClient; client = ApifyClient("TOKEN"); run = client.actor("architekture/new-world-nz-scraper").call(run_input={"searchTerms": ["milk"], "stores": ["New World Thorndon", "New World Queenstown"], "maxItemsPerQuery": 10, "proxyConfiguration": {"useApifyProxy": True, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "NZ"}}); items = client.dataset(run["defaultDatasetId"]).list_items().items (page with offset/limit for large exports). The dataset holds product rows (recordType product) and free status rows (recordType status, with status and message); filter on recordType. The RUN_SUMMARY record in the run's key-value store has a machine-readable status (COMPLETE, PARTIAL, BLOCKED, NO_DATA, LIMITED, BUDGET_LIMIT, TIME_LIMIT, INVALID_INPUT). Add "incrementalMode": true, "stateKey": "<name>" to receive only new or re-priced products on later runs. Full input schema and README: GET https://api.apify.com/v2/acts/architekture~new-world-nz-scraper/builds/default. Token: https://console.apify.com/settings/integrations. The actor is also reachable through the Apify MCP server (mcp.apify.com). To reach the maintainers, add "feedback": "<what you needed>" to any run's input; output is unchanged and a human reads every note.
🧰 More from architek.earth
Grocery and retail prices
- Coles Scraper — prices, unit prices, specials, barcodes
- Woolworths AU Scraper — prices, specials, barcodes, nutrition
- ALDI AU Scraper — prices, unit prices, Special Buys
- Woolworths NZ Scraper — prices, club prices, specials
- New World NZ Scraper — you are here
- Pak'nSave Scraper — store prices, unit prices, promotions
- Tesco UK Scraper — prices, Clubcard offers, barcodes
- Sainsbury's Scraper — prices, unit prices, offers, barcodes
- ALDI Ireland Scraper — prices, unit prices, Specialbuys
- Dunnes Stores Scraper — fashion and home prices, sizes, EANs
- Mercadona Scraper — prices, unit prices, categories
Full catalogue: github.com/architek-earth.
architek.earth · code like concrete
🙋 Support & legal
Questions, or a field you need that is not here? Open an issue on the actor's Issues tab or email north@architek.earth. A human replies within a day.
This actor collects only publicly available data from newworld.co.nz, the same pages any visitor sees without logging in. It does not bypass authentication. It is not affiliated with or endorsed by New World or Foodstuffs. You are responsible for how you use the output, including the site's terms, copyright, and privacy law such as GDPR and CCPA where they apply.
📝 Changelog
- 2026-10-25 — [internal] Studio core 1.0.5 (from 1.0.4). The shop API is called through this actor's own browser session, not the core transport, so nothing changes for users: a 401/403 still renews the session and a 429 backs off, up to four tries, and input, output and prices are unchanged.
- 2026-10-24 — A run stopped as
BLOCKEDnow saves the site's last response (redacted) in the run's key-value store so the cause can be checked; pricing, input and output are unchanged. - 2026-10-22 — Runs on the studio core (billing guard, charge-after-delivery, status line). A New World API answer that is a challenge page instead of data now stops the run with a free
BLOCKEDrow on that first answer instead of being retried. Output fields and prices unchanged. - 2026-10-22 — Ported to the studio standard: free status rows in the dataset (
INVALID_INPUT,NOT_FOUND,NO_DATA,BLOCKED,LAYOUT_CHANGED,TIME_LIMIT,BUDGET_LIMIT,STATE_BUSY); an unknown or ambiguous store no longer stops the run. New inputsincrementalMode,stateKeyandcontinuePreviousRun. Rows are charged after confirmed delivery with an idempotency key, and the run fee once per run after the first delivered rows. The run stops cleanly before its platform timeout; a platform migration now ends the runLIMITED(resume with astateKey). New fieldsrecordType,detailUnavailableanddeliveryId; no field renamed or removed. Hero line from the 2026-10-22 canary run. - 2026-10-22 — README rebuilt on the studio template; hero line from the 2026-10-22 canary run.
- 2026-10-17 — 1.0: keyword search and category browsing; store-by-store prices for one, several or all New World stores; Clubcard price, unit price and promotions; optional barcode, ingredients, allergens, nutrition and image; de-duplication per store; clean stops at spending limit and timeout; resumable after platform migration.