# Coles Scraper - Prices & Stock by Store, Specials, Catalog (`clearpath/coles-scraper`) Actor

Coles Australia prices and stock for every store. Search, paste any Coles link, or scrape half-price and multibuy specials and the full catalog, by store ID, postcode or all ~870 stores. Add barcodes, nutrition, ingredients and allergens, plus every store's address and opening hours.

- **URL**: https://apify.com/clearpath/coles-scraper.md
- **Developed by:** [ClearPath](https://apify.com/clearpath) (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.99 / 1,000 product or store 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

<p><a href="https://console.apify.com/actors/FzxNShGGntfilAEDe/input"><img src="https://iili.io/nnPoa0x.png" alt="Price and stock levels for every Coles store: the same half-price chocolate biscuits with a different was price and stock count in Sydney, Collingwood, Darwin and Karratha."></a></p>

### Why choose this Coles scraper?

- **Each store's own price and stock.** Pick stores by ID or postcode, or run all ~870 Coles stores that sell online. Every store gets its own rows with shelf price, was price, stock and availability. In one run the same biscuits were "was $6.00" in Sydney and "was $6.42" in Karratha, and 3L milk was not available in Darwin.
- **Fast, and runs finish.** Thousands of products a minute: a full-catalogue test saved 19,012 products in under two minutes. When a run gets close to its time limit it stops on its own and keeps every product it already collected.
- **Everything Coles shows.** Specials with saving and multi-buy offer text, unit prices, purchase limits, category path and in-store aisle where Coles lists it. Add barcode, ingredients, allergens, nutrition panel and country of origin, or the full store directory with opening hours.

<p><a href="https://console.apify.com/actors/FzxNShGGntfilAEDe/input"><img src="https://iili.io/nnPo0JV.png" width="250" height="48" alt="Get Coles prices"></a></p>

### Try it

Open the [input page](https://console.apify.com/actors/FzxNShGGntfilAEDe/input), switch to JSON and paste this. It searches Tim Tam in the nearest Coles to Sydney, Melbourne and Brisbane postcodes and returns up to 10 products per store: at most 30 results, under $0.05.

```json
{
  "searchTerms": ["tim tam"],
  "postcodes": ["2000", "3000", "4000"],
  "maxItems": 10
}
```

Add `"includeDetails": true` for barcode, ingredients, allergens and nutrition on every product. Details are charged as an add-on per product.

#### Copy to your AI assistant

```
clearpath/coles-scraper on Apify. Scrapes Coles Australia: product search (searchTerms), any Coles product, category, specials, brand, search or store link, or a product ID as https://www.coles.com.au/product/ID (startUrls), specials (allspecials, halfprice, multibuy, onlineonly), whole departments with departments=[...] on its own, no other setting needed (slugs: fruit-vegetables, meat-seafood, deli, dairy-eggs-fridge, bakery, lunchbox, frozen, chips-chocolates-snacks, pantry, international-foods, drinks, liquorland, health-dietary, health-beauty, cleaning-laundry, baby, pet, home-garden; an unrecognised slug is skipped), fullCatalog=true (every department except Tobacco; departments narrows it) and storeDirectory=true (every store with address, phone, coordinates, opening and holiday hours, and the way to discover store IDs); combine them in one run. Price, stock and availability are per store: set storeIds, postcodes (nearest Coles supermarket selling online) or allStores=true (~870 stores); without them results come from Coles' default online store. Each store gets its own rows. For barcode (gtin), ingredients, allergens, nutrition and country of origin set includeDetails=true; product links always include them. sortBy orders listings: relevance (default), priceAscending, priceDescending, productNameAscending or productNameDescending, and a link that already carries a sort keeps it. maxItems applies per search term, link, specials type or department, per store (stores for storeDirectory); omitted or 0 means no limit, so set it to bound cost. One run takes at most 100 search terms, 1,000 links and 500 postcodes; more than that fails the run with a message. Searches with no matching product return no rows. Every dataset row carries a type field: product or store. An allStores or unlimited run takes minutes and outlives the synchronous run endpoints, so start the run, poll it and then read its dataset. Cost: $1.49 per 1,000 rows (Free plan) down to $0.99 (Gold and above), details +$0.49 down to +$0.29 per 1,000 products with details, plus $0.005 per run start, so batch inputs into one run. Full spec: GET https://api.apify.com/v2/actors/clearpath~coles-scraper/builds/default (Authorization: Bearer TOKEN) returns inputSchema, actorDefinition.storages.dataset and readme.
```

### What can this Coles scraper do?

- 🔍 **Search Coles** by keyword, the same products you see on coles.com.au, in any sort order
- 🔗 **Paste any Coles link**: product, category, specials, brand, search results or store page. Filters and sorting in the link are kept. For a product ID, paste coles.com.au/product/ followed by the ID
- 🏷️ **Scrape specials**: all specials, half price, multi-buy or online-only
- 🗂️ **Scrape whole departments** picked from a list: Fruit & Vegetables, Bakery, Pantry, Drinks, Baby, Pet and the rest
- 📦 **Pull the full Coles catalogue**, department by department: more than 20,000 products per store
- 🏪 **Choose stores** by store ID, by postcode (nearest Coles supermarket) or all stores at once
- 📍 **Export the Coles store directory**: address, phone, coordinates, opening hours and public holiday hours
- 🥛 **Add product details**: barcode (GTIN), ingredients, allergens, dietary, nutrition panel, country of origin, storage, every size and variety, UNSPSC code
- 🧾 **Combine everything in one run**: searches, links, specials, catalog and stores run side by side

### How to scrape Coles products, prices and specials

#### Search products in specific stores

```json
{
  "searchTerms": ["full cream milk", "bread"],
  "storeIds": ["313", "7689"],
  "maxItems": 50,
  "sortBy": "priceAscending"
}
```

The store ID is the number at the end of a Coles store page link, for example `313` in `coles.com.au/find-stores/coles/wa/karratha-313`. Leave stores empty to use Coles' default online store.

#### Scrape Coles half-price specials

```json
{
  "specials": "halfprice",
  "maxItems": 0
}
```

`maxItems: 0` returns every half-price product. Use `allspecials`, `multibuy` or `onlineonly` for the other special types. Coles changes its weekly specials on Wednesdays, so a weekly schedule on Wednesday keeps a specials tracker current.

#### Get this week's Coles catalogue

```json
{
  "specials": "allspecials",
  "maxItems": 0
}
```

The catalogue as data: every product on special right now, half price and multi-buy included, with the shelf price, the was price, the saving, the offer description and the unit price. Coles turns its catalogue over on Wednesday, so schedule this weekly on Wednesday. Add `postcodes` to get the catalogue as it prices at your own store. This returns the catalogue's products, not the printed PDF.

#### Paste Coles links

```json
{
  "startUrls": [
    { "url": "https://www.coles.com.au/browse/dairy-eggs-fridge/milk" },
    { "url": "https://www.coles.com.au/on-special?filter_Special=multibuy" },
    { "url": "https://www.coles.com.au/product/coles-full-cream-milk-3l-8150288" },
    { "url": "https://www.coles.com.au/find-stores/coles/wa/karratha-313" }
  ],
  "maxItems": 100
}
```

Category, specials, brand and search links return their product lists. Product links return one product with full details. Store links return the store's address and opening hours.

#### Compare prices and stock across every Coles store

```json
{
  "searchTerms": ["tim tam"],
  "allStores": true,
  "maxItems": 5
}
```

This returns up to 5 products for every Coles store that sells online, one row per store per product: up to about 4,350 results. In testing, three milk products for every store (2,607 results) took about a minute.

#### Get every Coles store location and opening hours

```json
{
  "storeDirectory": true,
  "maxItems": 0
}
```

The input form fills in a maximum of 100, which also limits the store directory to 100 stores. Set `maxItems` to 0 or leave it empty for every store.

#### Scrape whole departments

```json
{
  "departments": ["bakery", "dairy-eggs-fridge"],
  "postcodes": ["3000"],
  "maxItems": 500
}
```

Pick departments from the list in the input form, no category link needed. `maxItems` counts per department and per store, so this returns up to 500 bakery and 500 dairy products for the Coles nearest postcode 3000. For one aisle or shelf instead of a whole department, paste its link into `startUrls`.

#### Scrape the full Coles catalogue with nutrition and barcodes

```json
{
  "fullCatalog": true,
  "includeDetails": true,
  "maxItems": 0
}
```

Without `maxItems` limits this returns every product Coles sells online for the chosen store. Details make each product slower to collect and add the details charge, so start with a small `maxItems` per category.

#### Input parameters

| Parameter | Type | Default | Meaning |
|---|---|---|---|
| `searchTerms` | array | | Products to search for, up to 100 per run |
| `startUrls` | array | | Coles product, category, specials, brand, search or store links, up to 1,000. For a product ID use `https://www.coles.com.au/product/ID` |
| `specials` | string | `none` | `allspecials`, `halfprice`, `multibuy` or `onlineonly` |
| `departments` | array | | Department slugs, for example `bakery`, `pantry`, `dairy-eggs-fridge`. Narrows the catalogue to those departments |
| `fullCatalog` | boolean | `false` | Every department (Tobacco is excluded because Coles age-restricts it) |
| `storeDirectory` | boolean | `false` | Add every Coles store with address and opening hours |
| `storeIds` | array | | Store IDs to scrape prices and stock for |
| `postcodes` | array | | Australian postcodes, each uses the nearest Coles supermarket that sells online, up to 500 |
| `allStores` | boolean | `false` | Run searches, links, specials and catalog in every Coles store that sells online |
| `includeDetails` | boolean | `false` | Add barcode, ingredients, allergens, nutrition and more. Charged per product |
| `maxItems` | integer | no limit (form: 100) | Products per search term, link, specials type or department, per store. Stores for the directory. `0` = no limit |
| `sortBy` | string | `relevance` | `priceAscending`, `priceDescending`, `productNameAscending` or `productNameDescending` |

### What data can you extract from Coles?

| Group | Fields |
|---|---|
| Product | `id`, `name`, `brand`, `size`, `description`, `url`, `imageUrl`, `imageUrls` |
| Price | `price`, `wasPrice`, `unitPrice`, `unitOfMeasure`, `comparablePrice`, full `pricing` record |
| Specials | `isOnSpecial`, `specialType`, `offerDescription`, `saveAmount`, `savePercent`, `isHalfPrice` |
| Store stock | `storeId`, `storeName`, `storeSuburb`, `storeState`, `storePostcode`, `isAvailable`, `stockQuantity`, `availabilityType`, `locations` (in-store aisle, when Coles lists it) |
| Category | `onlineHeirs` (aisle, category and subcategory), `merchandiseHeir`, `restrictions` (purchase limits) |
| Product details | `gtin`, `ingredients`, `allergens`, `dietary`, `storage`, `dimensions`, `nutrition`, `countryOfOrigin`, `longDescription`, `variations`, `images`, `unspscCode` |
| Store directory | `address`, `suburb`, `state`, `postcode`, `phone`, `latitude`, `longitude`, `tradingHours`, `tradingHoursToday`, `holidayTradingHours`, `collectionPointId` |
| Run context | `type`, `sourceType`, `sourceInput`, `detailStatus`, `isAssociatedResult`, `adId`, `scrapedAt` |

Every field Coles returns is kept. Rows have `type: "product"` or `type: "store"`. The Output tab has a Products view and a Stores view; export as JSON to keep nested fields such as `nutrition` intact.

#### Product with details

A real result for 3L milk at Coles Karratha, with `includeDetails`. To keep it short, `variations.byVarieties` and `variations.bySizes` show 1 of 8 and 1 of 10 entries, `images` shows 1 of 4, and each nutrition table shows 3 of its 10 nutrients.

```json
{
  "type": "product",
  "id": 8150288,
  "name": "Full Cream Milk",
  "brand": "Coles",
  "size": "3L",
  "price": 4.95,
  "wasPrice": null,
  "unitPrice": 1.65,
  "unitOfMeasure": "1l",
  "comparablePrice": "$1.65/ 1L",
  "isOnSpecial": false,
  "specialType": null,
  "offerDescription": null,
  "saveAmount": null,
  "savePercent": null,
  "isHalfPrice": false,
  "isAvailable": true,
  "stockQuantity": 433,
  "url": "https://www.coles.com.au/product/coles-full-cream-milk-3l-8150288",
  "imageUrl": "https://cdn.productimages.coles.com.au/productimages/8/8150288.jpg",
  "imageUrls": [
    "https://cdn.productimages.coles.com.au/productimages/8/8150288.jpg"
  ],
  "isAssociatedResult": false,
  "storeId": "313",
  "storeName": "Coles Karratha",
  "storeSuburb": "Karratha",
  "storeState": "WA",
  "storePostcode": "6714",
  "sourceType": "url",
  "sourceInput": "https://www.coles.com.au/product/coles-full-cream-milk-3l-8150288",
  "detailStatus": "enriched",
  "ingredients": "Homogenised and Pasteurised Full Cream Milk",
  "allergens": "Contains Milk",
  "dietary": "Source of Calcium",
  "dimensions": "273.00 x 153.00 x 102.00 mm",
  "storage": "Keep this way up,Keep refrigerated. Store at or below 5°C",
  "description": "COLES FULL CREAM MILK 3L",
  "imageUris": [
    {
      "altText": "",
      "type": "default",
      "uri": "/8/8150288.jpg"
    }
  ],
  "availabilityStatus": null,
  "minGuarantee": "Life 7 days min",
  "merchandiseHeir": {
    "tradeProfitCentre": "DAIRY",
    "categoryGroup": "DAIRY",
    "category": "DY MILK",
    "subCategory": "WHOLE WHITE",
    "className": "WHOLE 3-3.9L"
  },
  "onlineHeirs": [
    {
      "aisle": "Full Cream Milk",
      "category": "Milk",
      "subCategory": "Dairy, Eggs & Fridge",
      "categoryId": "8881800",
      "aisleId": "8881801",
      "subCategoryId": "1300"
    }
  ],
  "associatedProductId": null,
  "continuity": null,
  "lifestyle": null,
  "lastUpdated": "2026-09-16T11:12:33Z",
  "locations": [
    {
      "aisleSide": null,
      "description": "Aisle information is not available for this product. Please ask a Team Member at $STORE to help you find this product.",
      "facing": 0,
      "aisle": null,
      "order": 9999.0,
      "shelf": null
    }
  ],
  "additionalInfo": [
    {
      "title": "Ingredients",
      "description": "INGREDIENTSHomogenised and Pasteurised Full Cream Milk"
    },
    {
      "title": "Allergen",
      "description": "Contains Milk"
    },
    {
      "title": "Dietary",
      "description": "Source of Calcium"
    },
    {
      "title": "Dimensions",
      "description": "273.00 x 153.00 x 102.00 mm"
    },
    {
      "title": "Storage instructions",
      "description": "Keep this way up,Keep refrigerated. Store at or below 5&deg;C"
    }
  ],
  "excludeFromSubstitution": false,
  "brandDetails": {
    "id": 3955134709,
    "name": "Coles",
    "seoToken": "coles"
  },
  "collectableCampaign": "",
  "disclaimers": null,
  "internalDescription": "",
  "longDescription": "Coles is committed to bringing you high quality fresh milk from dairy farms across Australia",
  "nutrition": {
    "title": "Nutritional information",
    "servingsPerPackage": "12.00",
    "servingSize": "250mL",
    "dailyIntakeDisclaimer": "*Percentage Daily (%DI) Intakes are based on an average adult diet of 8700 kJ. Your daily intakes may be higher or lower depending on your energy needs.",
    "breakdown": [
      {
        "title": "Per Serving",
        "subtitle": "Average quantity per serving",
        "disclaimer": null,
        "nutrients": [
          {
            "nutrient": "Energy (kJ)",
            "value": "650 kJ",
            "dailyIntakeInfo": "(7% DI)",
            "nutrientDisplayOrder": "2.000"
          },
          {
            "nutrient": "Energy (Cal)",
            "value": "155 Cal",
            "dailyIntakeInfo": null,
            "nutrientDisplayOrder": "3.000"
          },
          {
            "nutrient": "Protein",
            "value": "8.75 g",
            "dailyIntakeInfo": "(18% DI)",
            "nutrientDisplayOrder": "4.000"
          }
        ]
      },
      {
        "title": "Per 100g/ml",
        "subtitle": "Average quantity per 100g (or 100ml)",
        "disclaimer": null,
        "nutrients": [
          {
            "nutrient": "Energy (kJ)",
            "value": "260 kJ",
            "dailyIntakeInfo": null,
            "nutrientDisplayOrder": "2.000"
          },
          {
            "nutrient": "Energy (Cal)",
            "value": "62.2 Cal",
            "dailyIntakeInfo": null,
            "nutrientDisplayOrder": "3.000"
          },
          {
            "nutrient": "Protein",
            "value": "3.5 g",
            "dailyIntakeInfo": null,
            "nutrientDisplayOrder": "4.000"
          }
        ]
      }
    ]
  },
  "nutritionalClaims": null,
  "pricing": {
    "now": 4.95,
    "rawPriceNow": 4.95,
    "was": 0,
    "unit": {
      "quantity": 1.0,
      "ofMeasureQuantity": 1,
      "ofMeasureUnits": "l",
      "price": 1.65,
      "ofMeasureType": "l",
      "isWeighted": false,
      "isIncremental": false
    },
    "comparable": "$1.65/ 1L",
    "onlineSpecial": false
  },
  "gtin": "9300601186945",
  "variations": {
    "total": 18,
    "byVarieties": [
      {
        "id": 5593963,
        "name": "Reduced Fat Hi Lo Milk",
        "brand": "Coles",
        "description": "COLES REDUCED FAT HI LO MILK 2L",
        "size": "2L",
        "imageUris": [
          {
            "altText": "",
            "type": "default",
            "uri": "/5/5593963.jpg"
          }
        ],
        "images": null,
        "restrictions": null,
        "availability": false,
        "availabilityType": "InStoreAndOnline",
        "availabilityStatus": null,
        "merchandiseHeir": {
          "tradeProfitCentre": "DAIRY",
          "categoryGroup": "DAIRY",
          "category": "DY MILK",
          "subCategory": "FAT REDUCED",
          "className": "LOW FAT"
        },
        "onlineHeirs": [
          {
            "aisle": "Skim & Low Fat Milk",
            "category": "Milk",
            "subCategory": "Dairy, Eggs & Fridge",
            "categoryId": "8881800",
            "aisleId": "8881802",
            "subCategoryId": "1300"
          }
        ],
        "associatedProductId": null,
        "continuity": null,
        "pricing": null
      }
    ],
    "bySizes": [
      {
        "id": 1993245,
        "name": "Milk Full Cream",
        "brand": "Coles",
        "description": "COLES MILK FULL CREAM 500ML QLD",
        "size": "500mL",
        "imageUris": [
          {
            "altText": "",
            "type": "default",
            "uri": "/1/1993245.jpg"
          }
        ],
        "images": null,
        "restrictions": null,
        "availability": false,
        "availabilityType": "InStoreAndOnline",
        "availabilityStatus": null,
        "merchandiseHeir": {
          "tradeProfitCentre": "DAIRY",
          "categoryGroup": "DAIRY",
          "category": "DY MILK",
          "subCategory": "WHOLE WHITE",
          "className": "WHOLE <1L"
        },
        "onlineHeirs": [
          {
            "aisle": "Full Cream Milk",
            "category": "Milk",
            "subCategory": "Dairy, Eggs & Fridge",
            "categoryId": "8881800",
            "aisleId": "8881801",
            "subCategoryId": "1300"
          }
        ],
        "associatedProductId": null,
        "continuity": null,
        "pricing": null
      }
    ]
  },
  "images": [
    {
      "thumb": {
        "path": "/wcsstore/Coles-CAS/images/8/1/5/8150288-th.jpg",
        "description": null
      },
      "zoom": {
        "path": "/wcsstore/Coles-CAS/images/8/1/5/8150288-zm.jpg",
        "description": "Product Image of Coles Full Cream Milk"
      },
      "full": {
        "path": "/wcsstore/Coles-CAS/images/8/1/5/8150288.jpg",
        "description": null
      }
    }
  ],
  "restrictions": {
    "retailLimit": 20,
    "promotionalLimit": 12,
    "liquorAgeRestrictionFlag": false,
    "tobaccoAgeRestrictionFlag": false,
    "delivery": [
      "OVN",
      "REMOTE SERVICE"
    ],
    "restrictedByOrganisation": false
  },
  "countryOfOrigin": {
    "logoRequired": true,
    "barcodeRequired": true,
    "descriptionRequired": true,
    "country": "Australian",
    "barcodePercentage": 100,
    "statement": "Australian Milk",
    "description": "Australian Milk"
  },
  "availability": true,
  "availabilityType": "InStoreAndOnline",
  "availableQuantity": 433,
  "unspscCode": "50131700",
  "scrapedAt": "2026-09-16T11:12:33+00:00"
}
```

`detailStatus` is `enriched` when details were added, `not_requested` without `includeDetails`, and `unavailable` when Coles could not return details for that product (the listing fields are still delivered). Products without details carry the same listing fields without the detail group.

#### Store

`services` and `nextDoorStores` are empty for most stores; `holidayTradingHours` lists upcoming public holiday hours when Coles publishes them.

```json
{
  "type": "store",
  "storeId": "350",
  "storeName": "Coles Geraldton",
  "brandName": "Coles Supermarkets",
  "address": "Chapman Rd & View St",
  "suburb": "Geraldton",
  "state": "WA",
  "postcode": "6530",
  "phone": "(08) 9948 7300",
  "latitude": -28.766786,
  "longitude": 114.616117,
  "sourceType": "storeDirectory",
  "sourceInput": null,
  "brandId": 2,
  "services": [],
  "tradingHoursToday": {
    "storeTime": "Today from 8am to 9pm",
    "holidayReason": null,
    "isOpenNow": true
  },
  "tradingHours": [
    {
      "daysOfWeek": "Mon-Fri",
      "storeTime": "8am - 9pm"
    },
    {
      "daysOfWeek": "Sat",
      "storeTime": "8am - 5pm"
    },
    {
      "daysOfWeek": "Sun",
      "storeTime": "11am - 5pm"
    }
  ],
  "holidayTradingHours": [
    {
      "storeTime": "8am - 6pm",
      "holidayReason": "Kings Birthday",
      "effectiveDate": "Monday 28 September",
      "isOpen": true
    }
  ],
  "nextDoorStores": [],
  "collectionPointId": "0350CC0350",
  "scrapedAt": "2026-09-16T11:13:44+00:00"
}
```

#### Result counts and categories

Runs with searches, listing links, specials or the catalogue also save `LISTING_METADATA` in the run's key-value store: total results Coles reports per search, link or specials type and store, the available filters and subcategories, and whether a search had no exact match. Full catalog runs also save `CATEGORIES`, the Coles category tree.

### Do Coles prices and stock differ by store?

Yes. The same half-price Tim Tam Original 200g in one run had the same special price everywhere, but the regular price and stock changed between stores:

| Store | Price | Was | Stock |
|---|---|---|---|
| Coles Local Sydney CBD, NSW | $3.00 | $6.00 | 382 |
| Coles Collingwood, VIC | $3.00 | $6.00 | 682 |
| Coles Darwin, NT | $3.00 | $6.30 | 586 |
| Coles Karratha, WA | $3.00 | $6.42 | 880 |
| Coles Chinatown (Broome), WA | $3.00 | $6.54 | 962 |

In the same run Coles 3L Full Cream Milk was not available in Darwin or Alice Springs (`isAvailable: false`, no price). Without store IDs or postcodes you get Coles' default online store.

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

Pay per result. Result charges per 1,000 results:

| Apify plan | Result (product or store) | Product details add-on |
|---|---|---|
| Free | $1.49 | +$0.49 |
| Bronze | $1.39 | +$0.49 |
| Silver | $1.29 | +$0.39 |
| Gold | $0.99 | +$0.29 |
| Platinum | $0.99 | +$0.29 |
| Diamond | $0.99 | +$0.29 |

The details add-on is charged for each product that comes back with details: with `includeDetails`, and for product links, which always include details.

| Example on the Free plan | Results | Result and details charges |
|---|---|---|
| Search 3 products in 3 stores, 10 each | 90 | $0.13 |
| Store directory | ~875 | $1.30 |
| 1,000 products with details | 1,000 | $1.98 |
| One product in every store (`allStores`) | ~870 | $1.30 |

Set a maximum cost per run in the run options to stop a large run at your budget.

### FAQ

**Can I get prices for a specific Coles store or postcode?**
Yes. Use `storeIds`, `postcodes` (nearest Coles supermarket that sells online) or `allStores`. Each store gets its own rows, so the same product appears once per store.

**Which stores does `allStores` cover?**
Every Coles store that sells online, around 870. A few small-format and regional stores have no online range and are left out. If you enter one of them as a store ID, it is skipped with a note in the log.

**When do Coles specials change?**
Weekly, on Wednesday. Schedule the actor on Wednesdays to track each new specials week.

**Can I get nutrition, ingredients, allergens and barcodes?**
Yes, turn on `includeDetails`. Barcode (`gtin`), ingredients, allergens, dietary information, storage, dimensions, nutrition panel and country of origin are added when Coles lists them for the product.

**Can I look up a product by barcode?**
No. Coles search does not match barcodes reliably. Use the product link instead, or https://www.coles.com.au/product/ followed by the product ID: both return the barcode with the details.

**Can I get the full Coles product list or catalogue with prices?**
Yes, with `fullCatalog`. It covers every category except Tobacco, which Coles age-restricts, and removes products that appear in several categories.

**Why did my search return nothing?**
When Coles has no product matching a search term it shows unrelated suggestions. Those are not saved as results; the log says no products matched, and `LISTING_METADATA` marks the search with `noExactMatch`.

**Are sponsored products included?**
Yes. Coles shows sponsored products among search and category results, and they are saved like any other product: they have an `adId` and `adSource`, and count toward `maxItems` and your results. Filter on `adId` to remove them.

**What happens if the run reaches its time limit?**
The actor stops shortly before the limit and saves everything it collected. The run ends successfully and the status message says it stopped early.

**Do I need a Coles account?**
No. The actor collects the public prices and products shown on coles.com.au.

**Can I compare Coles with Woolworths?**
This actor covers Coles only. Its store data lets you compare Coles prices across regions and stores.

### More scrapers from our friends at Zen Studio

Sister scrapers for product, price and seller data.

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-ghXSMZcW3GxsCrkiR-5hnvsKv4Yt-1688-wholesale-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **1688 阿里巴巴**
  - [1688 Wholesale Scraper](https://apify.com/zen-studio/1688-wholesale-scraper)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-PsAKYWM55HG4AHXjK-ItywU7Bp0s-taobao-search-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Taobao 淘宝**
  - [Taobao Product Scraper](https://apify.com/zen-studio/taobao-search-scraper)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-uZy6tbKLKnSVtT4BN-emXnT123uR-jd-com-scraper-logo-square.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **JD.com 京东**
  - [JD.com Scraper](https://apify.com/zen-studio/jd-com-search-scraper)

**More from Clearpath**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-9K7ejaAYnpuwNl2sr-0xGZJDXdTD-joybuy-scraper-logo.webp" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Joybuy**
  - [Joybuy Scraper](https://apify.com/clearpath/joybuy-scraper)
  - [Joybuy Product Detail Scraper](https://apify.com/clearpath/joybuy-product-detail-scraper)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-P5fALt8vY7xXgJh56-cIPO73yOhI-shein-product-scraper-logo.jpg" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **SHEIN**
  - [SHEIN Product Scraper](https://apify.com/clearpath/shein-product-scraper)
  - [SHEIN Trends Scraper](https://apify.com/clearpath/shein-trends-scraper)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-R9SL2PPdhdhLQwdck-tbaq4J8sxX-shopy-by-shopify-scraper-logo.jpg" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Shopify**
  - [Shopify Product Search](https://apify.com/clearpath/shop-by-shopify-product-scraper)
  - [Shopify Store Leads](https://apify.com/clearpath/shopify-store-leads)

### Support

- **Bugs**: Issues tab
- **Features**: Email or issues
- **Email**: max@mapa.slmail.me

### Legal Compliance

Extracts publicly available product, price and store information. Users must comply with Coles' terms of use and applicable data protection laws. Not affiliated with or endorsed by Coles.

***

*Scrape Coles Australia products, prices, specials, stock by store, nutrition, barcodes and store locations.*

# Actor input Schema

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

Products to search for on Coles, one per line. Each search returns the same products you would see on coles.com.au. Up to 100 per run.

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

Paste any Coles link: a product, category, specials page, brand, search results or store page. Filters and sorting in the link are kept. For a product ID, paste https://www.coles.com.au/product/ followed by the ID. Up to 1,000 per run.

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

Scrape everything currently on special, or only one kind of deal.

## `departments` (type: `array`):

Whole departments, picked from the list. For one aisle or shelf, paste its link above instead.

## `fullCatalog` (type: `boolean`):

Scrape every product Coles sells online, department by department: more than 20,000 products per store. Pick Departments above to narrow it. Tobacco is excluded because Coles age-restricts it.

## `storeDirectory` (type: `boolean`):

Add every Coles supermarket to the results: address, phone, coordinates, opening hours and holiday hours.

## `maxItems` (type: `integer`):

Per search term, link, department or specials type, per store. For the store directory, the maximum number of stores. Leave empty or set 0 for no limit. Keeps a run small and the cost predictable.

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

Get prices, stock and range for specific stores. The store ID is the number at the end of a Coles store page link, for example 313 in coles.com.au/find-stores/coles/wa/karratha-313. Each store gets its own rows.

## `postcodes` (type: `array`):

Australian postcodes. Each one uses the nearest Coles supermarket that sells online. Up to 500 per run.

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

Run your searches, links, specials and full catalog in every Coles supermarket that sells online (around 870 stores). Results multiply by the number of stores, so combine with a small maximum for a national price comparison.

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

Add barcode (GTIN), ingredients, allergens, dietary information, nutrition panel, country of origin, full description, all images and every size variant to each product. Slower, and charged as an add-on per product. Products from product links always include details.

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

Order results the way Coles sorts them. Links that already contain a sort order keep it.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "specials": "none",
  "fullCatalog": false,
  "storeDirectory": false,
  "maxItems": 100,
  "allStores": false,
  "includeDetails": false,
  "sortBy": "relevance"
}
```

# Actor output Schema

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

No description

## `listingMetadata` (type: `string`):

No description

## `categories` (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"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearpath/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 = {
    "searchTerms": ["milk"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("clearpath/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 '{
  "searchTerms": [
    "milk"
  ],
  "maxItems": 100
}' |
apify call clearpath/coles-scraper --silent --output-dataset

```

## MCP server setup

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