Coles Scraper: Grocery & Unit Prices, Specials
Pricing
from $0.85 / 1,000 products
Coles Scraper: Grocery & Unit Prices, Specials
Coles scraper for Australian grocery prices on coles.com.au: shelf price, was price, unit price per kg or litre, half-price and multibuy specials, stock and aisle, for any keyword, aisle, product id and store. Track price changes between runs. One flat row per product, no personal data.
Pricing
from $0.85 / 1,000 products
Rating
0.0
(0)
Developer
Flatrow Data Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Security
Limited permissionsShare
Coles Scraper: Grocery Prices, Unit Prices & Specials – price per kg or litre, half price and multibuy, no personal data
- Verified daily by an automated run on Apify with the default input.
- Price: a fixed price per product saved, nothing else (see the Pricing tab).
Coles scraper and Coles price tracker: get Coles prices from coles.com.au — shelf price, was price and discount, unit price and price per kg or litre, half-price and multibuy specials, stock and aisle — for any keywords, aisles, specials or product ids, at the Coles store you choose, as a clean table or through an API, no login. Use it to follow Australian grocery prices and supermarket prices, compare products per kilo or per litre, and watch your weekly basket with price drop alerts.
No login, no cookies, no personal data: nothing to sign in to, no cookies to paste, nothing about shoppers or staff in the output.
- What you get: one flat row per Coles product and store for any keywords, aisles, specials (all, half price, multibuy) or product ids: shelf price, was price and discount, unit price and the price per kg, litre or item, the special or multibuy offer, units in stock at the store, purchase limits, aisle path, image and link; a price-tracking mode that returns only the price drops, price rises and new products since your previous run. No personal data.
- For whom: grocery price trackers and comparison sites, FMCG brands and category managers, retail and inflation analysts, deal hunters and budgeting apps, AI agents through MCP.
- How much: a fixed price per product saved and nothing else (compute and proxy traffic included, see the Pricing tab);
maxResultscaps every search.
Sample output: one real row from a "milk" search at Coles store 7674, key columns only (the full row is under Output example):
{"platformProductId": "8150288","title": "Coles Full Cream Milk","category": "Full Cream Milk","price": 4.95,"inStock": true,"stockQuantity": 2985,"packSize": "3L","unitPrice": 1.65,"unitPriceDisplay": "$1.65/ 1L","pricePerBaseUnit": 1.65,"priceBasis": "l","storeLocationId": "7674"}
Scrape Coles search results for any keywords, any Coles aisle (Dairy, Eggs & Fridge, Pantry, Bakery… or a sub-aisle such as Cheese), the specials of the week (all specials, half price, multibuy) or a basket of product ids, at one or several Coles stores, and get one flat row per product and store: shelf price, strike-through "was" price, discount and amount saved, unit price as displayed ("$1.65/ 1L") and brought to one kilogram, litre or item, products sold by weight, special and multibuy offers ("Buy 2 for $6" with the price per item), units in stock, purchase limits, 18+ flag, brand, aisle path, image and link. Sort by best sellers, price or unit price; turn on price monitoring to get only what changed since your previous run. This Coles scraper reads the public product lists of coles.com.au without logging in, removes duplicates and stops exactly at the number of products you ask for.
No personal data, by design. Coles sells its own products: there is no private seller, and product lists carry no customer information; customer reviews are never collected. Every row goes through a privacy filter before it is saved. The dataset is safe to store, share and feed to AI agents.
What can you do with Coles data?
- Track grocery prices and specials week after week: half-price and multibuy specials, was prices and the amount saved, with a scheduled price-monitoring run that returns only the price drops, price rises and new products.
- Compare products per kilo, per litre or per item:
pricePerBaseUnitbrings "$2.19/ 100g" and "$1.65/ 1L" to one unit, so pack sizes and brands can be ranked by real value. - Watch your own basket of product ids every day, at the stores that matter to you.
- Compare stores and regions: prices and stock differ between Coles stores (see Choose your store), one row per product and store.
- Study an aisle or a brand: price distribution, share of products on special, sponsored placements, best sellers first.
- Compare supermarkets with a stable, documented schema built for groceries (
ecommerce-grocery/1.0), with amatchKeycolumn to find the same product at another retailer.
What data does Coles Scraper extract?
Every row has every column: a value Coles does not publish is null (or [] / {} for lists and objects), so CSV and Excel exports keep the same columns from run to run.
| Group | Columns |
|---|---|
| Identity | schemaVersion, platform, platformProductId, variantId, url, title, brand, category, categoryPath |
| Prices and stock | currency, price, originalPrice, discountPercent, inStock, stockQuantity |
| Popularity | rating, ratingMax, reviewCount, soldCount, isBestSeller, isChoice, listedAt |
| Seller | storeType, storeName, storeId, storeUrl, storeRating |
| Shipping | shippingFree, shippingCost, deliveryEstimate, shipsFrom |
| Media and attributes | imageUrl, imageCount, attributes |
| Search context | isSponsored, searchQuery, searchRank, searchPage, viewCountryCode, scrapedAt |
| Price monitoring | changeType, previousPrice, priceDelta, priceDeltaPercent (filled in price-monitoring runs only, see Price monitoring; null otherwise) |
| Pack and unit price | packSize, unitPrice, unitPriceQuantity, unitPriceUnit, unitPriceDisplay, pricePerBaseUnit, priceBasis, soldByWeight, priceIsEstimate, rawPrice |
| Specials | promotionLabels, promotionType, specialType, saveAmount, onlineOnlySpecial, multiBuyQuantity, multiBuyUnitPrice, multiBuyTotalPrice, isSpecialBuy, availableFrom, availabilityLabel |
| Limits and matching | retailLimit, promotionalLimit, ageRestricted, ean, matchKey |
| Store of the prices | storeLocationId, storeLocationName, storeRegion, storePostcode |
Coles shows no rating, review count or sales figure in its product lists, so rating, reviewCount and soldCount are always empty; so are variantId (each size is its own product), the seller columns storeId, storeUrl and storeRating (storeType is always platform and storeName "Coles"), the shipping columns (delivery fees are set at checkout), isBestSeller, isChoice, listedAt, and the columns other supermarkets of the schema fill: isSpecialBuy, availableFrom, availabilityLabel and ean (Coles publishes no barcode). storeLocationName, storeRegion and storePostcode are filled for the stores whose location was established at build time (7674 Truganina VIC 3029, 313 Karratha WA) and null for the others.
attributes holds the other facts of the product as flat strings, only the keys the product shows: availabilityType ("InStoreAndOnline"), minGuarantee ("Life 7 days min"), tradeProfitCentre, categoryGroup, merchCategory, merchSubCategory and className (Coles' internal merchandise hierarchy), categoryIds (aisle ids from top to bottom, joined by /), variationsTotal (sizes and flavours of the product), delivery (delivery services, joined by |), multiBuyType and multiBuyUnitPriceDisplay (multibuy offers, e.g. "$12.00/ 1kg" within the offer) and, for products read by id, countryOfOrigin ("Made in Australia").
How to scrape Coles products
- Enter search keywords, one per line ("milk", "coffee beans"), and/or Coles aisles (
dairy-eggs-fridge,dairy-eggs-fridge/cheeseor a browse URL copied from coles.com.au), and/or product ids for a fixed basket. - Pick the specials if you only want products on special: all specials, half price or multibuy. Alone, it lists every product of that type.
- Choose the Coles stores (
storeIds, 7674 by default), the maximum number of products per search and the sort order (best sellers, price or unit price). - Run and open the Output tab: the Overview, Prices and Stock views show the main columns; export everything as JSON, CSV, Excel or through the API.
- To track prices, turn on
monitorPricesandonlyChangesand schedule the run: from the second run on you get only the price drops, price rises and new products, in the Changes view.
Input
Give at least one keyword in searchQueries, one aisle in categories, a type of specials or one product id in productIds (with nothing at all, "milk" is searched). The form is prefilled with the keyword "milk": clear it when you list only aisles, specials or product ids. Field names and defaults are those of the input form.
The input of our validation run: the first 60 products for "milk" at store 7674, best sellers first (every other field keeps its default):
{"searchQueries": ["milk"],"storeIds": ["7674"],"sortBy": "salesDescending","maxResults": 60}
Every field, with its type and default:
| Field | Type | Default | Description |
|---|---|---|---|
searchQueries | string[] | — | Search keywords, one search per entry, as typed in the Coles search box. Prefilled with ["milk"] in the form (clear it to list only aisles, specials or product ids); with no keyword, aisle, specials or product id at all, the Actor searches "milk". |
categories | string[] | [] | Coles aisles to list in full: a slug (pantry), a slug path (dairy-eggs-fridge/cheese) or a browse URL (https://www.coles.com.au/browse/bakery), read by the Actor and never opened. An unknown aisle is left out with a message. |
specials | string | "none" | all, halfprice or multibuy: alone, every product of that type; with keywords or aisles, only their products on special (combination not verified yet). |
productIds | string[] | [] | Coles product ids (8150288) or product URLs (only the id is read): one request per product, at every store; maxResults does not apply. |
storeIds | string[] | ["7674"] | Coles store numbers; every keyword, aisle and product id is read at every store, one row per product and store. |
maxResults | integer | 50 | Stop each search (keyword, aisle or specials, per store) after this many unique products (1 to 10,000). You are never charged for more. The form is prefilled with 20 for a quick first run. |
sortBy | string | "salesDescending" | salesDescending (best sellers, Coles default), priceAscending and unitPriceAscending, validated; priceDescending and relevance come from the Coles website and are not verified yet. |
monitorPrices | boolean | false | Price monitoring: compare every product with the previous run of the same search or basket (by Coles product id and store) and fill changeType, previousPrice, priceDelta, priceDeltaPercent. maxResults then counts the products compared per search. See Price monitoring. |
onlyChanges | boolean | false | With monitorPrices: return and charge only the new products and the price changes; a run without any change succeeds with an empty dataset. |
monitorStoreName | string | "coles-price-monitor" | Key-value store of your account that keeps the previous prices, one record per search and store, one per basket (letters, digits and dashes, lower-cased). One name per schedule. |
proxyConfiguration | object | {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"AU"} | Apify residential proxies with an Australian exit (RESIDENTIAL group, country AU): the configuration validated for Coles, its traffic included in the price. Keep it. |
maxConcurrency | integer | 3 | Searches and product ids read at the same time (1 to 5). |
maxRequests | integer | 1000 | Safety cap on the requests of one run, all searches, product ids and retries included. |
debugStoreHtml | boolean | false | Debugging only: store every answer of Coles in the key-value store. |
Output example
One real row, produced by the Actor from a "milk" search at Coles store 7674 (the first product of the results page). All columns are present, in this order, for every product:
{"schemaVersion": "ecommerce-grocery/1.0","platform": "coles","platformProductId": "8150288","variantId": null,"url": "https://www.coles.com.au/product/coles-full-cream-milk-3l-8150288","title": "Coles Full Cream Milk","brand": "Coles","category": "Full Cream Milk","categoryPath": ["Dairy, Eggs & Fridge","Milk","Full Cream Milk"],"currency": "AUD","price": 4.95,"originalPrice": null,"discountPercent": null,"inStock": true,"stockQuantity": 2985,"rating": null,"ratingMax": 5,"reviewCount": null,"soldCount": null,"storeType": "platform","storeName": "Coles","storeId": null,"storeUrl": null,"storeRating": null,"shippingFree": null,"shippingCost": null,"deliveryEstimate": null,"shipsFrom": null,"imageUrl": "https://cdn.productimages.coles.com.au/productimages/8/8150288.jpg","imageCount": 1,"attributes": {"availabilityType": "InStoreAndOnline","minGuarantee": "Life 7 days min","tradeProfitCentre": "DAIRY","categoryGroup": "DAIRY","merchCategory": "DY MILK","merchSubCategory": "WHOLE WHITE","className": "WHOLE 3-3.9L","categoryIds": "1300/8881800/8881801","variationsTotal": "18","delivery": "REMOTE SERVICE|OVN"},"isSponsored": false,"isBestSeller": null,"isChoice": null,"listedAt": null,"searchQuery": "milk","searchRank": 1,"searchPage": 1,"viewCountryCode": "AU","scrapedAt": "2026-10-24T00:00:00.000Z","changeType": null,"previousPrice": null,"priceDelta": null,"priceDeltaPercent": null,"packSize": "3L","unitPrice": 1.65,"unitPriceQuantity": 1,"unitPriceUnit": "l","unitPriceDisplay": "$1.65/ 1L","pricePerBaseUnit": 1.65,"priceBasis": "l","soldByWeight": false,"priceIsEstimate": false,"rawPrice": 4.95,"promotionLabels": [],"promotionType": null,"specialType": null,"saveAmount": null,"onlineOnlySpecial": false,"multiBuyQuantity": null,"multiBuyUnitPrice": null,"multiBuyTotalPrice": null,"isSpecialBuy": null,"availableFrom": null,"availabilityLabel": null,"retailLimit": 20,"promotionalLimit": 12,"ageRestricted": false,"ean": null,"matchKey": "coles full cream milk|3000ml","storeLocationId": "7674","storeLocationName": "Truganina","storeRegion": "VIC","storePostcode": "3029"}
price is the shelf price at the store requested, specials included; originalPrice is the "was" price of a special, discountPercent the percentage off and saveAmount the amount saved. unitPrice is the unit price as Coles displays it (unitPriceDisplay), for unitPriceQuantity × unitPriceUnit, and pricePerBaseUnit the same price brought to one kilogram, litre or item (priceBasis). For a product sold by weight (soldByWeight), price is the estimated price of an average item (priceIsEstimate) and unitPrice the price per kilo. The four monitoring columns are filled in price-monitoring runs only (see Price monitoring).
The Output tab offers four views of the same rows: Overview (title, size, price, currency, unit price, price per kg / L / item, specials, available, aisle, sponsored, link, image), Prices (product id, title, price, was price, discount, amount saved, unit price and its quantity and unit, price per base unit, sold by weight, specials, special type, multibuy items, price per item and offer price, store), Stock (product id, title, available, stock, purchase limits, 18+ flag, store number, location and state, link) and, for price-monitoring runs, Changes (change, title, price, previous price, change and change %, currency, was price, specials, unit price, store, query, product id, link).
Choose your store
Coles prices and stock depend on the store. storeIds takes one or several Coles store numbers; every keyword, aisle and product id is read at every store and each store gets its own rows (storeLocationId). The default, 7674, is the online store Coles uses when no store is chosen (Truganina, VIC 3029).
Measured at build time for the "milk" search: store 313 (Karratha, WA) listed 262 products instead of 323 at store 7674; the 3-litre Coles Full Cream Milk cost $4.95 at both stores, with 2,985 units in stock at 7674 and 421 at 313; and 8 of the 16 products found at both stores had another price, for example Devondale Full Cream Long Life Milk 1L at $2.20 at store 7674 and $2.35 at store 313. Searching for a store by postcode is not part of this version: use 7674 for the online prices, or a store number you know.
Price monitoring
Turn on monitorPrices and onlyChanges, then schedule the run (daily or weekly): the Actor becomes a Coles price tracker that sends you the price drops. It keeps the last shelf price of every product it compared in a key-value store of your account (monitorStoreName, coles-price-monitor by default), with one record per search (same keyword, aisle or specials, sort order and store) and one record per store for the basket of productIds; a product is identified by its Coles product id and its store. The first run is the reference: every product comes back with changeType = "new" (and RUN_STATS.monitorBaseline is true). From the second run on, with onlyChanges the dataset holds only the new products and the products whose price changed, with the previous price and the difference, and only those rows are charged; a run where nothing changed succeeds with an empty dataset. Without onlyChanges, every compared product is returned with its changeType (new, price_changed or unchanged).
A scheduled input that watches a basket of three products at store 7674:
{"productIds": ["8150288", "2353056", "301721"],"storeIds": ["7674"],"monitorPrices": true,"onlyChanges": true,"monitorStoreName": "coles-weekly-basket"}
A price_changed row, as the Actor produces it from the row of the output example when the previous run had recorded $5.50 (the other columns are the same as above):
{"platformProductId": "8150288","title": "Coles Full Cream Milk","currency": "AUD","price": 4.95,"changeType": "price_changed","previousPrice": 5.5,"priceDelta": -0.55,"priceDeltaPercent": -10,"storeLocationId": "7674"}
What to know before relying on it:
- The record is written only after a search that ended cleanly. A failed or empty search, a page Coles refused on every attempt, a run stopped by its budget (
maxRequestsor your charge limit) or an interrupted run never overwrites the reference, so a bad day cannot erase your prices; the log says when a record was kept unchanged (RUN_STATS.monitorcounts the records written and skipped). In a basket, a product that could not be read keeps its last recorded price. - Shelf prices are compared, in AUD. A new special shows as a price drop, its end as a price rise; a product shown without a price (unavailable) is reported
unchangedand keeps its last known price. The price of a product sold by weight is the estimate for an average item. - Several searches in one run. Each search compares its own products, so a product found by two searches of the run is recorded in both; it is written to the dataset (and charged) only once per store (
RUN_STATS.extra.monitorDuplicatesNotWritten). - One store per schedule when searches collide. Runs sharing a
monitorStoreNameshare the records: two schedules with the same search and store would overwrite each other's reference, so give them different store names. Delete the key-value store in Apify Console to start over.
How much does it cost to scrape Coles?
This Actor uses pay-per-event pricing: you pay a fixed price per product saved to your dataset, and nothing else. The price of every plan tier is on the Pricing tab of this page; paid plans pay less per product.
| What you pay for | How it is counted | Price |
|---|---|---|
result event: one product saved to your dataset | once per unique product and store of the run, capped by maxResults for each search; with onlyChanges, only the new products and the price changes | Pricing tab, per plan tier |
| Run start | a symbolic amount, once per run | Pricing tab |
| Compute, proxies, storage and data transfer | included: no platform usage is passed on to you | — |
The cost of a run is known before you start: 1,000 products cost 1,000 times the result price of your tier, whatever the number of pages fetched. A product read by its id costs the same result event as a search result, but takes one request per product instead of one per 48 products (about 10 US cents of proxy traffic for 1,000 products, included in the price). A page of 48 products takes about 2 seconds: 100 products in about 5 seconds, a whole search of 1,000 products in about a minute; 1,000 product ids take about 10 minutes at 3 in parallel.
Limits and behaviour worth knowing
- No rating, reviews or sales figures. Coles shows no rating in its product lists; customer reviews are never collected. Sort by best sellers (
salesDescending, the default) to see what sells. - No barcode, no nutrition table yet. Coles publishes no barcode (
eanstays empty). The nutrition table and ingredients exist on the product page but are not exported in this version; the country of origin is (attributes.countryOfOrigin, product ids only). - 48 products per page, sponsored products once. The first page of an aisle or of the specials carries 9 to 10 sponsored products on top of the 48 regular ones; they are real products of the aisle, flagged in
isSponsoredand written once (RUN_STATS.extra.sponsoredSeen,RUN_STATS.extra.duplicatesSkipped). Products are deduplicated by product id and store across the run. - Aisles. The 21 top aisles of coles.com.au are known; a sub-aisle (
dairy-eggs-fridge/cheese) is resolved from the first page of its aisle.lunchboxwas not seen at build time; an unknown aisle or sub-aisle is left out with a message listing the real ones, and the other entries run. - Not verified yet. The
priceDescendingandrelevancesort orders, specials combined with keywords or aisles, sub-aisle results, store numbers other than 7674 and 313 and the product links of names with special characters (&, apostrophes) were not exercised at build time; they are marked as such in the input form and confirmed at the first runs. The product id at the end of each link is what Coles reads. - Unavailable products come without a price (
inStockfalse,priceand the unit pricenull), as Coles shows them. - Refused pages. Every request goes out on its own proxy session; a page Coles refuses is tried again on a new session, up to 4 times (
RUN_STATS.extra.sessionRotations), then given up and reported in the log (RUN_STATS.extra.pagesAbandoned). After 3 refusals in a row, free Apify datacenter proxies take over until they are refused in turn (RUN_STATS.extra.datacenterRequests,RUN_STATS.extra.tierSwitches). If Coles changes the public key its website uses, the Actor reads the new one from the site once (RUN_STATS.extra.keyRefreshes). Unknown product ids are skipped (RUN_STATS.extra.productsNotFound). - No empty successes. A run that finds no product ends as failed with an explicit message (refused requests, unknown aisles or product ids, misspelt keywords), so that your schedules and integrations notice. The one exception is a price-monitoring run that compared products and found no change: it succeeds with an empty dataset.
Integrations and API
Start the Actor from Apify Console, schedule it, or call it from the Apify API with any language (the API tab shows ready-made code for Node.js, Python and curl). Webhooks notify your systems when a run finishes; the dataset can be pulled as JSON, CSV, Excel, XML or RSS, or pushed to Google Sheets, Make, Zapier, n8n, Slack, Airtable, Google Drive and more through the Apify integrations.
Use it from your AI assistant
Add this Actor as a tool to Claude, ChatGPT, Cursor, VS Code or any MCP client with the Apify MCP server URL below (sign in with your Apify account when asked):
https://mcp.apify.com?tools=myth84/coles-product-scraper
Then ask in plain words. Copy this prompt and change the details:
Use myth84/coles-product-scraper to find the cheapest coffee per kilo at Coles this week and tell me which ones are on special. Input: {"searchQueries": ["coffee beans"], "storeIds": ["7674"], "sortBy": "unitPriceAscending", "maxResults": 30}. Show the title, pack size, price, price per kg, specials and link of each product.
For AI agents (MCP)
Through the Apify MCP server this Actor is a tool that answers questions such as "how much is a litre of milk at Coles right now?", "which coffee is half price at Coles this week?" or "which products of my basket got cheaper at Coles since last week?".
Minimal input (every other field keeps its default; raise maxResults only when the question needs more rows):
{"searchQueries": ["olive oil"],"storeIds": ["7674"],"sortBy": "unitPriceAscending","maxResults": 20}
- Key output fields:
platformProductId,title,url,price,originalPrice,discountPercent,currency,inStock,stockQuantity,packSize,unitPrice,unitPriceDisplay,pricePerBaseUnit,priceBasis,promotionLabels,multiBuyQuantity,multiBuyTotalPrice,category,storeLocationId; in price-monitoring runschangeType,previousPrice,priceDelta,priceDeltaPercent. Every column is always present, in a fixed order;nullmeans Coles did not show the value. The full list is in What data does Coles Scraper extract? above. - Use it when you need current Coles prices in Australia: shelf prices, specials, unit prices, stock at a store. Pass
searchQueries(orcategories,specials,productIds),storeIdsand a smallmaxResults(20–50 is enough for an answer and fits in one page). To report price changes between two calls, passmonitorPrices: true,onlyChanges: trueand a stablemonitorStoreName. - Do not use it for other supermarkets, nutrition or ingredients, customer reviews, delivery fees or anything behind a login: it only reads public product lists and collects no personal data.
- Cost per 1,000 results: 1,000
resultevents at the price of your plan tier (Pricing tab); nothing else is charged (in price-monitoring runs withonlyChanges, unchanged prices are free). - Typical time: about 2 seconds per page of 48 products: 20 products in a few seconds, a few hundred in under a minute.
Alternatives and switching
- Official API. Coles does not document a public API for its product catalogue. This Actor reads the same public product lists any visitor of coles.com.au sees (shelf prices, specials, unit prices, stock), with no account, no keys and no approval.
- Your own scraper. Nothing to build or maintain: proxies, retries, pagination, deduplication and Coles website changes are handled for you. The columns stay the same from run to run, a run that finds nothing fails with an explicit message instead of succeeding empty, and a scheduled test run catches Coles changes early.
- Another scraper from the Store. The input names differ from one Actor to the next; the usual ones map to this Actor as follows:
| Usual input | Here | Note |
|---|---|---|
search, query, keyword | searchQueries | Several keywords per run |
category, startUrls | categories | Aisle slugs or browse URLs |
specials, onSpecial, halfPrice | specials | all, halfprice or multibuy |
productIds, productUrls | productIds | Ids or product URLs, one request each |
storeId, store, postcode | storeIds | Coles store numbers (no postcode search yet) |
maxItems, limit | maxResults | Unique products per search and store, never charged beyond |
sort | sortBy | Best sellers, price or unit price |
proxy | proxyConfiguration | Keep the default: proxies are included in the price |
FAQ
Does Coles Scraper collect personal data?
No. Coles sells its own products, product lists carry no customer information, and the scraper never collects customer reviews. The store columns describe a shop, not a person. Every row goes through a privacy filter before it is saved.
Is it legal to scrape Coles?
The Actor only reads product lists that Coles serves to any visitor without an account, and it stores no personal data. Scraping public data is generally lawful, but Coles' terms of use restrict automated access, and you are responsible for how you use the results and for complying with the laws that apply to you (including copyright on product texts and images). Use the data for analysis, not to republish the Coles catalogue.
Do I need proxies, and do I pay for them?
No extra setup: the default proxy configuration (Apify residential proxies with an Australian exit, a new IP for every request) is the one validated for Coles, and its traffic is included in the price per product. Coles refuses visitors from outside Australia: keep the RESIDENTIAL group and the AU country; the run logs a warning otherwise. Your own Australian proxy URLs are accepted too.
Which stores can I choose, and why do prices differ?
Any Coles store number in storeIds (7674, the default online store, and 313 in Karratha WA were validated at build time). Coles sets prices and stock per store: at build time the Karratha store charged more than store 7674 for 8 of the 16 milk products both listed, and stock differs everywhere (see Choose your store). Each store gets its own rows.
How do I compare prices per kilo or per litre?
Use pricePerBaseUnit with priceBasis: "$2.19/ 100g" becomes 21.9 per kg and "$0.80/ 100mL" 8 per litre, so every pack size and brand is comparable. Sort the results with sortBy: "unitPriceAscending" to get the best value first. For products sold by weight, unitPrice is already the price per kilo.
Can I get only the half-price or multibuy specials?
Yes. Set specials to halfprice, multibuy or all: alone (in the form, clear the prefilled "milk" keyword) it lists every product of that type at the store (1,310 half-price products at store 7674 at build time), and with keywords or aisles it keeps only their products on special. Multibuy rows carry multiBuyQuantity, multiBuyUnitPrice and multiBuyTotalPrice ("Buy 2 for $6": 2, 3 and 6).
Can I scrape a whole Coles aisle?
Yes. Put the aisle slug or browse URL in categories (pantry, dairy-eggs-fridge, https://www.coles.com.au/browse/dairy-eggs-fridge/cheese) and raise maxResults: Pantry holds about 6,000 products, Dairy, Eggs & Fridge about 2,300, at 48 per page. searchQuery holds the aisle name.
Why is a price estimated, or missing?
Products sold by weight (loose fruit and vegetables, meat) are priced at the till by weight: price is the estimate for an average item (priceIsEstimate true, packSize such as "approx. 160g") and unitPrice the price per kilo. Unavailable products come without a price (inStock false), as Coles shows them.
How often should I run it, and how do I get only price changes?
Every run reads live prices. Coles specials change every week and prices can change any day, so schedule the Actor as often as your use case needs (daily or weekly is typical) and compare runs by platformProductId and storeLocationId, or let the Actor compare them for you: turn on monitorPrices and onlyChanges, keep the default monitorStoreName (or one per schedule) and schedule the run. The first run records every product of the search or basket and returns it as new; each later run returns only the products that appeared since and the products whose shelf price changed, with previousPrice, priceDelta and priceDeltaPercent, and charges only those rows. A run without any change succeeds with an empty dataset. Keep the same keywords, aisles, specials, sort and stores from run to run.
How do I export or integrate the results, and where do I get support?
From the run's Output tab (JSON, CSV, Excel, XML, RSS) or automatically: Apify API, webhooks, scheduled runs and integrations with Google Sheets, Make, Zapier, n8n, Slack and others; AI agents can call the Actor through the Apify MCP server. For bugs or questions, open an issue in the Issues tab of this Actor with your run id and input: website changes are fixed as a priority, feature requests (nutrition, postcode search, other Australian supermarkets) are welcome.
More scrapers by Flatrow Data Studio
The e-commerce scrapers of the studio share their first columns, so products from several stores land in comparable tables:
- Walmart Products Scraper & Price Tracker: Walmart prices, was-prices, stock, ratings and badges on walmart.com and walmart.ca, with price-drop alerts.
- Amazon Products Scraper & Price Tracker: Amazon prices, list prices, coupons, ratings and "bought in past month" on nine Amazon marketplaces, with sort orders, departments and search URLs.
- AliExpress Products Scraper & Price Tracker: AliExpress prices, discounts, units sold and shipping for any keywords and delivery country, with price-drop alerts.
Did this scraper give you the data you needed? A rating on its Store page helps other people find it. For a bug or a missing field, open an issue in the Issues tab.
If this Actor saved you time, a short review helps others find it.
Legal note
This Actor reads publicly available Coles product lists without logging in and collects no personal data. You are responsible for your use of the data and for complying with Coles' terms and the laws that apply to you.
Not affiliated with, endorsed or sponsored by Coles. Coles is a trademark of its owner.