Coles Australia Scraper - Product, Price & Stock
Pricing
from $0.89 / 1,000 products
Coles Australia Scraper - Product, Price & Stock
Scrape Coles Australia (coles.com.au) by keyword, category or specials URL, or SKU list. Extract price, unit price, discount, stock, and category data with optional price/stock change tracking.
Pricing
from $0.89 / 1,000 products
Rating
0.0
(0)
Developer
ParseBird
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Coles Australia Scraper
Scrape product, price, and stock data from Coles, one of Australia's largest supermarket chains, by keyword, category/search/specials URL, or an exact SKU list. Get price, was-price, discount, a normalized unit price, stock availability, and category data as clean JSON, CSV, or Excel — with optional price and stock change tracking across runs.
| Search by keyword, browse or specials URL, or scrape an exact SKU list, and get price, was-price, discount amount/percent, a normalized price-per-kg/L/each for real cross-product comparison, stock availability and quantity, and full category data — plus optional Watchlists that flag new listings, price moves, and stock changes run over run. |
Copy to your AI assistant
Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this Actor.
Actor: parsebird/coles-australia-scraper (Apify). Scrapes Coles Australia (coles.com.au) product, price, and stock data. Call it with ApifyClient.Input: scrapeMode (enum, required: "searchKeyword" | "providedUrls" | "skuList"), searchQuery (string, used in searchKeyword mode, default "milk"), startUrls (array of {url}, Coles search/category/specials URLs, used in providedUrls mode), skuList (array of strings, exact Coles SKU IDs, used in skuList mode), includeDescription (boolean, default true), maxItems (integer, default 25), maxRequestsPerCrawl (integer, default 25, 0 = no limit), monitorMode (enum: "snapshot" default | "changes"), stateName (string, Watchlist name, default "default"), onlyChanged (boolean, default false), proxyConfiguration (object, default {"useApifyProxy": true} using Apify's datacenter proxy).Output: one row per product — product_id, name, brand, description, size, availability, availability_type, available_quantity, price, original_price, on_special, discount_amount, discount_percent, currency, comparable, unit_price, unit_price_quantity, unit_price_unit, unit_price_basis, price_per_base_unit, image_url, category, sub_category, class_name, trade_profit_centre, category_group, url, scraped_at, retail_limit, promotional_limit, online_special, and in "changes" mode also change_type, old_price, price_delta, price_delta_pct.Pricing: pay-per-event, $1.19 per 1,000 products on the Free plan (cheaper on paid plans). API docs: https://apify.com/parsebird/coles-australia-scraper/api
What does Coles Australia Scraper do?
This Actor reads the same server-rendered JSON that Coles's own website hydrates its React app from, so every product comes back with its real price, unit price, stock, and category data — no guessing from what's visible on the page.
- 🔍 Three ways to find products — a plain keyword search, a list of Coles search/category/specials URLs (including
/on-special), or an exact list of SKU IDs. - 💲 Real pricing detail — current price, was-price, discount amount and percent (computed from the genuine list vs. sale price, since Coles' own discount field is unreliable), and Coles' own unit-price text.
- ⚖️ Cross-product unit price — Coles displays some products per-100g and others per-1kg, which makes prices impossible to compare directly.
price_per_base_unitnormalizes every product to a price per full kg, L, or each. - 📦 Stock data — availability, availability type (e.g. in-store and online), and available quantity, for keyword and URL searches.
- 🏷️ Full category hierarchy — category, sub-category, class name, trade profit centre, and category group, straight from Coles' own merchandising taxonomy.
- 👀 Watchlists (price & stock change tracking) — set
monitorModetochangesand astateName, and every row gets achange_typeofNEW,PRICE_DROP,PRICE_RISE,BACK_IN_STOCK,OUT_OF_STOCK, orUNCHANGEDcompared to that Watchlist's last run. - 🛡️ Handles Coles' bot protection automatically — Coles sits behind Incapsula, which blocks plain HTTP requests outright. The Actor drives a real, stealth-configured browser session and retries on a fresh proxy session if a request gets blocked.
How is this different from browsing Coles by hand?
Coles' website only shows a handful of fields per product tile and requires a real session to reveal stock. This Actor reads the underlying data Coles' own site is built from, so every result already includes fields the page doesn't render at all — the raw category hierarchy (trade profit centre, category group, class name), the exact available quantity, and a properly normalized per-kg/L/each price for comparison shopping.
Input parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| scrapeMode | enum | Yes | How to find products: searchKeyword, providedUrls, or skuList. |
| searchQuery | string | No | Search term, product name, or barcode. Used in keyword search mode. |
| startUrls | array of URLs | No | Coles search, category, or weekly specials URLs. Used in URL mode. |
| skuList | array | No | Specific Coles product SKU IDs to scrape. Used in SKU list mode. |
| includeDescription | boolean | No | Include the full product description text. Default: true. |
| maxItems | integer | No | Maximum number of products to scrape per run. Default: 25. |
| maxRequestsPerCrawl | integer | No | Maximum pages to load per run. Set to 0 for no limit. |
| monitorMode | enum | No | snapshot (default) returns current data every run. changes compares against the last run of the same Watchlist name and adds change fields to every row. |
| stateName | string | No | Watchlist name that separates independent change-tracking scopes. Only used when monitorMode is changes. |
| onlyChanged | boolean | No | When monitorMode is changes, emit only rows that changed since the last run. Default: false. |
| proxyConfiguration | object | No | Keep the datacenter default. Blocked attempts are retried automatically on a fresh IP, and residential proxies cost far more per run for the same data. Switch only if a very large run still fails after retries. |
Basic keyword search
{"scrapeMode": "searchKeyword","searchQuery": "milk","maxItems": 25}
Scrape a category or specials URL
{"scrapeMode": "providedUrls","startUrls": [{ "url": "https://www.coles.com.au/on-special" }],"maxItems": 50}
Watchlist: track price and stock changes over time
{"scrapeMode": "skuList","skuList": ["8150288", "4845732"],"monitorMode": "changes","stateName": "dairy-watchlist","onlyChanged": true}
Run this on a schedule with the same stateName and only genuinely new, repriced, or restocked products come back.
Output example
{"product_id": "8150288","name": "Full Cream Milk","brand": "Coles","description": "COLES FULL CREAM MILK 3L","size": "3L","availability": true,"availability_type": "InStoreAndOnline","available_quantity": 5128,"price": 4.95,"original_price": null,"on_special": false,"discount_amount": null,"discount_percent": null,"currency": "AUD","comparable": "$1.65/ 1L","unit_price": 1.65,"unit_price_quantity": 1,"unit_price_unit": "l","unit_price_basis": "L","price_per_base_unit": 1.65,"image_url": "https://productimages.coles.com.au/productimages/8/8150288.jpg","category": "DY MILK","url": "https://www.coles.com.au/product/8150288","scraped_at": "2026-09-16T05:59:50.306Z","retail_limit": 20,"promotional_limit": 12,"online_special": false,"sub_category": "WHOLE WHITE","class_name": "WHOLE 3-3.9L","trade_profit_centre": "DAIRY","category_group": "DAIRY"}
What data can you extract from Coles?
| Field | Description |
|---|---|
| product_id / name / brand / description / size | Core product identity fields. |
| availability / availability_type / available_quantity | Stock status, channel (e.g. in-store and online), and exact quantity on hand. Populated for keyword and URL searches; SKU list mode does not expose these (see FAQ). |
| price / original_price / on_special / discount_amount / discount_percent | Current price, genuine pre-discount price, and a computed discount — only set when original_price genuinely exceeds price. |
| comparable / unit_price / unit_price_quantity / unit_price_unit | Coles' own unit-price text and its parsed numeric parts. |
| unit_price_basis / price_per_base_unit | Normalized comparison basis (kg, L, or ea) and the true price per full base unit — comparable across products, unlike comparable, which mixes per-100g and per-1kg displays. |
| image_url / url | Full-resolution product image and the Coles product page URL. |
| category / sub_category / class_name / trade_profit_centre / category_group | Coles' full internal merchandising hierarchy. |
| retail_limit / promotional_limit / online_special | Purchase limits and whether the item is an online-only special. |
| change_type / old_price / price_delta / price_delta_pct | Only present in changes monitor mode — see Watchlists above. |
How to scrape Coles
- Open Coles Australia Scraper on Apify.
- Choose a Scrape mode: search by keyword, paste category/search/specials URLs, or list exact SKUs.
- Set Max items and Max requests per crawl — start small (e.g. 25 and 25) for a fast, cheap test run.
- Leave Proxy configuration on the datacenter default; only switch to residential if a large run still fails after automatic retries.
- For recurring price or stock tracking, set Monitor mode to
changesand give it a Watchlist name. - Click Start, then download results as JSON, CSV, or Excel from the Storage tab, or pull them from the API.
How much does it cost to scrape Coles?
This Actor uses the pay-per-event model — you are charged per product saved to the dataset, with lower rates on paid Apify plans.
| Plan | Price per product | Price per 1,000 products |
|---|---|---|
| Free | $0.00119 | $1.19 |
| Bronze | $0.00099 | $0.99 |
| Silver | $0.00089 | $0.89 |
| Gold | $0.00089 | $0.89 |
Scraping 1,000 products on the Free plan costs about $1.19. Your monthly Apify platform credits typically cover several thousand products on top of that.
How it works
- The Actor launches a stealth-configured Camoufox browser session and warms it up against coles.com.au's homepage to pass Incapsula's bot challenge.
- Depending on
scrapeMode, it navigates to a search/category/specials URL (paginating via Coles' ownstartoffset) or an individual/product/{sku}page for each SKU. - It parses the
__NEXT_DATA__JSON Coles' own Next.js app hydrates from, flattens each product into the fields above, and pushes it to the dataset immediately. - In
changesmonitor mode, each product is compared against the named Watchlist's last recorded price and availability, and the result is merged back into that Watchlist for the next run. - If a request gets blocked mid-run, the Actor retries it on a fresh browser session and proxy IP automatically.
Using the Actor via API
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("parsebird/coles-australia-scraper").call(run_input={"scrapeMode": "searchKeyword","searchQuery": "yoghurt","maxItems": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["name"], "—", item.get("price"), item.get("comparable"))
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('parsebird/coles-australia-scraper').call({scrapeMode: 'providedUrls',startUrls: [{ url: 'https://www.coles.com.au/on-special' }],maxItems: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
The Actor runs on the Apify platform, so you also get scheduling, a full REST API, webhooks, and native integrations with Make, Zapier, Google Sheets, and Slack. Results export as JSON, CSV, Excel, XML, or HTML.
Use cases
- Price monitoring — track price and discount changes for specific products or a whole category over time.
- Weekly specials tracking — scrape
/on-specialon a schedule to catch new discounts as they go live. - Stock and availability tracking — watch specific SKUs for
BACK_IN_STOCKorOUT_OF_STOCKtransitions. - Basket price comparison — use
price_per_base_unitto compare like-for-like unit prices across brands and pack sizes. - Market and category research — analyze category mix, discount depth, and stock patterns across a search term.
FAQ
Do I need a proxy to scrape Coles?
Yes — Coles sits behind Incapsula, which blocks plain requests outright. Keep the default {"useApifyProxy": true}, which uses Apify's datacenter proxy; the Actor retries blocked attempts automatically on a fresh session. Only switch to a residential proxy group if a very large run still fails after retries — it costs far more for the same data.
Why don't SKU list results have availability_type or available_quantity?
Coles only publishes those two fields on search, category, and specials result tiles — not on the individual product page that SKU list mode fetches directly. availability (a plain in-stock/out-of-stock boolean) is still populated in every mode.
How is discount_percent calculated?
From original_price and price directly. on_special is only true when Coles published a genuine pre-discount "was" price that's actually higher than the current price.
What is a Watchlist?
Set monitorMode to changes and give it a stateName (the Watchlist name). Each run compares the scraped products against that Watchlist's last run and tags every row with a change_type. Different stateName values track completely independent histories, so you can run several Watchlists — a category, a competitor set, your own SKU list — side by side.
Does maxRequestsPerCrawl: 0 really mean unlimited?
Yes. It removes the page-load cap entirely; maxItems is still the ultimate stopping point.
Can I schedule recurring runs?
Yes. Use Apify's scheduler to run this Actor daily or weekly — combine it with monitorMode: changes to get a clean feed of only what moved. Found a problem? Open an issue on the Issues tab.
Related Actors
- Woolworths Australia Grocery Products Scraper — the same kind of price, stock, and category data from Coles' biggest competitor.
- Daraz.pk Ecommerce Scraper — product and pricing data from Daraz, Pakistan's Lazada-platform marketplace.
- Browse the full ParseBird publisher page for more scrapers.
Is it legal to scrape Coles Australia?
Is it legal? This Actor collects only publicly available product listings from Coles — data any visitor can view without logging in. It does not access private account data or bypass authentication. You are responsible for using the scraped data lawfully, including respecting Coles' terms and applicable data-protection laws such as the Australian Privacy Act or GDPR where relevant. If you plan to scrape at scale or redistribute the data commercially, seek legal advice first. See Apify's guide on the legality of web scraping.