Coles, Woolworths & ALDI Scraper: Prices, Specials, Unit Prices
Pricing
from $1.50 / 1,000 products
Coles, Woolworths & ALDI Scraper: Prices, Specials, Unit Prices
Coles, Woolworths and ALDI Australia prices in one format: price, was price, half-price and multibuy specials, unit price per kg / L / each, category, barcode, stock. Search, category, specials or product IDs. Tracks price and special changes. $1.50 per 1,000 products.
Pricing
from $1.50 / 1,000 products
Rating
0.0
(0)
Developer
Naveen Raja
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Get Coles, Woolworths and ALDI Australia product prices in one clean format: current price, was price, half-price and multibuy specials, and a unit price normalised to per kg, per litre or per item, so you can compare a 2 L bottle at one supermarket with a 3 L bottle at another. Search by keyword, paste category or specials pages, or check a fixed basket of product IDs.
The Actor reads the same JSON data the supermarkets' own websites load in your browser. It needs no browser and no login, so it is fast. Apify Proxy is on by default and included in the price: datacenter IPs for Woolworths and ALDI (switching to Australian residential IPs if they block them), Australian residential IPs for Coles.
Turn on change tracking and every later run tells you what changed: price drops, price rises, specials that started, specials that ended, new products and stock changes. Schedule it daily and you have a specials alert or a shelf-price monitor.
Price: $1.50 per 1,000 products ($0.0015 per product row). Change-only monitors also pay $0.0003 per product checked. There are no usage fees. Queries that fail cost nothing (rows already returned before an error are charged), and so do the rows that explain them.
What you get
- Three supermarkets, one schema: Coles, Woolworths and ALDI rows share the same fields, so you can sort and compare them directly.
- Prices:
price,wasPrice,savingsanddiscountPct. - Specials:
isOnSpecialandspecialType, which is one ofhalf_price,price_cut,multibuy,specialorspecial_buy(ALDI Special Buys). You also get the deal text as shown ("1/2 Price","Buy 2 for $9.40","Save $3.20"), and for multibuys the quantity and total price (multibuyQuantity: 2,multibuyPrice: 9.4). - Unit prices you can compare:
unitPriceperkg,L,each,mor100 sheets, plus the supermarket's own label ("$2.80 / 100G"). If a retailer shows no unit price, it is calculated from the pack size. - Product data: name, brand, pack size, category path, barcode (GTIN: Woolworths' own products, and Coles when you check product IDs or product URLs; Coles search and category results and ALDI don't publish one), image, product URL, availability, sold-by-weight flag.
- Only the supermarket's own products by default: Woolworths also lists third-party "Everyday Market" items (sold and priced by other businesses, no barcode, often not groceries). They are left out of searches and categories unless you turn on Include Woolworths Everyday Market items; then they come back with
marketplace: trueand thesellername. - Clear answers when there is nothing to return: a query without results, an invalid input or a product ID that couldn't be read gets one free row with
erroranderrorKind. Woolworths sometimes answers a search that matches nothing with unrelated products; the Actor detects this and reports "no results" instead of charging you for them. - Search context:
rank(the product's position in the supermarket's results) andsponsored(paid placement). These are useful for share-of-shelf analysis. - Change tracking:
changeType,previousPrice,priceChangePct,previousSpecialLabelandfirstSeenAt. - Built for automation and AI agents: the same fields on every row, pay-per-event pricing without usage fees, limited permissions, a machine-readable
SUMMARYrecord, and a clean stop when your spending limit is reached.
Use cases
- Grocery price comparison apps and sites: search the same products at all three chains and compare by
unitPrice. - CPG and brand monitoring: track your brand's shelf price, promotions, multibuy mechanics, search rank and sponsored placements at Coles and Woolworths, and do the same for your competitors.
- Specials alerts: run daily with Output only changed products and get a row whenever a product goes on special (
special_started), comes off special (special_ended) or changes price. - Inflation and cost-of-living research: schedule a fixed basket of product IDs and build a time series of shelf prices and unit prices per kg / L.
- Category and range analysis: export a whole category or the weekly half-price catalogue with prices, deal types and categories.
- AI agents: give an agent a tool for questions like "What's the cheapest full cream milk per litre this week?" or "Is Vegemite on special at Coles or Woolworths?"
How to use
- Pick the Supermarkets to search: Coles, Woolworths and/or ALDI.
- Add Search queries (e.g.
full cream milk,tim tam), and/or paste Category, specials, search or product URLs, and/or add Product IDs likewoolworths:888140,coles:8150288,aldi:398689. - Optional: set Max products per query (default 30) and turn on Only products on special. Turn on Include Woolworths Everyday Market items if you also want third-party sellers' products.
- Optional: turn on Track price and specials changes, and Output only changed products to get only the changes. Use the same Tracking ID for every run of the same monitor.
- Run it (or schedule it). Download the results as JSON, CSV or Excel, or read them via the API. A per-query summary is saved as the
SUMMARYrecord in the run's key-value store.
Supported URLs
| Supermarket | Category / specials pages | Search pages | Product pages |
|---|---|---|---|
| Woolworths | woolworths.com.au/shop/browse/... (e.g. /shop/browse/specials/half-price) | /shop/search/products?searchTerm=... | /shop/productdetails/{id}/... |
| Coles | coles.com.au/browse/..., /on-special and other product-list pages | /search/products?q=... | /product/...-{id} |
| ALDI | aldi.com.au/products/.../k/{number} | /results?q=... | /product/...-{number} |
Input example
{"retailers": ["coles", "woolworths", "aldi"],"searchQueries": ["full cream milk", "tim tam"],"startUrls": ["https://www.woolworths.com.au/shop/browse/specials/half-price"],"productIds": ["woolworths:888140", "coles:8150288", "aldi:398689"],"onlySpecials": false,"maxItemsPerQuery": 30}
For a daily specials alert, add "trackChanges": true, "onlyChanges": true, "trackingId": "my-basket".
Output example
A real Woolworths row from a cloud run on 19 October 2026 (search "full cream milk"; sponsored marks the paid placement at rank 1):
{"retailer": "woolworths","productId": "208064","name": "a2 Milk Full Cream 2L","brand": "a2","size": "2L","price": 7.3,"wasPrice": null,"savings": null,"discountPct": null,"isOnSpecial": false,"specialType": null,"specialLabel": null,"multibuyQuantity": null,"multibuyPrice": null,"priceTag": null,"unitPrice": 3.65,"unitOfMeasure": "L","unitPriceLabel": "$3.65 / 1L","soldByWeight": false,"category": "Dairy, Eggs & Fridge > Milk > Full Cream Milk","barcode": "9335390000035","available": true,"sponsored": true,"marketplace": false,"seller": null,"imageUrl": "https://cdn0.woolworths.media/content/wowproductimages/large/208064.jpg","url": "https://www.woolworths.com.au/shop/productdetails/208064/a2-milk-full-cream-milk","sourceType": "search","source": "full cream milk","rank": 1,"scrapedAt": "2026-10-18T20:58:36Z","changeType": null,"changes": null,"previousPrice": null,"priceChangePct": null,"previousIsOnSpecial": null,"previousSpecialLabel": null,"previousAvailable": null,"firstSeenAt": null,"error": null,"errorKind": null}
A Coles multibuy row, parsed from Coles' "On special" page (other fields as above):
{"retailer": "coles","productId": "4661649","name": "Coles Water 12x600ml | 12 Pack","price": 5.35,"wasPrice": null,"isOnSpecial": true,"specialType": "multibuy","specialLabel": "Buy 2 for $9.40 (online only)","multibuyQuantity": 2,"multibuyPrice": 9.4,"unitPrice": 0.74,"unitOfMeasure": "L","unitPriceLabel": "$0.74/ 1L","category": "Drinks > Water > Still Water","url": "https://www.coles.com.au/product/coles-water-12x600ml-12-pack-4661649"}
An ALDI row from the same test run (search "full cream milk"):
{"retailer": "aldi","productId": "000000000000398689","name": "Full Cream Milk 2L","brand": "FARMDALE","size": "2 l","price": 3.39,"unitPrice": 1.7,"unitOfMeasure": "L","unitPriceLabel": "$1.70 per 1 L","category": "Dairy, Eggs & Fridge > Milk","url": "https://www.aldi.com.au/product/farmdale-full-cream-milk-2l-000000000000398689"}
A Woolworths Everyday Market item, returned only with Include Woolworths Everyday Market items on (cloud run, search "vegemite", other fields as above):
{"retailer": "woolworths","productId": "1126275561","name": "Vegemite 2.5kg x 1","price": 102.95,"unitPrice": 41.2,"unitOfMeasure": "kg","barcode": null,"marketplace": true,"seller": "Tasteful Delights","rank": 11}
Free error rows explain inputs that returned nothing (cloud run, 19 October 2026; all other fields are null):
[{"retailer": "woolworths","sourceType": "search","source": "zzqxjv nonexistent product 123","error": "Woolworths has no products for \"zzqxjv nonexistent product 123\".","errorKind": "no_results"},{"retailer": "coles","productId": "999999999","sourceType": "product","source": "productIds","error": "Coles product 999999999 not found.","errorKind": "not_found"}]
With tracking on, a changed row looks like this (illustrative values, other fields as above):
{"changeType": "special_started","changes": ["special_started", "price_down"],"previousPrice": 6.0,"priceChangePct": -25.0,"previousIsOnSpecial": false,"previousSpecialLabel": null,"firstSeenAt": "2026-10-10T21:00:04Z"}
Output fields
| Field | Description |
|---|---|
retailer | coles, woolworths or aldi |
productId | Woolworths stockcode, Coles product number or ALDI 18-digit product number |
name, brand, size | Product title as the retailer shows it (Woolworths and Coles include brand and size), brand, pack size |
price | Current shelf price in AUD. For products sold by weight, the price of a typical pack. null when Woolworths lists the product as unavailable (it shows no price then; available is false) |
wasPrice, savings, discountPct | Regular price when discounted, the saving, and the discount in percent (null when not discounted) |
isOnSpecial, specialType, specialLabel | Whether there is a deal, its type (half_price, price_cut, multibuy, special, special_buy) and the deal text. All null for a sold-out Woolworths product: Woolworths shows neither its price nor its special then, so the special status is unknown (not "no special") |
multibuyQuantity, multibuyPrice | Multibuy deals: e.g. 2 and 9.4 for "Buy 2 for $9.40" |
priceTag | Other price messages, e.g. Woolworths "Lower Shelf Price" with the previous price range |
unitPrice, unitOfMeasure | Normalised unit price per kg, L, each, m or 100 sheets |
unitPriceLabel | The retailer's own unit price text |
soldByWeight | Priced per kg at the checkout (loose produce, deli, meat) |
category | Category path, e.g. Dairy, Eggs & Fridge > Milk > Full Cream Milk |
barcode | GTIN / EAN where the retailer publishes it: Woolworths' own products, Coles product IDs and product URLs (null for Coles search and category results, ALDI and Everyday Market items) |
available | Woolworths / Coles: available online. ALDI: in the current range. Unavailable products are normal rows, so change tracking can report out_of_stock and back_in_stock |
sponsored | Paid / promoted placement in search results |
marketplace, seller | Woolworths Everyday Market item (sold by a third-party business) and that business's name. false / null for products the supermarket sells itself, and always for Coles and ALDI |
imageUrl, url | Product image and product page |
sourceType, source, rank | What returned the product (search query, URL or product IDs) and its position in the results |
scrapedAt | When this run read the product (UTC) |
changeType, changes, previousPrice, priceChangePct, previousIsOnSpecial, previousSpecialLabel, previousAvailable, firstSeenAt | Change tracking fields (null when tracking is off) |
error, errorKind | Only on free error rows (null on product rows): why a query, URL or product ID returned nothing. errorKind is no_results, not_found, no_price (a product ID you asked for is available but has no price; the row holds only the ID), invalid_input, unsupported, over_limit, not_checked (the run was about to time out), blocked, network or parse |
The dataset has ready-made views: Products, Specials, Changes, All fields and Errors. To keep only products, skip rows whose error is set.
How unit prices are normalised
Each supermarket shows unit prices on its own basis: Woolworths $2.80 / 100G, Coles $4.07/ 100g, ALDI $2.38 per 100 g. The Actor converts all of them to one basis per kind of unit:
| Unit shown by the retailer | unitOfMeasure | Example |
|---|---|---|
| g, kg | kg | $2.80 / 100G becomes 28.0 per kg |
| mL, L | L | $0.97/ 100mL becomes 9.7 per L |
| each, ea, pack | each | $0.81 / 1EA becomes 0.81 each |
| cm, m | m | |
| sheets | 100 sheets | $2.14/100 sheets stays 2.14 |
The retailer's original text is kept in unitPriceLabel. When a retailer shows no unit price, the Actor divides the price by the pack size (e.g. a $10.00 razor sold "each" becomes 10.0 each); unitPriceLabel is then null.
How specials are detected
half_price: the retailer flags it as half price, or the was price is double the price.price_cut: there is a was price higher than the current price (wasPrice,savings,discountPctfilled).multibuy: a quantity deal such as "2 for $8" or "Pick any 2 for $11" (multibuyQuantity,multibuyPricefilled). The shelf price stays the single-item price.special: the retailer marks the product as a special without a was price (for example Coles specials on loose produce).special_buy: an ALDI Special Buy (limited-time product).
Only products on special works for search queries, URLs and product IDs. Woolworths filters on its side. For Coles and ALDI, and for Woolworths when change tracking is on (so specials that just ended stay visible), the Actor reads more results and filters them itself: up to 10 times your limit (at least 200), or exactly your limit with Output only changed products (there the limit is the number of top results checked). For complete specials lists, use the specials pages directly: Woolworths /shop/browse/specials/half-price, Coles /on-special.
How change tracking works
With Track price and specials changes on, the Actor saves a compact snapshot of every product it checks: only what change detection needs (price, was price, special and its label, availability, first and last seen). The snapshot lives in a named key-value store in your Apify account (au-supermarket-prices-tracking, one encrypted record per supermarket and Tracking ID; it is the Actor's working memory, not an export, so read your results from the dataset). On the next run every product is compared with it:
changeType | Meaning |
|---|---|
new | Not seen before by this tracker |
special_started / special_ended | Went on special / came off special |
special_changed | Still on special, but a different deal (e.g. "2 for $8" became "1/2 Price") |
price_down / price_up | Lower / higher shelf price than in the previous run (previousPrice, priceChangePct) |
back_in_stock / out_of_stock | Became available / unavailable |
unchanged | None of the above |
If a product has several changes at once, changeType shows the most important one (stock changes first, then specials, then price) and changes lists them all (e.g. ["special_started", "price_down"]).
A sold-out Woolworths product is reported as out_of_stock only: Woolworths shows no price and no special for sold-out products, so neither is compared while it is sold out (the tracker keeps the last known price and special). When it is back, it is compared with those: back on the same special gives back_in_stock; if the special ended in the meantime you get back_in_stock with special_ended (and e.g. price_up) in changes.
Good to know:
- Output only changed products returns only the changes. You pay $0.0003 for each product checked (
product-checked, once per product and run, also on the first run, which saves the baseline and returns nothing) and $0.0015 for each changed product returned. With this option, Max products per query is the number of top results checked per query. - With Only products on special and tracking on, a product that just came off special is still returned once, as
special_ended. - A product is tracked by retailer and product ID across all your queries. Products not seen for 90 days are forgotten.
- If a run stops early (spending limit or time-out), changes that were not returned are kept and reported in the next run.
- The tracking state is saved after each query (at most every 30 seconds), every minute while a long query runs, and when the run is aborted, migrated to another server or about to time out. A change you were charged for is never reported again by the next run. If the state can't be saved (rare), the run's status message and
SUMMARY.trackingSaveErrorssay so. - One tracking ID remembers up to 40,000 products per supermarket (the most recently seen).
Pricing
Pay per event. There is no subscription and there are no usage fees:
| Event | Price |
|---|---|
product: one product row in the dataset | $0.0015 ($1.50 per 1,000) |
product-checked: one product read and compared with the previous run, only with Output only changed products (once per product and run) | $0.0003 ($0.30 per 1,000) |
| Actor start (standard Apify event, per run) | $0.00005 |
Examples:
- Compare one product at all three supermarkets, top 5 results each: 15 rows, about $0.02.
- A 20-product basket checked at all three supermarkets every day: 60 rows a day, about $0.09 a day (about $2.70 a month).
- The whole Woolworths half-price catalogue (about 1,850 products): about $2.80.
- A daily specials alert with Output only changed products that checks 300 products and finds 30 changes: 300 x $0.0003 + 30 x $0.0015 = about $0.14 a day. On a quiet day without changes: $0.09.
The Apify platform costs (compute, proxies, storage) are included. Free: the SUMMARY record, queries that fail (rows already returned before an error are charged) and the error rows that explain them. Unavailable products are normal rows (available: false; Woolworths shows no price for them, so price is null), because "out of stock" is real information and change tracking needs it. An available product without a price (rare) is left out of searches and categories (counted in SUMMARY.productsWithoutPrice); if you asked for it by ID, you get a free row with only its ID and errorKind: "no_price". To cap spending, set Maximum cost per run in the run options (or maxTotalChargeUsd via the API). The Actor stops cleanly when the cap is reached, and everything returned up to then stays in the dataset.
Use it from the API, an app or an AI agent
Run synchronously and get the rows in one call. Keep your API token in the APIFY_TOKEN environment variable:
curl -X POST "https://api.apify.com/v2/acts/fairfetch~au-supermarket-prices/run-sync-get-dataset-items?maxTotalChargeUsd=0.10" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries": ["full cream milk 2l"], "maxItemsPerQuery": 5}'
The Actor runs with limited permissions and uses pay-per-event pricing without usage fees, so AI agents can call it through the Apify MCP server and pay per run. Each run also writes a machine-readable SUMMARY record with per-query counts, errors and notes.
Performance and limits
- No browser: one request returns 36 products (Woolworths), 48 (Coles) or 30 (ALDI). 100 products from one supermarket take about 5 to 15 seconds.
- Product IDs: Woolworths reads 20 IDs per request and ALDI one per request (under a second each). Coles needs two small requests per product, about 3.5 to 4.5 seconds per product (measured in the cloud: 20 Coles IDs in 69 seconds on residential IPs, 200 in 15 minutes on datacenter IPs including retries after bot checks). Per run you can check up to 2,000 Woolworths and ALDI IDs and up to 400 Coles IDs (about 25 to 30 minutes, inside the default 1-hour run timeout); IDs above the limit come back as free
over_limitrows, so split larger baskets into several runs. If a run is about to time out anyway, the Actor stops a minute early, saves its state and lists the unchecked IDs as freenot_checkedrows. - Requests are polite: one at a time per supermarket, at most one request per second to Woolworths and one per 1.5 seconds to Coles (Coles' redirect to a product's own page is followed at once, like a browser does), with automatic retries and backoff. The three supermarkets are read in parallel.
- Max products per query: 0 means all results, up to 5,000 per query.
- Woolworths searches: Woolworths pads some searches with loosely related products after the real matches (in a cloud test, "vegemite" returned 10 Woolworths Vegemite products and 15 Everyday Market items, which are left out by default, and then 15 "Vege Chips"). Once a search has matched, 8 unrelated products in a row end it; single unrelated products between matches are kept.
- Each product is returned once per run, even if several queries find it (
duplicatesin the summary). - Prices and locations: Woolworths rows are Woolworths' own online prices (Everyday Market items, off by default, are the third-party seller's price and are marked
marketplace: true); Coles rows are the prices of Coles' default online store; ALDI rows are the prices listed on aldi.com.au. Prices in your local store can differ slightly. Choosing a specific store or postcode is not supported yet. - ALDI Australia does not sell groceries online, so
availablemeans "in the current range". ALDI Special Buys pages (/special-buys/...) are not supported yet; Special Buys that appear in searches and categories are returned and markedspecial_buy.
Bot protection and proxies
Coles and Woolworths protect their websites against bots. The Actor uses a real browser's network fingerprint and Apify Proxy (included in the price). In cloud tests on 19 October 2026, Woolworths and ALDI never blocked Apify datacenter IPs, while Coles showed its bot check to 4-6% of datacenter requests and refused some product IDs. So by default:
- Woolworths and ALDI use datacenter IPs; Coles uses residential IPs in Australia from the start.
- When a supermarket answers with a bot-check page, the Actor retries that request up to 3 times, each time with a fresh IP.
- If a supermarket on datacenter IPs still refuses (a bot-check page or dropped connections), it switches to Apify residential proxy in Australia for the rest of the run and the request is tried again (Use residential proxy where needed, on by default).
SUMMARY.perRetailer.*.proxyshows which proxy each supermarket used. - A Woolworths search that finds nothing from a datacenter IP is repeated once from a residential IP, because Woolworths searches datacenter visitors more strictly (
SUMMARY.perRetailer.woolworths.residentialRetries). - If even that fails, only that query or product ID fails (a free error row with
errorKind: "blocked"or"network", not charged) and the next one is tried. After 3 refused or unreachable requests in a row the supermarket is given up for the rest of the run (its remaining queries get free error rows;SUMMARY.perRetailer.*.givenUpsays why); the other supermarkets continue. - One request never takes more than about 2 minutes per proxy (all retries included), and the run's time-out stop is checked before every retry, so even during an outage the run ends cleanly with its
SUMMARYbefore the run timeout.
You can also pick Residential + Australia in the proxy settings to use residential IPs from the start, or your own proxies.
FAQ
Do I need a Coles, Woolworths or ALDI account? No. The Actor reads the public product data that the websites show to every visitor. It never logs in.
How do I find a product ID?
It's the number at the end of the product page URL: woolworths.com.au/shop/productdetails/888140/... gives woolworths:888140, coles.com.au/product/...-8150288 gives coles:8150288, aldi.com.au/product/...-000000000000398689 gives aldi:398689. You can also paste the product URL into the URL field.
Why is a multibuy product's wasPrice empty?
Multibuys don't reduce the single-item price. The deal is in multibuyQuantity and multibuyPrice (e.g. 2 for $9.40), and the per-item deal price is multibuyPrice / multibuyQuantity.
How do I compare the same product across supermarkets?
Search the same query at all three and sort by unitPrice within the same unitOfMeasure. Where barcodes are available (Woolworths' own products, and Coles when you check product IDs or product URLs), you can match identical branded products by barcode.
Why do Woolworths and Coles names include the size but ALDI's don't always?
The name is the title each supermarket shows. Woolworths and Coles add brand and size; ALDI shows the brand separately (brand). The pack size is always in size.
How often should I run it? Coles and Woolworths start their weekly specials on Wednesdays, and ALDI releases Special Buys on Wednesdays and Saturdays, so a daily schedule (or Wednesday and Saturday) suits specials alerts. For price research, daily or weekly runs of a fixed basket work well.
What happens if one supermarket fails?
The others still run. The failure and its reason are in a free error row, in the SUMMARY record (perTarget[].error, errorKind) and in the run's status message. Queries that fail are not charged; rows already returned before an error are. The run is marked failed only when nothing at all could be returned because of a problem on our side or at the supermarket (for example every request blocked). Mistakes in the input (an unknown URL, a product ID that doesn't exist, a search without results) give a successful run with error rows.
Why did a Woolworths search return nothing although Woolworths' website shows products?
For some searches that match nothing, Woolworths answers with unrelated products (a search for a made-up word returned hay-fever tablets and roof racks). The Actor checks that your search words appear in a product's name, brand, category or description (all of them for 1 or 2 words, two thirds for longer searches); if no product on the first page qualifies, it returns a free "no results" row instead of charging you for unrelated products. The check is forgiving: whole words with common endings folded ("eggs" = "egg", "sliced" = "slices", "dishwasher" = "dishwashing"), joined and split spellings ("weetbix" = "Weet-Bix", "kit kat" = "KitKat"), accents ("nescafe" = "Nescafé") and the typos Woolworths corrects itself all match. Woolworths searches datacenter IPs more strictly than residential ones (it corrects typos such as "vegimite" only for residential visitors), so with the default settings a Woolworths search that finds nothing from a datacenter IP is repeated once from an Australian residential IP (noted in SUMMARY). With Use residential proxy where needed off, such a search returns a "no results" row. If a search you expect to work comes back empty, try the brand's own spelling.
What are Everyday Market items?
Products of other businesses sold through woolworths.com.au. They are priced by the seller, have no barcode and include many non-grocery items. They are left out of searches and categories by default. Turn on Include Woolworths Everyday Market items to get them (marketplace: true, seller). Product IDs you list are always returned.
Can I get nutrition information or ingredients? Not yet. The Actor focuses on prices, specials and unit prices.
Legal
This Actor is not affiliated with, endorsed by or sponsored by Coles, Woolworths or ALDI. It reads only product and price information that the supermarkets publish openly to every visitor of their websites. It does not log in, does not collect personal data and paces its requests politely. You are responsible for how you use the data and for complying with the websites' terms and the laws that apply to you. Coles, Woolworths and ALDI are trademarks of their respective owners and are used here only to describe the data source.