Coles Scraper: Products, Prices, Specials & Unit Prices avatar

Coles Scraper: Products, Prices, Specials & Unit Prices

Pricing

from $0.50 / 1,000 products

Go to Apify Store
Coles Scraper: Products, Prices, Specials & Unit Prices

Coles Scraper: Products, Prices, Specials & Unit Prices

Scrape Coles Australia products by search words, category, specials or product URL: product id, name, brand, size, price, was-price, half-price and multi-buy specials, unit price, availability, image and category. Several searches per run, a max per search. No login. Misses free.

Pricing

from $0.50 / 1,000 products

Rating

0.0

(0)

Developer

Hyperbach

Hyperbach

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Features

Limited permissions

Share

Coles Australia products, logged out: search words, Coles search, category or specials URLs, the specials list by kind, or product URLs in, one row per product out — the product id and URL, name, brand and size, the price with the was-price and the saving, the half-price or multi-buy special with its text, the unit price, availability, the purchase limits, the image URL and the department, category and aisle — several searches in one run, a max per search. One free query row per input carries a completeness verdict: COMPLETE (every product of Coles' count), CAPPED (your limit), TRUNCATED (Coles' own depth limit, with its count) or PARTIAL. No login, no API key, no browser, proxies handled for you.

$1.00 per 1,000 product rows on the Free plan, $0.85 on Starter. A run start is $0.008. The default input returns about 10 rows for about $0.018. A value that names nothing is a free row that says why.

A Coles product page in a browser: a box of toasted honey muesli on a half-price special, with its price, the was-price, the saving, the unit price and the purchase limit. Beside it, the row this Actor returns for the product, with was_price, save_amount and special_text highlighted, then the size, the unit price, the promotional limit and the aisle.

Why this Coles scraper

  • Searches, categories, specials and products in one run. Give search words (milk), search URLs from your browser with the sort and filters you set there, category URLs (/browse/dairy-eggs-fridge/milk), the specials list by kind (all, half price, multi-buy, online only), or product URLs and product ids. Each list gets its own cap (maxItemsPerQuery), and the run's cap sits on top (maxItems).
  • Prices and specials as Coles shows them. The shelf price, the was-price and the saving in dollars and percent when the product is on special, the special's kind and its label (1/2 Price, Pick any 2 for $6), the multi-buy quantity, the unit price with its measure ($1.65/ 1L), availability and the retail and promotional purchase limits.
  • Every product of a list, checked. Coles' own order, 48 products a page, until every product of Coles' count is met: the free query row says COMPLETE with the count. Coles shows a reader about 100 pages of a list (about 4,900 products) whatever its count says (the specials: 7,307, measured 2026-10-23); a run that reaches that end says TRUNCATED with Coles' count. A product a later page or another search repeats is delivered and charged once; sponsored products are kept and flagged.
  • Honest runs. A product Coles does not know is a free not_found row, checked twice; a search with no match a free no_results row; a URL that is not Coles a free invalid row. Every input gets a row.

Who it's for

  • Grocery price analysts — the prices, was-prices and unit prices of a category or a search's products, read again every week to follow specials and price moves.
  • Brands and suppliers — where their products and their competitors' sit in Coles' search for their words, with the special, the saving and the sponsored placements.
  • Deal and catalogue sites — the half-price and multi-buy specials of the week with their labels, images and product URLs.

Quick start

The first 100 products of a search

{
"searchTerms": [
"milk"
],
"maxItemsPerQuery": 100
}

This week's half-price specials

{
"specials": "halfprice",
"maxItemsPerQuery": 500
}

A whole category and two products by URL and by id

{
"startUrls": [
"https://www.coles.com.au/browse/dairy-eggs-fridge/milk",
"https://www.coles.com.au/product/coles-full-cream-milk-3l-8150288",
"6450214"
],
"maxItemsPerQuery": 0
}

Output

One row per product (and one free query row per input):

