# Woolworths Product Scraper - AU Shelf Prices, Specials & GTINs (`tenfoldfleet/woolworths-product-scraper`) Actor

Get Woolworths Australia product prices for any search term, barcode, product URL or category and specials page: shelf price, was price, unit price, half-price and multibuy deals, stock, GTIN barcode, brand and category. $1.50 per 1,000 products; empty searches and errors are free.

- **URL**: https://apify.com/tenfoldfleet/woolworths-product-scraper.md
- **Developed by:** [Tenfold Fleet](https://apify.com/tenfoldfleet) (community)
- **Categories:** E-commerce, Agents, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.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

### What does Woolworths Product Scraper do?

**Woolworths Product Scraper** collects **product and price data from Woolworths Australia** (woolworths.com.au) for any **search term, GTIN barcode, stockcode, product page URL or category and specials page** (a whole aisle, the half-price list or every special at once). Each row has the **shelf price, was price, savings, unit price (cup price), special and multibuy deal, stock status, GTIN barcode, brand, pack size, department and category** and links to the product page and image.

It works like a **Woolworths product API**: it reads the same public search JSON the Woolworths website loads in your browser. Plain HTTP, no browser, no login and no proxy by default, so runs are fast and cheap enough to schedule every day. **$1.50 per 1,000 products**, with no start fee and no per-search fee.

Not affiliated with, endorsed or sponsored by Woolworths Group.

### Why scrape Woolworths prices?

- **Price monitoring**: track the shelf price and unit price of your own products or a competitor's basket, daily or weekly.
- **Weekly specials catalogue**: paste `https://www.woolworths.com.au/shop/browse/specials` to get every product on the half-price, lower-shelf-price, everyday-low-price, seasonal, online-only and Buy More Save More lists in one run, or one list such as `/shop/browse/specials/half-price`.
- **Specials tracking by keyword**: list every product on special for a keyword, including **half price**, **% off** and **multibuy deals** such as "2 for $6.00".
- **Whole categories**: scrape a full aisle or department, e.g. `/shop/browse/dairy-eggs-fridge/cheese` (about 440 products).
- **Competitor and category analysis**: compare brands, pack sizes and price per litre or per kg across a category.
- **FMCG and retail analytics**: build share-of-shelf and promotion-frequency datasets by department and category.
- **Barcode price lookup**: paste a list of EAN/GTIN barcodes and get the current Woolworths price for each one.
- **Product data enrichment**: add Woolworths stockcodes, images and categories to your own product catalogue.

What makes it different:

- **GTIN barcode and unit price included** for the range Woolworths sells itself, plus department, category and subcategory. Third-party Everyday Market items, which often have no barcode, can be switched off.
- **Keywords, barcodes, product URLs and category pages in one list**: barcode, stockcode and product URL lookups are exact matches only, so a lookup never returns look-alike products.
- **Sponsored ads removed.** Woolworths puts the same paid tiles on top of every results page; they are dropped and never charged.
- **Clean special flags**: `wasPrice` and `savingsAmount` are only filled for a real price cut (Woolworths repeats the shelf price as the "was" price on regular items), and multibuy deals count as specials with their own quantity and deal price.
- **Free failures**: empty searches, unknown barcodes and blocked requests cost nothing.

### What data can it extract?

| Field | Example |
|---|---|
| `stockcode`, `barcode` | `155909`, `9310036070382` (GTIN/EAN) |
| `name`, `brand`, `packageSize`, `unit` | `Pauls Zymil Lactose Free Full Cream Milk 3L`, `Pauls`, `3L`, `Each` |
| `price`, `instorePrice` | `8.95`, `8.95` (AUD) |
| `wasPrice`, `savingsAmount` | `9.8`, `0.85` (only when the price is cut) |
| `cupPrice`, `cupMeasure`, `cupString` | `2.98`, `1L`, `$2.98 / 1L` |
| `isOnSpecial`, `isHalfPrice`, `promoText` | `true`, `false`, `Special \| Save $0.85` |
| `multibuyQuantity`, `multibuyPrice` | `2`, `6` for a "2 for $6.00" deal |
| `isInStock`, `isMarketplace` | `true`, `false` (Everyday Market third-party seller) |
| `department`, `category`, `subcategory` | `FRESH CONVENIENCE`, `DAIRY - MILK`, `DAIRY - SPECIALTY MILK` |
| `imageUrl`, `productUrl` | large product image, link to the product page |
| `searchTerm`, `position`, `totalResults` | your search, rank in the organic results, results Woolworths found |
| `scrapedAt` | `2026-10-23T11:36:15.121Z` |

### How to scrape Woolworths products

1. Click **Try for free**.
2. Enter one or more **Search terms, barcodes or Woolworths URLs**, one per line: keywords like `milk` or `tim tam`, GTIN barcodes like `9310036070382`, stockcodes, product page links, or category and specials page links copied from the menu on woolworths.com.au.
3. Set **Max products per search** (default 200; use a large number such as 3000 for the full result list).
4. Optionally pick **Sort by**, turn on **Only specials**, or turn off **Include out-of-stock products** or **Include marketplace sellers**.
5. Click **Start**, then download the products as **JSON, CSV, Excel or HTML**, or read them through the Apify API.

### How much does it cost?

You pay **$0.0015 per product** saved, which is **$1.50 per 1,000 products**. There is no fee per search and no start fee apart from Apify's $0.00005 Actor start event, so a barcode lookup costs about $0.0015. **Sponsored tiles, duplicate products, searches with no results, unknown barcodes and blocked requests are free**: they appear as rows with an `error` field and are never charged. For example, the whole half-price list (about 1,700 products) costs about $2.55. On the Apify free plan, the $5 monthly credit covers about 3,300 products. Set a **maximum cost per run** and the Actor stops as soon as it is reached.

### Input

```json
{
    "searchTerms": ["milk", "tim tam", "9310036070382", "https://www.woolworths.com.au/shop/browse/specials/half-price"],
    "maxProductsPerSearch": 200,
    "sortBy": "relevance",
    "onlySpecials": false,
    "includeOutOfStock": true,
    "includeMarketplace": true
}
```

`sortBy` is one of `relevance`, `priceAsc`, `priceDesc` or `name`.

### Output example

```json
{
    "stockcode": 772309,
    "barcode": "9342584049770",
    "name": "Oak Chocolate Flavoured Milk 600mL",
    "brand": "Oak",
    "price": 4.2,
    "wasPrice": null,
    "savingsAmount": null,
    "cupPrice": 7,
    "cupMeasure": "1L",
    "cupString": "$7.00 / 1L",
    "isOnSpecial": true,
    "isHalfPrice": false,
    "promoText": "Buy More Save More | 2 for $6.00 - $5.00/1L",
    "multibuyQuantity": 2,
    "multibuyPrice": 6,
    "isInStock": true,
    "instorePrice": 4.2,
    "packageSize": "600mL",
    "unit": "Each",
    "rating": null,
    "reviewCount": 0,
    "department": "FRESH CONVENIENCE",
    "category": "DAIRY - MILK",
    "subcategory": "MILK - FLAVOURED",
    "isMarketplace": false,
    "imageUrl": "https://cdn0.woolworths.media/content/wowproductimages/large/772309.jpg",
    "productUrl": "https://www.woolworths.com.au/shop/productdetails/772309/oak-chocolate-flavoured-milk",
    "searchTerm": "milk",
    "position": 190,
    "totalResults": 2681,
    "scrapedAt": "2026-10-23T11:36:18.322Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Tips

- **Monitoring a fixed list of products?** Put their barcodes or stockcodes in **Search terms**. Each one is a single quick request, and you pay only for the products found.
- **Only want deals?** Turn on **Only specials**. Woolworths filters the results itself, so a run over hundreds of keywords stays small.
- **Schedule it**: create a task with your keywords and run it daily or weekly from the **Schedules** tab to build a price history.
- Woolworths reports at most 10,000 results for one search. For very broad words, use more specific keywords (e.g. `full cream milk 2l` instead of `milk`).
- Prices are the online prices Woolworths shows without a selected store; `instorePrice` is the in-store price it reports alongside.
- Product reviews and Everyday Rewards member prices are not collected, and personal pages such as "My Specials" (which need a login) are skipped. The `rating` and `reviewCount` fields are filled only when Woolworths includes ratings in its search data; for most products it does not, so expect `null` and `0`.

### Use it with AI agents (MCP)

Give Claude, ChatGPT, Cursor or any MCP client this Actor as a tool through Apify's MCP server: add `https://mcp.apify.com?tools=tenfoldfleet/woolworths-product-scraper` as a remote MCP server and sign in with your Apify account. The agent fills in the input, runs the Actor and reads the results itself; you pay the same per-event price as a normal run.

### FAQ

#### Can I look up a Woolworths price by barcode?

Yes. Enter the GTIN/EAN barcode printed on the pack (for example `9310036070382`) as a search term. You get that one product with its current price, or a free error row if Woolworths does not sell it.

#### Does it include products on special and multibuy deals?

Yes. `isOnSpecial` is true for price cuts, half-price items, and multibuy deals such as "2 for $6.00". `promoText` shows the label from the shelf tag, and `multibuyQuantity` and `multibuyPrice` give the deal terms.

#### Why are there fewer rows than the search results count?

Duplicates and sponsored tiles are removed, and **Max products per search** caps each search. With **Include out-of-stock products** or **Include marketplace sellers** off, those items are skipped too, and skipped items are not charged.

#### Can I scrape a whole category or every special?

Yes. Paste a category link such as `https://www.woolworths.com.au/shop/browse/pantry` or `.../shop/browse/dairy-eggs-fridge/cheese`, or a specials link such as `.../shop/browse/specials/half-price`. The specials group link `.../shop/browse/specials` goes through every specials list in turn, with products that appear on two lists saved once. Set **Max products per search** high enough (e.g. 8000 for every special).

#### Does it need a proxy?

No, not in normal use. If a run reports blocked searches, turn on Apify Proxy in the input and run it again.

#### Does it scrape Coles or Aldi?

No. This Actor only covers Woolworths Australia.

#### Support

Found a problem or need another field? Open an issue in the **Issues** tab.

This Actor reads only publicly available product data from Woolworths search results. It does not log in or use any account (it keeps only the anonymous session cookies the website gives every visitor) and does not collect personal data.

### More tools from Tenfold Fleet

| Actor | Output |
|---|---|
| [ALDI Australia Scraper - AU Products, Unit Prices & Catalogue](https://apify.com/tenfoldfleet/aldi-australia-scraper) | product |
| [Alibaba Image Search - Reverse Lookup of Suppliers by Photo](https://apify.com/tenfoldfleet/alibaba-image-search) | matched product |
| [AliExpress Keyword Scraper - Exact Sold Counts by Search Term](https://apify.com/tenfoldfleet/aliexpress-search-scraper) | product |
| [Amazon Product Scraper - Details, Prices & Search by ASIN](https://apify.com/tenfoldfleet/amazon-product-scraper) | product |
| [ATS Jobs Scraper - Greenhouse, Lever, Ashby & 5 More](https://apify.com/tenfoldfleet/ats-jobs-scraper) | job posting |
| [Backlinks Checker - Referring Domains, Anchors & Domain Rank](https://apify.com/tenfoldfleet/backlinks-checker) | backlink |
| [Bilibili Scraper - Videos, Comments, Danmaku & Search](https://apify.com/tenfoldfleet/bilibili-scraper) | video or comment |
| [Businesses Without Websites - Local Leads with Phone & Rating](https://apify.com/tenfoldfleet/businesses-without-websites) | lead |
| [Contact Details Scraper - One Lead Record per Company Website](https://apify.com/tenfoldfleet/company-contact-finder) | website with contacts |
| [Google Ads Transparency Center Scraper - Competitor Ads by Site](https://apify.com/tenfoldfleet/google-ads-transparency-scraper) | ad |
| [Google AI Overviews Checker - Citations & Domain Tracker](https://apify.com/tenfoldfleet/google-ai-overviews-checker) | keyword checked |
| [Google Jobs Scraper - Salary, Apply Links & Posting Dates](https://apify.com/tenfoldfleet/google-jobs-scraper) | job listing |
| [Google Keyword Planner Alternative - Ideas, Bids & Volume](https://apify.com/tenfoldfleet/google-keyword-planner) | keyword idea |
| [Google Maps Extractor - Business Leads, Phones & Websites](https://apify.com/tenfoldfleet/google-maps-extractor) | place |
| [Google News Scraper - Articles, Real URLs & Full Text](https://apify.com/tenfoldfleet/google-news-scraper) | article |
| [Google Travel Hotel Rate Tracker - OTA Prices for Every Night](https://apify.com/tenfoldfleet/google-travel-hotel-rate-tracker) | offer |
| [Google Trends Scraper - Interest, Regions & Related Queries](https://apify.com/tenfoldfleet/google-trends-scraper) | keyword |
| [Keyword Ideas & Related Keywords - Difficulty, Volume & CPC](https://apify.com/tenfoldfleet/keyword-ideas) | keyword idea |
| [Keyword Search Volume, CPC & Difficulty Checker (Bulk)](https://apify.com/tenfoldfleet/keyword-search-volume) | keyword with data |
| [Remote Job Board Scraper - Remote Jobs Aggregator, 7 Sites](https://apify.com/tenfoldfleet/remote-jobs-aggregator) | unique remote job |
| [SEEK Job Scraper - Australia, NZ, Jobstreet & JobsDB](https://apify.com/tenfoldfleet/seek-job-scraper) | job listing |
| [SEO Audit Tool - Technical On-Page SEO Checker & Score](https://apify.com/tenfoldfleet/seo-audit-tool) | page audit |
| [SEO Competitor Keywords - Domain Ranked Keywords & Keyword Gap](https://apify.com/tenfoldfleet/seo-competitor-keywords) | keyword |
| [Shopify Inventory Scraper - SKUs, Variants & In-Stock Status](https://apify.com/tenfoldfleet/shopify-products-scraper) | product |
| [Shopify App & Theme Detector - Store Analyzer & Contacts](https://apify.com/tenfoldfleet/shopify-store-analyzer) | shopify store |
| [Sitemap URL Extractor - All URLs from sitemap.xml & robots.txt](https://apify.com/tenfoldfleet/sitemap-url-extractor) | url |
| [Technology Detector - Wappalyzer & BuiltWith Alternative](https://apify.com/tenfoldfleet/tech-stack-detector) | website |
| [URL to Markdown - Web Page to LLM-Ready Text for AI Agents](https://apify.com/tenfoldfleet/url-to-markdown) | page |
| [Website Traffic Checker - Bulk Domain Traffic Estimate](https://apify.com/tenfoldfleet/website-traffic-checker) | domain with traffic data |
| [Workday Jobs Scraper - myworkdayjobs.com API with Salary](https://apify.com/tenfoldfleet/workday-jobs-scraper) | job posting |
| [YouTube Channel Email Scraper - Creator Contact Extractor](https://apify.com/tenfoldfleet/youtube-channel-email-scraper) | channel with email |
| [YouTube Livestream & Channel Scraper - Videos, Likes & Stats](https://apify.com/tenfoldfleet/youtube-channel-scraper) | video |
| [YouTube Comments Scraper - Replies, Likes & Sort by Newest](https://apify.com/tenfoldfleet/youtube-comments-scraper) | comment |
| [YouTube Shorts Analytics Scraper - Views, Likes & Hashtags](https://apify.com/tenfoldfleet/youtube-shorts-scraper) | short |
| [YouTube Captions Downloader - Transcript & Subtitles Scraper](https://apify.com/tenfoldfleet/youtube-transcript-scraper) | transcript |

# Actor input Schema

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

One per line. A keyword ("milk", "tim tam") returns the products Woolworths shows for that search. A GTIN/EAN barcode ("9310036070382"), a stockcode ("155909") or a product page URL (https://www.woolworths.com.au/shop/productdetails/155909/...) returns that one product, exact matches only. A category or specials page URL from the site menu (https://www.woolworths.com.au/shop/browse/dairy-eggs-fridge/cheese, .../shop/browse/specials/half-price, or .../shop/browse/specials for every specials list) returns every product on that page.

## `maxProductsPerSearch` (type: `integer`):

How many products to save for each keyword or category page. Woolworths shows 36 per page; set a large number (e.g. 3000) to get the full list. Barcode, stockcode and product URL lookups always return one product. On the Apify free plan, the $5 monthly credit covers about 3,300 products.

## `sortBy` (type: `string`):

Order of the results, the same options as the sort menu on woolworths.com.au.

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

Return only products on special: price cuts, half price and multibuy deals such as "2 for $6.00". Works for keywords and category pages.

## `includeOutOfStock` (type: `boolean`):

Turn off to save only products that are in stock online (out-of-stock products are skipped and not charged).

## `includeMarketplace` (type: `boolean`):

Turn off to skip Everyday Market products sold by third-party sellers and keep only the range Woolworths sells itself (skipped products are not charged). Marketplace products often have no barcode or unit price.

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

Optional. Not needed in normal use: requests go straight to Woolworths. Turn on Apify Proxy only if your runs report blocked searches.

## Actor input object example

```json
{
  "searchTerms": [
    "milk",
    "tim tam",
    "9310036070382",
    "https://www.woolworths.com.au/shop/browse/specials/half-price"
  ],
  "maxProductsPerSearch": 50,
  "sortBy": "relevance",
  "onlySpecials": false,
  "includeOutOfStock": true,
  "includeMarketplace": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# 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",
        "tim tam",
        "9310036070382",
        "https://www.woolworths.com.au/shop/browse/specials/half-price"
    ],
    "maxProductsPerSearch": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tenfoldfleet/woolworths-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",
        "tim tam",
        "9310036070382",
        "https://www.woolworths.com.au/shop/browse/specials/half-price",
    ],
    "maxProductsPerSearch": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("tenfoldfleet/woolworths-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",
    "tim tam",
    "9310036070382",
    "https://www.woolworths.com.au/shop/browse/specials/half-price"
  ],
  "maxProductsPerSearch": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call tenfoldfleet/woolworths-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tenfoldfleet/woolworths-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/waNtOirWd982Wrfek/builds/NKCm8MfpgWqwfw77m/openapi.json
