Coles Australia Scraper - Prices, Half Price Specials & Stock
Pricing
from $0.80 / 1,000 products
Coles Australia Scraper - Prices, Half Price Specials & Stock
Scrape Coles (coles.com.au) prices, half-price and multibuy specials, unit price per kg/L, stock, barcode and aisle by keyword, category, specials page or product ID. Pull the whole specials catalogue in one run. Per-store pricing, store finder, price-drop alerts. No proxy needed.
Pricing
from $0.80 / 1,000 products
Rating
0.0
(0)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
16
Total users
16
Monthly active users
19 hours ago
Last modified
Categories
Share
Scrape Coles (coles.com.au) products, prices and weekly specials. Search by keyword, paste a category, specials or product URL, list product IDs, or pull the whole half-price or multibuy catalogue in one run. Each row has the price, was-price, the deal text (1/2 Price, Any 2 $10), unit price per kg / L / each, stock, category, and optional barcode, country of origin, nutrition and aisle. Per-store pricing, a nearby store finder, and change tracking that flags price drops and restocks.
| Input | Rows emitted |
|---|---|
Keyword (milk, tim tams) | Every matching product |
Category URL (/browse/pantry) | Every product in that category |
Specials page (/on-special, /specials/half-price) or the Specials catalogue setting | Every product on that kind of special, across the whole store |
Product URL or product ID (8150288) | That product |
| Latitude / longitude | Nearby Coles and Liquorland stores with their store ids |
Reads Coles' own product API directly. No browser, no proxy to configure.
Why use this scraper
- Runs finish. Each page of results is one API call to Coles, with no browser to load. In the 30 days to 2026-10-09, 33 of 33 public runs on the Apify Store succeeded.
- The whole specials catalogue, not a sample. Pick Half price, Multibuy, Online-only or All specials and get every product Coles lists under it (half price alone was 1,406 products on 2026-10-09), with paging handled for you.
- The deal itself, parsed.
promoLabel(1/2 Price,Any 3 $4.50),promoDescription(Pick any 3 for $4.50),savePercent, and amultiBuyobject withquantity,totalPriceandpriceEach, next tonow,wasandsaved. - Unit prices you can sort.
unitPricePerKg,unitPricePerLorunitPricePerEachas numbers, so different pack sizes compare directly. - Product IDs fetched directly. Each ID is one call to Coles' product API. An ID Coles does not know is named in the run log, and a run where fetches fail and nothing comes back ends FAILED with the reason, not as an empty "success".
- Per-store pricing. Pass a store id (
COL:<storeNo>) for that store's prices and stock. Don't know it? Run once with a latitude/longitude to list nearby stores. - Change tracking. Monitor mode: Changes tags each row
NEW,PRICE_DROP,PRICE_RISE,BACK_IN_STOCK,OUT_OF_STOCKorUNCHANGEDagainst the last run. Only changed rows delivers and bills only the changes.
How it works
- Keywords, category URLs, specials pages and product IDs are classified and sent to Coles' product API (the one coles.com.au itself uses), for the store you chose.
- Specials use Coles' own specials filter, so a half-price run returns what Coles lists as half price, across the store or inside your keyword or category.
- Results are paged until
maxItemsor the end of the list. If the API path fails, the actor falls back to reading the Coles web pages. - Each product becomes one flat row. In change-tracking mode each row is compared with the last run of the same watchlist.
Input
| Field | Type | Notes |
|---|---|---|
searchTerms | string[] | Keywords, each searched separately. Prefilled with milk. |
startUrls | string[] | Coles search, /browse/ category, specials (/on-special, /specials/half-price) or /product/ URLs. Auto-routed. |
skuList | string[] | Coles product IDs, e.g. 8150288. |
specials | none / all / halfPrice / multibuy / onlineOnly | Narrows every keyword and category to that kind of special, filtered by Coles. With no keywords, URLs or IDs, scrapes the whole specials catalogue of that kind. Default none. |
specialsOnly | boolean | Keep only products on any special (markdown, multibuy or online special). Default false. |
monitorMode | snapshot / changes | changes adds changeType and the previous price/availability. Default snapshot. |
stateName | string | Watchlist name, so several monitors run independently. Default default. |
onlyChanged | boolean | Drop UNCHANGED rows (the first run returns everything as NEW). Default false. |
includeDescription | boolean | Product description text. Default true. |
includeDetails | boolean | Adds gtin (barcode), countryOfOrigin, nutrition, aisle. Default false. |
store | string | Store id COL:<storeNo>. Empty = Coles' default online store. |
storeLookup | {latitude, longitude} | Lists nearby Coles/Liquorland stores instead of products. |
maxItems | integer | Cap on products collected and billed. Default 1000. |
maxRequestsPerCrawl | integer | Cap on page requests, 0 = no cap. |
maxConcurrency | integer | Parallel requests, 1-30. Default 10. |
Example inputs
Whole half-price catalogue (clear the prefilled keyword):
{ "searchTerms": [], "specials": "halfPrice", "maxItems": 2000 }
Multibuy deals on chocolate and in the pantry category:
{"searchTerms": ["chocolate"],"startUrls": ["https://www.coles.com.au/browse/pantry"],"specials": "multibuy"}
Daily price watch on a fixed basket, billing only changes:
{ "skuList": ["8150288", "2351709"], "monitorMode": "changes", "onlyChanged": true, "stateName": "my-basket" }
Find store ids near Sydney CBD:
{ "storeLookup": { "latitude": -33.86, "longitude": 151.21 } }
Output
Product row (multibuy)
{"type": "product","source": "coles.com.au","id": 2353056,"name": "Dairy Milk Chocolate Caramello Koala Sharepack 12 Pack","brand": "Cadbury","description": "CADBURY DAIRY MILK CHOCOLATE CARAMELLO KOALA SHAREPACK 12 PACK 180G","size": "180g","price": {"now": 7.5,"was": null,"saved": null,"currency": "AUD","onlineSpecial": false,"onSpecial": true,"specialType": "MULTI_SAVE","promoLabel": "Any 2 $10","promoDescription": "Pick any 2 for $10","savePercent": null,"multiBuy": { "quantity": 2, "totalPrice": 10, "priceEach": 5 },"comparable": "$4.17/ 100g","unitPrice": 4.17,"unitMeasure": "100g","unitPricePerKg": 41.7,"unitPricePerL": null,"unitPricePerEach": null,"unitPriceBasis": "kg"},"availability": true,"availabilityType": "InStoreAndOnline","availableQuantity": null,"category": "Chocolates","categoryGroup": "IMPULSE","subCategory": "Chips, Chocolates & Snacks","restrictions": { "retailLimit": 20, "promotionalLimit": 12, "liquorAge": false, "tobaccoAge": false, "delivery": [] },"featured": false,"imageUrl": "https://productimages.coles.com.au/productimages/2/2353056.jpg","productUrl": "https://www.coles.com.au/product/cadbury-dairy-milk-chocolate-caramello-koala-sharepack-12-pack-180g-2353056","scrapedAt": "2026-10-09T08:55:32.350Z","sourceUrl": "https://www.coles.com.au/search/products?q=chocolate"}
A half-price row's price looks like this:
{ "now": 2.02, "was": 4.05, "saved": 2.03, "currency": "AUD", "onlineSpecial": false, "onSpecial": true, "specialType": "PERCENT_OFF", "promoLabel": "1/2 Price", "promoDescription": null, "savePercent": 50, "multiBuy": null, "comparable": "$8.42/ 1L", "unitPrice": 8.42, "unitMeasure": "1L", "unitPricePerKg": null, "unitPricePerL": 8.42, "unitPricePerEach": null, "unitPriceBasis": "L" }
With Include extra details each row also has gtin, countryOfOrigin, nutrition (servingSize, servingsPerPackage) and aisle. Change-tracking runs add changeType, previousPrice and previousAvailability.
Store row (store discovery)
{ "type": "store", "source": "coles.com.au", "storeId": "COL:840", "name": "Coles Central Wynyard Express", "distanceKm": 0.717, "scrapedAt": "2026-10-09T08:55:32.350Z" }
Key fields
| Field | Meaning |
|---|---|
price.now, price.was, price.saved | Current price, pre-special price, difference (AUD) |
price.onSpecial | Any Coles promotion on the product |
price.specialType | PERCENT_OFF, MULTI_SAVE, or null |
price.promoLabel, price.promoDescription | Deal text as shown on Coles |
price.multiBuy | quantity, totalPrice, priceEach for multibuy deals |
price.unitPricePerKg / PerL / PerEach | Normalized unit price |
availability, availabilityType | In stock, and where it is sold |
category, subCategory, categoryGroup | Coles category path |
restrictions | Purchase limits and age flags |
The dataset has three views: Overview, Specials (price, was, deal text, % off) and All fields.
Pricing
Pay per event: $0.005 per run start plus $0.0008 per dataset row ($0.80 per 1,000 products). With Only changed rows, unchanged products are neither delivered nor billed. Free-plan runs are capped at 25 products, 3 runs per 24 hours, with 30 minutes between runs.
Coming from another Coles scraper?
| Common complaint | This actor |
|---|---|
| Runs time out | One API call per page of results, no browser |
| Only a handful of results, or a cap of about 100 | Pages through to maxItems, including the whole half-price catalogue |
| Product-ID lookups return nothing but say "succeeded" | IDs go straight to Coles' product API; fetch failures with no rows end FAILED with a reason |
Notes & limitations
- Postcode lookup is not supported. Use
storeLookupwith the postcode's coordinates. - Barcode search is not supported: Coles' search does not match barcodes. Turn on Include extra details to get each product's
gtinand match on your side. availableQuantityis null on most rows: Coles' product API does not expose stock counts.availability(in stock or not) is always filled.
FAQ
Do I need proxies? No.
How do I get every half-price product? Set Specials catalogue to Half price and clear the keyword field, or paste https://www.coles.com.au/specials/half-price into the URL field.
Can I get specials within one category? Yes. Paste the /browse/... URL and pick a specials kind; Coles filters the category.
Are prices store-specific? Yes. Pass store as COL:<storeNo>, and use storeLookup to find store ids.
How does change tracking work? Each run compares with the last run of the same stateName, tags rows with changeType and the previous price, and with onlyChanged drops unchanged rows. Schedule the actor daily for a price watch.
How fresh is the data? Read live from Coles when the run starts.
Support
Found a problem or need a field? Open an issue on the actor's Issues tab and include the run id.
🤖 For AI Agents & LLM Apps
- Purpose: live Coles Australia grocery prices, specials and stock.
- Minimal input:
{"searchTerms": ["milk"], "maxItems": 20} - Specials catalogue:
{"searchTerms": [], "specials": "halfPrice", "maxItems": 100}(values:all,halfPrice,multibuy,onlineOnly) - Per store: add
"store": "COL:<storeNo>"; get ids with{"storeLookup": {"latitude": -33.86, "longitude": 151.21}} - Output: one flat JSON row per product:
id, name, brand, size, price{now, was, saved, onSpecial, specialType, promoLabel, promoDescription, savePercent, multiBuy, unitPricePerKg, unitPricePerL, unitPricePerEach}, availability, category, subCategory, productUrl, imageUrl - Billing: per dataset row plus a small start fee;
maxItemscaps cost. - Behavior: no matches (with no fetch errors) ends SUCCEEDED with 0 rows; fetch failures with no rows end FAILED with the reason in the status message.
⚠️ Disclaimer
This actor collects only publicly available information from coles.com.au. It is not affiliated with or endorsed by Coles Group. Use the data in line with applicable laws and the site's terms. You are responsible for how you use the data.
SEO Keywords
Coles scraper, coles.com.au scraper, Coles API, Coles price scraper, Coles specials scraper, Coles half price specials, Coles multibuy, Coles catalogue scraper, Australian grocery prices API, supermarket price monitoring Australia, grocery price comparison Australia, Coles unit price, Coles stock availability, Coles price drop alerts, Coles barcode GTIN, Coles nutrition data, Coles per-store pricing, Coles store locator.