fieldmeaning
row_typeproduct (one product, charged) or query (the input's row with the walk's verdict; free).
input_indexThe 1-based position of the input this row answers: startUrls first, then searchTerms, then specials.
input_valueThe input as you gave it (the URL, the search words or the specials kind).
input_kindWhich input it came from: url (startUrls), query (searchTerms) or specials.
search_urlThe list (or the product) on coles.com.au, as a URL you can open.
statusA query row: ok, no_results, not_found, invalid, duplicate, failed or not_read (see the FAQ). A product row: ok.
status_detailWhy a query row is not ok, in a sentence.
scraped_atWhen the row was read (UTC).
positionThe product's place among this input's delivered products (1 = first); 1 for a product URL.
pageThe list page the product was on (empty for a product URL).
product_idColes' product id (the number at the end of the product URL).
urlThe product's page on coles.com.au.
nameThe product's name, without the brand and the size.
brandThe brand.
descriptionColes' short product line (COLES FULL CREAM MILK 3L).
sizeThe pack size as Coles writes it (3L, 675g, 10 Pack).
priceThe current shelf price, in currency (empty when Coles shows no price: an unavailable product).
currencyThe price's currency (AUD).
was_priceThe earlier price Coles strikes through when the product is on special.
save_amountThe saving against the was-price, in dollars.
save_percentThe saving in percent, when Coles states one (50 for half price).
on_specialTrue when the product is on special (a price cut or a multi-buy offer).
promotion_typeColes' promotion type: SPECIAL, EVERYDAY (an everyday low price), BONUSCOLLECTABLE, NEW, or empty.
special_typeThe kind of special: PERCENT_OFF, MULTI_SAVE (a multi-buy), REDUCED_TO_CLEAR, WHILE_STOCKS_LAST, or empty.
special_textThe special's label as Coles shows it (1/2 Price, Pick any 2 for $6, save $0.50).
multibuy_quantityA multi-buy offer: how many to buy for the offer price.
online_specialTrue when the special is online only.
unit_priceThe price per unit_measure, in AUD.
unit_measureThe measure the unit price is for (1 l, 100 g, 1 ea).
unit_price_textThe unit price as the shelf label writes it ($1.65/ 1L).
availableTrue when Coles shows the product as available to buy.
availability_typeWhere it is sold (InStoreAndOnline), from a list page.
available_quantityThe quantity Coles' list page shows as available (its default online store), when it shows one.
retail_limitThe most of this product one order may hold.
promotional_limitThe most of this product one order may hold at the special price.
image_urlThe product's main image.
departmentThe department (Dairy, Eggs & Fridge).
categoryThe category inside the department (Milk).
aisleThe aisle inside the category (Full Cream Milk).
category_pathDepartment > category > aisle.
sponsoredTrue when the product was a sponsored placement in the list (false for a product URL).
products_countA query row: Coles' own count of products for the list (sponsored ones included).
products_deliveredA query row: the product rows this input delivered.
pages_readA query row: the list pages read.
repeats_skippedA query row: products skipped because an earlier page or another input of the run already delivered them.
verdictA query row: COMPLETE (every product of Coles' count, or Coles' own end of the list), CAPPED (your limit), TRUNCATED (the list ended below Coles' count: Coles shows a reader about 100 pages of a list) or PARTIAL (a refusal or the time limit stopped it).
verdict_detailA query row: the verdict in a sentence, with the counts.

Example record:

{
"row_type": "product",
"input_index": 7,
"input_value": "halfprice",
"input_kind": "specials",
"search_url": "https://www.coles.com.au/on-special?filter_Special=halfprice",
"status": "ok",
"status_detail": null,
"scraped_at": "2026-10-23T04:00:41Z",
"position": 1,
"page": 1,
"product_id": "6538290",
"url": "https://www.coles.com.au/product/oreo-mini-original-cookies-multipack-10-pack-204g-6538290",
"name": "Mini Original Cookies Multipack 10 Pack",
"brand": "Oreo",
"description": "OREO MULTIPACK ORIGINAL MINI COOKIES:.:204 GRAM",
"size": "204g",
"price": 2.5,
"currency": "AUD",
"was_price": 5.0,
"save_amount": 2.5,
"save_percent": 50.0,
"on_special": true,
"promotion_type": "SPECIAL",
"special_type": "PERCENT_OFF",
"special_text": "1/2 Price",
"multibuy_quantity": null,
"online_special": false,
"unit_price": 1.23,
"unit_measure": "100 g",
"unit_price_text": "$1.23/ 100g",
"available": true,
"availability_type": "InStoreAndOnline",
"available_quantity": 3276,
"retail_limit": 20,
"promotional_limit": 12,
"image_url": "https://cdn.productimages.coles.com.au/productimages/6/6538290.jpg",
"department": "Chips, Chocolates & Snacks",
"category": "Biscuits & Cookies",
"aisle": "Multipack Biscuits",
"category_path": "Chips, Chocolates & Snacks > Biscuits & Cookies > Multipack Biscuits",
"sponsored": false,
"products_count": null,
"products_delivered": null,
"pages_read": null,
"repeats_skipped": null,
"verdict": null,
"verdict_detail": null
}

Pricing

Pay for the products a run delivers, plus one run start; no platform usage is billed to you. The product price falls with your Apify plan.

eventunitFreeStarterScaleBusiness
Product (product)per 1,000$1.00$0.85$0.70$0.50
Run start (start)per run$0.008$0.008$0.008$0.008

A product is $1.00 per 1,000 on the Free plan ($0.001 a product). Each run that delivers a charged product also pays the run start, $0.008 once; a run that delivers no charged product pays nothing at all. So one search of 100 products costs $0.108 on the Free plan, and several searches in one run share one start. The free query row of every input, a value that is not a Coles URL (invalid), a product Coles does not know (not_found), a search with no match (no_results), a repeated input (duplicate), an input left at the cap or the time limit (not_read) and a refusal the run could not pass (failed) are never charged. A product is charged once a run, also when several searches list it. A run that stops early (a timeout, an abort) is charged for the products it delivered. maxItems counts the charged rows; before the first request the log names the price of each row at your plan and the most the run can cost. Enterprise plans have their own rates: the Actor's Pricing tab shows the price for your plan.

Usage patterns

  • Searches, categories, specials and products — searchTerms takes words, one search a line. startUrls takes search URLs as your browser shows them (their sort and filters are kept), category URLs (/browse/<department>/<category>/<aisle>), the specials page (/on-special, with ?filter_Special=halfprice, multibuy or onlineonly) and product URLs (/product/<name>-<id>) or bare product ids. specials adds the specials list of one kind. coles.com.au only.
  • What a row is — row_type = product: one product, in Coles' order (position, and the page it was on). row_type = query: the free row of one input value — products_count (Coles' own count), products_delivered, pages_read, repeats_skipped, the verdict with its verdict_detail, and the status with its reason.
  • How far a list goes — maxItemsPerQuery (default 100; 0 = every product the list serves) stops each list after that many new products. Coles shows a reader about 100 pages of a list, about 4,900 products, whatever its count says; a run that reaches that end says TRUNCATED with Coles' count, and a category or a special kind reads a narrower list. maxItems caps the charged rows of the whole run.

