Coles & Woolworths Scraper: Aldi & IGA Supermarket Prices AU avatar

Coles & Woolworths Scraper: Aldi & IGA Supermarket Prices AU

Pricing

from $0.35 / 1,000 products

Go to Apify Store
Coles & Woolworths Scraper: Aldi & IGA Supermarket Prices AU

Coles & Woolworths Scraper: Aldi & IGA Supermarket Prices AU

Coles, Woolworths, Aldi and IGA prices across Australia in one table: half-price and multibuy specials, keyword search, full catalog, store prices, barcodes and a changed-only price watcher. No login, no browser.

Pricing

from $0.35 / 1,000 products

Rating

0.0

(0)

Developer

Jay Novello

Jay Novello

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

5

Monthly active users

8 hours ago

Last modified

Features

Limited permissions

Share

Coles, Woolworths, Aldi & IGA Prices Scraper (Australia)

Australian supermarket prices from Coles, Woolworths, Aldi and IGA in one table: this week's half-price and multibuy specials, keyword search, whole categories or the full catalog, store-specific prices, barcodes and nutrition, and a price watcher that outputs only what changed. No login, no browser, no API key.

Try it: Click Start with the default input (this week's half-price specials at Coles, Woolworths and IGA, 20 per retailer): 60 products in 15 seconds for about $0.03 (run on October 21, 2026).

RetailerProductSizeNowWasSavingPrice for
ColesI&J Frozen Raw Prawns Tail Off500g$12.00$24.00$12.00Coles Online Hub Store Ocado - Melbourne
ColesOstelin Vitamin D250 pack$24.75$49.50$24.75Coles Online Hub Store Ocado - Melbourne
WoolworthsVanish Gold Pro Turbo Stain Remover Powder1kg$11.00$22.00$11.00national online price
WoolworthsCoca-Cola Zero Sugar Soft Drink Mini Bottles300mL x 12 pack$12.00$24.00$12.00national online price
IGABulla Creamy Classics Boysenberry Sundae Cone4 pack$6.25$12.50$6.25Ashcroft's IGA Erskine Park

Every row carries price, wasPrice, saving, specialType, promoText, unitPrice and unitOfMeasure in the same format for all four retailers, so a mixed table sorts directly.

Pricing: $0.50 per 1,000 products, plus $1.00 per 1,000 for the optional product-details add-on and $0.50 per 1,000 store or category rows; $0.00005 per run start. Platform compute, proxy and storage are included. Failed runs, error rows and products skipped by the watcher are not charged.

Weekly specials watch

Specials at Coles, Woolworths and IGA change on Wednesdays. To get only the products that went on special, came off special or changed price since last week, turn on Only changed prices, name the watcher and schedule the input weekly:

{"mode": "specials", "specialsType": "halfPrice", "retailers": ["woolworths"], "maxItemsPerQuery": 0,
"onlyChanged": true, "watcherName": "woolworths-half-price"}

The first run outputs every special as new and sets the baseline. Each later run outputs only rows with a changeType (special-started, special-ended, price-down, price-up, new, stock changes) together with previousPrice and priceChange; unchanged products are skipped and not charged. Use maxItemsPerQuery: 0 so the whole specials list is read each time, and keep the retailers and store IDs the same from run to run.

Real example: search mode

Run on Apify on October 14, 2026 (07:53 UTC). Search mode, keyword full cream milk 2l, all four retailers, 6 products each, Coles store 357 (North Perth), product details on. It finished in 23 seconds and returned 24 products, every one with a barcode or nutrition data where the retailer publishes it.

Retailer#ProductSizePriceUnit priceStoreBarcode
Coles1Coles Full Cream Milk2L$3.40$1.70 per 1LColes North Perth9300601186938
Coles3Masters Full Cream Milk2L$4.30$2.15 per 1LColes North Perth9310232957012
Woolworths1Woolworths Full Cream Milk2L$3.40$1.70 per 1Lnational online price9300633556143
Woolworths6Pauls Zymil Lactose Free Full Cream Milk2L$5.95 (was $6.90, price drop)$2.98 per 1Lnational online price9310036048985
Aldi1Full Cream Milk 2L2L$3.39$1.70 per 1Lnational shelf price(Aldi publishes none)
Aldi4Lactose Free Full Cream Milk 2L2L$4.79$2.40 per 1Lnational shelf price(Aldi publishes none)
IGA3Pauls Full Cream Milk1L$2.50 (was $2.60)$2.50 per 1LAshcroft's IGA Erskine Park(IGA publishes none)
IGA4A2 Milk Full Cream Milk3L$10.50$3.50 per 1LAshcroft's IGA Erskine Park(IGA publishes none)

House-brand 2L milk came out within a cent everywhere: Aldi $3.39, Coles $3.40 and Woolworths $3.40.

Other runs on the same day:

  • Half-price specials at Coles, Woolworths and IGA, 200 each: 600 products in 46 seconds. The deepest cuts were a Philips Sonicare toothbrush at Coles ($35, was $70) and an Oral-B Pro Expert at Woolworths ($59.50, was $119).
  • Load test: the whole Dairy, Eggs & Fridge category at Coles (2,265 products) and Woolworths (1,726) in 3 minutes 34 seconds, 103 requests, no blocks.
  • Price watcher: milk and tim tams at all four retailers. The first run output 138 products marked new; the second run a few minutes later output nothing and skipped 138 unchanged products. Unchanged products incur no product events; the $0.00005 start event still applies.

Real before/after: October 14 to October 21

The separate readme-demo baseline from October 14, 2026, 19:18 UTC held 118 products. Rerunning its original input on October 21, 07:19 UTC returned 41 rows in 18.9 seconds: 25 changes to previously observed products and 16 newly observed products, with 76 unchanged products skipped and no error rows. Build 0.1.7, run NCoOp4GexCNgQsTnL.

ProductPrice scopeOct 14 (AUD)Oct 21 (AUD)changeType
Devondale High Protein Full Cream Milk 1L, Coles 1329781Coles store 7674$2.50$2.00special-started
Arnott's Tim Tam Original Chocolate Biscuits 200g, Woolworths 36066National online$4.50$6.00special-ended
Milk Chocolate Block 180g, Aldi 000000000000398417National shelf$3.49$2.99price-down
Arnott's Tim Tam Chocolate Original 200g, IGA 308953IGA store 32600$3.00$5.70price-up
{"mode":"search","queries":["milk","tim tams"],"maxItemsPerQuery":20,"onlyChanged":true,"watcherName":"readme-demo"}

Use your own watcher name for a new workflow. Its first run establishes your baseline; it cannot recreate this historical comparison. Keep retailer and store settings consistent. These search windows can rotate: new means newly observed by this watcher, and missing products do not establish delisting or stock loss. Changes happened between the two observations, not necessarily on Wednesday. Coles and IGA examples apply only to the stated stores.

At list prices, 41 product events plus one start event total $0.02055. An unchanged run still incurs the $0.00005 start event. This was an owner validation run, not evidence of paid customer usage. Each exported change includes its source URL, observation timestamp, previousPrice, price and priceChange.

One full row from the search run (nutrition cut to 3 of 10 lines):

{
"type": "product",
"retailer": "coles",
"productId": "439693",
"name": "Coles Full Cream Milk",
"brand": "Coles",
"size": "2L",
"price": 3.4,
"wasPrice": null,
"saving": null,
"isOnSpecial": false,
"specialType": null,
"promoText": null,
"unitPrice": 1.7,
"unitOfMeasure": "1L",
"unitPriceText": "$1.70 per 1L",
"inStock": true,
"barcode": "9300601186938",
"categories": ["Dairy, Eggs & Fridge", "Milk", "Full Cream Milk"],
"imageUrl": "https://cdn.productimages.coles.com.au/productimages/4/439693.jpg",
"url": "https://www.coles.com.au/product/coles-full-cream-milk-2l-439693",
"storeId": "357",
"storeName": "Coles North Perth",
"priceScope": "store",
"currency": "AUD",
"searchQuery": "full cream milk 2l",
"position": 1,
"details": {
"barcode": "9300601186938",
"description": "Coles Australian Dairy Full Cream Milk, 2L. Fresh full cream milk sourced from Australian farmers for wholesome goodness. Better together with Australian Farmers.",
"ingredients": "Homogenised and Pasteurised Full Cream Milk",
"allergens": "Contains Milk",
"nutrition": [
{"name": "Energy (kJ)", "per100": "260 kJ", "perServing": "650 kJ"},
{"name": "Protein", "per100": "3.5 g", "perServing": "8.75 g"},
{"name": "Sugars - Total", "per100": "4.4 g", "perServing": "11 g"}
],
"servingSize": "250mL",
"servingsPerPack": "8.00",
"countryOfOrigin": "Australian Milk"
},
"scrapedAt": "2026-10-14T07:53:52Z"
}

What you can do

ModeInputOutput
specialsall, halfPrice, multibuy or onlineOnlyProducts on special with was price, saving and promo text
searchKeywords, e.g. milk, tim tams, nappies size 4Products in each retailer's own ranking (position)
categoryCategory names, IDs or URLs, or all for the full catalogEvery product in the category, de-duplicated
productsProduct URLs or IDs (coles:439693, woolworths:888140, Woolworths barcodes)A price check of your watchlist, in input order
categoriesNothingEach retailer's category tree with IDs and product counts
storesA postcode or suburbNearby stores with store IDs for store pricing

Turn on Only changed prices with any mode and schedule the same input to get a feed of price drops, price rises, specials that started or ended, and stock changes. Each row then carries changeType, previousPrice and priceChange. Unchanged products are not output and not charged.

Retailer coverage

ColesWoolworthsAldiIGA
PricesPer store (default: Coles online store 7674, Melbourne)National online priceNational shelf pricePer store (default: 32600, Erskine Park NSW)
Full catalog (all)~31,900 lines22,000+ lines (Everyday Market excluded)~3,250 lines incl. Special Buys~13,800 lines per store
Specialshalf price, multibuy, online only, price dropshalf price, multibuy, online only, lower shelf priceSpecial Buys (with on-sale date), Super Savers, Lower Priceshalf price and % off, with start and end dates
BarcodeWith product details, or in products modeAlwaysNot publishedNot published
DetailsIngredients, allergens, nutrition, country of originIngredients, allergens, nutrition, health star ratingDescription, ingredients, allergensIngredients, nutrition, allergens, country of origin
StockYesYesNot publishedYes
Store finderPostcode or suburbPostcode or suburbPostcode or suburbPostcode, suburb, state or all 536 stores

Input examples

Every half-price product at Coles and Woolworths, unlimited:

{"mode": "specials", "specialsType": "halfPrice", "retailers": ["coles", "woolworths"], "maxItemsPerQuery": 0}

Compare keywords across all four supermarkets:

{"mode": "search", "queries": ["milk", "bread", "eggs"], "maxItemsPerQuery": 50}

Daily price-change feed for a full category at one Coles store:

{"mode": "category", "retailers": ["coles"], "categories": ["Dairy, Eggs & Fridge"], "colesStoreId": "357",
"maxItemsPerQuery": 0, "onlyChanged": true, "watcherName": "coles-357-dairy"}

Watchlist with barcodes and nutrition:

{"mode": "products", "includeDetails": true,
"products": ["https://www.coles.com.au/product/coles-full-cream-milk-2l-439693", "woolworths:888140", "iga:726347"]}

Pricing

Pay per event. Platform usage (compute, proxy, storage) is included.

EventPriceWhen
Product$0.50 per 1,000Each product row output
Product details add-on$1.00 per 1,000Only with Include product details, and only when details were found
Store or category$0.50 per 1,000Each row in stores or categories mode
Actor start$0.00005Once per run

Examples: 1,000 products from a search or specials list cost $0.50. The whole Coles catalog (about 31,900 products) costs about $16. A weekly watcher over 2,000 specials where 150 change costs $0.08 a week. Error rows and blocked requests are never charged.

Accuracy and limits

  • Store prices. Coles and IGA prices depend on the store. Every row says which store the price is for (storeId, storeName, priceScope). Woolworths and Aldi show one national online or shelf price to anonymous visitors, so their rows say priceScope: "national". Woolworths store-level prices need a login and are not collected.
  • Small Coles stores. Coles Central and Coles Local Express stores have no online range; choosing one returns an uncharged error row. Pick a full-size supermarket from stores mode.
  • Aldi sells in store only, so its rows have no stock flag, and Aldi publishes no barcodes. Aldi has no half-price, multibuy or online-only specials; those types return an uncharged error row for Aldi, which is why the default input lists Coles, Woolworths and IGA. Use specialsType: "all" to include Aldi's Special Buys and price drops.
  • Coles "other" specials. Coles lists some products as specials without a previous price; they come out with specialType: "other" and no wasPrice.
  • Sponsored products appear in Coles and Woolworths results as they do on the website; each product appears once per list.
  • Woolworths Everyday Market (over a million third-party listings) is left out unless you turn on Include Woolworths Everyday Market.
  • Proxy. Coles blocks most direct connections from cloud servers, so keep the default Apify proxy on. When a site refuses repeatedly, the run stops that list with an error row instead of hanging, and keeps what was already delivered.
  • Prices change during the day and specials usually change on Wednesdays. scrapedAt is the time each row was read.

FAQ

Do I need an account at the supermarkets? No. The actor reads the same public prices any visitor sees, without a login.

How do I get prices for my local store? Run mode stores with your postcode, copy the Coles or IGA storeId, and put it in Coles store ID or IGA store ID.

How do I match the same product across retailers? Use barcode: Woolworths always has it and Coles has it with product details or in products mode. Otherwise match on brand, name and size.

Can I get a price history? Schedule the actor with Only changed prices on. Each run outputs only the changes, so the datasets together form the history. Use a different Watcher name per schedule.

Can I call it from code or an AI agent? Yes. For example:

curl -X POST "https://api.apify.com/v2/acts/varnmill~au-supermarket-prices/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "specials", "specialsType": "halfPrice", "retailers": ["woolworths"], "maxItemsPerQuery": 50}'

What if a search finds nothing or a product id is unknown? The run still succeeds and the dataset gets an uncharged error row that explains why, so schedules and integrations keep running. A run fails only when a supermarket blocks or errors and nothing comes back.

Do I have to set mode? Not if you fill only one kind of input. products, categories or location on their own select that mode, and product URLs typed into queries are price-checked as products. Common field names from other scrapers also work: query, keyword(s), searchTerms, productUrls, startUrls, category, postcode.

Something is wrong or missing? Open an issue on the actor page. Issues are checked daily.

Watcher scheduling: use a separate watcherName for each independent workflow and keep its filters/location consistent. Runs using the same name wait up to 50 seconds for the previous run; if it is still busy, retry after it finishes. Local and cloud baselines are separate. A failed or interrupted delivery can appear again on retry, so deduplicate downstream by product or observation time. Existing names keep their baselines, but a baseline previously shared by colliding names cannot be disentangled automatically.

Cleaner product-name searches

For procurement and restocking workflows, set searchMatch to allWords to require every query word in the product name or brand. Unrelated retailer recommendations are filtered before product/detail charges and watcher updates. The default retailer setting keeps the retailer's original results.

{"mode":"search","retailers":["coles","woolworths","aldi"],"queries":["kinder bueno"],"searchMatch":"allWords","maxItemsPerQuery":12,"maxItems":36,"includeDetails":false,"onlyChanged":false}

The filter ignores case and punctuation but uses whole words: no synonyms, stemming, variant equivalence or pack-size validation. A match may still be a different format (for example ice cream versus a chocolate bar); verify variant, quantity and unit before comparing prices. maxItemsPerQuery limits source products before filtering, so twelve fetched products can yield fewer matches. No extra pages are fetched to fill that limit. Zero matches describe this fetched window, not the entire retailer catalogue. Use product IDs for known exact listings and a new watcher name when changing matching settings. Full snapshots are useful when you need a positive observation on every check; missing products are not proof of removal or stock loss.

Optional pack-size evidence

Set "includePackEvidence": true to add packEvidence to delivered product rows. This uses the retailer's explicit size field, with no extra source requests or billable events. It works with search, specials, category and product lookup. The default is off; unchanged watcher rows remain skipped. Enabling this option does not backfill unchanged products: run a snapshot with onlyChanged: false if you need their evidence.

The output includes the original size, status (explicit or unknown), dimension, quantity, unit and pricePerBaseUnit in AUD per g, mL or each. For example, an explicit 6 x 330mL means 1,980 mL. A 4 pack establishes a count of four, not a volume. Mixed strings such as 204g 10 pack remain unknown because the weight's scope is ambiguous. Unknown quantities and unit costs are null, never zero.

Evidence is not product matching: productEquivalenceEstablished is always false. Product names, nutrition, concentration, pack variants, store scope and retailer promotions still need review. We never infer quantity from product names, unit prices or assumed density. The retailer's original size, unitPrice and unitOfMeasure remain available unchanged.

{"mode":"search","retailers":["coles","woolworths"],"queries":["kinder bueno"],"searchMatch":"allWords","includePackEvidence":true,"maxItemsPerQuery":12,"maxItems":24,"includeDetails":false,"onlyChanged":false}

Search coverage for restocking integrations

Search runs save SEARCH-OUTCOMES in the run's default key-value store (also linked under Output). This report has no event fee and adds no rows to the product dataset. Join a report entry to products using retailer and searchQuery; product IDs and source URLs stay on the product rows.

Each entry counts source products observed, literal matches, filtered products, delivered products and unchanged products. deliveredProducts counts successful product deliveries in this attempt; source totals and matched totals are not billed-row counts. An unchanged-only run can observe matching products and deliver zero rows without being an empty search.

  • coverage: bounded means the source iterator ended within the configured window. It does not prove exhaustive search; sourceComplete remains null.
  • coverage: truncated means processing reached maxItemsPerQuery, the shared maxItems, or the spending limit. More source matches may exist; this is not proof that they do.
  • coverage: unknown covers source/start failures, cancellation and queries not reached. Partial delivered products remain valid observations. stopReason distinguishes these cases.
  • outcome: empty_source_window means no product was observed in a normally ended source window. no_matches_in_window means source products were observed but none passed the literal filter. Neither means the retailer has no matching stock.

The report is checkpointed before fetching and after each query, not after every product. pending, running or interrupted entries are incomplete; after a hard stop, counts can lag the dataset. Use the dataset for actual delivered rows. A restarted run writes a report for that attempt, not an aggregate over previous attempts. No report is created for non-search modes.

Keep full snapshots when your application needs them, and treat missing products as unknown. This report never declares stock loss, removal, equivalent pack sizes or complete retailer coverage. Prices and existing watcher behavior are unchanged.

Changelog

  • 0.1.12 (November 10, 2026): optional includePackEvidence adds explicit pack quantities and AUD per base unit to delivered products. Ambiguous sizes remain unknown. No added requests, events or automatic product matching.

  • 2026-11-09: Search runs now save an uncharged SEARCH-OUTCOMES report with per-retailer/query observed, filtered, delivered and unchanged counts, source errors and explicit result-window limits. Missing products do not establish stock loss.

  • 2026-11-09: Optional searchMatch: "allWords" filters unrelated recommendations before charges or watcher updates. Default retailer behavior and prices are unchanged.

  • 0.1.8 (2026-10-21): Default input is now this week's half-price specials at Coles, Woolworths and IGA (60 products in 15 seconds). README restructured around the weekly specials watch. No code changes.

  • 0.1.7 (2026-10-19): Watcher runs with the same name now wait for each other before loading and saving their baseline. Losing the lock stops the run without saving stale state. Cancelled runs keep only confirmed output in watcher state.

  • 0.1.6 (2026-10-19): Spending-limit fix. When your maximum charge per run runs out, a product and its details add-on are charged together or not at all, and only delivered products are counted and remembered by the watcher, so a product cut off by the limit shows up again on the next run. Watcher names with spaces or other special characters now get their own record (existing watchers carry over); state is merged before saving. Full overlap serialization was added in 0.1.7.

  • 0.1.5 (2026-10-17): Runs no longer fail when a search finds nothing or a product id is unknown (uncharged error rows instead). The mode is now picked from the filled fields, and common field names from other scrapers (query, productUrls, startUrls, postcode and more) are accepted. An unusable proxy group now falls back to the datacenter proxy.

  • 0.1 (2026-10-14): First release. Coles, Woolworths, Aldi and IGA; search, category and full catalog, specials, products, categories and stores modes; store pricing for Coles and IGA; product details add-on; changed-only price watcher.