Coles Australia Scraper - Prices, Specials, Nutrition & Stock avatar

Coles Australia Scraper - Prices, Specials, Nutrition & Stock

Pricing

from $1.50 / 1,000 results

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

Coles Australia Scraper - Prices, Specials, Nutrition & Stock

Coles supermarket product data: price, was price, unit price, half-price and multibuy specials, stock, category, barcode, ingredients, allergens and nutrition. Search, categories, specials or product URLs. HTTP-only, fast and cheap.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Giovanni Rich

Giovanni Rich

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Coles Scraper - Coles Australia Prices API & Specials Scraper

Coles scraper and unofficial Coles Australia prices API: scrape coles.com.au product prices, was prices, unit prices, half-price and multibuy specials, stock and categories, plus optional barcode (GTIN), ingredients, allergens and nutrition. Search by keyword, scrape whole categories or the weekly Coles specials catalogue, and export Australian grocery prices to JSON, CSV or Excel.

Coles is Australia's second-largest supermarket, and it sits behind Imperva bot protection, which is why scrapers for it often fail. This one reads the same JSON data the Coles website loads, over plain HTTP with no headless browser. It uses Australian residential proxies and rotates to a fresh session whenever Coles pushes back. In our test runs every request succeeded, and a full half-price catalogue (1,549 products) finished in under a minute.

How to use

  1. Enter what to scrape: keywords (milk, tim tam), categories (bakery, or all for the whole catalogue), a specials list (halfprice, multibuy...) or any coles.com.au URL. Optionally add a store ID and turn on product details.
  2. Click Start. The Coles specials scraper saves one row per product as it goes.
  3. Download the results as JSON, CSV or Excel, or call the actor through the Apify API and schedule it daily or weekly.

What you get

  • Prices: current price, was price, dollar and percent saving, unit price ($3.06/ 100g) with its number and unit split out, and a flag for products sold by weight.
  • Specials: special type (half_price, price_drop, multibuy, percent_off, special), offer text (save $2.50, Buy 2 for $9.40), multibuy quantity and total price, online-only flag, and the promo purchase limit.
  • Stock: in stock or not, availability type (in store and online), and the quantity Coles reports as available.
  • Category: department > category > aisle, with IDs, plus Coles' internal merchandise hierarchy.
  • Product details (with includeDetails): barcode/GTIN, long description, ingredients, allergens, dietary info, storage and usage instructions, dimensions, country of origin with the Australian content %, the full nutrition panel (per serving and per 100 g/ml), and all product images.
  • Store-specific data: give a store ID to get that store's prices, stock and shelf location.

Use cases

  • Grocery price monitoring and price-history databases (schedule it daily or weekly)
  • Weekly specials trackers, half-price alerts and deal sites
  • Competitor pricing for FMCG brands, retailers and category managers
  • Product and nutrition databases, keyed by barcode
  • Market research: range, pack sizes and price per unit by category
  • Australian grocery price comparison (pair it with a Woolworths scraper)
  • Feeding live Coles prices to AI agents and shopping assistants via the Apify MCP server

Input example

Use any mix of the four ways in. Each keyword, category, specials list or URL is scraped separately, up to maxItems products each.

FieldDefaultDescription
searchQueries-Keywords as typed into the Coles search box: "milk", "tim tam". A barcode works too.
categories-Category slugs or browse URLs: "dairy-eggs-fridge", "pantry/breakfast", "https://www.coles.com.au/browse/bakery". Use "all" for the whole catalogue (every department, deduplicated).
specialsnoneWeekly specials: all, halfprice, multibuy or onlineonly.
startUrls-Any coles.com.au search, category, specials or product URL. Filters in the URL are kept.
maxItems100Products per source. 0 = everything Coles lists.
includeDetailsfalseAdds barcode, ingredients, allergens, nutrition, origin and images. One extra request per product.
storeIdColes defaultA store number like 7799, or a store page URL such as https://www.coles.com.au/find-stores/coles/vic/ardeer-7799.
includeSponsoredfalseInclude the paid product ads Coles puts at the top of search and specials pages. They're flagged isSponsored.
proxyConfigurationResidential, AULeave as is unless you have a reason to change it.

Example: every half-price special, plus the bakery department and two keyword searches with full product details:

{
"specials": "halfprice",
"categories": ["bakery"],
"searchQueries": ["chocolate", "shampoo"],
"maxItems": 0,
"includeDetails": true
}

Output example