Input configuration

fieldtypedefaultwhat it does
searchTermsarrayWords to search on coles.com.au, one search a line (milk, tim tam), as you would type them in Coles' search box. Each line is one list, read page after page. Words Coles matches with nothing give a free row with no product.
startUrlsarrayColes pages to read, one a line: a search URL (https://www.coles.com.au/search/products?q=milk, with any sort or filter you set in your browser), a category URL (https://www.coles.com.au/browse/dairy-eggs-fridge/milk), the specials (https://www.coles.com.au/on-special, or ?filter_Special=halfprice), or a product URL (https://www.coles.com.au/product/<name>-<id>, or the product id alone). A URL that is not a coles.com.au list or product gets a free invalid row; a URL given twice a free duplicate row.
specialsnone / allspecials / halfprice / multibuy / onlineonly"none"Read Coles' specials list too: every special, the half-price specials, the multi-buy offers or the online-only specials. None = no specials list (search words and URLs only).
maxItemsPerQueryinteger100Stop each search, category or specials list after this many new products. 0 = every product the list serves: Coles shows a reader about 100 pages of a list (about 4,900 products), whatever its count says. Product URLs are not counted here.
maxItemsinteger0Stop the whole run after this many product rows (the charged rows). 0 = no run cap; each list still stops at its own limit above.
feedbackstringA note to the people who maintain this Actor: what you needed and did not get. For example a missing field, a wrong or empty result, or the Actor you switch from or to, and why. The run does not read it: the rows and the charges stay the same. A person reads every note.

Errors

A run does not fail because of your input. When an input cannot be used — a date that is not a date, an id in the wrong form, two settings that contradict each other — the run ends Succeeded, charges nothing, and says what to change:

  • the status message starts with INPUT REJECTED;
  • the dataset holds one row, {"error": true, "code": "…", "message": "…"}, and no results;
  • the key-value store record ERROR holds the same object.

From code, check error on the first row before reading results.

A URL that is not a Coles search, category, specials or product URL (an account page, a catalogue, another shop) is not an error: it gets one free query row with status invalid that says why, and the run goes on with the others. A run that ends Failed is a fault on our side, never your input; it charges nothing, and we are alerted.

FAQ

Which status is which?

A query row's status is ok (products served), no_results (Coles lists no product for it; read on two connections), not_found (Coles has no product at that URL; checked on two connections), invalid (an empty value, or a URL that is not a Coles search, category, specials or product URL), duplicate (the same list or product again in the input: read once; or a product another input already delivered), failed (Coles refused every try; free) or not_read (left at maxItems, the charge limit or the run's time limit). A product row's status is ok.

