# Coles Australia Scraper - Prices, Specials, Barcodes $1/1K (`om_kh/coles-australia-scraper`) Actor

Scrape Coles supermarket (Australia): shelf price, was-price, specials, unit price, availability, aisle. Search, aisles, specials page, links, per-store prices, barcode, ingredients, nutrition. No login. $1 per 1,000 products, no start fee.

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

## Pricing

Pay per event

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

## Coles Australia Scraper — Prices, Specials, Barcodes

> Scrape **Coles supermarket (Australia)**: shelf price, was-price, **specials**, unit price,
> availability and aisle for any search, aisle, link or the whole specials page — with
> **per-store prices** and, on request, **barcode (EAN), ingredients, allergens and
> nutrition**. No login, no browser. **$1 per 1,000 products, no start fee.**

### What does this Coles scraper do?

Type search words (`milk`), paste aisle paths (`dairy-eggs-fridge/milk`), any coles.com.au
link, product numbers, or ask for the specials page. For each product it returns the price
Coles shows right now, the previous price and the saving when it is on special, the unit
price (`$1.65 / 1L`), stock, purchase limits and the aisle it sits in. Switch on
`includeDetails` to add the barcode, ingredients, allergens and the nutrition table.

### Why use it

1. **No start fee.** You pay $0.001 per product and nothing else. The first 10 products of
   every run are free.
2. **Fast and light:** it reads Coles' own data, not a browser. Measured on the platform:
   300 half-price specials in 40 seconds.
3. **Filters nobody else offers:** brand, dietary (Vegan, Halal...), free-from (Gluten
   Free...), price range, minimum discount %, in stock only.
4. **Sort by price or by unit price** — the cheapest per litre or per kilo first.
5. **Per-store prices and specials** with a Coles store number.
6. **Whole catalogue (about 30,000 products)** or the whole specials page (about 7,000) in
   one run, split by aisle for you.
7. **Barcode, ingredients, allergens, nutrition** on request ($0.003 per product with its full page).
8. **Free aisle tree:** about 1,500 aisles with their paths and product counts.

### How to use it in 3 steps

1. Click **Try for free** — two searches are prefilled.
2. Add search words, aisles or links, and how many products you want.
3. Click **Start** and download JSON, CSV or Excel.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | What you would type in the Coles search box, one per line. |
| `categories` | Aisle paths or links (`pantry`, `dairy-eggs-fridge/milk`). |
| `urls` | Any coles.com.au link: product, search, aisle, specials. |
| `productIds` | Coles product numbers; each returns the full product page. |
| `specials` | `all`, `halfprice`, `multibuy` or `onlineonly`. Alone, it reads the specials page. |
| `wholeCatalogue` | Reads every main aisle (about 30,000 products). |
| `listCategories` | Also returns the aisle tree. These rows are free. |
| `maxProductsPerInput` | 1 to 100,000. Default 100. |
| `storeId` | Coles store number for that store's prices (the number at the end of the store page link). |
| `sortBy` | `relevance`, `priceAscending`, `priceDescending`, `unitPriceAscending`. |
| `brands`, `dietary`, `allergens` | Keep only these (for example `Heinz`, `Vegan`, `Gluten Free`). |
| `minPrice`, `maxPrice`, `minDiscountPercent` | Price and discount filters. |
| `inStockOnly`, `includeSponsored` | Skip unavailable products or paid placements. |
| `includeDetails` | Adds barcode, ingredients, allergens, storage, dimensions, nutrition ($0.003 per product). |
| `maxTotalChargeUsd` | Optional hard cost cap for the run. |

```json
{
  "specials": "halfprice",
  "categories": ["pantry"],
  "sortBy": "unitPriceAscending",
  "maxProductsPerInput": 500
}
```

### Output

Real example (search `milk`, shortened):