One dataset item per product. This one is from a real run on 24 Sep 2026, search "chocolate" with includeDetails: true (long description shortened):

{
"productId": "2351720",
"name": "Dairy Milk Hazelnut Chocolate Block",
"brand": "Cadbury",
"fullName": "CADBURY FAMILY BLOCK CHOCOLATE:HAZELNUT:.:180 GRAM",
"size": "180g",
"url": "https://www.coles.com.au/product/cadbury-dairy-milk-hazelnut-chocolate-block-180g-2351720",
"imageUrl": "https://cdn.productimages.coles.com.au/productimages/2/2351720.jpg",
"price": 5.5,
"wasPrice": 8,
"saveAmount": 2.5,
"discountPercent": 31,
"unitPrice": 3.06,
"unitPriceQuantity": 100,
"unitPriceUnit": "g",
"unitPriceText": "$3.06/ 100g",
"isWeighted": false,
"currency": "AUD",
"isOnSpecial": true,
"promotionTag": "special",
"specialType": "price_drop",
"offerDescription": "save $2.50",
"multiBuy": null,
"onlineOnlySpecial": false,
"available": true,
"availabilityType": "InStoreAndOnline",
"availableQuantity": 877,
"retailLimit": 20,
"promotionalLimit": 12,
"ageRestricted": false,
"department": "Chips, Chocolates & Snacks",
"category": "Chocolates",
"aisle": "Chocolate Blocks",
"categoryIds": { "department": "8916201", "category": "657635263", "aisle": "657635638" },
"merchandiseHierarchy": { "tradeProfitCentre": "GROCERY", "categoryGroup": "IMPULSE", "category": "CONFECTIONERY", "subCategory": "BLOCK CHOCOLATE", "className": "EVERYDAY" },
"storeAisle": null,
"variationsCount": 27,
"isSponsored": false,
"source": "search",
"sourceQuery": "chocolate",
"page": 1,
"positionOnPage": 10,
"storeId": null,
"scrapedAt": "2026-09-24T05:29:53.686Z",
"barcode": "9300617064923",
"longDescription": "There's a moment - right when your teeth break through smooth milk chocolate and hit that first whole hazelnut - ...",
"ingredients": "Full Cream Milk, Sugar, Hazelnuts, Cocoa Butter, Cocoa Mass, Milk Solids, Emulsifiers (Soy Lecithin, 476), Flavours.",
"allergens": "Contains Hazelnut, Milk, Soy\nMay Contain Peanut, Wheat",
"storage": "Please store in cool, dry conditions.",
"dimensions": "178.00 x 86.00 x 12.00 mm",
"countryOfOrigin": "Australia",
"countryOfOriginStatement": "Made in Australia from Imported and Local Ingredients",
"nutrition": {
"servingsPerPackage": 7.2,
"servingSize": "25g",
"perServing": { "Energy": "585 kJ", "Protein": "2.3 g", "Fat - Total": "9.1 g", "Fat - Saturated": "4.0 g", "Carbohydrate": "11.9 g", "Sugars - Total": "11.6 g", "Sodium": "17 mg" },
"per100": { "Energy": "2340 kJ", "Protein": "9.0 g", "Fat - Total": "36.2 g", "Fat - Saturated": "16.1 g", "Carbohydrate": "47.7 g", "Sugars - Total": "46.4 g", "Sodium": "67 mg" }
},
"images": [
"https://shop.coles.com.au/wcsstore/Coles-CAS/images/2/3/5/2351720.jpg",
"https://shop.coles.com.au/wcsstore/Coles-CAS/images/2/3/5/2351720_L.jpg"
]
}

A half-price row from the specials list, with no details:

{ "productId": "2993706", "fullName": "COCA-COLA ZERO SUGAR SOFT DRINK BOTTLE 1.25L", "price": 2.25, "wasPrice": 4.5, "saveAmount": 2.25, "discountPercent": 50, "unitPriceText": "$1.80/ 1L", "specialType": "half_price", "offerDescription": "save $2.25", "available": true, "availableQuantity": 4824, "promotionalLimit": 12, "department": "Drinks", "category": "Soft Drinks", "aisle": "Soft Drink Bottles", "source": "specials", "specialsFilter": "halfprice" }

The dataset comes with three ready-made views: Overview, Specials and Barcode & nutrition. A RUN_SUMMARY record in the key-value store lists, for each source, how many products were saved, how many Coles has in total, and why scraping stopped.

Field fill rates (real test runs)

