# Woolworths AU Product & Price Scraper (`architekture/woolworths-au-product-scraper`) Actor

Search Woolworths Australia products by keyword, category or stockcode. Prices, specials, unit prices, stock status, barcodes, nutrition and ingredients. Fast JSON API, no browser.

- **URL**: https://apify.com/architekture/woolworths-au-product-scraper.md
- **Developed by:** [Architekture Studio](https://apify.com/architekture) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Woolworths AU Product & Price Scraper

Extract product data from **Woolworths Australia** (woolworths.com.au) — prices, specials, half-price deals, unit prices, stock status, barcodes, nutrition, ingredients and allergens. Search by keyword, scrape whole categories, or look up specific stockcodes.

Built on Woolworths' own JSON endpoints. No headless browser, so runs finish in seconds and cost a fraction of browser-based scrapers.

### What you get

| Field | Example |
|---|---|
| `stockcode` | `6052122` |
| `name` | `Shake 2 Go Protein Liquid Recharge Milk Chocolate 350mL` |
| `brand` | `Shake 2 Go` |
| `price` / `wasPrice` / `savingsAmount` | `3.5` / `4.0` / `0.5` |
| `isOnSpecial` / `isHalfPrice` / `isEdrSpecial` | `true` |
| `cupPrice` / `cupString` | `10` / `$10.00 / 1L` |
| `packageSize` / `unit` | `350mL` / `Each` |
| `isInStock` / `isAvailable` / `isRanged` | `true` |
| `barcode` | `9324401000829` (GTIN) |
| `imageSmall` / `imageMedium` / `imageLarge` | CDN URLs |
| `url` | Product page |

With **Fetch full product details** on, you also get `ingredients`, `allergenStatement`, `allergenContains`, `healthStarRating`, `countryOfOrigin`, `servingSize`, `servingsPerPack`, `department`, `aisle`, `ratingAverage`, `ratingCount` and a full `nutrition` table (per serving and per 100g/100mL).

### Use cases

- **Price monitoring** — track Woolworths prices daily, catch half-price and Everyday Rewards specials.
- **Competitor benchmarking** — compare against Coles, Aldi, IGA on identical barcodes.
- **Grocery apps & shopping lists** — current prices and stock for any product.
- **Nutrition & dietary datasets** — ingredients, allergens, health star ratings at scale.
- **Market research** — category-wide catalogue snapshots (fruit & veg, dairy, pantry, etc.).

### Input

```json
{
  "searchTerms": ["milk", "weet-bix"],
  "categoryUrls": ["https://www.woolworths.com.au/shop/browse/fruit-veg"],
  "stockcodes": ["6052122", "https://www.woolworths.com.au/shop/productdetails/888138/..."],
  "maxItemsPerQuery": 100,
  "onlySpecials": false,
  "includeDetails": false,
  "sortType": "TraderRelevance"
}
```

Any of `searchTerms`, `categoryUrls` or `stockcodes` can be used alone or together. Duplicates across sources are removed.

- `maxItemsPerQuery` — cap per search term / category (`0` = everything).
- `onlySpecials` — only return products currently on special.
- `includeDetails` — one extra request per product for nutrition/ingredients. Stockcode lookups always return full details.
- `sortType` — `TraderRelevance`, `PriceAsc`, `PriceDesc`, `Name`, `CUPAsc`, `CUPDesc` (unit price).

#### Category URLs

Paste any browse URL from the site. Both full URLs and paths work:

```
https://www.woolworths.com.au/shop/browse/dairy-eggs-fridge/milk
/shop/browse/pantry/breakfast-cereals
```

### Output example

```json
{
  "stockcode": 6052122,
  "name": "Shake 2 Go Protein Liquid Recharge Milk Chocolate 350mL",
  "brand": "Shake 2 Go",
  "price": 3.5,
  "wasPrice": 3.5,
  "isOnSpecial": false,
  "cupPrice": 10,
  "cupString": "$10.00 / 1L",
  "packageSize": "350mL",
  "isInStock": true,
  "barcode": "9324401000829",
  "url": "https://www.woolworths.com.au/shop/productdetails/6052122/shake-2-go-protein-liquid-recharge-milk-chocolate",
  "source": "search",
  "searchTerm": "milk"
}
```

### Pricing

Pay per result. `product` = one row from search or category browsing. `product-detail` = one row with full nutrition/ingredient data. No charge for failed requests.

### Proxies

Woolworths blocks most datacenter IPs. The default proxy configuration uses Apify residential proxies with an Australian exit. Leave it as is unless you have your own AU residential proxies.

### Reliability

- Sessions are warmed up on the Woolworths homepage before any API call and rotated automatically on block.
- Browser TLS fingerprint impersonation (Chrome / Edge / Safari).
- Every result is normalised to the same schema regardless of source (search, category, stockcode).
- A product that disappears from Woolworths is reported in the log as *not found*, not silently dropped.

### Integrations & API

Run from the Apify API, schedule it, or push results to Google Sheets, webhooks, Make, Zapier, n8n. Works as an MCP tool for AI agents — inputs are plain keywords and URLs.

### Legal

Scrapes publicly available product listings only. No login, no personal data. Review Woolworths' terms and your local laws before commercial use.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search, e.g. "milk", "weet-bix". One result set per term.

## `categoryUrls` (type: `array`):

Woolworths browse URLs, e.g. https://www.woolworths.com.au/shop/browse/fruit-veg or /shop/browse/dairy-eggs-fridge/milk

## `stockcodes` (type: `array`):

Specific products to fetch: stockcodes (e.g. 6052122) or product URLs. Always returns full detail (nutrition, ingredients).

## `maxItemsPerQuery` (type: `integer`):

Cap results per term or category. 0 = no cap.

## `onlySpecials` (type: `boolean`):

Return only products currently on special.

## `includeDetails` (type: `boolean`):

Also fetch nutrition, ingredients, allergens, health star rating for every result. One extra request per product (charged as product-detail).

## `sortType` (type: `string`):

Woolworths sort order

## `proxyConfiguration` (type: `object`):

Woolworths blocks most datacenter IPs. Residential AU proxies recommended.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "maxItemsPerQuery": 100,
  "onlySpecials": false,
  "includeDetails": false,
  "sortType": "TraderRelevance",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Scraped items in the default dataset (one JSON object per row).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "milk"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("architekture/woolworths-au-product-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["milk"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("architekture/woolworths-au-product-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "milk"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}' |
apify call architekture/woolworths-au-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,architekture/woolworths-au-product-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Iq2kdQdR7cstG4Hy0/builds/75v9mhf6dSKNv5bPB/openapi.json
