Woolworths Scraper: Australia Grocery Prices and Specials
Pricing
from $0.27 / 1,000 products
Woolworths Scraper: Australia Grocery Prices and Specials
Scrape Woolworths Australia products and prices by keyword, category, specials or stock code: price, was price, half price and multi buy, unit price per kg or litre, in store price, stock, barcode, ingredients, nutrition, health star rating. Monitor mode returns price changes only.
Pricing
from $0.27 / 1,000 products
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
From The Mine Works, makers of ALDI Australia Scraper and B2B Leads Finder, with over 290,000 runs across 310+ public actors.
Updated 31 Oct 2026: first release. Keywords, categories by name, slug, node id or link, the full catalogue, every specials list (half price, buy more save more, lower shelf price, seasonal, online only), product links and stock codes; online and in store prices; barcode, ingredients, allergens, health star rating and nutrition on every row; monitor mode that returns only price changes; one flat row per product. Bookmark this Actor on its Store page so it is one click away next time.
Why choose this actor?
- Every price a category manager compares, in columns.
price,was_price,save_amount,is_half_priceand the multi buy offer split intomultibuy_quantityandmultibuy_total_price, plus the in store price Woolworths shows beside the online one.unit_price_normalizedputs every product on one scale (per kg, per litre or each), whatever unit Woolworths prints. - The barcode and the food facts on every row, at no extra cost. Barcode (GTIN) on 6,827 of 6,827 rows in our test, ingredients on 6,114, the nutrition panel on 6,096, plus allergens, dietary claims and the Health Star Rating. Join Woolworths to Coles, ALDI or your own range on the barcode.
- Cheap to run every day. Monitor mode remembers the last price of each product and returns only what changed, so a daily watch of 2,000 products pays for the dozens that moved. Product links go 60 to a call. Plain HTTP to the API woolworths.com.au calls itself, no browser.
- Pay per product, nothing for errors. Links that are not Woolworths links, stock codes Woolworths does not have, the summary row and duplicates found by two lists are never charged. No Woolworths account.
Part of The Mine Works E-commerce and marketplaces family: Ozon.ru Scraper, ⭐ Amazon Reviews Scraper, Amazon Product Scraper, Etsy Listings Scraper, AliExpress Scraper, Kleinanzeigen.de Scraper.
Try it in one minute
Paste this into the input (JSON view) and press Start. It returns the first 30 products for "milk". It took 9 seconds in our test run:
{"searchQueries": ["milk"],"maxItems": 30}
Put several keywords on separate lines, add categories or a specials list, or paste product links or stock codes. A product that two of your lists find is delivered once.
Apify's free plan includes $5 of credit every month, which covers about 8,700 products at this actor's price.
Copy to your AI assistant
themineworks/woolworths-scraper on Apify. Reads Woolworths Australia (woolworths.com.au) by keyword, category, specials list or product link and returns one flat row per product with online and in store price, was price, special, half price and multi buy offer, unit price and a unit price per kg or litre, stock and purchase limit, barcode, ingredients, allergens, health star rating, nutrition panel, department and category, image and link, with no login. Call ApifyClient("TOKEN").actor("themineworks/woolworths-scraper").call(run_input={"searchQueries": ["milk"], "maxItems": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Inputs: searchQueries (keywords or any woolworths.com.au link), categories (names such as Milk, slug paths such as dairy-eggs-fridge/milk, node ids, browse links, or "all"), specials (none, all, halfprice, multibuy, lowershelfprice, seasonal, onlineonly, everydaylowprice), productUrls (product links or stock codes, 60 per call), fullCatalogue (bool), maxItems (default 100, per list), sortBy (relevance, price_asc, price_desc, unit_price_asc, unit_price_desc, name_asc), specialsOnly (bool), includeSponsored (default true), includeEverydayMarket (default false), monitorMode (bool) with monitorName, monitorWatch (price or all) and includeNewProducts. Product rows have no _type field and carry retailer, product_id, barcode, name, brand, display_name, description, size, variety, price, was_price, currency, on_special, is_half_price, promotion_label, offer_description, save_amount, save_percent, multibuy_quantity, multibuy_total_price, multibuy_unit_price, member_price, is_member_special, unit_price, unit_price_unit, unit_price_display, unit_price_normalized, unit_price_normalized_unit, instore_price, instore_was_price, instore_on_special, instore_unit_price, instore_available, sold_by, sold_by_weight, in_stock, is_available, is_purchasable, stock_quantity, purchase_limit, is_new, is_online_only, age_restricted, department, category, subcategory, departments, category_path, merchandise_department, merchandise_category, merchandise_subcategory, merchandise_segment, ingredients, allergens_contains, allergens_may_contain, dietary_claims, health_star_rating, country_of_origin, nutrition, serving_size, servings_per_pack, storage, rating_average, review_count, image_url, images, url, is_sponsored, is_marketplace, seller, price_scope, found_by, search_keyword, search_category, sort_by, results_in_list, page, position, scraped_at, and in monitor mode change_type, changed_fields, previous_price, previous_was_price, price_change, price_change_percent, previous_scraped_at. Each run also writes one row with _type "summary", one with _type "info" when products were delivered, and a row with _type "error" for each input that could not be read; none of these is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~woolworths-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- Keywords, categories, specials or links. Type keywords as in the woolworths.com.au search box, give categories by name (Milk, Soft Drinks), slug path (dairy-eggs-fridge/milk), node id or link, pick a specials list (all, half price, buy more save more, lower shelf price, seasonal, online only, everyday low price), or paste any Woolworths link into any field.
- Online and in store prices. Every row has the online price and, from the same answer, the in store price, was price, special flag and unit price Woolworths shows for shopping in store.
- Food facts on every row. Barcode, ingredients, allergens it contains and may contain, dietary claims, Health Star Rating and the nutrition panel per 100 g and per serve come with every product, with no extra call and no extra charge.
- Supermarket range only, unless you ask. Woolworths mixes Everyday Market listings (third party sellers, not sold in stores) into its results. They are left out by default;
includeEverydayMarketbrings them back, markedis_marketplace. - Monitor mode. Remembers the last price of each product and returns only new products and those whose price or was price moved (
monitorWatch: "all"adds the in store price, specials starting or ending and stock changes), withprevious_price,price_changeandprice_change_percent. - Stops cleanly. A run ends after the first call if Woolworths refuses it, after 6 refused calls in a row, at the last page of a list or at
maxItems, and before its time limit, keeping every row. The summary row says why.
How to use it
Basic: products for a keyword
{"searchQueries": ["coffee beans", "oat milk"],"maxItems": 200}
Each keyword is its own list, labelled in search_keyword, in Woolworths' relevance order.
A whole category, cheapest per litre first
{"categories": ["Milk"],"sortBy": "unit_price_asc","maxItems": 500}
category_path names where each product sits (Dairy, Eggs & Fridge > Milk > Full Cream Milk). Categories without a sort come back A to Z, which keeps runs stable.
This week's half price specials
{"specials": "halfprice","maxItems": 5000}
Woolworths changes its specials on Wednesday; schedule this for Wednesday morning. 1,679 half price products on 30 Oct 2026; "specials": "all" returned 4,040 products from the five specials lists in 152 seconds.
Daily price change alerts on a watch list
{"productUrls": ["44528", "888140", "https://www.woolworths.com.au/shop/productdetails/88436/dairy-farmers-full-cream-milk"],"monitorMode": true,"monitorName": "milk-watch","includeNewProducts": false}
The first run saves the baseline and returns nothing, so it costs nothing: the start fee is charged only once a product row is stored. Every run after it returns the products whose price or was price changed, with change_type price_down or price_up. Unchanged products are not delivered and not charged.
One product at a time from Clay, n8n or an AI agent
{"productUrls": ["https://www.woolworths.com.au/shop/productdetails/44528/norco-full-cream-milk"]}
One row with the price, barcode and nutrition of that product. A bare stock code (44528) works too.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
searchQueries | array of strings | empty | Keywords, or any Woolworths link. |
categories | array of strings | empty | Category names, slug paths, node ids or links; all for every grocery department. |
specials | string | none | all, halfprice, multibuy, lowershelfprice, seasonal, onlineonly or everydaylowprice. |
productUrls | array of strings | empty | Product links or stock codes, 60 per call. |
fullCatalogue | boolean | false | Every grocery department. |
maxItems | integer | 100 | Most products per list, 1 to 30,000. |
sortBy | string | relevance for keywords, name A to Z for lists | Any Woolworths sort order. |
specialsOnly | boolean | false | Keywords and categories return only products on special. |
includeSponsored | boolean | true | Keep Woolworths' paid placements (marked is_sponsored). |
includeEverydayMarket | boolean | false | Include third party marketplace listings. |
monitorMode | boolean | false | Return only products that changed since the last run. |
monitorName | string | default | Separate price memories for separate watch lists. |
monitorWatch | string | price | all also counts in store price, specials and stock changes. |
includeNewProducts | boolean | true | Return products the monitor has not seen before. |
Give searchQueries, categories, specials, productUrls or any mix. Up to 100 lists and 10,000 product links per run.
What data do you get?
One row per product. Product rows have no _type field; the summary, info and error rows do, so a filter on _type separates them.
| Field | What it is |
|---|---|
product_id, barcode | Woolworths stock code and barcode (GTIN) |
name, brand, display_name, description, size, variety | Product, brand, name with size, short text, pack size, variety |
price, was_price, currency | Online price now, price before the special, AUD |
on_special, is_half_price, promotion_label, offer_description | Special flags and labels, e.g. Save $0.50, 2 for $5.00 |
save_amount, save_percent | The saving |
multibuy_quantity, multibuy_total_price, multibuy_unit_price | Multi buy offer |
member_price, is_member_special | Everyday Rewards member price and special |
unit_price, unit_price_unit, unit_price_display | Unit price as Woolworths shows it, e.g. $2.10 / 1L |
unit_price_normalized, unit_price_normalized_unit | The same per kg, per litre or each |
instore_price, instore_was_price, instore_on_special, instore_unit_price, instore_available | In store price and special |
sold_by, sold_by_weight | Each or by the kg |
in_stock, is_available, is_purchasable, stock_quantity, purchase_limit | Availability online; units left when Woolworths limits an order by stock |
is_new, is_online_only, age_restricted | Flags |
department, category, subcategory, departments, category_path | Where the product sits on woolworths.com.au |
merchandise_department, merchandise_category, merchandise_subcategory, merchandise_segment | Woolworths' internal grouping |
ingredients, allergens_contains, allergens_may_contain, dietary_claims | Food facts |
health_star_rating, nutrition, serving_size, servings_per_pack, country_of_origin, storage | Health Star Rating, nutrition panel per 100 g and per serve |
rating_average, review_count | Customer rating |
image_url, images, url | Main image, all images, product page |
is_sponsored, is_marketplace, seller | Paid placement, Everyday Market listing and its seller |
price_scope | online |
found_by, search_keyword, search_category, sort_by, results_in_list, page, position | The list that found the product and its place in it |
change_type, changed_fields, previous_price, previous_was_price, price_change, price_change_percent, previous_scraped_at | Monitor mode only |
scraped_at | When the row was written |
Summary row (_type: "summary", never charged): lists read and failed, products delivered and charged, duplicates, sponsored and marketplace listings skipped, requests, refused calls, kilobytes on the wire, per_list (one entry per list with products found, delivered and why it stopped) and shortfall_reason when fewer products came back than asked. The same summary is saved as the OUTPUT record of the run.
Error rows (_type: "error", never charged): one per input that could not be read, with error_type (invalid_input, not_found, category_not_found, blocked, fetch_error, source_refused), identifier and reason.
Stable fields for automations
These were present in every product row of our test runs (6,827 rows from Dairy, Eggs & Fridge and Pantry), and their names will not change:
| Field | What it is |
|---|---|
product_id | The key to store and join on |
barcode | Barcode, to join with other retailers |
display_name | Name with size |
on_special | Special flag |
is_half_price | Half price flag |
in_stock | Availability online |
category_path | Where it sits on the site |
image_url | Main image |
url | Product page |
position | Place in its list |
Nearly always present: price, unit_price_display, unit_price_normalized and instore_price (6,665 of 6,827; products Woolworths shows as unavailable have no price), brand, ingredients (6,114), nutrition (6,096), stock_quantity (5,957). Present when the product is on special: was_price (1,323), multi buy fields (410). health_star_rating when the pack carries one (2,696).
Output examples
A product from the keyword "milk" (test run, 30 Oct 2026, trimmed):
{"retailer": "Woolworths","product_id": "88436","barcode": "9310199012717","display_name": "Dairy Farmers Full Cream Milk 2L","brand": "Dairy Farmers","size": "2L","price": 4.2,"was_price": 4.7,"on_special": true,"promotion_label": "Save $0.50","save_amount": 0.5,"unit_price_display": "$2.10 / 1L","unit_price_normalized": 2.1,"unit_price_normalized_unit": "L","instore_price": 4.2,"instore_unit_price": 2.35,"in_stock": true,"purchase_limit": 36,"category_path": "Dairy, Eggs & Fridge > Milk > Full Cream Milk","ingredients": "Milk.","allergens_contains": ["Milk"],"dietary_claims": ["Gluten Free", "Low Salt", "Source of Protein", "Vegetarian"],"health_star_rating": 4,"nutrition": { "per_100g": { "Energy kJ": "259.0kJ", "Protein": "3.4g", "Calcium": "118.0mg" } },"url": "https://www.woolworths.com.au/shop/productdetails/88436/dairy-farmers-full-cream-milk-full-cream-milk","is_sponsored": true,"found_by": "keyword_search","position": 1}
A multi buy from the Pantry department (same day, trimmed):
{"product_id": "248679","barcode": "9300695004279","display_name": "Old El Paso Fajita Spice Mix Mexican Style 40g","price": 3,"on_special": true,"offer_description": "2 for $5.00 - $6.25/100G","multibuy_quantity": 2,"multibuy_total_price": 5,"multibuy_unit_price": 2.5,"unit_price_normalized": 75,"unit_price_normalized_unit": "kg","health_star_rating": 0.5,"category_path": "Pantry > Mexican > Seasonings & Ingredients"}
An error row for a stock code Woolworths does not have (nothing charged):
{ "_type": "error", "error_type": "not_found", "identifier": "99999999", "reason": "Woolworths has no product with stock code 99999999, or it is no longer listed online." }
Pricing
Pay per event: you pay for the products you receive, plus a flat $0.003 per run, whatever memory you choose. Barcode, ingredients and nutrition come with every product at no extra cost.
| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
product-scraped | Once per product row stored in your dataset | $0.54 per 1,000 | $0.45 per 1,000 | $0.36 per 1,000 | $0.27 per 1,000 |
run-start | Once per run, after the first product row is stored | $0.003 | $0.003 | $0.003 | $0.003 |
The price of one product is the price per 1,000 divided by 1,000.
Never charged:
- links that are not Woolworths links and stock codes Woolworths has no product for (each gets an error row);
- a product that a second list of the same run finds again;
- products past your
maxItems, sponsored products whenincludeSponsoredis off, and Everyday Market listings unless you include them; - unchanged products in monitor mode, and new ones when
includeNewProductsis off; - the summary, info and error rows;
- a run that delivers no product: the start fee is charged only after the first product row is stored;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.
Run it on a schedule
- Open the actor in Apify Console, set your input and click Save as a new task.
- In the task, open Schedules, click Add schedule and pick how often (every day, every Wednesday at 07:00 for the new specials, and so on).
- Turn on
monitorModein the task so each run returns only the products whose price changed, or compare runs yourself onproduct_idandprice. - Optional: add an integration (Google Sheets, Slack, a webhook) so each run lands where your team works.
FAQ
What does this actor read?
The same API woolworths.com.au calls in your browser to fill its search, category, specials and product pages, as anyone sees them without logging in. It does not log in, add anything to a trolley or read account data.
Are the prices for a particular store?
They are Woolworths' online prices, the ones the site shows before you choose a delivery address or pick up store, plus the in store price Woolworths shows beside them. Woolworths keeps store prices behind an address session, which this actor does not open. For prices by store and postcode in Australia, see our Coles Scraper and ALDI Australia Scraper.
How many products can I get?
Up to 30,000 per list. The full catalogue returned 24,864 products in our test (21 departments, duplicates across departments removed). Product links: up to 10,000 per run, 60 per call.
Why do some rows have no price?
Woolworths still lists products that are out of stock or not sold online at the moment; they come back with in_stock: false and no price. 162 of 6,827 rows in our test.
How does monitor mode know what changed?
It keeps the last price, was price, in store price, special and stock of every product it delivered in a key value store named after monitorName in your Apify account. Each run compares against it and saves the new values. Use a different monitorName for each watch list.
How long does a run take?
In our tests: 9 seconds for the "Try it" input, 49 seconds for 177 products across 6 lists and 3 product links, 243 seconds for 6,827 products from two departments, and 1,160 seconds for the full catalogue of 24,864 products. The default time limit is 3,600 seconds; the actor stops before it and keeps every row.
Do I need an account, cookies or a proxy?
No. The actor opens its own anonymous session with one small call and uses Apify Proxy, included in the price. Woolworths answered every call in our tests.
Which formats can I download?
JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has four ready views: Products, Prices, Ingredients and nutrition, and Price changes. In CSV and Excel, nutrition is flattened into columns such as nutrition/per_100g/Protein.
Can I use it from Claude, ChatGPT or Cursor (MCP)?
Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/woolworths-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http woolworths-scraper "https://mcp.apify.com/?tools=themineworks/woolworths-scraper"
Is it legal to scrape Woolworths?
The actor reads public product and price data that Woolworths shows to anyone without logging in, and no personal data. Woolworths' robots.txt asks crawlers to stay away from its /shop/search pages; the actor does not load those pages, it calls the search API the site uses for them, with the keyword you give. Decide for yourself whether that suits your use. You are responsible for how you use the data and for following the site's terms and the law. This is general information, not legal advice. Woolworths is a trademark of Woolworths Group; this actor is independent and not affiliated with it.
Integrations
- Google Sheets: send each run's products to a sheet with Apify's Google Sheets integration; one row per product fits a sheet as is.
- Make, Zapier and n8n: start a run and read its dataset with the Apify apps and nodes, for example "Woolworths price drops on our watch list every morning to Slack".
- Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
- API and SDKs: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.
More from The Mine Works
E-commerce and marketplaces
- Ozon.ru Scraper
- ⭐ Amazon Reviews Scraper
- Amazon Product Scraper
- Etsy Listings Scraper
- AliExpress Scraper
- Kleinanzeigen.de Scraper
- Carsales.com.au Scraper
- eBay Product Listings Scraper
- Shopify Store Scraper
- 🛒 TikTok Shop Scraper
- Walmart Product & Price Scraper
- Vinted Scraper
Social media and video
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
Company and business data
Food and local services
Developer and AI tools
More tools
Support
Found a list that returns fewer products than the site, or a field that comes back empty? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.
Search Woolworths Australia by keyword, category, specials or stock code and get every product back as one row, with online and in store price, was price, half price and multi buy offers, unit price per kg or litre, barcode, ingredients and nutrition, no login.

