Woolworths Australia Scraper - Prices, Specials & Price History avatar

Woolworths Australia Scraper - Prices, Specials & Price History

Pricing

from $0.30 / 1,000 products

Go to Apify Store
Woolworths Australia Scraper - Prices, Specials & Price History

Woolworths Australia Scraper - Prices, Specials & Price History

Woolworths AU products, prices, unit prices and specials with price history, genuine-discount checks, nutrition, allergens and barcodes. Served from a nightly-refreshed catalogue: fast, reliable, no start fee.

Pricing

from $0.30 / 1,000 products

Rating

0.0

(0)

Developer

Piotr Zimniak

Piotr Zimniak

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

Get prices, unit prices, specials, barcodes and full product details (description, ingredients, allergens, nutrition, health stars, dietary tags, images) from woolworths.com.au as JSON, CSV, Excel or via API. It also gives you price history and genuine-discount checks, which no other Woolworths scraper offers.

Why this one

  • Reliable. Results come from a catalogue we refresh every night, so a run does not depend on Woolworths answering at that moment. If live requests are blocked, the run still succeeds with the latest data and a warning, instead of failing.
  • Fast. Cached queries return in 2-3 seconds; a 1,000-product live search takes about 20 seconds.
  • Price history for every product. Each result includes the previous price, when it changed, the lowest price in 30 days and the 90-day average. It also says whether a "special" is a genuine discount.
  • The whole catalogue in one run. Every product Woolworths sells (~25-30k), straight from the nightly snapshot.
  • Clean data. Unit prices are normalised to per kg and per litre, nutrition is parsed, and Woolworths' garbled text is repaired.
  • Pay for results, not for runs. From $0.30 per 1,000 products; the start fee is $0.00005 (a twentieth of a cent).

What can you use it for?

  • Price monitoring: shelf and unit prices of the products you care about, on a schedule.
  • Deal hunting and consumer research: current specials with a check on whether the discount is real.
  • Price-change alerts: products whose price changed since your last run, sent to email, Slack or Sheets.
  • Basket and store comparison: barcodes, MPNs and per-kg prices make matching across stores straightforward.
  • Nutrition and allergen apps: filter by dietary tags, allergens, health stars, sugar or protein.
  • Market and category research: brands, pack sizes, price points, new launches, full-catalogue exports.
  • AI agents: a fast, well-described tool for "find me the cheapest…" style questions (see Use with AI agents).

Quick start

  1. Click Try for free (or Start), keep the default input (search for milk) and press Start.
  2. Open the Output tab: a table of products with prices, unit prices and specials. Switch views to Product details or Deals check, or export as JSON, CSV or Excel.
  3. Change the input using one of the ready-to-use examples below, and save it as a task to reuse or schedule it.

Modes

ModeWhat you give itWhat you get
search (default)queries: keywordsmatching products, like the site's search
categorycategoryUrls: any woolworths.com.au/shop/browse/... URLthe products in that category
specialsoptional specialsGroupscurrent specials; Half Price first, then other promotions
productsproductIds: stockcodes (the number in a product URL)those exact products
urlsurls: any Woolworths product, search, category or specials URL, or a stockcodewhatever each link shows; paste links from your browser
catalognothing (set maxItems high, e.g. 30000)the whole catalogue from the nightly snapshot; filters apply
categoriesnothingdepartments, categories and specials groups with their URLs

Ready-to-use examples

Paste any of these into the JSON tab of the input (or send them through the API).

1. Price check for a shopping list: the exact products you buy, by stockcode.

{ "mode": "products", "productIds": ["88436", "888140", "6073909"] }

2. Cheapest coffee per kg: a search sorted by unit price, within a price range.

{ "queries": ["coffee beans"], "sortBy": "unit_price_asc", "minPrice": 5, "maxPrice": 40, "maxItems": 50 }

3. Everything in a category, cheapest first:

{ "mode": "category", "categoryUrls": ["https://www.woolworths.com.au/shop/browse/dairy-eggs-fridge/milk"], "sortBy": "price_asc", "maxItems": 500 }

