# Coles Scraper - Prices, Specials, Unit Prices & Barcodes (`alaathr/coles-scraper`) Actor

Coles Australia products from any search, aisle, specials page or product link: price, was price, half-price and multi-buy offers, unit price, stock, purchase limit and category. Add barcode, ingredients, allergens and nutrition. Pay per product.

- **URL**: https://apify.com/alaathr/coles-scraper.md
- **Developed by:** [Alaa Tahir](https://apify.com/alaathr) (community)
- **Categories:** E-commerce, Automation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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.

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 Scraper - Prices, Specials, Unit Prices & Barcodes

Get **Coles Australia products from any search, aisle, specials page or product link**: **price, was price, half-price and multi-buy offers, unit price** (per kg, per litre, each), **stock, purchase limit, category and sponsored flag**, in the order coles.com.au shows them.

Add the **product page details** when you need them: **barcode (GTIN), country of origin, ingredients, allergens, dietary information, storage and the nutrition table**. You **pay per product delivered**.

### What you get for each product

| Group | Fields |
| --- | --- |
| Product | Coles product ID, name, brand, pack size, full name, image, link |
| Price | Current price (AUD), was price, saving in dollars and percent |
| Specials | On special or not, kind of offer (half price, multi-buy, percent off), the offer as Coles words it ("Pick any 2 for $15.50"), multi-buy price per item, online-only offers |
| Unit price | Price per unit of measure, the unit (1kg, 1L, 100g, 1ea), sold by weight |
| Stock | Available or not, in store and online or online only, purchase limit |
| Category | Department, category, aisle and the full path ("Dairy, Eggs & Fridge > Milk > Full Cream Milk") |
| Search | Query, page, position, sponsored flag, total results |
| Details (optional) | Barcode, country of origin and Australian content, ingredients, allergens, dietary, storage, dimensions, description, servings, nutrition per serving and per 100 g/mL, all images |

### Use cases

- **Price monitoring**: track Coles prices and specials on your products or categories every week.
- **Specials catalogues**: pull every half-price and multi-buy offer of the week in one run.
- **Price comparison**: compare unit prices across brands and pack sizes, or against other retailers.
- **Suppliers and brands**: watch your range, your competitors' prices and who pays for sponsored placement.
- **Nutrition and labelling data**: collect barcodes, ingredients, allergens and nutrition tables for a category.
- **AI agents**: give an assistant live Australian grocery prices through the API or the Apify MCP server.

### How to use it

1. Enter **keywords** (`milk`) or **Coles links**, one per line: a search, an aisle or category (`https://www.coles.com.au/browse/dairy-eggs-fridge/milk`), the specials (`https://www.coles.com.au/on-special`, with any filter you set on the site, such as half price), or a product page.
2. Set **Max products per search**, and tick **Only products on special** if you want the offers only.
3. Tick **Include product details** for barcodes, ingredients and nutrition.
4. Click **Start**, then download the results as JSON, CSV or Excel, or read them through the API.

### Input example

```json
{
  "searches": [
    "tim tam",
    "https://www.coles.com.au/browse/dairy-eggs-fridge/milk",
    "https://www.coles.com.au/on-special?filter_Special=halfprice",
    "https://www.coles.com.au/product/coles-full-cream-milk-3l-8150288"
  ],
  "maxItemsPerSearch": 200,
  "onlySpecials": false,
  "includeDetails": false
}
```

### Output example

```json
{
  "query": "https://www.coles.com.au/on-special",
  "queryType": "specials",
  "searchUrl": "https://www.coles.com.au/on-special",
  "page": 1,
  "position": 3,
  "productId": "5191256",
  "name": "Strawberries",
  "brand": "Coles",
  "size": "250g",
  "fullName": "STRAWBERRIES:BERRIES:.:250 GRAM",
  "price": 3.9,
  "wasPrice": null,
  "saveAmount": null,
  "savePercent": null,
  "onSpecial": true,
  "specialType": "MULTI_SAVE",
  "offer": "Buy 2 for $6",
  "multiBuy": {"quantity": 2, "unitPrice": 3, "unitPriceText": "$12.00/ 1kg"},
  "onlineOnlySpecial": false,
  "unitPrice": 15.6,
  "unitOfMeasure": "1kg",
  "unitPriceText": "$15.60/ 1kg",
  "soldByWeight": false,
  "available": true,
  "availabilityType": "InStoreAndOnline",
  "purchaseLimit": 50,
  "department": "Fruit & Vegetables",
  "category": "Fruit",
  "aisle": "Berries & Cherries",
  "categoryPath": "Fruit & Vegetables > Fruit > Berries & Cherries",
  "isSponsored": false,
  "imageUrl": "https://cdn.productimages.coles.com.au/productimages/5/5191256.jpg",
  "url": "https://www.coles.com.au/product/coles-strawberries-250g-5191256",
  "totalResults": 7322,
  "scrapedAt": "2026-10-25T15:30:00Z"
}
```

With details, each product also gets, for example: `"barcode": "9300601186945"`, `"countryOfOrigin": "Australian Milk"`, `"ingredients": "Homogenised and Pasteurised Full Cream Milk."`, `"allergens": "Contains Milk"`, `"servingSize": "250mL"` and `"nutritionPer100": [{"nutrient": "Energy (kJ)", "value": "258 kJ"}, {"nutrient": "Protein", "value": "3.4 g"}, ...]`.

### Pricing

**$1.00 per 1,000 products** (pay per event). Product details cost **$1.00 per 1,000 products** more, only when you tick the option. Searches that fail or find nothing come back with an `error` field and are **not charged**. Use "Max products per search" and a maximum cost per run in the run options to keep full control.

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

| Run | Cost |
| --- | --- |
| 100 products of one search | $0.10 |
| The whole specials page (about 7,300 products) | $7.30 |
| 1,000 products with barcodes, ingredients and nutrition | $2.00 |

Apify's free plan includes $5 of usage every month: enough for about 5,000 products a month without paying anything.

### Use it from code or from an AI agent

- **API:** start a run and fetch the dataset with the Apify API or the Python and JavaScript clients.
- **Schedules:** run it every week on the specials, or every day on your watch list, to build a price history.
- **AI agents:** the Actor is available as a tool through the Apify MCP server, so assistants such as Claude can look up Coles prices directly.

### More tools from this developer

| Tool | What it returns | Price |
| --- | --- | --- |
| [AliExpress Search Scraper](https://apify.com/alaathr/aliexpress-search-products) | AliExpress products for any keyword or URL: price, discount, units sold, rating, delivery | $3.00 / 1,000 products |
| [Google Ads Transparency Scraper](https://apify.com/alaathr/google-ads-transparency-scraper) | Every Google ad of an advertiser or website: format, dates shown, image, texts and link | $1.00 / 1,000 ads |
| [Google Flights Scraper](https://apify.com/alaathr/google-flights-scraper) | Every flight of a route and date with price, times, stops, layovers and CO2, plus a lowest-price calendar | $2.50 / 1,000 searches |
| [Google Hotels Scraper](https://apify.com/alaathr/google-hotels-prices) | Hotel prices for your dates in any city, with stars, ratings, address and links | $3.00 / 1,000 hotels |
| [Google Trends Scraper](https://apify.com/alaathr/google-trends-reliable) | Interest over time, by region and related queries for your own keyword list | $2.50 / 1,000 search terms |
| [Google Trends Trending Now Scraper](https://apify.com/alaathr/google-trends-trending-now) | Every trending search of a country or US state, with volume, timing, category and news | $0.80 / 1,000 trends |
| [Walmart Scraper](https://apify.com/alaathr/walmart-scraper) | Walmart search results: price, was price, rating, seller, stock, delivery and badges | $1.50 / 1,000 products |

### FAQ

**Which prices are these?** The online prices coles.com.au shows to a visitor who has not picked a store. Prices can differ slightly in some stores.

**How many products per search?** All of them: Coles shows 48 products per page and the Actor goes through every page, up to your "Max products per search".

**Can I get only the specials?** Yes: paste `https://www.coles.com.au/on-special` (with a filter such as half price if you like), or tick "Only products on special" to filter any search or aisle.

**What if Coles refuses a request?** Coles uses bot protection that refuses some IP addresses. The Actor then moves to another IP address and tries again; if datacenter addresses keep being refused, it switches by itself to Apify's Australian residential proxy, at no extra cost to you.

**Are reviews included?** No. The Actor reads product and price information only and collects no personal data.

**Is this an official Coles product?** No. This Actor is not affiliated with or endorsed by Coles Group. It reads the public product information coles.com.au shows to any visitor.

# Actor input Schema

## `searches` (type: `array`):

One per line: a keyword (milk), or a Coles link: a search (https://www.coles.com.au/search/products?q=...), an aisle or category (https://www.coles.com.au/browse/...), the specials (https://www.coles.com.au/on-special, with any filter you set on the site), or a product (https://www.coles.com.au/product/...).

## `maxItemsPerSearch` (type: `integer`):

Stop after this many products for each keyword or link. 0 means every product Coles lists (the specials page alone holds about 7,000).

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

Keep only the products with an offer (half price, multi-buy, price drop) in searches and aisles.

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

Keep the sponsored products Coles mixes into the results (each one is flagged with isSponsored).

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

Also read each product page for its barcode (GTIN), country of origin, ingredients, allergens, dietary information, storage, nutrition table and all images. Charged as an extra event per product.

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

Searches (and product pages) processed at the same time.

## `maxRetries` (type: `integer`):

How many times a refused page is retried from another IP address before the search is reported as failed (not charged).

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

Apify Proxy. With the default datacenter proxy, the run switches by itself to the Australian residential proxy if Coles keeps refusing datacenter IP addresses (at no extra cost to you).

## Actor input object example

```json
{
  "searches": [
    "milk"
  ],
  "maxItemsPerSearch": 50,
  "onlySpecials": false,
  "includeSponsored": true,
  "includeDetails": false,
  "maxConcurrency": 3,
  "maxRetries": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searches": [
        "milk"
    ],
    "maxItemsPerSearch": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alaathr/coles-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 = {
    "searches": ["milk"],
    "maxItemsPerSearch": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("alaathr/coles-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 '{
  "searches": [
    "milk"
  ],
  "maxItemsPerSearch": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call alaathr/coles-scraper --silent --output-dataset

```

## MCP server setup

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