# Woolworths Coles ALDI Scraper: AU Grocery Prices (`luzivanlt/au-supermarkets-scraper`) Actor

Woolworths, Coles and ALDI products for any search in one run, every results page to the end. $0.50 per 1,000 products. Unit price, specials, was price, stock, ingredients.

- **URL**: https://apify.com/luzivanlt/au-supermarkets-scraper.md
- **Developed by:** [Luzi](https://apify.com/luzivanlt) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 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 Coles ALDI Scraper: AU Grocery Prices

Search Woolworths, Coles and ALDI Australia in one run and read each store's
results for your words page after page to the last page, one row per product
per store. Each row has the price, unit price, specials and was price, stock,
categories and, at Woolworths, ingredients, allergens and nutrition. No account, login or cookies needed.

Tested daily. Latest checks: 90 products for "milk" from the three stores
in 8 seconds; and three searches read to each store's last page, 6,879
products in 10 minutes, Coles' lists whole (768 of 768).

### What does this Actor do?

You give it search terms, the words you would type in a supermarket's search
box. For each search it reads each store's results one page after another, in
the store's own order, and saves one row per product until it reaches your
limit or the store's last page. Each row carries the store's own count of
results for the search; for Coles, the run's status also says whether each
search was read whole.

Each row comes with:

- the store, the search, the product's place in the results and the store's
  result count
- the product id, name, brand, size, link and images, and the barcode at
  Woolworths
- price, was price, saving and the special's text ("Save $1.50", "Pick any 3
  for $5.10"), half price, multibuy and online-only flags
- unit price as a number, its unit ("100g", "1l") and as the store shows it
- availability, quantity available (Coles), purchase limits
- department, category and subcategory
- at Woolworths: the in-store price and special, stock, Health Star Rating,
  ingredients, allergens,
  nutrition per 100 g and per serve, storage, delivery and pick-up options,
  the product's other attributes (vegetarian, contains gluten, …), and
  the seller and its delivery fee for marketplace products
- at Coles: the store's own category, shelf-life guarantee, bonus-points
  offers, variant count and sponsored placements
- at ALDI: container deposit, on-sale date for upcoming products, and whether
  the product is for sale now

### Why use it?

- **Three supermarkets, one input.** Type a search once and get Woolworths,
  Coles and ALDI side by side, each row in the same shape.
- **Every results page.** It follows each store's pages to the last one,
  and each row says how many results the store counted.
- **Prices you can compare.** Unit price as a number with its unit, the was
  price and the saving, at every store.
- **Specials only.** One switch to read only the Woolworths and Coles
  specials for your searches.
- **Use the data anywhere.** Download as JSON, CSV or Excel, or send it to
  your own tools through Apify's API and integrations.

### How to use it

1. Type one or more searches into **Search terms**.
2. Optionally, untick a store under **Stores**, turn on **Specials only**, or
   set **Max products per search, per store**.
3. Click **Start**. When the run ends, open the **Output** tab to view the
   products or download them.

Run it with no input to see a sample: up to 30 products for "milk" at each
store, charged as usual.

### Input

| Field                                                           | What it does                                      | Default   |
| --------------------------------------------------------------- | ------------------------------------------------- | --------- |
| **Search terms** (`searchTerms`)                                | Words to search for, one search each              | —         |
| **Stores** (`stores`)                                           | `woolworths`, `coles`, `aldi`                     | all three |
| **Specials only** (`specialsOnly`)                              | Only Woolworths and Coles specials; ALDI left out | off       |
| **Max products per search, per store** (`maxProductsPerSearch`) | Stop each search at each store after this many    | 100       |

Example input:

```json
{
  "searchTerms": ["milk", "tim tam"],
  "stores": ["woolworths", "coles", "aldi"],
  "specialsOnly": false,
  "maxProductsPerSearch": 500
}
```

### Output

One row per product per store. An example, with made-up values:

```json
{
  "product_key": "coles:1234567",
  "store": "coles",
  "store_name": "Coles",
  "search_term": "milk",
  "specials_only": false,
  "search_total": 323,
  "position": 4,
  "product_id": "1234567",
  "barcode": null,
  "name": "Full Cream Milk",
  "brand": "Example Dairy",
  "description": "EXAMPLE DAIRY FULL CREAM MILK 2L",
  "size": "2L",
  "url": "https://www.coles.com.au/product/example-dairy-full-cream-milk-2l-1234567",
  "image_url": "https://cdn.productimages.coles.com.au/productimages/1/1234567.jpg",
  "images": ["https://cdn.productimages.coles.com.au/productimages/1/1234567.jpg"],
  "price": 3.5,
  "was_price": 4.2,
  "is_on_special": true,
  "savings_amount": 0.7,
  "special_type": "SPECIAL",
  "special_text": "save $0.70",
  "is_half_price": false,
  "multibuy_quantity": null,
  "multibuy_price": null,
  "multibuy_text": null,
  "is_online_only": false,
  "unit_price": 1.75,
  "unit_measure": "1l",
  "unit_price_text": "$1.75/ 1L",
  "is_available": true,
  "available_quantity": 240,
  "purchase_limit": 20,
  "minimum_quantity": null,
  "department": "Dairy, Eggs & Fridge",
  "category": "Milk",
  "subcategory": "Full Cream Milk",
  "categories": ["Dairy, Eggs & Fridge > Milk > Full Cream Milk"],
  "labels": [],
  "is_sponsored": false,
  "is_new": null,
  "in_stock": null,
  "is_purchasable": null,
  "is_bundle": null,
  "is_marketplace": null,
  "seller_name": null,
  "seller_delivery_fee": null,
  "is_free_shipping": null,
  "...": "the store-only fields listed below"
}
```

A field the store does not show is `null` (or an empty list). The other
fields, filled at one store:

- **Woolworths:** `instore_price`, `instore_was_price`,
  `instore_is_on_special`, `instore_savings_amount`, `instore_unit_price`,
  `instore_unit_price_text`, `instore_is_available`, `is_for_delivery`,
  `is_for_collection`, `is_for_express`, `next_available_date`, `sold_by`,
  `unit_weight_grams`, `health_star_rating`, `ingredients`, `allergens`,
  `allergens_may_contain`, `allergy_statement`, `dietary_statement`,
  `lifestyle_claim`, `nutrition` (name and value pairs), `storage_instructions`,
  `warnings`, `variety`, `full_description`, `enriched_description`,
  `is_age_restricted`, `has_variants`, `variant_group_id`,
  `fulfilment_store_id`, `attributes`, and for marketplace products
  `seller_name`, `seller_delivery_fee`, `is_free_shipping`
- **Coles:** `variant_count`, `availability_type`, `is_weighed`,
  `promotional_limit`, `delivery_restrictions`, `merchandise_hierarchy`,
  `min_life_guarantee`, `bonus_points`, `is_featured`
- **ALDI:** `bottle_deposit`, `on_sale_date`, `on_sale_text`,
  `is_discontinued`, `is_not_for_sale`, `not_for_sale_reason`,
  `quantity_step`, `weight_type`, `is_dropship`, `fee_text`

### How much does it cost?

No surcharges and no paid options; an item that fails is not charged.

This Actor is priced per product saved:

- **$0.50 per 1,000 products** ($0.0005 a product). A product at one store is
  one product; the same product at two stores is two. Each is charged once
  per run.
- No start fee, and nothing per search or per store.

So 1,000 products cost $0.50. If you set a maximum cost for a run, the Actor
stops when it reaches it and keeps every product saved so far.

### How long does a run take?

About 8 seconds for 30 products at each store, and about 10 minutes for three
searches read to every store's last page (6,879 products).

### Good to know

- **Prices are each store's online prices** for a shopper who has not picked a
  store or suburb. Woolworths also gives its in-store price. A store's price
  in your suburb can differ.
- **Specials only reads Woolworths' and Coles' own specials lists.** ALDI has
  none, so a specials-only run leaves ALDI out.
- **A product found by two searches at the same store is saved and charged
  once**, under the search that reached it first.
- **Sponsored products** at Coles are kept and marked with `is_sponsored`. An
  ad for a product the same page also lists is left out, so the product keeps
  its own place; one listed again on a later page is saved once, as first
  seen.
- **`search_total` is the store's own count** for the search. Woolworths and
  ALDI list some products on more than one page and count each listing, so a
  whole search saves a few fewer products than that count (2,617 distinct
  products in Woolworths' 2,692 listings for "milk"). A row's
  `position` is its place in the store's order, counting from 1.
- **One search that cannot be read does not stop the run.** The others carry
  on, and the run's status lists the searches that could not be read.
- **A search with no results is not an error.** It saves nothing.
- **This Actor reads the search results**, not each product's own page, and
  takes search words, not category or product links. It does not read store
  locations or stock at one store.

### More Actors from us

- [AliExpress Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/aliexpress-products-scraper): Every product of an AliExpress search to its last page, with exact sold counts and ratings.
- [Amazon Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/amazon-products-scraper): Every product on Amazon's search pages to the last page, sponsored marked, with monthly sales.
- [App Store Reviews Scraper: All Reviews, Not 500](https://apify.com/luzivanlt/app-store-reviews-scraper): Every written App Store review of an app, not just the newest 500.
- [Bilibili Video Scraper: Search & Channel Videos](https://apify.com/luzivanlt/bilibili-videos-scraper): Bilibili videos from searches or whole channels, each with its full detail page's data.
- [Career Site Jobs Scraper: Workday, Greenhouse, Lever](https://apify.com/luzivanlt/career-site-jobs-scraper): Every job on Greenhouse, Lever, Ashby, SmartRecruiters and Workday boards, checked against each board's count.
- [Facebook Ads Library Scraper: Meta Ads by Keyword or Page](https://apify.com/luzivanlt/facebook-ads-library-scraper): Meta Ad Library ads by keyword, Page or Ad Library link, with text, images, videos and dates.

### Use it from an AI agent or the API

One call starts a run and returns its items (Apify waits up to 300 seconds; for a
longer run, start it with `POST /v2/acts/…/runs` and read its dataset):

```text
POST https://api.apify.com/v2/acts/luzivanlt~au-supermarkets-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>
```

With the sample input as its JSON body:

```json
{
  "searchTerms": ["milk"],
  "stores": ["woolworths", "coles", "aldi"],
  "specialsOnly": false,
  "maxProductsPerSearch": 30
}
```

Its inputs, in the order of the input form:

| Input                                                       | What it takes                                                                                                                                     | Default                         |
| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
| `searchTerms` (Search terms)                                | Words to search for, one search per line, as you would type them in a supermarket's search box, up to 200 characters each and up to 100 searches. | —                               |
| `stores` (Stores)                                           | The supermarkets to search: Woolworths, Coles and ALDI Australia, all three by default.                                                           | `["woolworths","coles","aldi"]` |
| `specialsOnly` (Specials only)                              | Only products on special at Woolworths and Coles (their own specials lists).                                                                      | `false`                         |
| `maxProductsPerSearch` (Max products per search, per store) | Stop each search at each store after this many products, in the store's own order, from 1 to 10,000 (100 by default).                             | `100`                           |

Apify's MCP server, `https://mcp.apify.com`, lists it as `luzivanlt/au-supermarkets-scraper`. To give an
AI agent this Actor as a tool, add the server to the agent's MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=luzivanlt/au-supermarkets-scraper"
    }
  }
}
```

The client signs in with OAuth, or add `"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }`.

Charged per product delivered; the sample input above costs at most $0.06.

### FAQ

**Do I need an account or cookies?**
No. The Actor reads what anyone can see on the stores' websites.

**Can I compare the same product across stores?**
Each row is one store's product, with its name, brand, size and unit price,
so you can match products across stores yourself. The stores do not share
product ids.

**Can I run it from my own code, on a schedule, or with other apps?**
Yes. Like any Apify Actor, you can start it through the Apify API, run it on a
schedule, and connect it to other apps with Apify's integrations and webhooks.

### Is it legal to scrape Woolworths, Coles and ALDI?

This Actor reads only what anyone can see on the stores' websites without
logging in. Check each store's terms and the laws that apply to you before
you use the data. If you are unsure, ask a lawyer.

### Support

Found a problem or missing a feature? Open an issue on the **Issues** tab and
include the run's link.

***

This Actor is not affiliated with, endorsed by or sponsored by Woolworths,
Coles or ALDI.

# Changelog

This Actor's version history is a separate document: https://apify.com/luzivanlt/au-supermarkets-scraper/changelog.md

# Actor input Schema

## `searchTerms` (type: `array`):

Words to search for, one search per line, as you would type them in a supermarket's search box, up to 200 characters each and up to 100 searches. Each search is run on every store you pick. A product found by two searches at the same store is saved and charged once. Example: tim tam

## `stores` (type: `array`):

The supermarkets to search: Woolworths, Coles and ALDI Australia, all three by default. Each product is one row per store, so the same milk at two stores is two rows. Example: \["woolworths", "coles"]

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

Only products on special at Woolworths and Coles (their own specials lists). ALDI keeps no specials list, so ALDI is left out when this is on. Off by default. Example: true

## `maxProductsPerSearch` (type: `integer`):

Stop each search at each store after this many products, in the store's own order, from 1 to 10,000 (100 by default). A search also ends at the store's last results page. You pay per product saved ($0.50 per 1,000), so this caps what each search costs: 3 stores x 100 products cost at most $0.15. Example: 1000

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "stores": [
    "woolworths",
    "coles",
    "aldi"
  ],
  "specialsOnly": false,
  "maxProductsPerSearch": 30
}
```

# Actor output Schema

## `products` (type: `string`):

Every product the run saved, one row per product per store.

## `allFields` (type: `string`):

The same rows with every field.

# 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 = {
    "searchTerms": [
        "milk"
    ],
    "stores": [
        "woolworths",
        "coles",
        "aldi"
    ],
    "maxProductsPerSearch": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("luzivanlt/au-supermarkets-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 = {
    "searchTerms": ["milk"],
    "stores": [
        "woolworths",
        "coles",
        "aldi",
    ],
    "maxProductsPerSearch": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("luzivanlt/au-supermarkets-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 '{
  "searchTerms": [
    "milk"
  ],
  "stores": [
    "woolworths",
    "coles",
    "aldi"
  ],
  "maxProductsPerSearch": 30
}' |
apify call luzivanlt/au-supermarkets-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,luzivanlt/au-supermarkets-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/Zwgb66LL68Wp2VIIE/builds/N4KcacNYvf5yCXWjx/openapi.json