Are the prices for my store?

No. The prices and availability are the ones coles.com.au shows a visitor who has not chosen a store (Coles' default online store). Prices per store or postcode are not read.

Does it give the barcode, nutrition and ingredients?

No. Those sit on each product's own page; the row has what Coles' lists show: the price, the special, the unit price, the size, availability, the image and the category.

Why are some products marked sponsored?

Coles places sponsored products in its own lists; they count in Coles' count of the list and keep their place, with sponsored true. Filter on it if you want the organic results only.

Does it need a Coles account or API key?

No. Everything is read from Coles' public pages, logged out.

Integration

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('hyperbach/coles-scraper').call({"searchTerms": ["milk"], "maxItemsPerQuery": 100});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('hyperbach/coles-scraper').call(run_input={'searchTerms': ['milk'], 'maxItemsPerQuery': 100})
items = client.dataset(run['defaultDatasetId']).list_items().items

CLI

$apify call hyperbach/coles-scraper --input '{"searchTerms": ["milk"], "maxItemsPerQuery": 100}'

REST

curl -X POST "https://api.apify.com/v2/acts/hyperbach~coles-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' -d '{"searchTerms": ["milk"], "maxItemsPerQuery": 100}'

AI agents and MCP

Apify's MCP server offers this Actor as a tool to Claude, Cursor, VS Code and any other MCP client. Connect https://mcp.apify.com?tools=hyperbach/coles-scraper and ask, for example: "Get the first 100 Coles products for milk with prices and specials". The agent fills the input from the table above and reads the rows from the run's dataset. The input names are the ones in the table above. An agent or a person can add feedback to any run and say what was needed and not delivered: a missing field, a wrong or empty result, the Actor switched from or to, and why. The run returns the same rows at the same price, and a person reads every note.

n8n, Make and Zapier

The Apify node in n8n, the Apify app in Make and the Apify integration in Zapier run this Actor on a schedule or from a trigger and read its dataset. A webhook on the run's end (Integrations on the Actor page) sends the rows on to your own endpoint. Nothing to install on our side.

Support

Disagree with a charge? Write to apify@hyperbach.com with the run ID. We will ask Apify to compensate you, and the charge comes back to your Apify account as platform credit.

Did it do the job? A short review on the Store, at any rating, helps the next buyer choose.

See also

  • Amazon Product Details Scraper — Amazon products by ASIN, URL or UPC / EAN / ISBN on 21 Amazon stores: the buy-box price, every best-seller rank, the rating and the review summary.
  • AliExpress Product Details Scraper — AliExpress products by URL or item id: every SKU with its own price and stock, in the country and currency you choose.
  • Shopify Store Scraper — every product of a Shopify store, with its variants, prices and images.
  • Alibaba Products Scraper — the products of an Alibaba.com search: price range, minimum order and the supplier with its country and verification.
  • Walmart Products Scraper — Walmart products by search, category or URL: the price with the was-price, the seller and the rating.
  • Woolworths Scraper — Woolworths Australia products and specials, with the barcode, the unit price and nutrition.

This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.

⌂ 换网址