# Woolworths Scraper: Australia Grocery Prices and Specials (`themineworks/woolworths-scraper`) Actor

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.

- **URL**: https://apify.com/themineworks/woolworths-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.27 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Woolworths Scraper: Australia Grocery Prices and Specials

[![6,827 Woolworths products with price, unit price, specials, barcode and nutrition in 243 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/woolworths-scraper-hero.png)](https://console.apify.com/actors/sjImJconEGmhz4E7A/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [ALDI Australia Scraper](https://apify.com/themineworks/aldi-australia-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), 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_price` and the multi buy offer split into `multibuy_quantity` and `multibuy_total_price`, plus the in store price Woolworths shows beside the online one. `unit_price_normalized` puts 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.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/sjImJconEGmhz4E7A/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works E-commerce and marketplaces family:** [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [AliExpress Scraper](https://apify.com/themineworks/aliexpress-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Kleinanzeigen.de Scraper](https://apify.com/themineworks/kleinanzeigen-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### 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:

```json
{
  "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

```text
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; `includeEverydayMarket` brings them back, marked `is_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), with `previous_price`, `price_change` and `price_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

```json
{
  "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

```json
{
  "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

```json
{
  "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

```json
{
  "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

```json
{
  "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):

```json
{
  "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):

```json
{
  "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):

```json
{ "_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 when `includeSponsored` is off, and Everyday Market listings unless you include them;
- unchanged products in monitor mode, and new ones when `includeNewProducts` is 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

1. Open the actor in Apify Console, set your input and click **Save as a new task**.
2. 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).
3. Turn on `monitorMode` in the task so each run returns only the products whose price changed, or compare runs yourself on `product_id` and `price`.
4. 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](https://apify.com/themineworks/coles-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [ALDI Australia Scraper](https://apify.com/themineworks/aldi-australia-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

#### 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](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [AliExpress Scraper](https://apify.com/themineworks/aliexpress-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Kleinanzeigen.de Scraper](https://apify.com/themineworks/kleinanzeigen-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Carsales.com.au Scraper](https://apify.com/themineworks/carsales-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [eBay Product Listings Scraper](https://apify.com/themineworks/ebay-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Shopify Store Scraper](https://apify.com/themineworks/shopify-store-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [🛒 TikTok Shop Scraper](https://apify.com/themineworks/tiktok-shop-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Walmart Product & Price Scraper](https://apify.com/themineworks/walmart-product-price-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Vinted Scraper](https://apify.com/themineworks/vinted-listings-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### 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.*

# Actor input Schema

## `searchQueries` (type: `array`):

Products as you would type them in the woolworths.com.au search box, one per line. Example: milk, coffee beans, nappies. Each keyword reads Woolworths' search results, 36 per page, up to Max products per list. Any Woolworths link (product, category, search) works here too. Up to 100 searches per run.

## `categories` (type: `array`):

Woolworths categories by name (Milk, Dairy, Eggs & Fridge, Soft Drinks), slug path (dairy-eggs-fridge/milk), node id (1_6E4F4E4) or link (https://www.woolworths.com.au/shop/browse/dairy-eggs-fridge/milk). A department includes its categories. Write all to read every grocery department.

## `specials` (type: `string`):

Read Woolworths' specials lists. All: half price, buy more save more, lower shelf price, seasonal and online only specials together (Everyday Low Price is a standing price; pick it on its own). Woolworths changes its specials on Wednesday.

## `productUrls` (type: `array`):

Woolworths product links (https://www.woolworths.com.au/shop/productdetails/44528/norco-full-cream-milk) or stock codes (44528), 60 per call. Built for one record at a time from Clay, n8n or an AI agent, and for watch lists of thousands of products.

## `fullCatalogue` (type: `boolean`):

On: every Woolworths grocery department (24,864 products in our test). Max products per list does not limit it; use the run's max cost to cap the spend.

## `maxItems` (type: `integer`):

The most products to return for each keyword, category or specials list, 1 to 30,000. Product links are not limited by this. Example: 500.

## `sortBy` (type: `string`):

Order of the results, as on woolworths.com.au. Empty: relevance for keywords, name A to Z for categories and specials (stable between runs).

## `specialsOnly` (type: `boolean`):

On: keywords and categories return only the products currently on special.

## `includeSponsored` (type: `boolean`):

Woolworths mixes paid placements into its results. On: they are kept and marked is_sponsored. Off: they are left out and not charged.

## `includeEverydayMarket` (type: `boolean`):

Everyday Market is Woolworths' marketplace of third party sellers, shipped by the seller and not sold in stores. Off (default): searches and categories show the supermarket range only. On: marketplace listings are included and marked is_marketplace.

## `monitorMode` (type: `boolean`):

On: the actor remembers the last price of every product it delivered (under the monitor name) and returns only products whose price or was price changed, with previous_price, price_change and price_change_percent, plus new products. Unchanged products are not delivered and not charged. Run it on a schedule with the same input.

## `monitorName` (type: `string`):

Keeps separate price memories for separate watch lists, for example dairy-nsw. Letters, numbers and dashes. Only used in monitor mode.

## `monitorWatch` (type: `string`):

Price: price and was price only. All: also the in store price, a special or multi buy offer starting, ending or changing, and a product going in or out of stock.

## `includeNewProducts` (type: `boolean`):

On: products the monitor has not seen before are returned with change_type new (on the first run, that is every product). Off: they are saved as the baseline and not returned or charged, so the first run costs nothing per product.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy by default, which Woolworths answered on every call in our tests.

## Actor input object example

```json
{
  "searchQueries": [
    "milk"
  ],
  "specials": "none",
  "fullCatalogue": false,
  "maxItems": 30,
  "specialsOnly": false,
  "includeSponsored": true,
  "includeEverydayMarket": false,
  "monitorMode": false,
  "monitorName": "default",
  "monitorWatch": "price",
  "includeNewProducts": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "milk"
    ],
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/woolworths-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["milk"],
    "maxItems": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/woolworths-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "milk"
  ],
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call themineworks/woolworths-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,themineworks/woolworths-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sjImJconEGmhz4E7A/builds/JfIgmlYvRN4vDhBE4/openapi.json