```json
{
  "productId": "8150288",
  "name": "Full Cream Milk",
  "brand": "Coles",
  "size": "3L",
  "url": "https://www.coles.com.au/product/coles-full-cream-milk-3l-8150288",
  "imageUrl": "https://cdn.productimages.coles.com.au/productimages/8/8150288.jpg",
  "price": 4.95,
  "wasPrice": null,
  "savingsPercent": null,
  "unitPrice": 1.65,
  "unitPriceText": "$1.65/ 1L",
  "isOnSpecial": false,
  "isAvailable": true,
  "availableQuantity": 2907,
  "purchaseLimit": 20,
  "isSponsored": false,
  "department": "Dairy, Eggs & Fridge",
  "category": "Milk",
  "aisle": "Full Cream Milk",
  "position": 1,
  "storeId": null,
  "scrapedAt": "2026-10-09T01:07:09Z",
  "status": "ok"
}
```

With `includeDetails` (real values for Vegemite 380g):

```json
{
  "barcode": "9352042000328",
  "ingredients": "Yeast Extract (from Yeast Grown on Barley and Wheat), Salt, Mineral Salt (508), Malt Extract (from Barley), Colour (150c), Flavours, Niacin, Thiamine, Riboflavin, Folate.",
  "allergens": "Contains Barley, Gluten, Wheat",
  "storage": "Store in a cool, dry place.",
  "dimensions": "98.00 x 79.00 x 79.00 mm",
  "nutrition": {"Per Serving": {"Energy": "37 kJ", "Protein": "1.2 g"}}
}
```

### How much does it cost?

| Event | Price |
|---|---|
| Product | **$0.001** ($1 per 1,000) |
| Product with details (`includeDetails`) | **$0.003** ($3 per 1,000) |
| Start fee | none |
| Aisle tree rows | free |

The first 10 products of every run are free. A search with no result or a wrong link is
reported and never charged. Paid Apify plans get lower tier prices.

### Use cases

- **Price monitoring** — schedule a daily run on your aisles or your own products.
- **Specials tracking** — every half-price and multi-buy offer, per store.
- **Grocery comparison apps** — unit prices ready to compare with other supermarkets.
- **Nutrition and allergen databases** — barcode, ingredients and nutrition table.
- **Brand and category analysis** — share of shelf, price positioning, sponsored spots.

### Use it from code (API)

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("om_kh/coles-australia-scraper").call(run_input={
    "searchTerms": ["milk", "vegemite"],
    "maxProductsPerInput": 100,
})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["name"], product["price"], product["unitPriceText"])
```

```bash
curl -X POST "https://api.apify.com/v2/acts/om_kh~coles-australia-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"specials": "halfprice", "maxProductsPerInput": 200}'
```

### Integrations and MCP

Schedule it daily and push price changes to Google Sheets, Slack or a database with n8n,
Make or Zapier. AI agents can call it through `https://mcp.apify.com` as
`om_kh/coles-australia-scraper`.

### Tips and limits

- Coles shows at most **4,800 products per search or aisle**. For more, use sub-aisles,
  filters, or `wholeCatalogue`, which splits the job by aisle for you.
- **Coles' bot check comes and goes.** The Actor keeps the addresses Coles accepts, switches address pool when it is refused, and retries each page up to eight times. A page that still fails is reported and never charged.
- A store is chosen by its **number**, not by suburb or postcode.
- There is **no search by barcode**: Coles does not index barcodes. The barcode is returned
  on each product when `includeDetails` is on.
- A brand or filter Coles does not offer for that list is reported with the list of the
  ones it does offer.

### FAQ

**Do I need a Coles account?** No.

**Are prices the same in every store?** Not always. Leave `storeId` empty for Coles'
default prices, or set a store number for that store.

**Is it legal?** It reads prices Coles publishes publicly. Use the data in line with the
laws and terms that apply to you.

### Related Actors