4. This week's half-price specials:

{ "mode": "specials", "specialsGroups": ["half-price"], "maxItems": 2000 }

5. New specials only, every Wednesday: schedule this weekly to get what just went on special.

{ "mode": "specials", "onlyNewSpecials": true, "maxItems": 2000 }

6. Price-drop alerts since your last run: schedule it daily; each run returns only products whose price changed.

{ "mode": "products", "productIds": ["88436", "888140", "6073909"], "changedSince": "last-run" }

7. Gluten-free snacks with less than 5 g sugar per 100 g:

{ "queries": ["snacks"], "dietary": ["Gluten Free"], "maxSugarPer100g": 5, "maxItems": 100 }

8. Allergy-safe: no peanuts or tree nuts, at least 4 health stars:

{ "queries": ["muesli bars"], "excludeAllergens": ["Peanut", "Tree Nut"], "minHealthStarRating": 4 }

9. The whole catalogue (analytics, BI, price comparison sites): served from the nightly snapshot in seconds.

{ "mode": "catalog", "maxItems": 30000 }

10. New products this week:

{ "mode": "catalog", "onlyNew": true, "maxItems": 30000 }

11. 90-day price history for a few products:

{ "mode": "products", "productIds": ["88436", "888140"], "priceHistoryDays": 90 }

12. Links straight from the browser:

{ "mode": "urls", "urls": [
"https://www.woolworths.com.au/shop/productdetails/88436/dairy-farmers-full-cream-milk",
"https://www.woolworths.com.au/shop/search/products?searchTerm=tim%20tam",
"https://www.woolworths.com.au/shop/browse/specials/half-price"
] }

13. Everyday Market (third-party sellers) with seller and delivery terms:

{ "queries": ["kettle"], "includeMarketplace": true, "sortBy": "price_asc", "maxItems": 50 }

Input options

Filters and sorting (all modes):

  • sortBy: relevance, price_asc, price_desc, unit_price_asc, name, specials_first. Sorting is done by Woolworths before paging, so you get the true cheapest products, not just a re-ordered first page.
  • specialsOnly, inStockOnly, minPrice / maxPrice, minRating (customer stars), excludeCategories (department names or slugs).
  • includeMarketplace: off by default, so only products sold by Woolworths are returned (third-party Everyday Market listings are excluded at the source). When it is on, marketplace items include seller (name, dispatch time, delivery days and fee, returns) and mpn.
  • specialsGroups (specials mode): half-price, buy-more-save-more, lower-shelf-price, seasonal-price, bundles, everyday-low-price.

Health and nutrition: dietary (e.g. ["Gluten Free", "Vegan"], all required), excludeAllergens (e.g. ["Peanut", "Milk"]), minHealthStarRating, maxSugarPer100g, minProteinPer100g. Products without the data a filter needs are left out, so you never get a product we can't confirm.

Price history (from our shared daily price database):

  • changedSince: only products whose price changed since a date (2026-09-01) or since your previous run (last-run).
  • onlyNewSpecials: only products that went on special in the last 7 days (Woolworths specials change on Wednesdays).
  • onlyNew: only products that appeared at Woolworths in the last 7 days.
  • priceHistoryDays: add the list of price changes from the last N days.

