# Woolworths Scraper - Prices, Specials, Barcodes & Nutrition (`topapi/woolworths-scraper`) Actor

Scrape Woolworths Australia by search, category, specials, stockcode or barcode: price, was price, unit price, multi-buy, stock, barcode, ingredients, nutrition, ratings. Reviews, in-store stock and store directory add-ons. Price monitor. $0.27 per 1,000 products, no start fee.

- **URL**: https://apify.com/topapi/woolworths-scraper.md
- **Developed by:** [Top Api](https://apify.com/topapi) (community)
- **Categories:** E-commerce, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.27 / 1,000 product (or category) rows

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 Scraper do?

**Woolworths Scraper** pulls product data from **woolworths.com.au**, the online store of Woolworths Supermarkets in Australia. Give it search terms, Woolworths links, specials groups, stockcodes or barcodes and it returns one row per product: price, was price, unit (cup) price, special and multi-buy deal, stock, barcode, category path, ingredients, allergens, nutrition and customer rating. Brands, category managers, price-comparison apps, nutrition apps and analysts use it to track Australian grocery prices week after week.

Also known as: Woolworths API, Woolies price scraper, Woolworths specials scraper, Australian grocery price scraper.

- 🔎 **Every way in**: keyword search, any category / aisle / specials / search / multi-buy offer link, whole departments, the full catalogue, stockcodes and exact barcodes, all in one run
- 🏷️ **Specials as data**: Half Price, Lower Shelf Price, Everyday Low Price, Seasonal, Buy More Save More and Online Only groups, with was price, saving, % off and the multi-buy deal ("2 for $8.00")
- 🥫 **Product facts on every row**: barcode, ingredients, allergens, dietary claims, Health Star Rating and nutrition per 100 g and per serve, plus ratings with the 1-5 star breakdown
- ➕ **Add-ons**: the product page's nutrition panel, country-of-origin label and aisle; customer reviews; in-store availability at the stores nearest a postcode; the Woolworths store directory; the category tree
- 🔁 **Price monitor**: on a schedule it delivers only new products and price, special or availability changes, with the previous price
- 🔓 **No login, no cookies, no API key**, no browser: it reads the same public pages any visitor opens
- 📤 Export to JSON, CSV, Excel or HTML, or feed Google Sheets, Make, Zapier, n8n, webhooks and AI agents through the API and MCP

### What data can you get from Woolworths?

| | | |
|---|---|---|
| 🔢 Stockcode `stockcode` | 📦 Barcode (EAN) `barcode` | 🏷️ Name, brand, pack size |
| 💲 Price `price` | 🔙 Was price `wasPrice` | 💸 Saving $ and % `savingsPercent` |
| ⚖️ Unit price `unitPriceText` | 📏 Price per kg / litre / item | 🎯 Special type `specialType` |
| 🛍️ Multi-buy `multibuyText` | 🏬 In-store price `instorePrice` | 📊 Stock status `stockStatus` |
| 🔻 Units left `stockQuantity` | 🗂️ Category path `categoryPath` | 🏭 Merchandise hierarchy |
| 🥣 Ingredients `ingredients` | ⚠️ Allergens contains / may contain | 🌱 Dietary claims `lifestyleClaims` |
| ⭐ Health Star Rating | 🧪 Nutrition per 100 g / per serve | 🌟 Rating + 1-5 star counts |
| 🖼️ Images `images` | 🔗 Product link `url` | 🛒 Everyday Market seller (opt-in) |

### How to scrape Woolworths with Woolworths Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) (it comes with monthly free credit).
2. Open **Woolworths Scraper** and go to the **Input** tab.
3. Type search terms (e.g. `milk`), paste Woolworths links, or pick a specials group such as **Half Price**.
4. Set **Max products** and switch on any add-on you need.
5. Click **Start** and wait a few seconds: 100 products take about 7 seconds.
6. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | |
| `searchTerms` | array | Products to search for, e.g. `["milk", "tim tam"]`. A barcode typed here is looked up as a barcode. |
| `startUrls` | array | Woolworths search, category / aisle, specials, multi-buy offer, product or store links. Sort and specials settings in a link are kept. |
| `specials` | array | `halfPrice`, `lowerShelfPrice`, `everydayLowPrice`, `seasonal`, `buyMoreSaveMore`, `bundles`, `onlineOnly` or `all`. |
| `stockcodes` | array | Woolworths product numbers, e.g. `888140`. |
| `barcodes` | array | Exact EAN / GTIN barcodes, e.g. `9300633556150`. |
| `departments` | array | Whole departments, e.g. `dairy-eggs-fridge`, `pantry`. |
| `fullCatalog` | boolean | Every department, duplicates removed. Default `false`. |
| `categoryTree` | boolean | One row per Woolworths category with its id, path and link. Default `false`. |
| `storeDirectory` | boolean | Woolworths supermarkets with address, phone, coordinates, hours and facilities. Default `false`. |
| **🎯 Filters** | | |
| `sortBy` | string | `relevance` (default), `priceAsc`, `priceDesc`, `unitPriceAsc`, `unitPriceDesc`, `nameAsc`, `nameDesc`. |
| `specialsOnly`, `inStockOnly` | boolean | Only specials / multi-buys; only available products. |
| `includeEverydayMarket` | boolean | Include third-party Everyday Market listings. Default `false`. |
| **✂️ Refine results** | | |
| `minPrice`, `maxPrice` | number | Shelf price range in A$. |
| `minDiscountPercent` | integer | e.g. `40` for 40% off or more. |
| `minRating`, `minHealthStarRating` | number | Average customer rating; Health Star Rating. |
| `brands`, `dietary`, `allergenFree`, `excludeCategories` | array | e.g. `["Cadbury"]`, `["Vegan"]`, `["Gluten"]`, `["Beer, Wine & Spirits"]`. |
| **➕ Extra data** | | |
| `includeDetails` | boolean | Product page fields (nutrition panel, serving size, country-of-origin label and %, aisle, health warnings, all images). Add-on. |
| `includeRatings` | boolean | Rating, counts and star breakdown on every row, free. Default `true`. |
| `includeReviews`, `maxReviewsPerProduct`, `reviewSort` | | Customer reviews as their own rows; default 20 per product, newest first. Add-on. |
| `postcodes`, `storeIds` | array | Postcodes (e.g. `0800`) or store numbers (e.g. `1002`): in-store availability at the nearest stores, or the stores for the directory. |
| `inStoreAvailability`, `maxStoresPerProduct` | | One row per product per nearby store. On automatically with postcodes or store numbers. Add-on. |
| **🔁 Monitoring** | | |
| `monitorMode`, `monitorOutput`, `monitorStoreName` | | Deliver only new products and changes since the previous run. |
| **📦 Output** | | |
| `maxItems` | integer | Most product rows in the run (default 1,000; `0` = no limit). |
| `maxResultsPerSource` | integer | Most products per search, link, specials group or department (`0` = no limit). |
| `deduplicate`, `compact` | boolean | One row per product per run (default on); core fields only. |
| **⚙️ Advanced** | | |
| `proxyConfiguration`, `maxConcurrency` | | Optional own proxy; parallel sources (default 3). |

#### Input JSON

```json
{
  "searchTerms": ["milk", "tim tam"],
  "specials": ["halfPrice"],
  "maxItems": 200,
  "maxResultsPerSource": 50,
  "includeDetails": false
}
```

#### Paste the link of the aisle you want

Category links are the most precise source. Open the aisle on woolworths.com.au (for example **Dairy, Eggs & Fridge > Milk**) and paste `https://www.woolworths.com.au/shop/browse/dairy-eggs-fridge/milk`. A sort order or the "specials only" switch in the link is kept. Turn on `categoryTree` once to get every category link Woolworths has.

#### Use specials groups for the weekly catalogue

Woolworths starts a new specials week every Wednesday. Pick **Half Price** or **all** in `specials` and schedule the run for Wednesday morning to capture each week's deals with their was price and saving.

#### Barcodes are exact

A barcode returns only the product that carries exactly that barcode. A barcode Woolworths does not sell online is listed under `notFound` in the run summary and is not charged.

### ⬆️ Output

One row per product (`"type": "product"`). Reviews, in-store availability, stores and categories come as rows of their own type. A real row from run `tt9zAkn7nM47rS6Jf` (2026-10-28), shortened:

```json
{
  "stockcode": 153676,
  "barcode": "9310016800701",
  "name": "Magnum Mini Classic Ice Cream Sticks",
  "brand": "Magnum",
  "packageSize": "6 pack",
  "price": 6,
  "wasPrice": 12,
  "savingsPercent": 50,
  "specialType": "Half Price",
  "promotionLabel": "Save $6.00",
  "unitPriceText": "$1.67 / 100ML",
  "stockStatus": "in_stock",
  "stockQuantity": 35,
  "allergensContains": ["Milk", "Soy"],
  "healthStarRating": 1,
  "rating": 4.68,
  "ratingCount": 66,
  "url": "https://www.woolworths.com.au/shop/productdetails/153676/magnum-mini-classic-ice-cream-sticks",
  "source": "specials",
  "sourceInput": "halfPrice"
}
```

With **Product details** on, the same row also carries the printed panel:

```json
{
  "nutrition": [{ "name": "Energy", "per100g": "2190.0kJ", "perServing": "401.0kJ" }, { "name": "Protein", "per100g": "4.6g", "perServing": "0.8g" }],
  "servingSize": "18.3 G",
  "servingsPerPack": 11,
  "countryOfOriginLabel": "Made in Australia",
  "aisle": "plain & sweet biscuits",
  "detailStatus": "enriched"
}
```

An in-store availability row:

```json
{ "type": "storeStock", "stockcode": 84628, "productName": "Arnott's Tim Tam Original Chocolate Biscuits Large Pack 365g",
  "storeId": "3813", "storeName": "Melbourne Square (Southbank)", "state": "VIC", "distanceKm": 1.62, "inStoreAvailable": true, "nearPostcode": "3000" }
```

#### Fields

Measured fill on run `tt9zAkn7nM47rS6Jf` (100 products from "coffee", "bread" and Half Price):

| Field | Fill | Field | Fill |
|---|---|---|---|
| stockcode, name, brand, price, wasPrice, url, images | 100% | barcode | 100% |
| unitPriceText, instorePrice, stockStatus | 100% | categoryPath, department | 100% |
| description | 100% | ingredients | 91% |
| allergenFreeClaims | 86% | lifestyleClaims | 87% |
| storageInstructions | 83% | nutritionPer100g | 65% |
| rating, ratingCount, ratingDistribution | 60% | allergensContains | 56% |
| stockQuantity (when stock is low) | 49% | healthStarRating | 35% |
| specialType (specials only) | 61% | pricePerKg / pricePerLitre / pricePerItem | 66% / 12% / 22% |

Fields are null when Woolworths does not publish the value for that product (fresh produce has no ingredients; unrated products have no rating). The dataset has views for Products, Specials & multi-buy, Ingredients & nutrition, Reviews and Stores.

### Use cases

- 🏷️ **FMCG brands**: track your shelf price, specials frequency and multi-buy deals against competitors, week by week
- 📊 **Category managers and analysts**: snapshot whole aisles or the full catalogue with unit prices and the merchandise hierarchy
- 🛒 **Price-comparison and cashback apps**: feed live Woolworths prices and specials by barcode
- 🥗 **Nutrition and allergy apps**: ingredients, allergens, dietary claims, Health Star Rating and the nutrition panel per barcode
- 📰 **Journalists and economists**: measure grocery inflation and "was price" claims over time with monitor mode
- 🤖 **AI agents**: compact rows through the API or MCP answer "what does milk cost at Woolworths today"

### How much does it cost to scrape Woolworths?

You pay per row delivered, with no start fee. Filtered, duplicate and unchanged (monitor) products are not charged.

| What | Price |
|---|---|
| Product row (or category row) | **$0.27 per 1,000** |
| Product details add-on | $0.36 per 1,000 rows that carry it |
| Customer review row | $0.45 per 1,000 |
| Store row (directory or in-store availability) | $0.90 per 1,000 |

| Run | Rows | Cost |
|---|---|---|
| 100 products | 100 | $0.027 |
| 1,000 products | 1,000 | $0.27 |
| 1,000 products with details | 1,000 | $0.63 |
| 10,000 products | 10,000 | $2.70 |

Measured on the platform: 100 products in 6.5 s, 1,000 products from the Pantry department in 47 s at 512 MB.

### Integrations, API, scheduling & MCP

- **Schedule** the actor in Apify (daily, weekly on Wednesday for specials) with `monitorMode` on, so each run delivers only what changed.
- **Webhooks** send each finished run to your endpoint; **Make, Zapier, n8n, Google Sheets, Slack** and **Airbyte** connect from the Integrations tab.
- **API**: start runs and read datasets from any language with the [Apify API](https://docs.apify.com/api/v2), or the clients for [Python](https://docs.apify.com/api/client/python) and [JavaScript](https://docs.apify.com/api/client/js).
- **MCP**: AI agents (Claude, ChatGPT, Cursor) can call Woolworths Scraper through the [Apify MCP server](https://mcp.apify.com).

### More scrapers from TopApi

- 🛍️ [SHEIN Product Scraper](https://apify.com/TopApi/shein-product-scraper): prices, discounts, ratings and fit
- 🇰🇷 [Naver Shopping Scraper](https://apify.com/TopApi/naver-shopping-scraper): prices, stock, sellers and reviews
- 📱 [TikTok Shop Scraper](https://apify.com/TopApi/tiktok-shop-scraper): products, sales, prices, stock and sellers
- 🏷️ [eBay Sold Listings Scraper](https://apify.com/TopApi/ebay-sold-listings-scraper): sold prices, dates and sellers

All TopApi actors: [apify.com/TopApi](https://apify.com/TopApi)

### Limits & empty runs

- **Prices are Woolworths' default online prices** (store 1101, `priceScope: "online"`). Woolworths shows a chosen store's prices only to a signed-in shopper, and this actor never signs in; per-store **availability** is delivered with postcodes or store numbers.
- Woolworths returns at most 36 tiles per page; the actor pages through every page a search or category has.
- Directions for use, product videos, variant lists and member prices are not columns: Woolworths' public data carried none of them in 1,600+ products read on 2026-10-28.
- Everyday Market (third-party sellers) is left out unless `includeEverydayMarket` is on.
- A run that finds nothing ends with a message that says why (no results, every product filtered, nothing new in monitor mode) and charges nothing. The run summary (`RUN_SUMMARY` in the key-value store) lists each source, its count and any input that was not found.

### ❓ FAQ

#### How much does Woolworths Scraper cost?

$0.27 per 1,000 products, no start fee. Add-ons are charged only on the rows that carry them. A 100-product run costs about $0.03.

#### How many products can Woolworths Scraper return?

As many as Woolworths lists: a search returns every page of results (e.g. 696 supermarket products for "milk"), a department up to several thousand, and the full catalogue all departments. Set `maxItems` to bound a run.

#### Can I monitor Woolworths prices on a schedule?

Yes. Turn on `monitorMode`, give the schedule a `monitorStoreName`, and each run delivers only new products and price, special or availability changes, with `changeType`, `previousPrice` and `priceChange`. An unchanged poll delivers and charges nothing.

#### Does Woolworths Scraper get prices for my local store?

It returns Woolworths' online prices, which is what a visitor sees before signing in. For a store, it tells you whether each product is on the shelf there (`inStoreAvailability` with `postcodes` or `storeIds`).

#### Can I get Woolworths specials with Woolworths Scraper?

Yes. Pick specials groups (Half Price, Lower Shelf Price, Buy More Save More...) or set `specialsOnly` on any search or category. Each row has the was price, saving, special type and multi-buy deal.

#### Can I look up products by barcode?

Yes. Put EAN / GTIN barcodes in `barcodes`; only an exact barcode match is returned.

#### Can I use Woolworths Scraper with the Apify API or Python?

Yes. Start a run and read its dataset with the Apify API or the Python and JavaScript clients; see the API tab of the actor for ready-made code.

#### Can AI agents use Woolworths Scraper through MCP?

Yes. Add the actor to the Apify MCP server and turn on `compact` for smaller rows.

#### Do I need a Woolworths account, login or API key?

No. Woolworths Scraper reads public product pages; no account, cookies or API key are needed.

#### Is this an official Woolworths API?

No. It is unofficial and not affiliated with Woolworths.

#### Why did my Woolworths Scraper run return no results?

The status message says why: the search had no results, your filters removed every product, a barcode or stockcode does not exist online, or (in monitor mode) nothing changed. Nothing is charged for an empty run.

#### Your feedback

Found a bug or need a field? Open an issue in the [Issues tab](https://apify.com/TopApi/woolworths-scraper/issues/open) and we will look at it.

# Actor input Schema

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

Products to search for, as you would type them on woolworths.com.au, e.g. "milk", "tim tam", "gluten free bread". A barcode typed here is looked up as a barcode.

## `startUrls` (type: `array`):

Any woolworths.com.au search, category / aisle, specials, multi-buy offer or product link, e.g. https://www.woolworths.com.au/shop/browse/dairy-eggs-fridge/milk. Sort and specials settings in a link are kept.

## `specials` (type: `array`):

Woolworths specials groups to scrape in full, e.g. Half Price. Each group is read page by page like a category.

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

Woolworths product numbers (the number in a product link), e.g. 888140 for /shop/productdetails/888140/... Looked up 20 at a time.

## `barcodes` (type: `array`):

Exact barcodes, e.g. 9300633556150. Only an exact barcode match is returned; a barcode Woolworths does not sell online is reported as not found.

## `departments` (type: `array`):

Scrape whole departments page by page, e.g. Dairy, Eggs & Fridge. Set Max products to bound the run (a department holds 500-3,000 products).

## `fullCatalog` (type: `boolean`):

Every department, duplicates removed (about 25,000 supermarket products). Departments above narrow it. Pair with Max products.

## `categoryTree` (type: `boolean`):

One row per Woolworths category (about 2,600) with its id, path and browse link - the way to find an aisle link to pass back in Woolworths links.

## `storeDirectory` (type: `boolean`):

Woolworths supermarkets with address, phone, coordinates, this week's opening hours and facilities. All of them, or the ones near Postcodes / the Store numbers below.

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

Order of search and category results, as on the site.

## `specialsOnly` (type: `boolean`):

Only products on special or on a multi-buy deal.

## `inStockOnly` (type: `boolean`):

Leave out products Woolworths shows as unavailable.

## `includeEverydayMarket` (type: `boolean`):

Include Everyday Market listings (third-party sellers, shipped by the seller). Off = supermarket products only, as most buyers want.

## `minPrice` (type: `number`):

Lowest shelf price to keep, e.g. 2.5.

## `maxPrice` (type: `number`):

Highest shelf price to keep, e.g. 20.

## `minDiscountPercent` (type: `integer`):

Keep products at least this far below their was price, e.g. 40 for 40% off or more.

## `minRating` (type: `number`):

Keep products with an average customer rating of at least this, 1-5, e.g. 4.

## `brands` (type: `array`):

Keep only these brands, e.g. "Woolworths", "Cadbury" (case-insensitive, partial match).

## `dietary` (type: `array`):

Keep products that carry every one of these claims, e.g. "Vegan", "Gluten Free", "High Protein".

## `allergenFree` (type: `array`):

Keep products stated free of these allergens and not listing them, e.g. "Gluten", "Peanut", "Milk".

## `minHealthStarRating` (type: `number`):

Keep products with at least this Health Star Rating, 0.5-5.

## `excludeCategories` (type: `array`):

Leave out products in these departments or categories, e.g. "Beer, Wine & Spirits", "Baby".

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

Add the product page's nutrition panel (per 100 g and per serve), serving size, country-of-origin label and Australian %, in-store aisle and department, health warnings and every product image. One extra request per product.

## `includeRatings` (type: `boolean`):

Average rating, rating count, review count and the 1-5 star breakdown on every product row. No extra charge.

## `includeReviews` (type: `boolean`):

Customer reviews as their own rows (type "review"): rating, text, author, date, source.

## `maxReviewsPerProduct` (type: `integer`):

How many reviews to read per product, newest first by default. 0 = all.

## `reviewSort` (type: `string`):

Which reviews come first.

## `postcodes` (type: `array`):

Australian postcodes, e.g. "2000", "0800". With products: in-store availability at the nearest supermarkets. With Store directory: the stores near each postcode.

## `storeIds` (type: `array`):

Woolworths store numbers (the number at the end of a store link, e.g. 1002 in /shop/storelocator/nsw-chatswood-1002). Used like Postcodes.

## `inStoreAvailability` (type: `boolean`):

One row per product per nearby store (type "storeStock") saying whether that store has it on the shelf. On automatically when Postcodes or Store numbers are given without Store directory.

## `maxStoresPerProduct` (type: `integer`):

How many of the nearest stores to check for each product and postcode.

## `monitorMode` (type: `boolean`):

Remember every delivered product's price and deliver only new products and price / special / availability changes on later runs. Unchanged products are not delivered and not charged.

## `monitorOutput` (type: `string`):

What a monitor run delivers.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the memory. Use one name per schedule, e.g. "woolworths-milk-daily".

## `maxItems` (type: `integer`):

Most product rows in the run (also caps directory and category rows). Woolworths shows up to a few thousand products per search; 0 = no limit.

## `maxResultsPerSource` (type: `integer`):

Most products from each search term, link, specials group or department. 0 = no per-source limit.

## `deduplicate` (type: `boolean`):

Deliver a product once per run even when several searches or categories return it.

## `compact` (type: `boolean`):

Core fields only (name, price, special, unit price, stock, category, rating, link) - smaller rows for AI agents and MCP.

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

Optional. Your own proxy is tried first; the built-in routes follow if it is refused.

## `maxConcurrency` (type: `integer`):

How many searches / links are read at the same time.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "specials": [
    "halfPrice"
  ],
  "fullCatalog": false,
  "categoryTree": false,
  "storeDirectory": false,
  "sortBy": "relevance",
  "specialsOnly": false,
  "inStockOnly": false,
  "includeEverydayMarket": false,
  "includeDetails": false,
  "includeRatings": true,
  "includeReviews": false,
  "maxReviewsPerProduct": 20,
  "reviewSort": "latest",
  "maxStoresPerProduct": 3,
  "monitorMode": false,
  "monitorOutput": "changes",
  "monitorStoreName": "woolworths-monitor",
  "maxItems": 40,
  "maxResultsPerSource": 20,
  "deduplicate": true,
  "compact": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 3
}
```

# Actor output Schema

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

One item per Woolworths product (price, special, unit price, stock, barcode, category, ingredients, nutrition, rating), plus review, in-store stock, store and category rows when asked for.

## `summary` (type: `string`):

Per-source counts (delivered, examined, total Woolworths reported), filtered and duplicate counts, not-found inputs, routes used and charges.

# 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"
    ],
    "specials": [
        "halfPrice"
    ],
    "maxItems": 40,
    "maxResultsPerSource": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/woolworths-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"],
    "specials": ["halfPrice"],
    "maxItems": 40,
    "maxResultsPerSource": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/woolworths-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"
  ],
  "specials": [
    "halfPrice"
  ],
  "maxItems": 40,
  "maxResultsPerSource": 20
}' |
apify call topapi/woolworths-scraper --silent --output-dataset

```

## MCP server setup

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