New World NZ Scraper — Store Prices, Clubcard, Specials, EAN avatar

New World NZ Scraper — Store Prices, Clubcard, Specials, EAN

Pricing

from $4.00 / 1,000 products

Go to Apify Store
New World NZ Scraper — Store Prices, Clubcard, Specials, EAN

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

architek.earth

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

17 days ago

Last modified

Categories

Features

Limited permissions

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.

SourceMarketFromStandout fields
New World (newworld.co.nz)New Zealand$4.00 / 1,000 products + $0.15 per runprice / 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, allergens and nutrition come only with includeDetails and only when New World publishes them. A row whose detail request fails keeps its list fields and carries detailUnavailable: true, at the same price. After 5 detail failures in a run, details are turned off and later rows carry list fields only (noted in RUN_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_LIMIT and STATE_BUSY. Filter on recordType if 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 BLOCKED row and ends PARTIAL (rows kept and charged) or BLOCKED (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 ends TIME_LIMIT with nothing fetched or charged. With a stateKey, continuePreviousRun: true resumes 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 stateKey stops with RECONCILIATION_REQUIRED instead of guessing: nothing is replayed or charged twice. Use a new stateKey to 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

ParameterTypeDefaultDescription
searchTermsarray—Keywords such as milk or weet-bix, up to 50. Use searchTerms, categories or both.
categoriesarray—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.
storesarray["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.
maxItemsPerQueryinteger100Products per search term or category, per store. 0 means everything New World lists, up to 1,000.
includeDetailsbooleanfalseAdd barcode, description, ingredients, allergens, nutrition and imageUrl. One extra request per product; same price per product.
incrementalModebooleanfalseNeeds 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.
stateKeystring—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.
continuePreviousRunbooleanfalseResume 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.
proxyConfigurationproxyRESIDENTIAL, NZResidential New Zealand proxy is required. API callers should pass it explicitly.
feedbackstring—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.

FieldTypeMeaning
idstringNew World product ID, for example 5201479-EA-000. Unique per store per run.
name / brand / packageSizestringProduct name, brand and size as shown (2l, 750g).
pricenumberShelf (non-Clubcard) price at this store, NZD.
clubPrice / clubPricePerUnitnumber, omitted when noneClubcard-only single-item price and its unit price at this store, NZD.
pricePerUnit / pricePerUnitLabelnumber / stringUnit price at the shelf price and its basis (1L, 100g).
isOnPromotionbooleanTrue when New World lists any promotion for the product at this store.
promotionsarray, omitted when noneOffers as published: promoId, type, value (NZD), quantity (2 = "2 for"), clubcardOnly.
saleTypestringHow New World sells it, for example UNITS.
availabilityChannelsarrayIN_STORE and/or ONLINE. Channels, not stock.
categorystringDepartment > Aisle > Shelf.
isLiquor / isRestrictedbooleanAge-restricted product flags.
urlstringProduct page on newworld.co.nz.
storeId / storeName / storeRegionstringThe store these prices belong to.
positionnumberRank in that store's results (1 = first).
sourceobject{source: "search", query, page} or {source: "category", category, page}.
barcodestring, omitted when noneEAN-13, with includeDetails.
recordTypestringproduct on every product row, status on a free status row.
detailUnavailableboolean, optionaltrue when includeDetails was on but the product's detail request failed.
deliveryIdstringUnique 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.

EventPriceWhat it covers
product$4.00 / 1,000 productsOne delivered product row (one product at one store), with or without details.
collection-delivered$0.15 per runOnce 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

Full catalogue: github.com/architek-earth.

architek.earth · code like concrete

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 BLOCKED now 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 BLOCKED row 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 inputs incrementalMode, stateKey and continuePreviousRun. 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 run LIMITED (resume with a stateKey). New fields recordType, detailUnavailable and deliveryId; 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.