Other options:

  • maxItems: products per query / category / URL, after filters (default 100). For specials, products and catalog it applies per run.
  • maxAgeHours: how old cached data may be (default 12; 0 = always fetch live).
  • fetchFullDetails: add country of origin, the nutrition panel exactly as printed and all images. It takes one extra request per product and is charged per product.
  • includeRaw: add the original Woolworths payload (every attribute, including ones we don't map).

Example output

{
"store": "woolworths",
"productId": "88436",
"barcode": "9310199012717",
"name": "Dairy Farmers Full Cream Milk 2L",
"brand": "Dairy Farmers",
"size": "2L",
"url": "https://www.woolworths.com.au/shop/productdetails/88436/dairy-farmers-full-cream-milk-full-cream-milk",
"price": 4.7,
"wasPrice": 4.7,
"unitPrice": 2.35,
"unitMeasure": "1L",
"pricePerKg": null,
"pricePerLitre": 2.35,
"isOnSpecial": false,
"specialType": null,
"inStock": true,
"categoryPath": ["Dairy, Eggs & Fridge", "Milk", "Full Cream Milk"],
"description": "Dairy Farmers Full Cream Milk 2L is Australian owned, made and loved. ...",
"ingredients": "Milk.",
"allergens": { "contains": ["Milk"], "mayContain": [] },
"nutrition": {
"servingSize": "250.0 ML",
"servingsPerPack": "8.0",
"items": [{ "name": "Energy", "per100": "259.0kJ", "perServing": "648.0kJ" }, { "name": "Protein", "per100": "3.4g", "perServing": "8.5g" }]
},
"healthStarRating": 4,
"dietaryTags": ["Gluten Free", "Low Salt", "Source of Protein", "Vegetarian"],
"countryOfOrigin": "Australia",
"images": ["https://cdn0.woolworths.media/content/wowproductimages/large/088436.jpg", "..."],
"rating": { "average": 4.6, "count": 132 },
"isMarketplace": false,
"previousPrice": 4.95,
"priceChangedAt": "2026-10-14T15:31:02.000Z",
"firstSeenAt": "2026-09-26T15:05:01.000Z",
"lowestPrice30d": 4.7,
"averagePrice90d": 4.86,
"specialStartedAt": null,
"discountCheck": null,
"specialCycle": null,
"scrapedAt": "2026-10-20T15:45:14.223Z",
"source": "cache"
}

Output fields

GroupFields
Identitystore, productId (stockcode), barcode (EAN), mpn, name, brand, size, url, imageUrl, images, categoryPath
Priceprice, wasPrice, unitPrice + unitMeasure, pricePerKg, pricePerLitre, pricePerItem, inStock
SpecialsisOnSpecial, specialType, specialStartedAt, discountCheck, specialCycle
HistorypreviousPrice, priceChangedAt, lowestPrice30d, averagePrice90d, firstSeenAt, priceHistory (with priceHistoryDays)
Product detailsdescription, ingredients, allergens, nutrition, healthStarRating, dietaryTags, storage, manufacturer, countryOfOrigin*
Reviews & sellerrating, isMarketplace, seller (marketplace only)
FreshnessscrapedAt, source (cache or live)

* countryOfOrigin needs fetchFullDetails. All prices are in AUD, as numbers. Detail fields are null (or empty lists) when Woolworths has no data for a product.

Deal check for specials: discountCheck.verdict is:

  • genuine when the "was" price was actually charged for at least 28 of the 90 days before the special;
  • questionable when it was not (for example, when the price was raised shortly before the "discount");
  • insufficient-history until we have 28 days of history for the product.

specialCycle shows how often a product goes on special and when the next one is expected, once we have seen 3 of its specials.

Price alerts in 5 minutes

  1. Save a task with the input you want to watch (examples 5 and 6 above are good starting points).
  2. Add a schedule (for example every Wednesday morning, when specials change, or daily for price drops).
  3. In the task's Integrations tab, send results to email, Slack, Google Sheets, Zapier, Make, n8n or a webhook.

With changedSince: "last-run", each run returns only what changed since the previous one, so quiet days cost nothing.

Run it through the API

cURL (runs synchronously and returns the items):

curl -X POST "https://api.apify.com/v2/acts/crawlplant~woolworths-au/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries": ["milk"], "maxItems": 20}'

