Woolworths Australia prices, specials and unit prices as clean data
Last updated:
Woolworths has no public product API. This Actor collects public catalog data from Woolworths Australia's own product search: shelf price, was-price and specials, and the unit price (per kg, per litre, per 100 g). You give it search terms and get one clean row per product.
What you get
Row from a real run (search term milk):
json
{
"stockcode": "888137",
"name": "Woolworths Full Cream Milk",
"brand": "Woolworths",
"description": "Woolworths Full Cream Milk 2L",
"packageSize": "2L",
"price": 3.4,
"wasPrice": 3.4,
"isOnSpecial": false,
"savingsAmount": 0,
"cupPrice": 1.7,
"cupMeasure": "1L",
"cupString": "$1.70 / 1L",
"isAvailable": true,
"isInStock": true,
"unit": "Each",
"imageUrl": "https://cdn1.woolworths.media/content/wowproductimages/medium/888137.jpg",
"productUrl": "https://www.woolworths.com.au/shop/productdetails/888137/woolworths-full-cream-milk",
"searchTerm": "milk",
"scrapedAt": "2026-10-02T06:14:38.625Z"
}No customer data of any kind is collected.
Use cases
- Price monitoring: track shelf prices and specials for your own or competing products on a schedule.
- Inflation and basket research: collect unit prices for staples over time.
- Competitive pricing: compare specials and savings across brands and ranges.
Run it in the Apify Console (no code)
- Open the Woolworths scraper and click Try for free.
- Enter search terms (
milk,bread,eggs…), a maximum number of items per term, and a sort order. - Click Start, then download CSV, Excel or JSON. Use Apify's Schedules to repeat the run daily.
Run it from code
Replace <owner>/woolworths-au-products with the Actor id shown on its Store page.
Python (apify-client ≥ 3)
python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("<owner>/woolworths-au-products").call(
run_input={"searchTerms": ["milk"], "maxItemsPerSearch": 3, "sortBy": "priceAsc"},
)
for item in client.dataset(run.default_dataset_id).list_items().items:
print(item.get("name"), item.get("price"), item.get("cupString"))
# Woolworths Full Cream Milk 3.4 $1.70 / 1L
# Dairy Farmers Full Cream Milk Full Cream Milk 4.7 $2.35 / 1L
# Woolworths Full Cream Milk 4.95 $1.65 / 1LNode.js (apify-client)
js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('<owner>/woolworths-au-products').call({ searchTerms: ['bread', 'eggs'], maxItemsPerSearch: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((p) => `${p.name}: $${p.price} (${p.cupString})`));curl (one call, results in the response)
bash
curl -s -X POST "https://api.apify.com/v2/acts/<owner>~woolworths-au-products/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"searchTerms":["milk"],"maxItemsPerSearch":3,"sortBy":"priceAsc"}'Limits
- Search terms only. Category browsing is not implemented yet.
categoryUrlsis accepted but has no effect. - Woolworths returns at most 36 items per page. The Actor pages through results up to
maxItemsPerSearch. sortByis applied by the Actor after collection, because Woolworths' own sort parameter had no effect over this interface.- Unavailable or out-of-stock items are dropped unless you set
includeUnavailable: true. - If Woolworths starts blocking requests (403/429), enable Apify Proxy in the input.
Pricing
$1 per 1,000 products ($0.001 per row), pay per event, with no subscription.