FieldFill rate
productId, name, brand, size, url, image, price, category path, stock flag, limits100%
unitPrice / unitPriceText93-100% (a few items, such as gift cards, have no unit price)
wasPrice, saveAmount, specialType100% of products that are on special (78% of a specials run that included the full bakery range)
barcode92% with includeDetails (fresh produce and in-store bakery items have no barcode)
ingredients / long description / images / dimensions98-100% with includeDetails
nutrition95% of food products with includeDetails (non-food such as shampoo has none)
allergens99% of food products with includeDetails (non-food rarely declares any)
storeAisleonly with a storeId and only where Coles has shelf data

Test runs: 2,100 products (full half-price list + full bakery department) in 53 s with 45 requests, 0 failed. 200 products with full details in 103 s, 265 requests, 0 failed.

Pricing

Pay per result: $1.50 per 1,000 results. You pay per product saved to the dataset, with product details (barcode, ingredients, nutrition) included at no extra charge.

  • 1,000 results = $1.50
  • 10,000 results = $15.00

You're never charged for failed requests, blocked retries or duplicates. If you set a maximum cost per run, the scraper stops cleanly when it reaches it. Apify's free plan includes $5 of monthly platform credit, enough to try it out.

Integrations

  • Make, Zapier and n8n: trigger runs and pass Coles prices into any workflow.
  • Google Sheets: send each run's dataset straight into a spreadsheet.
  • Apify API: start runs and fetch results over REST, or with the JavaScript and Python API clients.
  • Webhooks: get notified when a run finishes, then pull the new data.
  • MCP for AI agents: the Apify MCP server (https://mcp.apify.com) lets Claude, ChatGPT, Cursor and other agents call this actor and read Coles prices directly.
  • Schedules: run it every Wednesday morning (AEST) to capture each week's specials.

Limits

  • Coles' own totals are approximate. A category that says 550 products can return 549 or 551, because Coles re-ranks items between pages. Duplicates are removed, so every product appears once per source.
  • Prices are the online store's prices unless you set storeId. In-store prices can differ by store. Set storeId to get a specific store's prices.
  • Sponsored products are skipped by default. They're paid ads that also show up in the normal results.
  • Product details double the request count, so leave includeDetails off when you only need prices.
  • Customer reviews are not included in this version.

FAQ

Does it need a Coles account or a browser? No. It reads public product data over HTTPS, the same data the Coles website loads for any visitor.

How do I find a store ID? Open the store on coles.com.au/find-stores. The number at the end of the page URL is the store ID (.../ardeer-7799 → 7799). You can also paste the whole URL into storeId.

How do I scrape the whole catalogue? Set categories to ["all"] and maxItems to 0. That's around 35,000 products across every department, and a product listed in two departments is saved only once.

How often do specials change? Coles' weekly specials start on Wednesday. Schedule the actor for Wednesday morning (AEST) to capture each week's catalogue.

Is it legal to scrape Coles? This actor collects only publicly available product and price information, not personal data. You're responsible for using the data in line with Coles' terms of service and privacy laws such as GDPR and the Australian Privacy Act. This isn't legal advice; if you're unsure, check with a lawyer.

How does it avoid blocks? It sends normal browser-like requests through Australian residential proxies (the default). Each proxy session is reused for at most 25 requests and keeps its own cookies. When Coles returns an Imperva interstitial, a 401/403/429 or an empty page, that session is retired and the request is retried on a new session with a new IP, up to 8 retries by default (maxRequestRetries). Other errors are retried with an increasing back-off.

What are the limits? maxItems caps each source (default 100, 0 = everything). Coles' own listing totals are approximate, the online store's prices are used unless you set storeId, and customer reviews aren't included. See the Limits section above. If you run it with no input at all, it does a demo search for "milk" (up to maxItems products) instead of failing.

How it works (for developers)

coles.com.au is a Next.js site. Every search, category and product page has a matching /_next/data/<buildId>/...json route that returns the page's data as JSON (about 100 KB for 48 products). The scraper calls these routes directly. It caches the site's build ID between runs, and when Coles deploys a new build it picks up the new ID from an HTML page. If a product link is slightly off, it follows Coles' redirect to the canonical product path. Imperva interstitials are detected and retried on a new residential session with a new IP.

npm install
npm test # parser tests on saved fixtures
APIFY_LOCAL_STORAGE_DIR=./storage node src/main.js # input in storage/key_value_stores/default/INPUT.json