JavaScript (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('crawlplant/woolworths-au').call({ mode: 'specials', specialsGroups: ['half-price'], maxItems: 200 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((p) => `${p.name}: $${p.price} (was $${p.wasPrice})`));

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("crawlplant/woolworths-au").call(run_input={"queries": ["coffee"], "sortBy": "unit_price_asc", "maxItems": 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["name"], item["pricePerKg"])

Use with AI agents

The Actor works as a tool in the Apify MCP server: Claude, ChatGPT, Cursor, VS Code, LangChain, CrewAI, OpenAI Agents and others. Small queries are answered from the cache in seconds, and every output field is described, so agents understand the data without extra prompting.

To give an assistant only this tool, use this server URL:

https://mcp.apify.com?tools=crawlplant/woolworths-au

Example for Claude Desktop (claude_desktop_config.json):

{ "mcpServers": { "woolworths": { "command": "npx", "args": ["mcp-remote", "https://mcp.apify.com?tools=crawlplant/woolworths-au"] } } }

Try prompts like "find the cheapest gluten-free pasta per kg at Woolworths", "which Woolworths half-price specials are genuine this week?" or "what did milk cost at Woolworths over the last 90 days?".

Pricing

Pay per result: you pay for the products returned, and platform usage (compute, proxies) is included.

EventFree planStarterScaleBusiness and up
Product (per 1,000 results)$0.50$0.40$0.35$0.30
Full product details (per 1,000, only with fetchFullDetails)$0.50$0.40$0.35$0.30
Actor start (per run)$0.00005$0.00005$0.00005$0.00005

Product details, price history and deal checks are included in the product price. A failed or empty run costs only the start fee. Example: the default run (100 products) costs $0.05 on the Free plan.

Data freshness

Every item has scrapedAt (when the price was read from Woolworths) and source:

  • cache: from our database, no older than your maxAgeHours. The whole catalogue is refreshed every night (Sydney time).
  • live: fetched from Woolworths during your run.

If Woolworths blocks live requests, the run doesn't fail: you get the latest cached data, with a warning in the run's OUTPUT record.

Troubleshooting

  • Fewer results than expected: filters (price, dietary, allergens, ratings) leave out products that don't match or have no data. The OUTPUT record in the run's key-value store lists any warnings, e.g. when up to 30 pages were scanned without enough matches.
  • "category not found": run mode categories to get the exact category URLs, then paste one into categoryUrls.
  • previousPrice is null: we have not seen that product's price change since we started tracking it.
  • onlyNew / onlyNewSpecials return nothing with a warning: these need a week of tracking history for the store; the warning shows the date they start working.
  • Results differ slightly between two identical runs: Woolworths' relevance order shifts between requests. Sort by name or a price for exact, repeatable results.
  • A stockcode isn't returned: the product no longer exists; it is listed in the run warnings and not charged.

FAQ

Which store's prices are these? The default online prices Woolworths shows before you choose a store or delivery address. Some prices differ in-store and by region.

Why are some products missing price? The product is currently unavailable online.

How is this different from other Woolworths scrapers? Runs don't fail when the site blocks requests, results are served from a nightly snapshot in seconds, and every product carries price history, a genuine-discount check, normalised unit prices and parsed nutrition. There is also a full-catalogue mode, and a start fee of just $0.00005.

Is this legal? The Actor reads only public product and price information that anyone can see without logging in. It does not collect personal data. It is not affiliated with Woolworths Group.

Limits

  • With filters, up to 30 result pages (~1,000 products) are scanned per query or category; the run says so when that cap is hit.
  • Relevance order on Woolworths shifts slightly between requests, so very large relevance-sorted searches can differ by a few products between runs. Sort by name or price for exact, repeatable results.
  • Personalised prices (Everyday Rewards member prices, "My Specials") need a login, so they are not included.

Run summary

The key-value store record OUTPUT shows items returned (cache vs live), invalid records skipped, blocked requests, the proxy route used, extra events charged and any warnings.

Privacy

The Actor only reads public product pages and does not collect personal data. To decide which features to build next, each run sends the developer anonymous usage statistics: the mode, which options were used (e.g. "sortBy: price_asc", "specialsOnly: on", "2 queries"), result counts and duration. It never sends your search terms, URLs, product ids, results or any account information.