Pak'nSave NZ API — Store Prices & Promotions | Apify · Apify
Pak'nSave Scraper — Store Prices, Unit Prices, Promotions avatar

Pak'nSave Scraper — Store Prices, Unit Prices, Promotions

Pricing

from $4.00 / 1,000 products

Go to Apify Store
Pak'nSave Scraper — Store Prices, Unit Prices, Promotions

Pak'nSave Scraper — Store Prices, Unit Prices, Promotions

Pak'nSave New Zealand (paknsave.co.nz) scraper: product ID, name, brand, package size, price in NZD, unit price, unit label, promotions, category, sales channels, URL, store ID. Per store, by keyword or Pantry category, with continuation. 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

2

Total users

2

Monthly active users

3 hours ago

Last modified

Categories

Features

Limited permissions

Share

Recorded run: 5 products from 1 search term in 54 seconds (2026-10-22, build 0.0.23, run GMpvgGaa8OdRkLf3k). 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.

Pak'nSave NZ product prices, unit prices and promotions from paknsave.co.nz for one chosen store, by keyword or the Pantry category.

SourceMarketFromStandout fields
Pak'nSave (paknsave.co.nz)New Zealand$4.00 / 1,000 productsprice, pricePerUnit, storeId, promotions

✅ Why choose this scraper

Pak'nSave prices for a chosen store

