Coles Australia Scraper - Prices, Half Price Specials & Stock avatar

Coles Australia Scraper - Prices, Half Price Specials & Stock

Pricing

from $0.80 / 1,000 products

Go to Apify Store
Coles Australia Scraper - Prices, Half Price Specials & Stock

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

Muhamed Didovic

Maintained by Community

Actor 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.

InputRows 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 settingEvery product on that kind of special, across the whole store
Product URL or product ID (8150288)That product
Latitude / longitudeNearby 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 a multiBuy object with quantity, totalPrice and priceEach, next to now, was and saved.
  • Unit prices you can sort. unitPricePerKg, unitPricePerL or unitPricePerEach as 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_STOCK or UNCHANGED against the last run. Only changed rows delivers and bills only the changes.

How it works

  1. 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.
  2. 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.
  3. Results are paged until maxItems or the end of the list. If the API path fails, the actor falls back to reading the Coles web pages.
  4. Each product becomes one flat row. In change-tracking mode each row is compared with the last run of the same watchlist.

Input

FieldTypeNotes
searchTermsstring[]Keywords, each searched separately. Prefilled with milk.
startUrlsstring[]Coles search, /browse/ category, specials (/on-special, /specials/half-price) or /product/ URLs. Auto-routed.
skuListstring[]Coles product IDs, e.g. 8150288.
specialsnone / all / halfPrice / multibuy / onlineOnlyNarrows 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.
specialsOnlybooleanKeep only products on any special (markdown, multibuy or online special). Default false.
monitorModesnapshot / changeschanges adds changeType and the previous price/availability. Default snapshot.
stateNamestringWatchlist name, so several monitors run independently. Default default.
onlyChangedbooleanDrop UNCHANGED rows (the first run returns everything as NEW). Default false.
includeDescriptionbooleanProduct description text. Default true.
includeDetailsbooleanAdds gtin (barcode), countryOfOrigin, nutrition, aisle. Default false.
storestringStore id COL:<storeNo>. Empty = Coles' default online store.
storeLookup{latitude, longitude}Lists nearby Coles/Liquorland stores instead of products.
maxItemsintegerCap on products collected and billed. Default 1000.
maxRequestsPerCrawlintegerCap on page requests, 0 = no cap.
maxConcurrencyintegerParallel 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

FieldMeaning
price.now, price.was, price.savedCurrent price, pre-special price, difference (AUD)
price.onSpecialAny Coles promotion on the product
price.specialTypePERCENT_OFF, MULTI_SAVE, or null
price.promoLabel, price.promoDescriptionDeal text as shown on Coles
price.multiBuyquantity, totalPrice, priceEach for multibuy deals
price.unitPricePerKg / PerL / PerEachNormalized unit price
availability, availabilityTypeIn stock, and where it is sold
category, subCategory, categoryGroupColes category path
restrictionsPurchase 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 complaintThis actor
Runs time outOne API call per page of results, no browser
Only a handful of results, or a cap of about 100Pages 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 storeLookup with 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 gtin and match on your side.
  • availableQuantity is 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; maxItems caps 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.