# Coles Australia Scraper — Store Prices, Products & Specials (`highbrow_fame/coles-au-products`) Actor

Coles Australia supermarket products and grocery prices: price, was-price, unit price, specials and multi-buy offers; barcode, ingredients, allergens and nutrition on request. Many searches per run.

- **URL**: https://apify.com/highbrow\_fame/coles-au-products.md
- **Developed by:** [yestrue](https://apify.com/highbrow_fame) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 product delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Coles Australia Scraper — Store Prices, Products & Specials

Get Coles Australia products with their shelf price, was-price, unit price, special offer and multi-buy deal — **at the Coles stores you pick** — and, if you want, the barcode, ingredients, allergens, country of origin and nutrition panel. Put in as many search words, category links and specials pages as you like — one run does them all.

**Why this one**

- 📍 **Prices for the store you pick.** Coles prices differ from store to store. In a test run on 28 September 2026, a Rokeby Protein Smoothie cost $3.70 at Coles Deer Park (VIC) and $4.00 at Coles Darwin (NT) and Coles Karratha (WA). The range differs too: a product sold in Melbourne may not be sold in Darwin, and its row says so. Give store numbers, store names or towns, or take every Coles supermarket (878, or only some states) — every row says which store it is for.
- 🛒 **Many searches in one run.** Type `tim tam` and `coffee beans` on two lines, add the half-price specials page and a category link, press Start. You get one list with every product labelled by the search or link it came from.
- 🔁 **Built to keep working.** Coles sits behind a strict firewall. This Actor reads the same data the Coles website loads, through Australian residential IPs at a steady pace; a request the firewall still refuses is reported in the dataset, not charged. A live test run of 6 searches and links (plus 3 deliberately wrong inputs) delivered 399 products with full label details in 121 seconds, with no failed requests.
- 🏷️ **Every kind of special.** Half price, "Buy 2 for $9.40" multi-buys, price drops with the amount saved, online-only specials. Switch on **Only products on special** and everything at full price is skipped — and not charged.
- 🥫 **The label, on request.** Switch on **Barcode, ingredients, allergens and nutrition** and every product page is opened too. In the test run above: 98% of products came with a barcode, 84% with ingredients, 64% with a nutrition panel.
- 💸 **You pay only for products delivered.** A search with no results, a wrong link or a page that fails after every retry comes back as a free record with the reason.

### What you get

For every product:

| Field | What it is |
|---|---|
| `name`, `brand`, `size` | as on the shelf label |
| `price`, `wasPrice`, `savings`, `savePercent` | current price, regular price and the discount (AUD) |
| `isOnSpecial`, `specialType`, `promotion` | whether it is discounted, and the offer as Coles shows it ("1/2 Price", "Buy 2 for $9.40", "Save $10.00") |
| `multiBuy` | for multi-buy deals: how many, for how much, and the unit price when you buy them |
| `isOnlineOnlySpecial` | a special that applies online only |
| `unitPrice`, `unitMeasure`, `unitPriceText` | price per 100 g / 1 L / each, for comparing pack sizes |
| `storeId`, `storeName`, `storeState` | the Coles store the price is for (when you pick stores) |
| `isAvailable`, `availabilityType` | whether it can be bought — at that store, or online when no store is picked — and how (`InStoreAndOnline`, …) |
| `purchaseLimit`, `promotionalLimit` | the purchase limits Coles sets for the product (per order, and at the promotional price) |
| `department`, `category`, `aisle` | where it sits in the store |
| `sponsored` | the product was a paid placement in the results |
| `image`, `url`, `productId` | product image, page and the Coles product number |
| `input`, `inputType`, `position` | which search or link it came from, and its place in that list |
| `scrapedAt` | when the row was read |
| `status`, `error` | `OK`, or why an input gave nothing |

With **Barcode, ingredients, allergens and nutrition** switched on, also:

| Field | What it is |
|---|---|
| `barcode` | the EAN barcode |
| `ingredients`, `allergens`, `dietary` | from the product label |
| `countryOfOrigin` | e.g. "Australian Milk", "Packaged in Italy" |
| `storage` | storage instructions |
| `nutrition` | the nutrition panel, per serving and per 100 g/ml |
| `description` | the product description |

#### Example

A real record from a live run — the milk category at store 313 (Coles Karratha), 28 September 2026:

```json
{
  "input": "https://www.coles.com.au/browse/dairy-eggs-fridge/milk",
  "inputType": "listing",
  "storeId": "313",
  "storeName": "Coles Karratha",
  "storeState": "WA",
  "position": 13,
  "productId": 1944192,
  "name": "Rokeby Protein Smoothie Dutch Chocolate",
  "brand": "Rokeby",
  "size": "425mL",
  "price": 4,
  "wasPrice": 5.45,
  "isOnSpecial": true,
  "promotion": "Save $1.45",
  "savings": 1.45,
  "unitPrice": 9.41,
  "unitMeasure": "1l",
  "unitPriceText": "$9.41 / 1L",
  "isAvailable": true,
  "availabilityType": "InStoreAndOnline",
  "purchaseLimit": 20,
  "promotionalLimit": 12,
  "department": "Drinks",
  "category": "Flavoured Milk",
  "url": "https://www.coles.com.au/product/rokeby-protein-smoothie-dutch-chocolate-425ml-1944192",
  "status": "OK"
}
```

### How to use it

1. Add **Search words** — one per line, exactly what you would type into the Coles search box.
2. And/or add **Links** from coles.com.au:
   - a category, e.g. `https://www.coles.com.au/browse/dairy-eggs-fridge/milk`
   - a specials page, e.g. `https://www.coles.com.au/on-special`, or with a filter such as `https://www.coles.com.au/on-special?filter_Special=halfprice`
   - a search results page, or a single product page
3. Pick stores, if you want store prices:

   - **Store numbers** — the number at the end of a store's link on coles.com.au/find-stores, e.g. `313` for `…/find-stores/coles/wa/karratha-313` (the link works too);
   - **Store names or towns** — e.g. `Karratha`, or `Palmerston`, which finds both Palmerston stores;
   - or **Every Coles supermarket**, optionally only in some states (`WA`, `NT`, …).

   Every search and link is read once for each store. Without stores you get the online prices Coles shows before a store is picked.
4. Set **Max products per search or link** (the specials page alone holds thousands).
5. Switch on **Barcode, ingredients, allergens and nutrition** if you need the label (slower: one extra request per product).
6. Press **Start**, and download the results from the **Output** tab as JSON, CSV or Excel.

To track prices over time, save your input as a task and schedule it daily or weekly — every row carries `scrapedAt`.

You can also call it from the Apify API, from Make, Zapier or n8n, or from an AI agent through the Apify MCP server.

### Pricing

You are charged **per product delivered** — see the price on this page. With stores, each product at each store is one row. Searches with no results, links that are not Coles product lists and inputs that fail after every retry are free. With **Only products on special** on, skipped full-price products are free too. If your run has a **Maximum charge**, the Actor stops cleanly when it is reached and tells you how many searches or links were left.

### FAQ

**Which prices are these?** With stores: the prices and availability Coles shows when that store is picked on coles.com.au. Without stores: the online prices Coles shows to a visitor who has not picked a store.

**Can I give a postcode?** Not at the moment. Use the store's town (e.g. `Karratha`) or its store number instead.

**Does it follow robots.txt?** Yes. At the start of every run it reads the robots.txt of coles.com.au and requests nothing it disallows. That is why specials pages are read as ordinary pages, and why a half-price filter in a link is applied by the Actor itself.

**My search word has a typo and still returned products.** The Coles search corrects and widens searches by itself, and the Actor returns what Coles returns.

**A link came back as `NOT_FOUND`.** The category, specials page or product does not exist (any more). Open it on coles.com.au and copy the address again. A product link with the right product number but outdated words in it is followed to the current page automatically.

**Is this affiliated with Coles?** No. This is an independent tool that reads the product information Coles publishes on its website.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

# Actor input Schema

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

What you would type into the Coles search box. One search per line — each one is a separate result list.

## `urls` (type: `array`):

Any coles.com.au link: a category (/browse/dairy-eggs-fridge/milk), a specials page (/on-special, also with its filters, e.g. ?filter\_Special=halfprice), a search results page or a single product (/product/…).

## `storeIds` (type: `array`):

Prices and availability at these Coles supermarkets. The store number is at the end of the store's link on coles.com.au/find-stores — e.g. 313 for …/find-stores/coles/wa/karratha-313 (you can paste the link too). Every search and link is read once for each store. Leave empty for the online prices Coles shows before a store is picked.

## `storeNames` (type: `array`):

Uses every Coles supermarket whose name contains this town or name, as in the Coles store list — e.g. Karratha, Broken Hill or Palmerston (which finds both Palmerston stores).

## `allStores` (type: `boolean`):

Reads every search and link at every Coles supermarket (878 in September 2026), or only those in the states below. You get one row per product per store, so use it with a small category or a few product links.

## `states` (type: `array`):

State codes: NSW, VIC, QLD, WA, SA, TAS, ACT, NT. Empty means all states.

## `maxProductsPerInput` (type: `integer`):

Stops each search or category after this many products (for each store). The specials page alone holds thousands.

## `onlySpecials` (type: `boolean`):

Keep only discounted products (half price, multi-buy, price drops). The others are skipped and not charged.

## `includeDetails` (type: `boolean`):

Also open every product page for its barcode, ingredients, allergens, country of origin and nutrition panel. Slower: one extra request per product.

## `maxConcurrency` (type: `integer`):

How many searches or links to work on at the same time.

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

Australian residential proxy by default: the Coles firewall lets it through far more often than datacenter IPs.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "allStores": false,
  "maxProductsPerInput": 50,
  "onlySpecials": false,
  "includeDetails": false,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}
```

# Actor output Schema

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

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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"
    ],
    "maxProductsPerInput": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/coles-au-products").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"],
    "maxProductsPerInput": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/coles-au-products").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"
  ],
  "maxProductsPerInput": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}' |
apify call highbrow_fame/coles-au-products --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,highbrow_fame/coles-au-products"
        }
    }
}
```

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/OQwFc7UlUNvmo90OF/builds/FjqJEN1bhOorSSDhw/openapi.json