Every row carries the storeId you requested (a public Pak'nSave store UUID); blank input selects Royal Oak. Prices are numeric NZD in price, converted from the source's cents.

Pak'nSave unit prices for pack-size comparison

pricePerUnit and pricePerUnitLabel (for example 5.11 per "1L") come back next to packageSize, with no currency strings to parse.

Pak'nSave promotions as the source publishes them

When a product has offers, promotions holds the source list unchanged; multi-buy rewards are never written into price.

A run status you can check

The SUMMARY record says complete, limited, partial or failed, with rows delivered this run; products are de-duplicated by id across queries and continuations.

Measured on a schedule

Canary tasks use bounded inputs and record rows, inputs and seconds. Scheduled checks are paused through 2026-11-15; manually verified runs are recorded in the changelog and deployment record.

⚠️ Worth knowing up front

  • Prices are store-scoped. Assortments were verified to differ between stores; overlapping sampled prices were identical, so price differences between stores have not been demonstrated. storeId records the requested store; the response does not echo it.
  • Collection uses the site's public anonymous guest and product APIs through an Apify datacenter proxy. No browser warm-up, residential proxy or image downloads are used. Paid pricing remains $0.15 per productive run plus $0.004 per product.
  • Keyword search and the Pantry category (https://www.paknsave.co.nz/shop/category/pantry) are supported. Other category URLs are rejected before collection. Some searches stop at a 1,000-result source ceiling.
  • Not returned: ingredients, nutrition, barcodes, image URLs, stock quantities, membership prices or separate was-prices. availability is always "unknown"; availabilityChannels (IN_STORE, ONLINE) are sales channels, not stock. includeDetails: true is rejected.
  • promotions is optional source passthrough, not part of the stable contract. Observed rewardValue values are in cents, and multi-buy quantities and conditions apply.
  • A run stopped by its time bound or spending limit keeps what it delivered and saves CHECKPOINT; SUMMARY then says limited or partial. That is a partial collection, not a full catalogue.
  • A run that stops early ends with a free status row ("recordType": "status") that says why. Check RUN_SUMMARY for the outcome of every run.

⚡ Try the example

Access

Version 0.1.3 requests anonymous guest credentials and product JSON directly over an Apify datacenter proxy. It does not visit the storefront HTML that intermittently shows a Cloudflare managed challenge. One fresh anonymous session is attempted if the API challenges a request; a persistent block stops cleanly and keeps delivered rows. No source account or supplied cookies are needed.

Free preview

Set preview: true for a free sample on every run: one page and up to 10 products across the whole run. There is no lifetime quota or dependency on an operator preview token, shared quota storage or canary schedules. storeId is optional; omitted or blank selects Royal Oak (e1925ea7-01bc-4358-ae7c-c6502da5ab12). Preview products never trigger product or collection charges, and previews never switch to paid mode. Invalid input, source blocks and platform limits can still prevent collection.

Open the actor's input page, switch to JSON, paste this and start the run:

{
"operation": "collect",
"searchTerms": ["milk"],
"storeId": "e1925ea7-01bc-4358-ae7c-c6502da5ab12",
"preview": true,
"maxItemsPerQuery": 10,
"maxRunSeconds": 60
}

For paid collection set "preview": false and a spending limit of at least $0.154; 10 paid products cost $0.19.

⚙️ Input

ParameterTypeDefaultDescription
operationselectcollectUse collect. capture is a developer diagnostic and is rejected on public runs.
searchTermsarray["milk"]Product keywords, up to 100. Set to [] for category-only collection.
categoryUrlsarray[]Only https://www.paknsave.co.nz/shop/category/pantry is supported; other categories are rejected before collection.
storeIdstring— (Royal Oak)Public Pak'nSave store UUID. Blank selects Royal Oak (e1925ea7-01bc-4358-ae7c-c6502da5ab12). A malformed ID returns a free INVALID_INPUT row.
maxItemsPerQueryinteger100Cap per search term or category across a continuation chain, 0 to 100,000. 0 removes the item cap, not time or spending limits.
previewbooleantrueFree preview on every run: one page, up to 10 products. false enables paid collection.
includeDetailsbooleanfalseLeave false. true is rejected; no detail fields are available.
continuePreviousRunbooleanfalsePaid only. Claims a saved checkpoint once.
previousStoreIdstring—The previous run's default key-value store ID (holds CHECKPOINT and CHECKPOINT_META), not a retailer store ID.
previousQueueIdstring—queueId from the previous run's CHECKPOINT_META; prevents the same checkpoint being replayed.
maxRunSecondsinteger240Collection deadline including source setup, 60 to 3,600 seconds; clamped to the platform timeout.
proxyConfigurationproxyApify datacenterApify proxy required and included. Collection normalizes older residential settings to datacenter.
debugSaveResponsesbooleanfalseSaves the last source response, with secrets redacted, as DEBUG-LAST-RESPONSE. Review before sharing.
captureCostModeselectnoneDeveloper-only. Leave at none.
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
idstringPak'nSave product ID (for example 5007415-EA-000); the de-duplication key within this actor.
namestringProduct name.
urlstringProduct page on paknsave.co.nz.
storeIdstringThe requested store UUID.
sourceobject{"source": "search", "searchTerm": …} or {"source": "category", "categoryUrl": …}.
availabilitystringAlways "unknown"; no stock inference.
brandstring, optionalBrand, when supplied.
packageSizestring, optionalSource pack-size label, for example 1l.
pricenumber, optionalIndividual product price in NZD.
pricePerUnitnumber, optionalUnit price in NZD.
pricePerUnitLabelstring, optionalUnit basis, for example 1L.
categorystring, optionalFirst source category path, for example Fridge, Deli & Eggs > Milk > Fresh Milk.
availabilityChannelsarray, optionalSource sales channels such as IN_STORE and ONLINE; not stock quantities.
recordTypestring"status" on free status rows; absent on product rows.

Optional fields are omitted when the source does not supply them, never invented. promotions is an extra, not part of the contract. To have one pinned, say so in feedback.

📦 Output example

Abridged real row from run GMpvgGaa8OdRkLf3k on 2026-10-22; values are a historical snapshot.

{
"id": "5007415-EA-000",
"name": "Zero Lacto Blue Milk",
"url": "https://www.paknsave.co.nz/shop/product/5007415_ea_000pns",
"storeId": "e1925ea7-01bc-4358-ae7c-c6502da5ab12",
"source": {"source": "search", "searchTerm": "milk"},
"availability": "unknown",
"brand": "Anchor",
"packageSize": "1l",
"price": 5.11,
"pricePerUnit": 5.11,
"pricePerUnitLabel": "1L",
"availabilityChannels": ["IN_STORE", "ONLINE"],
"category": "Fridge, Deli & Eggs > Milk > Fresh Milk"
}

A free status row looks like this:

{
"recordType": "status",
"status": "INVALID_INPUT",
"failureStage": "input",
"message": "Our free preview is temporarily unavailable; nothing was charged. Please retry or report this run ID."
}

🧠 Advanced usage

Track Pak'nSave price changes at one store daily

Keep storeId and the queries fixed, run once a day and diff price and pricePerUnit by id between datasets. A product missing from one day's results is an assortment change, not proof of a price change.

Scrape the Pak'nSave Pantry category

Set searchTerms: [] and categoryUrls: ["https://www.paknsave.co.nz/shop/category/pantry"] with a bounded maxItemsPerQuery and spending limit. Check SUMMARY.status is complete before treating the list as finished.

Continue a large Pak'nSave collection across runs

In paid mode set continuePreviousRun: true, previousStoreId to the prior run's default key-value store and previousQueueId to its CHECKPOINT_META.queueId, with the same store and queries. Buffered rows are delivered before new pages, results go to the new run's dataset, and each checkpoint can be claimed once. A recorded continuation on 2026-10-16 returned 54 rows with no overlap with the original run.

Compare Pak'nSave with Woolworths NZ and New World

This actor returns no barcodes, so match on normalised name plus packageSize against the Woolworths NZ Scraper or New World NZ Scraper and treat matches as candidates. Do not assume id values match across retailers.

🔌 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 paid task with a fixed storeId and a spending limit suits price tracking; previews provide a bounded sample on every run. Copy-paste code in Python, Node, curl and n8n: architek-earth/examples/paknsave-nz-scraper.

💸 Pricing

Pay per result. Platform and proxy usage are included. Status rows, failed requests and blocked pages are free. A continuation run skips products already delivered, but each productive continuation run pays the $0.15 collection fee again.

EventPriceWhat it covers
Free preview$0Free on every run; one page, up to 10 products.
product$4.00 / 1,000 productsOne product row saved to the dataset in a paid run.
collection-delivered$0.15 per runCharged once ($0.15) per paid run, after its first product is saved, including each productive continuation run. Zero-output runs are not charged.

One paid run of 10 products costs $0.19; 100 products in one run cost $0.55; 1,000 products in one run cost $4.15. A paid run needs a spending limit of at least $0.154, or it is rejected before proxy setup.

❓ FAQ

Is there a Pak'nSave API for product prices? This actor is one: it returns Pak'nSave product and price data as JSON through the Apify API, callable from any language or from n8n, Make and Zapier.

Do I need a Pak'nSave account or login? No. No Pak'nSave account, cookies or loyalty card. An Apify account is required.

Can I get Pak'nSave prices for a specific store? Yes. Pass the store's public UUID as storeId; blank uses Royal Oak. Keep one store fixed for comparisons.

Does it return Pak'nSave specials, Club Deals or was-prices? Offers the source lists come back in promotions. There is no separate was-price or membership-price field.

Can I get Pak'nSave barcodes, nutrition or ingredients? No. This release returns no barcodes, nutrition, ingredients or images.

Does it show Pak'nSave stock levels? No. availability is always "unknown", and availabilityChannels only says whether a product is sold in store or online.

🤖 For AI agents & LLM apps

Paste this into your AI assistant:

architekture/paknsave-nz-scraper on Apify. Python: from apify_client import ApifyClient; client = ApifyClient("TOKEN"); run = client.actor("architekture/paknsave-nz-scraper").call(run_input={"searchTerms": ["milk"], "storeId": "e1925ea7-01bc-4358-ae7c-c6502da5ab12", "preview": False, "maxItemsPerQuery": 10, "proxyConfiguration": {"useApifyProxy": True, "apifyProxyGroups": []}}); items = client.dataset(run["defaultDatasetId"]).list_items().items (page with offset/limit for large exports). Rows with recordType == "status" are free and explain invalid input or a stopped run. Full input schema and README: GET https://api.apify.com/v2/acts/architekture~paknsave-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 paknsave.co.nz, the same pages any visitor sees without logging in. It does not bypass authentication. It is not affiliated with or endorsed by Pak'nSave 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-11-13 — Product collection now uses the public anonymous product API over datacenter proxies, avoiding intermittent storefront challenges and browser warm-up. Free previews remain unbilled; output fields and paid prices are unchanged.
  • 2026-11-13 — Fixed free-preview initialisation after credential rotation by removing shared quota reservations. Every preview remains limited to one page and ten products with no billing; omitted store selects Royal Oak.
  • 2026-10-22 — Every run now writes RUN_SUMMARY (same document as SUMMARY, which stays). A challenge page from the product API stops the run as BLOCKED on the first response. A spending limit used up exactly by the last product now ends the run as complete. Pricing unchanged.
  • 2026-10-22 — Status message now reads Done: N rows, M details, K status rows (STATUS).
  • 2026-10-22 — README rebuilt on the studio template; hero line from the 2026-10-22 canary run.
  • 2026-10-21 — A malformed storeId now returns a free INVALID_INPUT status row before collection.
  • 2026-10-21 — Invalid input, blocks and time limits now stop cleanly with a free status row instead of a failed run; the collection deadline is clamped to the platform timeout.
  • 2026-10-16 — Added actionable failed-run status messages for insufficient allowance, exhausted previews and rejected continuation. Failure summaries retain the stage, error type and partial row counts without exposing transport credentials.
  • 2026-10-16 — Verified free preview, product/collection billing and continuation across a newly fetched page. Added zero-charge checks for insufficient allowance and consumed-checkpoint replay.
  • 2026-10-16 — Verified anonymous product API, cent-to-NZD mapping, public store selection and Pantry filtering against saved real responses. Documented unsupported fields and source limits.
  • 2026-10-16 — Prepared listing, priced examples and stable-field documentation from recorded runs; no production uptime or customer-demand claim.