Woolworths Australia Scraper - Prices, Specials and Barcodes
Pricing
Pay per event
Woolworths Australia Scraper - Prices, Specials and Barcodes
Scrape the Woolworths Australia grocery catalogue: product name, brand, AUD price, was-price, unit price, specials, barcode/GTIN, pack size, stock and image. Search by keyword, look products up by barcode, browse a department or read full detail by stockcode.
Pricing
Pay per event
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Woolworths Australia Scraper
Pull the Woolworths Australia grocery catalogue as clean rows: product name, brand, AUD price, was-price, unit price, specials, barcode, pack size, stock status and image. Search by keyword, look products up by barcode or GTIN, browse a whole department, or read the full record including ingredients, nutrition panel and Health Star Rating.
{"operation": "search","queries": ["tim tam", "vegemite"],"specials_only": true,"sort_by": "unit_price_asc","max_results": 200}
Four things it does
| Operation | What you give it | What you get |
|---|---|---|
| Search by keyword | Search terms | The catalogue rows for each term, tagged with the term that found them |
| Look up by barcode | EAN-13, UPC-A or GTIN codes | The Woolworths product for each code, or an explicit "not stocked" |
| Product detail | Woolworths stockcodes | The full record: ingredients, nutrition, allergens, Health Star Rating, storage |
| Browse a category | A department name such as fruit-veg | Everything Woolworths lists in it |
Barcode lookup, and the trap it avoids
This is the part worth reading before you use anything else for it.
Woolworths takes a barcode as a search term. For a barcode it stocks, you get exactly one product:
9310072000282→ Arnott's Tim Tam Original Chocolate Biscuits 200g, $6.00
For a barcode it does not stock, it does not tell you. It quietly falls back to listing the catalogue, over a million rows headed by "Cavendish Bananas each". Both answers are an HTTP 200 carrying real products. Anything that reads the first row hands you a banana for a German chocolate GTIN and gives you no reason to doubt it.
So every lookup here is settled by comparing the code you asked for against
the barcode on the rows that came back. A code with no exact match comes back
as found: false with not_found_reason, never as a substitute product. Short
codes are left-padded, so a 12-digit US UPC matches the 13-digit GTIN
Woolworths actually stores.
The same care applies to stockcodes. A stockcode that never existed returns a
404, but a withdrawn one returns HTTP 200 with a blank name and a price of
zero. That comes back as found: false too, rather than as a real product that
costs nothing.
What comes back
| Field | What it is |
|---|---|
stockcode | Woolworths' own product id. Stable, use it to join runs |
name, brand, package_size, unit | The product |
barcode, gtin_format | Its barcode, normally a 13-digit GTIN |
price, currency | Current price in AUD |
was_price, savings_amount, is_on_special, is_half_price | The promotion |
unit_price, unit_measure, unit_price_label | Price per 100g, per litre and so on |
is_available, is_in_stock, supply_limit | Whether you can actually buy it |
is_sponsored | True when Woolworths served the row as a paid placement |
image, url, description | |
query, position | Which term found it, and where it ranked |
With Add ingredients and nutrition turned on, each row also gets
ingredients, nutrition, country_of_origin, health_star_rating,
allergen_statement, allergens_may_be_present, contains_gluten,
contains_nuts, department, aisle, storage_instructions and
product_warnings. That costs one extra request per product.
A note on price: Woolworths sends 0 both for "this product has no price
right now" and for a withdrawn record. A zero in a price column quietly wins
every cheapest-supplier comparison built on top of it, so those come back
null.
A note on was_price: Woolworths fills it with the current price when
nothing is on promotion. Passed through, that invites you to compute a 0%
saving on a product that was never discounted, so it is dropped unless it is
actually higher than the price.
The filters, and what we saw them do
- On special only — Woolworths applies it. On "chocolate", 36 of 44 rows came back on special with it on, against 14 of 44 with it off.
- Sort order — Woolworths applies it, and it visibly holds: the same search opened at $0.89 sorted price-ascending and at $1,298.99 price-descending. Unit-price sorting is the interesting one for grocery, because it is the only honest way to compare a 165g pack against a 200g one.
Volume
A catalogue page carries about 36 products, and paging is real: pages 1, 2, 5
and 10 of the same search all returned different products, out of 2,206
available for "milk". max_results is the total across all your terms and
max_pages caps how deep each term goes.
Not included
There is no store locator. Woolworths' store endpoint answered with an error on every shape tried, so there is no per-store pricing or stock here. Prices are the national online ones.
Free plan
Free Apify accounts get 10 results per run. Paid plans are uncapped. On a free run the Actor stops after one page instead of paging through a catalogue it is not allowed to deliver.