# Coles & Woolworths Price Comparison Scraper (`proud_keypad_qsj/coles-woolworths-price-comparison-scraper`) Actor

Scrape Coles and Woolworths in one run: products, prices, unit prices, specials and images, plus ready-made price comparison rows showing which store is cheaper. No login, no proxy setup. Pay per result.

- **URL**: https://apify.com/proud_keypad_qsj/coles-woolworths-price-comparison-scraper.md
- **Developed by:** [mohammed مجهول](https://apify.com/proud_keypad_qsj) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

## Coles & Woolworths Price Scraper — Compare Australian Grocery Prices

Get products, prices, unit prices and specials from **Coles** and **Woolworths** in one run, plus ready-made **price comparison rows** that show which store is cheaper for the same or a very similar product. No login, no proxy setup. You pay only per result row.

### What does it do?

- Searches Coles and Woolworths (Australia) for every search term you give it.
- Returns one clean **product row** per product: name, brand, size, price, was-price, unit price, special flag, barcode and image (when the store shows them) and a link.
- Pairs products across the two stores and returns **comparison rows**: the cheaper store, the price gap in dollars and in percent, and a match confidence score.
- Skips sponsored tiles and third-party marketplace listings, so you only get real grocery results.
- Connects to each store the right way automatically. Nothing to configure.

### Who is it for?

- Price comparison apps and grocery deal sites
- Brands and category managers tracking shelf prices
- Analysts following grocery prices in Australia
- AI agents that need live grocery prices (works with the Apify MCP server)

### Input

| Field | Example | What it does |
|---|---|---|
| Search terms | milk 2l, vegemite | One search per term in each store |
| Stores | woolworths, coles | Pick one store or both (empty means both) |
| Max products per store | 48 | Products per store, per search term |
| Add price comparison rows | on | Adds comparison rows |
| Minimum name match (%) | 75 | How strict name + size matching is |
| Pause between pages (ms) | 1500 | Polite pause between pages |

### Output

The run's dataset has two ready-made tables:

- **Products**: store, product, size, price, was-price, unit price, on special, image, link, search term.
- **Price comparisons**: size, Woolworths product, Coles product, Woolworths price, Coles price, cheaper store, gap ($), gap (%), match confidence.

Every row also has a `rowType` field (`product` or `comparison`), so you can filter rows when you export to JSON, CSV or Excel.

### Pricing

Pay per event: a small start fee and one fixed price per result row (product rows and comparison rows). Blocked or failed requests produce no rows, so they cost you nothing beyond the start fee. See the Pricing tab for current prices, and set a spending limit for each run in Apify Console.

### How accurate are the comparisons?

Matches use the barcode when both stores show it, otherwise the product name and the same size. Each comparison row has a confidence score between 0 and 1. Raise the minimum name match if you want only very close matches.

### FAQ

**Why did I get 0 results for a store?** The store may have changed its website or temporarily blocked the request. Open the run's key-value store, check the SUMMARY record, and open an Issue. We aim to reply within 48 hours.

**Is it legal?** The Actor reads only public product listings, without logging in and without personal data. You are responsible for how you use the data and for following each store's terms.

**Not affiliated.** This is an unofficial tool. It is not affiliated with or endorsed by Coles Group or Woolworths Group.

# Actor input Schema

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

One search per term in each store, for example: milk 2l, vegemite, bread.

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

woolworths and/or coles

## `maxItemsPerStore` (type: `integer`):

Each product row is billed as one result.

## `includeComparisons` (type: `boolean`):

Pairs the same product (barcode) or a very similar one (name + same size) in both stores, with the cheaper store and the price gap. Each comparison row is billed as one result.

## `minMatchPercent` (type: `integer`):

Only used for name + size matches. Higher means stricter matching.

## `delayMs` (type: `integer`):

A polite pause between page requests.

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

Leave it off for the first run. Turn it on only if the log shows blocked = True.

## Actor input object example

```json
{
  "searchTerms": [
    "milk 2l"
  ],
  "stores": [
    "woolworths",
    "coles"
  ],
  "maxItemsPerStore": 48,
  "includeComparisons": true,
  "minMatchPercent": 60,
  "delayMs": 1500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchTerms": [
        "milk 2l"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("proud_keypad_qsj/coles-woolworths-price-comparison-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 2l"] }

# Run the Actor and wait for it to finish
run = client.actor("proud_keypad_qsj/coles-woolworths-price-comparison-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 2l"
  ]
}' |
apify call proud_keypad_qsj/coles-woolworths-price-comparison-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,proud_keypad_qsj/coles-woolworths-price-comparison-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/QWoQnXqokgP5rZpFW/builds/hYs0GPL8u88yj7VwP/openapi.json
