Woolworths AU Scraper — Prices, Specials, Barcodes
Pricing
from $1.50 / 1,000 products
Woolworths AU Scraper — Prices, Specials, Barcodes
Woolworths Australia (woolworths.com.au) scraper: product name, brand, size, price, was price, savings, specials, unit price, barcode, stock flags, image, URL; detail rows add ingredients, allergens, nutrition, health star rating, origin. Keyword, category or stockcode. Pay per result, no login.
Pricing
from $1.50 / 1,000 products
Rating
0.0
(0)
Developer
architek.earth
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Security
Limited permissionsShare

Recorded run: 5 products from 1 search term in 11 seconds (2026-10-22, build 1.0.11, run fHvMFNaIggxgpvS45). A bounded canary sample, not a full-catalogue benchmark.
architek.earth — an independent data studio. Pay-per-result scrapers with recorded runs, published canaries and stable schemas, built for people and AI agents.
Woolworths Australia product prices, specials, unit prices, barcodes, ingredients and nutrition from woolworths.com.au, by keyword, category URL or stockcode.
| Source | Market | From | Standout fields |
|---|---|---|---|
| Woolworths (woolworths.com.au) | Australia | $1.50 / 1,000 products | price / wasPrice, cupPrice, barcode, nutrition |
✅ Why choose this scraper
Woolworths prices and specials in one row
price, wasPrice, savingsAmount, isOnSpecial, isHalfPrice and isEdrSpecial come back together on every product row, with instorePrice and instoreIsOnSpecial alongside.
Woolworths unit prices for pack-size comparison
cupPrice, cupMeasure and cupString (for example "$9.90 / 1L") are on basic rows, next to packageSize.
Woolworths barcodes on basic rows
barcode (GTIN) is returned on search and category rows without a detail request; the 2026-10-22 canary row carried "9300662892908".
Woolworths ingredients, allergens and nutrition
With includeDetails: true or a stockcode, rows add ingredients, allergenContains, allergenStatement, nutrition (per serving and per 100 g/mL), healthStarRating, countryOfOrigin and 10 more fields: 45 product fields on detail rows, 29 on basic rows.
Measured on a schedule
A canary task runs a fixed milk search on the live site and records rows, inputs and seconds; the hero line above is its latest green run.
⚠️ Worth knowing up front
- There is no store, postcode or delivery-area selector. Prices are the public online catalogue, not a quote for a specific shop.
isAvailable,isInStockandsupplyLimitare passed through from Woolworths. They are not store stock counts.ingredients,allergenContains,nutrition,department,category,aisle, ratings and the other detail fields come only on detail rows and can be null;nutritionis an empty array when Woolworths publishes none. An empty allergen value does not mean the product is allergen-free.- Products are de-duplicated by
stockcodeacross inputs: a product found by an earlier query is not emitted again.maxItemsPerQuerycaps tiles per query before de-duplication, so a run can return fewer rows than the cap. - A category URL that does not match the Woolworths category tree is skipped with a log warning; a stockcode that does not resolve returns no row and is not charged. A search with no matches returns no rows.
- A blocked request is retried 4 times on a fresh session. If it still fails, or the run deadline arrives, the run stops with the rows already delivered and a
PARTIAL,BLOCKEDorTIME_LIMITstatus row. There is no resume state: a rerun starts over and charges again. - The 2026-10-22 canary ran with no proxy input (Apify Proxy's default pool). The input prefill uses Apify residential proxies in AU.
- Blocked runs, invalid input and the run deadline return a free status row (
"recordType": "status") that says what happened.
⚡ Try the example
This actor has no free preview; the example below costs about $0.02 (10 products).
Open the actor's input page, switch to JSON, paste this and start the run:
{"searchTerms": ["milk"],"maxItemsPerQuery": 10,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "AU"}}
Add "onlySpecials": true for discounted products only, or "includeDetails": true for ingredients and nutrition.
⚙️ Input
| Parameter | Type | Default | Description |
|---|---|---|---|
searchTerms | array | — (prefill: ["milk"]) | Keywords such as milk or weet-bix. One collection per term. |
categoryUrls | array | — | Woolworths browse URLs such as https://www.woolworths.com.au/shop/browse/fruit-veg, or the path alone. Every page of the category is walked up to the cap. |
stockcodes | array | — | Numeric stockcodes (6052122) or Woolworths product URLs. Always returns detail rows; stockcodes that do not resolve are not charged. |
maxItemsPerQuery | integer | 100 | Tiles per search term or category. 0 removes the cap. |
onlySpecials | boolean | false | Keep only products on special. Applies to search terms and categories, not to stockcodes. |
includeDetails | boolean | false | Add ingredients, allergens, nutrition and health star rating to search and category rows (one extra request per product, charged as product-detail; a failed lookup keeps the basic row at the product price). |
sortType | select | TraderRelevance | TraderRelevance, PriceAsc, PriceDesc, Name, CUPAsc (unit price low to high), CUPDesc. |
proxyConfiguration | proxy | — (prefill: residential AU) | Proxy settings. API callers should pass them explicitly. |
feedback | string | — | Optional note to the developer: what is missing or wrong. Logged; never changes the output. |
At least one of searchTerms, categoryUrls or stockcodes is required.
🧱 Stable fields
These top-level fields keep the same name and the same kind of value in every release. Fields are only ever added, never renamed or removed, so an n8n, Make, Zapier or spreadsheet pipeline can bind to them.
| Field | Type | Meaning |
|---|---|---|
stockcode | number | Woolworths product ID; the join key within Woolworths. |
name / brand / packageSize | string | Product name, brand and pack-size text. |
price | number, nullable | Current online price in AUD. |
wasPrice / savingsAmount | number, nullable | Reference price and saving in AUD when on special. |
isOnSpecial / isHalfPrice / isEdrSpecial | boolean | Special, half-price and Everyday Rewards special flags. |
cupPrice / cupMeasure / cupString | number / string / string, nullable | Unit price, its basis and the display string. |
isAvailable / isInStock | boolean, nullable | Online availability flags as published. |
barcode | string, nullable | GTIN barcode. |
imageLarge / url | string | Product image and product page. |
source | string | search, category or stockcode. |
searchTerm / categoryUrl | string | The query that produced the row; present only on rows from that kind of query. |
detailStatus | string, nullable | With includeDetails: complete (detail row, product-detail) or unavailable (basic fields kept, charged as product); absent on basic rows. |
recordType | string | "status" on free status rows; absent on product rows. |
Detail rows also carry ingredients, allergenStatement, allergenContains, healthStarRating, lifestyleAndDietary, countryOfOrigin, countryOfOriginLabel, servingSize, servingsPerPack, department, aisle, category, subCategory, ratingAverage, ratingCount and nutrition (an array of {name, perServing, per100g}). Other fields are extras, not part of the contract. To have one pinned, open an issue on the actor's Issues tab.
📦 Output example
Abridged real row from run fHvMFNaIggxgpvS45 on 2026-10-22; values are a historical snapshot.
{"stockcode": 6073909,"name": "Full+ On The Go Meal Replacement Chocolate 480mL","brand": "Full+","price": 4.75,"wasPrice": 5.95,"savingsAmount": 1.2,"isOnSpecial": true,"isHalfPrice": false,"isEdrSpecial": false,"cupPrice": 9.9,"cupMeasure": "1L","cupString": "$9.90 / 1L","packageSize": "480mL","isAvailable": true,"isInStock": true,"barcode": "9300662892908","url": "https://www.woolworths.com.au/shop/productdetails/6073909/full-on-the-go-meal-replacement-chocolate","source": "search","searchTerm": "milk"}
A free status row looks like this:
{"recordType": "status","status": "INVALID_INPUT","message": "Provide at least one of searchTerms, categoryUrls or stockcodes."}
🧠 Advanced usage
Woolworths specials this week
Schedule a few categoryUrls weekly with onlySpecials: true and filter isHalfPrice for half-price items; wasPrice and savingsAmount give the discount. Check the run's status message ends with (COMPLETE) before treating the list as finished.
Track Woolworths price changes daily
Run the same keywords or categories every day and diff price, wasPrice and cupPrice by stockcode between datasets.
Compare Woolworths with Coles and ALDI by barcode
Join barcode with gtin from the Coles Scraper's detail rows. ALDI does not publish barcodes, so match ALDI on normalised name plus packageSize and treat those matches as candidates.
Build a Woolworths nutrition dataset for one department
Pass one category URL with includeDetails: true and maxItemsPerQuery: 0; each row carries ingredients, nutrition and healthStarRating, charged as product-detail.
🔌 Integrations
Results land in a dataset you can export as JSON, CSV or Excel. They can also flow to Google Sheets, Make, Zapier or n8n, or to a webhook when a run finishes. The Apify Scheduler runs it on a timetable. Weekly on specials catches each promotion cycle; daily suits price tracking. Copy-paste code in Python, Node, curl and n8n: architek-earth/examples/woolworths-au-product-scraper.
💸 Pricing
Pay per result. Platform and proxy usage are included. Status rows, failed requests and blocked pages are free.
| Event | Price | What it covers |
|---|---|---|
product | $1.50 / 1,000 products | One delivered search or category row with price, specials, unit price and barcode, including a row kept with basic fields (detailStatus: "unavailable") when its detail lookup failed. |
product-detail | $4.00 / 1,000 products | One delivered row with details (detailStatus: "complete") from includeDetails or stockcodes. |
1,000 basic rows cost $1.50; 1,000 detail rows cost $4.00. A detail row is charged once, as product-detail only.
❓ FAQ
Is there a Woolworths API for product prices? This actor is one: it returns Woolworths catalogue data as JSON through the Apify API, callable from any language or from n8n, Make and Zapier.
How do I scrape Woolworths prices by postcode or store? You can't with this actor. It has no store or postcode selector and returns the public online catalogue.
Can I get Woolworths half-price specials? Yes. Set onlySpecials: true on a search or category and keep rows where isHalfPrice is true.
Can I get Woolworths barcodes (GTIN/EAN)? Yes, on every row where Woolworths publishes one, without a detail request. barcode can be null.
Can I get Woolworths nutrition information and ingredients? Yes, on detail rows: set includeDetails: true or pass stockcodes. You get nutrition, servingSize, ingredients, allergenContains and healthStarRating when Woolworths publishes them.
Do I need a Woolworths account or login? No. No account, cookies or API key from Woolworths.
🤖 For AI agents & LLM apps
Paste this into your AI assistant:
architekture/woolworths-au-product-scraper on Apify. Python: from apify_client import ApifyClient; client = ApifyClient("TOKEN"); run = client.actor("architekture/woolworths-au-product-scraper").call(run_input={"searchTerms": ["milk"], "maxItemsPerQuery": 10, "proxyConfiguration": {"useApifyProxy": True, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "AU"}}); items = client.dataset(run["defaultDatasetId"]).list_items().items (page with offset/limit for large exports). Rows with recordType == "status" are free and explain blocked or invalid inputs. Full input schema and README: GET https://api.apify.com/v2/acts/architekture~woolworths-au-product-scraper/builds/default. Token: https://console.apify.com/settings/integrations. The actor is also reachable through the Apify MCP server (mcp.apify.com). To reach the maintainers, open an issue on the actor's Issues tab or email north@architek.earth.
🧰 More from architek.earth
Grocery and retail prices
- Coles Scraper — prices, unit prices, specials, barcodes
- Woolworths AU Scraper — you are here
- ALDI AU Scraper — prices, unit prices, Special Buys
- Woolworths NZ Scraper — prices, club prices, specials
- New World NZ Scraper — store prices, Clubcard offers, promotions
- Pak'nSave Scraper — store prices, unit prices, promotions
- Tesco UK Scraper — prices, Clubcard offers, barcodes
- Sainsbury's Scraper — prices, unit prices, offers, barcodes
- ALDI Ireland Scraper — prices, unit prices, Specialbuys
- Dunnes Stores Scraper — fashion and home prices, sizes, EANs
- Mercadona Scraper — prices, unit prices, categories
Full catalogue: github.com/architek-earth.
architek.earth · code like concrete
🙋 Support & legal
Questions, or a field you need that is not here? Open an issue on the actor's Issues tab or email north@architek.earth. A human replies within a day.
This actor collects only publicly available data from woolworths.com.au, the same pages any visitor sees without logging in. It does not bypass authentication. It is not affiliated with or endorsed by Woolworths. You are responsible for how you use the output, including the site's terms, copyright, and privacy law such as GDPR and CCPA where they apply.
📝 Changelog
- 2026-10-24 — Studio core 1.0.5, with blocks handled as before: a Woolworths HTTP 403 or 429 is retried on a fresh session (new cookies and warm-up) up to four tries per request before the run reports
BLOCKEDwith a free status row, and output fields and prices are unchanged. - 2026-10-22 — A note in the status message now sits inside the parentheses:
Done: N rows, M details, K status rows (STATUS; note). - 2026-10-22 — Runs on the studio's shared core: one Chrome identity for every request; a challenge page served instead of data now stops the run as
BLOCKEDat once; rows are charged as they are saved, so a run whose last row spends the budget exactly endsCOMPLETE; a restarted run never re-delivers or re-charges a product; a run summary (RUN_SUMMARY) is saved in the key-value store; new optionalfeedbackinput. - 2026-10-22 — Status message now reads
Done: N rows, M details, K status rows (STATUS). - 2026-10-22 — A row whose detail lookup failed is now charged at the basic
productprice ($1.50 / 1,000), notproduct-detail, and is markeddetailStatus: "unavailable"; detail rows are markedcomplete. - 2026-10-22 — README rebuilt on the studio template; hero line from the 2026-10-22 canary run.
- 2026-10-21 — Invalid input, blocks and the run deadline now stop cleanly with a free status row instead of a failed run; the spending limit stops the run cleanly.
- 2026-10-12 — Published on Apify Store. Output schema added; pay-per-event pricing (
product,product-detail).