# Coles Australia Product & Price Scraper (`stralium/coles-products`) Actor

Scrape Coles (coles.com.au) products by search term, category, specials or product URL: price, was-price, specials and multi-buy deals, unit price, stock, aisle, plus optional barcode, ingredients and nutrition. Fast HTTP, no browser.

- **URL**: https://apify.com/stralium/coles-products.md
- **Developed by:** [Stralium](https://apify.com/stralium) (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.65 / 1,000 product results

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

### What does Coles Australia Product & Price Scraper do?

It returns **Coles (coles.com.au) products with current prices and specials** from any search term, category page, the specials page or individual product URLs. Each product comes with its price, was-price and savings, multi-buy deals, unit price, stock status, category and aisle. Optionally it adds the **barcode (GTIN), ingredients, allergens, nutrition panel and country of origin**.

- ⚡ **Fast and cheap.** Plain HTTP with no headless browser. 1,000 products take about a minute.
- 🏷️ **Specials done properly.** Half-price, % off and "2 for $10" multi-buy deals, with was-price, saving and per-item multi-buy price as numbers.
- ⚖️ **Unit prices.** Price per 1L / 100g / 1kg as a number, ready for comparisons.
- 🔎 **Any entry point.** Search terms, `/browse/...` categories, `/on-special`, or `/product/...` URLs.
- 🧾 **Clean output.** Flat JSON with numeric prices, ready for spreadsheets, databases and AI agents.

### What data can I extract from Coles?

| Field | Example |
|---|---|
| `productId`, `fullName`, `brand`, `name`, `size` | 8150288 · Coles Full Cream Milk 3L · Coles · Full Cream Milk · 3L |
| `price`, `wasPrice`, `saveAmount`, `isOnSpecial` | 5.95 · 7 · 1.05 · true |
| `promotionType`, `specialType`, `offerDescription` | SPECIAL · MULTI_SAVE · Pick any 2 for $10.50 |
| `multiBuy` | {"quantity": 2, "pricePerItem": 5.25, "totalPrice": 10.5} |
| `unitPrice`, `unitOfMeasure`, `unitPriceText` | 1.65 · 1l · $1.65/ 1L |
| `available`, `availabilityType`, `retailLimit` | true · InStoreAndOnline · 20 |
| `category`, `subCategory`, `aisle` | Dairy, Eggs & Fridge · Milk · Full Cream Milk |
| `imageUrl`, `url`, `sponsored` | Coles image and product links, and whether the listing was a paid placement |
| With details: `gtin`, `ingredients`, `allergens`, `nutritionPerServing`, `nutritionPer100`, `countryOfOrigin`, `images` | 9300601186945 · Full Cream Milk · Contains Milk · {"Protein": "8.5 g", ...} · Australian Milk |

Prices are Coles' standard online prices in AUD.

### How much does it cost to scrape Coles?

You pay **per product returned**, plus a small add-on per product when **Include product details** is on. Failed searches cost nothing. See the Pricing tab for the current rate.

Set **Max products per search term or URL** to control spend exactly.

### How do I use it?

1. Enter **Search terms** and/or **Coles URLs** (category, specials or product pages).
2. Optionally tick **Only products on special** or **Include product details**.
3. Click **Start**, then download the results as JSON, CSV or Excel, or fetch them by API.

#### Input example

```json
{
  "searchTerms": ["milk", "coffee pods"],
  "startUrls": ["https://www.coles.com.au/browse/pantry", "https://www.coles.com.au/on-special"],
  "maxResultsPerSource": 500,
  "onlySpecials": true,
  "includeDetails": false
}
```

#### Output example

```json
{
  "source": "milk",
  "position": 1,
  "productId": 8150288,
  "fullName": "Coles Full Cream Milk 3L",
  "brand": "Coles",
  "size": "3L",
  "price": 4.95,
  "wasPrice": null,
  "isOnSpecial": false,
  "unitPrice": 1.65,
  "unitOfMeasure": "1l",
  "unitPriceText": "$1.65/ 1L",
  "available": true,
  "category": "Dairy, Eggs & Fridge",
  "subCategory": "Milk",
  "aisle": "Full Cream Milk",
  "imageUrl": "https://cdn.productimages.coles.com.au/productimages/8/8150288.jpg",
  "url": "https://www.coles.com.au/product/coles-full-cream-milk-3l-8150288",
  "scrapedAt": "2026-10-08T01:30:17.000Z"
}
```

### Use cases

- **Price monitoring:** track Coles prices and specials daily for your products or competitors.
- **Grocery price comparison:** unit prices as numbers make cross-brand and cross-retailer comparisons simple.
- **Specials alerts:** pull `/on-special` with **Only products on special** each week when the catalogue changes (Wednesdays).
- **Product data:** barcodes, ingredients and nutrition for apps, research and FMCG analytics.

### FAQ

**Does it need a Coles account or cookies?** No. It reads the public website.

**Why are some products missing a price?** Products that are currently unavailable online have no price; `available` is `false` for them.

**Is this affiliated with Coles?** No. This is an independent tool that reads publicly available product information.

**Something broke?** The scraper is checked automatically every day and fixed when coles.com.au changes. Open an issue and it will be looked at.

# Actor input Schema

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

Words you would type into the Coles search box, e.g. "milk", "tim tam", "coffee pods".

## `startUrls` (type: `array`):

Any coles.com.au search, category (/browse/...), specials (/on-special) or product (/product/...) URL.

## `maxResultsPerSource` (type: `integer`):

Stop after this many products for each search term or URL. You are charged per product returned.

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

Skip products at regular price (keeps half-price, % off and multi-buy deals).

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

Also open each product page to add barcode (GTIN), ingredients, allergens, nutrition panel, country of origin and all images. Slower, and charged as an add-on per product. Product URLs always include details.

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

Optional. By default the scraper connects directly and automatically escalates to Apify Proxy only if Coles starts blocking it.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "startUrls": [
    "https://www.coles.com.au/on-special"
  ],
  "maxResultsPerSource": 200,
  "onlySpecials": false,
  "includeDetails": false
}
```

# Actor output Schema

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

One item per product: price, was-price, specials and multi-buy deals, unit price, stock, category, optional barcode/ingredients/nutrition.

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

Per-source result counts and any searches or URLs that returned nothing.

# 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"
    ],
    "startUrls": [
        "https://www.coles.com.au/on-special"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("stralium/coles-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"],
    "startUrls": ["https://www.coles.com.au/on-special"],
}

# Run the Actor and wait for it to finish
run = client.actor("stralium/coles-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"
  ],
  "startUrls": [
    "https://www.coles.com.au/on-special"
  ]
}' |
apify call stralium/coles-products --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stralium/coles-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/AasfeInpgOZjdyHBN/builds/wKDwoVDdsfsHU8ZyM/openapi.json