- [Amazon Price & Stock Scraper - Price, Stock, Buy Box](https://apify.com/om_kh/amazon-price-stock-tracker) — the same watch on Amazon.
- [SEEK & JobStreet Jobs Scraper - Salary, Company, AU NZ Asia](https://apify.com/om_kh/seek-jobstreet-jobs-scraper) — more Australian data.
- [Google Trends Scraper - Interest, Regions, Queries, $2/1K](https://apify.com/om_kh/google-trends-scraper) — what Australians search for.

# Actor input Schema

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

What you would type in the Coles search box, one per line (milk, vegemite, dog food...).

## `categories` (type: `array`):

Aisle paths or links, for example dairy-eggs-fridge/milk or https://www.coles.com.au/browse/pantry. Switch on 'List all aisles' below to see every path.

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

Paste any coles.com.au link: a product, a search, an aisle or the specials page. A bare product number (8150288) also works.

## `productIds` (type: `array`):

Coles product numbers, one per line. Each returns the full product page: price plus barcode, ingredients and nutrition.

## `specials` (type: `string`):

'none' returns normal listings. 'all' returns only products on special; half price, multi-buy and online-only narrow it. Used alone it reads the whole specials page (about 7,000 products).

## `wholeCatalogue` (type: `boolean`):

Reads every main aisle (about 30,000 products). Set 'Max products per input' high (up to 100,000) and a spending limit you accept.

## `listCategories` (type: `boolean`):

Also returns the full aisle tree (about 1,500 aisles with their paths and product counts). These rows are free.

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

Per search, aisle or link. 1 to 100,000. Coles shows at most 4,800 products per search; the whole-catalogue and big specials jobs are split by aisle for you.

## `storeId` (type: `string`):

Prices and specials of one store. The number is at the end of the store page link on coles.com.au (find-stores/coles/nsw/bondi-junction-7731 gives 7731). Empty = Coles default prices.

## `sortBy` (type: `string`):

Order of the results inside each search or aisle.

## `brands` (type: `array`):

Keep only these brands, for example Cadbury. A brand Coles does not offer for that list is reported together with the brands it does offer.

## `dietary` (type: `array`):

For example Vegan, Vegetarian, Halal, GMO Free.

## `allergens` (type: `array`):

For example Gluten Free, Dairy Free, Egg Free.

## `minPrice` (type: `number`):

Keep products at or above this shelf price.

## `maxPrice` (type: `number`):

Keep products at or below this shelf price.

## `minDiscountPercent` (type: `number`):

Keep only products at least this much below their was-price (50 = half price or better).

## `inStockOnly` (type: `boolean`):

Skip products Coles marks as unavailable.

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

Coles mixes paid placements into search results. Switch off to skip them (they are flagged isSponsored either way).

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

Opens every product page for its barcode (EAN), ingredients, allergens, dietary tags, storage, country of origin, dimensions and the full nutrition table. Slower, and sold as its own event: $0.003 per product instead of $0.001.

## `maxTotalChargeUsd` (type: `number`):

The run stops before it would spend more than this. The first 10 products of each run are free and do not count.

## Actor input object example

```json
{
  "searchTerms": [
    "milk",
    "vegemite"
  ],
  "specials": "none",
  "wholeCatalogue": false,
  "listCategories": false,
  "maxProductsPerInput": 100,
  "sortBy": "relevance",
  "inStockOnly": false,
  "includeSponsored": true,
  "includeDetails": false,
  "maxTotalChargeUsd": 0.5
}
```

# Actor output Schema

## `report` (type: `string`):

A visual summary of delivery, charges, and source issues.

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

Posts in a sortable table. No JSON knowledge required.

## `csv` (type: `string`):

Results ready for spreadsheets, CRMs, and analytics tools.

## `excel` (type: `string`):

Results as an Excel workbook for non-technical teams.

## `runSummary` (type: `string`):

Machine-readable delivery, billing, and source diagnostics.

# 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",
        "vegemite"
    ],
    "maxProductsPerInput": 100,
    "maxTotalChargeUsd": 0.5
};

// Run the Actor and wait for it to finish
const run = await client.actor("om_kh/coles-australia-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",
        "vegemite",
    ],
    "maxProductsPerInput": 100,
    "maxTotalChargeUsd": 0.5,
}

# Run the Actor and wait for it to finish
run = client.actor("om_kh/coles-australia-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",
    "vegemite"
  ],
  "maxProductsPerInput": 100,
  "maxTotalChargeUsd": 0.5
}' |
apify call om_kh/coles-australia-scraper --silent --output-dataset

```

## MCP server setup

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