# Woolworths AU Scraper \[$1.50/1K💰] | Groceries (`ahmed_jasarevic/woolworths-scraper`) Actor

Extract Woolworths Australia products by search, category or current specials - price, was-price, savings, unit pricing, ingredients, nutrition, allergens and reviews. Ideal for Coles price comparison and fake-specials analysis.

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

## Pricing

from $1.40 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper

Extract Woolworths Australia product data from search, category or specials endpoints — current price, was-price, savings, unit pricing, ingredients, nutrition, allergens and customer reviews — priced at `$1.50` per 1,000 products on the FREE tier.

- **The fields that matter for price analysis.** `wasPrice`, `savingsAmount`, `isSpecial`, `isHalfPrice`, `promotionType` and `rewardCardPromotion` land as separate, explicit columns — so you can analyse discount claims rather than guess at them from a price string.
- **Unit pricing built in.** `unitWeightInGrams`, `cupPrice`, `cupMeasure`, `cupString` and `pricePerKgLabel` let you compare per-100ml and per-kg across brands, and track shrinkflation when pack size changes.
- **Nutrition is not a separate scrape.** Ingredients, allergens, health stars, storage and a structured `nutrition` object come from the list responses, so `includeDetails` is off by default.
- **Reviews in the same run.** Product reviews come from the BazaarVoice-backed endpoint and land in their own dataset, joined on `stockcode` — no second Actor needed.
- **About 6.7× cheaper** than the verified premium competitor at `$10.00` per 1,000 products on the FREE tier.

### Main Use Cases

- **Coles vs Woolworths price comparison** — collect both supermarkets' ranges and normalise by unit price and pack size
- **Grocery specials monitoring** — track current promotions, multibuy offers and half-price lines as they change weekly
- **Fake specials analysis** — combine `wasPrice`, `savingsAmount` and `promotionType` with price history to test whether a claimed discount is genuine
- **Unit price and shrinkflation tracking** — compare `pricePerKgLabel` and `unitWeightInGrams` across runs to detect pack-size reductions without price cuts
- **Product ingredients and nutrition database** — build an ingredient, allergen and nutrient dataset for analysis or comparison tools
- **Product review collection** — gather review text and star ratings per product without a separate scraper
- **Basket cost tracking** — price a fixed shopping list repeatedly to measure real household basket cost
- **Category and department mapping** — enumerate whole categories and the full department hierarchy

### How It Works

1. `mode` selects the collection strategy: `search`, `categories`, `specials`, or `all` to run every configured source.
2. Products are pulled from Woolworths' own JSON API over HTTP/2 — browse and content-browse endpoints for search and categories, specials endpoints for promotions.
3. Each response is normalised into one flat row with pricing, availability, unit-pricing, nutritional and taxonomy fields. Because the list endpoints already return nutritional data, this happens without extra per-product requests.
4. Set `includeDetails: true` to additionally fetch the per-product detail payload for any extra fields the list view omits.
5. When `includeReviews` is on, reviews are fetched in **batches** of stock codes from the BazaarVoice-backed review endpoint and pushed to a separate `reviews` dataset.
6. `deduplicate` (on by default) suppresses repeat `stockcode` values across overlapping searches and categories.

Five dataset views are available: `overview`, `pricing`, `catalogue`, `details` and a full `json` view.

### Analyse Woolworths Specials, Was-Prices and Unit Pricing

The reason Woolworths data gets discussed publicly is discount transparency — whether a "was" price was genuinely charged before, and whether per-unit pricing has quietly moved. That analysis needs `wasPrice` and `savingsAmount` as real columns, unit pricing as real fields, and repeated runs to compare against.

This Actor gives you all of that as structured output, plus ingredients, allergens and a nutrition object in the same row — so a single run supports both price analysis and product-composition analysis. Customer reviews come from the same run too, rather than a separate Actor.

### Input

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `mode` | string | no | `all` | One of `all`, `search`, `categories`, `specials`. `all` runs every configured source. |
| `searchTerms` | array | no | `["milk"]` | Search terms, used in `search` mode. |
| `categories` | array | no | `["dairy-eggs-fridge"]` | Category slugs, used in `categories` mode. Accepts slugs and category names. |
| `specialsTargets` | array | no | — | Scopes for specials collection. Empty means Woolworths' default specials scope. |
| `maxItemsPerTarget` | integer | no | `120` | Products per search term or category, clamped to 1–20,000. Clamped to 10 on the FREE tier. |
| `maxItemsTotal` | integer | no | `2000` | Total products for the run, clamped to 1–200,000. Clamped to 10 on the FREE tier. |
| `sortOrder` | string | no | `TraderRelevance` | One of `TraderRelevance`, `PriceAsc`, `PriceDesc`. |
| `includeDetails` | boolean | no | `false` | Also fetch the per-product detail payload. Off by default because list responses already carry ingredients, nutrition, allergens and ratings. |
| `includeReviews` | boolean | no | `false` | Fetch customer reviews into the `reviews` dataset. |
| `maxReviewsPerProduct` | integer | no | `10` | Reviews per product, clamped to 1–500. Clamped to 5 on the FREE tier. |
| `reviewsOrder` | string | no | `latest` | One of `latest`, `highest`, `lowest`. |
| `deduplicate` | boolean | no | `true` | Suppress duplicate `stockcode` values across overlapping sources. |
| `delayMs` | integer | no | `150` | Delay between requests, clamped to 0–10,000. |
| `maxConcurrency` | integer | no | `3` | Parallel requests, clamped to 1–8. |
| `proxyConfiguration` | object | no | — | Proxy configuration. Not needed on the default direct HTTP/2 path. |

### Output

**Default dataset — products** (58 fields):

`stockcode`, `barcode`, `name`, `rawName`, `brand`, `url`, `price`, `wasPrice`, `savingsAmount`, `isSpecial`, `isOnSpecial`, `isHalfPrice`, `isEdrSpecial`, `hasMultibuy`, `isMemberPrice`, `promotionType`, `rewardCardPromotion`, `isNew`, `isOnlineOnly`, `isInStock`, `isAvailable`, `isPurchasable`, `isSponsored`, `ageRestricted`, `unit`, `packageSize`, `unitWeightInGrams`, `cupPrice`, `cupMeasure`, `cupString`, `pricePerKgLabel`, `images`, `badge`, `description`, `descriptionHtml`, `summary`, `ingredients`, `allergens`, `allergenStatement`, `healthStarRating`, `storageInstructions`, `lifestyleAndDiet`, `countryOfOrigin`, `nutrition`, `rating`, `reviewCount`, `ratingCount`, `hasProductSubs`, `departments`, `subcategories`, `categories`, `departmentNodeId`, `departmentNodes`, `sap`, `variants`, `videoUrl`, `countryOfOriginLabel`, `meta`

`stockcode` is the stable identifier — use it as your join key and for price-history tracking.

**`reviews` dataset** (16 fields, one row per review, carrying its own product context):

`reviewId`, `stockcode`, `productName`, `brand`, `productUrl`, `price`, `rating`, `body`, `createdAt`, `createdDay`, `source`, `ratingAverage`, `reviewCount`, `ratingCount`, `sortOrder`, `meta`

Join on `stockcode`.

### Example Input

```json
{
  "mode": "search",
  "searchTerms": ["whole milk", "sourdough bread"],
  "maxItemsPerTarget": 40,
  "maxItemsTotal": 80,
  "sortOrder": "PriceAsc",
  "includeReviews": true,
  "maxReviewsPerProduct": 10,
  "reviewsOrder": "latest"
}
```

### Example Output

```json
{
  "stockcode": "201186",
  "barcode": "9310072011863",
  "name": "Woolworths White Sliced Sandwich Bread 600g",
  "rawName": "White Sliced Sandwich Bread",
  "brand": "Woolworths",
  "url": "https://www.woolworths.com.au/shop/productd/woolworths-white-sliced-sandwich-bread-600g-201186",
  "price": 3.5,
  "wasPrice": 5.0,
  "savingsAmount": 1.5,
  "isSpecial": true,
  "isOnSpecial": true,
  "isHalfPrice": false,
  "isEdrSpecial": false,
  "hasMultibuy": false,
  "isMemberPrice": false,
  "promotionType": "Promotional",
  "rewardCardPromotion": null,
  "isNew": false,
  "isOnlineOnly": false,
  "isInStock": true,
  "isAvailable": true,
  "isPurchasable": true,
  "isSponsored": false,
  "ageRestricted": false,
  "unit": "each",
  "packageSize": "600g",
  "unitWeightInGrams": 600,
  "cupPrice": 0.58,
  "cupMeasure": "100g",
  "cupString": "$0.58 per 100g",
  "pricePerKgLabel": "$5.83 per kg",
  "images": ["https://cdn.woolworths.com.au/products/201186.jpg"],
  "badge": null,
  "description": "Classic white sandwich loaf, sliced.",
  "descriptionHtml": "<p>Classic white sandwich loaf, sliced.</p>",
  "summary": "Soft white bread suitable for sandwiches and toast.",
  "ingredients": "Wheat Flour (59%), Water, Sugar (4.2%), Milk Solids (3.5%), Salt, Yeast, Wheat Gluten, Soybean Oil, Preservative (200), Baking Soda.",
  "allergens": ["Wheat", "Milk", "Soy"],
  "allergenStatement": "Contains Wheat, Milk and Soy. May contain traces of Peanuts.",
  "healthStarRating": 4,
  "storageInstructions": "Store in a cool dry place. Do not refrigerate.",
  "lifestyleAndDiet": ["No Added Sugar Claims"],
  "countryOfOrigin": "Australia",
  "nutrition": {
    "energy": { "value": 1024, "unit": "kJ", "per": "100g" },
    "protein": { "value": 9.2, "unit": "g", "per": "100g" },
    "fatTotal": { "value": 3.1, "unit": "g", "per": "100g" },
    "sugars": { "value": 4.4, "unit": "g", "per": "100g" },
    "sodium": { "value": 420, "unit": "mg", "per": "100g" }
  },
  "rating": 4.4,
  "reviewCount": 823,
  "ratingCount": 4127,
  "hasProductSubs": false,
  "departments": ["Bakery"],
  "subcategories": ["Bread"],
  "categories": ["Bakery", "Bakery > Bread"],
  "departmentNodeId": "bakery",
  "departmentNodes": ["bakery", "bread"],
  "sap": "BKR-BRD-SLC",
  "variants": [],
  "videoUrl": null,
  "countryOfOriginLabel": "Made in Australia",
  "meta": { "scrapedAt": "2026-02-11T04:11:02.140Z", "sourceEndpoint": "browse" }
}
```

And one row from the `reviews` dataset:

```json
{
  "reviewId": "rv-8841207",
  "stockcode": "201186",
  "productName": "Woolworths White Sliced Sandwich Bread 600g",
  "brand": "Woolworths",
  "productUrl": "https://www.woolworths.com.au/shop/productd/woolworths-white-sliced-sandwich-bread-600g-201186",
  "price": 3.5,
  "rating": 4,
  "body": "Stays fresh for a few days if you keep it sealed. Slicing is a little thick for sandwich bread.",
  "createdAt": "2026-02-06T11:22:00Z",
  "createdDay": "2026-02-06",
  "source": "BazaarVoice",
  "ratingAverage": 4.4,
  "reviewCount": 823,
  "ratingCount": 4127,
  "sortOrder": "latest",
  "meta": { "scrapedAt": "2026-02-11T04:11:09.770Z" }
}
```

### Pricing

Pay-per-result at `$1.50` per 1,000 products on the FREE tier. On the FREE tier both `maxItemsPerTarget` and `maxItemsTotal` are clamped to **10 products**, `maxReviewsPerProduct` to **5**, and the request budget to **120** — so plan a paid tier for basket-level or category-level datasets.

### Integrations & Automation

- **Apify API** — read both datasets from Python, Node or any HTTP client.
- **Schedules** — Woolworths switches its catalogue on a weekly cadence, so a **weekly run on the same day and time** gives clean week-over-week specials diffs. Run daily if you are watching a small, fast-moving basket.
- **Webhooks** — trigger a Coles scrape or a report build when a Woolworths run completes.
- **MCP** — callable by AI agents through the Apify MCP server.

### Related Actors

- `ahmed_jasarevic/link-preview-api` — extract Open Graph and JSON-LD metadata from Woolworths product URLs as a cross-check on product naming and imagery
- `ahmed_jasarevic/preply-scraper` — comparable structured-catalogue extraction if you also research supplier or service listings

### FAQ

#### Why use this actor instead of a Woolworths product API?

There is no public Woolworths developer API. This Actor uses the same JSON API the Woolworths website itself calls, over HTTP/2, with no browser and no proxy on the default path.

#### Can I compare Woolworths prices against Coles?

Yes, and this is the most common use case. Collect the same `searchTerms` from both supermarkets and normalise on `price`, `unitWeightInGrams` and `cupPrice`/`pricePerKgLabel` rather than comparing shelf prices directly — that is what makes the comparison meaningful across different pack sizes.

#### What is the difference between `isSpecial` and `isOnSpecial`?

They are separate flags from the source. Treat `isSpecial` as "currently carrying a promotion" and `isOnSpecial` as the mark-down indicator, and use `promotionType` for the promotion category. Do not collapse them into one flag.

#### How do I analyse whether a discount is genuine?

Track `price`, `wasPrice` and `savingsAmount` for the same `stockcode` across scheduled weekly runs. A genuine reduction in the regular price shows up as a lower `price` once the promotion ends, rather than the `wasPrice` snapping straight back to the previous value.

#### Do I need `includeDetails` to get ingredients and nutrition?

No. That is the default design: the list endpoints already return `ingredients`, `allergens`, `allergenStatement`, `healthStarRating`, `storageInstructions` and the structured `nutrition` object, so a full catalogue run costs no extra requests for that data. Enable `includeDetails` only if you need fields the list view omits.

#### Do I get product reviews too?

Set `includeReviews: true`. Reviews are fetched in batches of stock codes and written to a separate `reviews` dataset with `stockcode`, `rating`, `body`, `createdAt` and the product's `ratingAverage`/`reviewCount`. Join on `stockcode`.

#### How many products can I collect in one run?

`maxItemsPerTarget` governs products per search term or category, and `maxItemsTotal` governs the run as a whole, capped at 200,000. `deduplicate: true` stops the same `stockcode` appearing twice when your terms or categories overlap. On the FREE pricing tier both are clamped to 10.

#### What are alternatives to this actor?

The Apify Store has several Woolworths scrapers, most of which return a narrow set of product fields and require a residential proxy. At least one charges `$10.00` per 1,000 results on the FREE tier, and in the Store product reviews are a **separate Actor**. No Woolworths-branded API is available as a direct alternative source.

### For AI Agents & LLM Apps

**Purpose:** returns Woolworths Australia product rows in the default dataset and customer review rows in a named `reviews` dataset, joinable on `stockcode`.

**Minimal working input** — smallest input that produces a valid run:

```json
{ "mode": "search", "searchTerms": ["milk"], "maxItemsTotal": 5 }
```

**Search variant with reviews:**

```json
{
  "mode": "search",
  "searchTerms": ["whole milk", "sourdough bread"],
  "maxItemsPerTarget": 40,
  "maxItemsTotal": 80,
  "sortOrder": "PriceAsc",
  "includeReviews": true,
  "maxReviewsPerProduct": 10,
  "reviewsOrder": "latest"
}
```

**Specials variant:**

```json
{
  "mode": "specials",
  "maxItemsPerTarget": 100,
  "maxItemsTotal": 500,
  "sortOrder": "TraderRelevance"
}
```

**Category variant:**

```json
{ "mode": "categories", "categories": ["dairy-eggs-fridge"], "maxItemsTotal": 500 }
```

**Output fields** — products: `stockcode, barcode, name, rawName, brand, url, price, wasPrice, savingsAmount, isSpecial, isOnSpecial, isHalfPrice, isEdrSpecial, hasMultibuy, isMemberPrice, promotionType, rewardCardPromotion, isNew, isOnlineOnly, isInStock, isAvailable, isPurchasable, isSponsored, ageRestricted, unit, packageSize, unitWeightInGrams, cupPrice, cupMeasure, cupString, pricePerKgLabel, images, badge, description, descriptionHtml, summary, ingredients, allergens, allergenStatement, healthStarRating, storageInstructions, lifestyleAndDiet, countryOfOrigin, nutrition, rating, reviewCount, ratingCount, hasProductSubs, departments, subcategories, categories, departmentNodeId, departmentNodes, sap, variants, videoUrl, countryOfOriginLabel, meta`. Reviews (named dataset `reviews`): `reviewId, stockcode, productName, brand, productUrl, price, rating, body, createdAt, createdDay, source, ratingAverage, reviewCount, ratingCount, sortOrder, meta`.

**Behaviors an agent should know**

- `mode` defaults to `all`, which runs search, categories **and** specials together. Set it explicitly to control scope and cost.
- `searchTerms` and `categories` both ship with defaults (`["milk"]`, `["dairy-eggs-fridge"]`). If you want only your own targets, pass your own arrays or empty ones — otherwise the defaults also get collected in `all` mode.
- On the FREE pricing tier `maxItemsPerTarget` and `maxItemsTotal` are clamped to **10**, `maxReviewsPerProduct` to **5**, and the request budget to **120**.
- `maxItemsTotal` is a **run-wide** stop, not a per-target target. The run halts once it is reached, so a large `maxItemsPerTarget` with a small `maxItemsTotal` will truncate.
- Reviews land in a **separate named dataset** (`reviews`), joined on `stockcode`. They are batched by stock code, not fetched one product at a time.
- `includeDetails` defaults to **false** and is usually unnecessary — list responses already include ingredients, nutrition and allergens.
- `deduplicate` defaults to **true**; overlapping `searchTerms` will not produce repeated `stockcode` rows.
- `isSpecial` and `isOnSpecial` are independent flags. Do not treat them as synonyms.
- Use `stockcode` — not `name` — as the key for price-history joins, since names change between runs.
- Five dataset views exist: `overview`, `pricing`, `catalogue`, `details`, `json`.
- No proxy is required on the default path; `maxConcurrency` is clamped to 1–8 and `delayMs` to 0–10,000.

**Billing:** pay-per-result — `$1.50` per 1,000 products on the FREE tier, where the FREE tier also caps you at 10 products and 5 reviews per product.

### Legal & Compliance

This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by Woolworths Group.

It reads only publicly accessible product listings, category and specials endpoints, and public customer reviews, using the same JSON API the Woolworths website uses. It does not bypass authentication, does not use CAPTCHA solving, and applies request delays and concurrency limits to avoid undue load on the source site.

You are responsible for your own compliance with Woolworths' Terms of Service and with applicable data-protection law. Review output contains personal data — customer reviewer names where published, review text and review dates. Under the Australian Privacy Act, GDPR and comparable regimes you need a lawful basis for processing it and must handle it accordingly.

If you republish price or discount analysis, note that Australia's competition regulator has taken enforcement action over misleading supermarket discount and "was" pricing claims. This Actor supplies the raw fields for such analysis; presenting it as a finding of wrongdoing against any retailer is your responsibility and must be based on your own verification. Do not use extracted personal data for unsolicited commercial outreach in violation of applicable law.

### SEO Keywords

woolworths scraper, woolworths product data, woolworths prices, woolworths specials, coles vs woolworths prices, grocery price comparison australia, fake specials grocery, discount claim investigation, shrinkflation tracking, unit price comparison, price per 100ml comparison, grocery price history, product ingredients database, nutrition data api, allergen data, woolworths reviews, online grocery price tracker, weekly specials catalogue, grocery basket cost tracker, australian supermarket data, woolworths category data, supermarket stockist data

# Actor input Schema

## `mode` (type: `string`):

Which data to extract.

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

Keyword searches to run (only used by the 'search' and 'all' modes). Example: milk, coffee, nappies.

## `categories` (type: `array`):

Categories to browse (only used by the 'categories' and 'all' modes). Accepts URL slugs such as 'dairy-eggs-fridge/milk', a single slug such as 'pantry', a full path like 'fruit-veg/fruit/avocados', a category node id such as '1_6E4F4E4' or a woolworths.com.au browse URL. Unknown targets are logged with suggestions and skipped.

## `specialsTargets` (type: `array`):

Specials scopes to scrape (only used by the 'specials' and 'all' modes). Leave empty to collect specials from every top-level department. Otherwise give scopes such as 'dairy-eggs-fridge', 'dairy-eggs-fridge/milk' or a promotion group like 'half-price', 'buy-more-save-more', 'online-only-specials'.

## `maxItemsPerTarget` (type: `integer`):

Stop each search term / category / specials scope after this many products. Free accounts are always clamped to 10.

## `maxItemsTotal` (type: `integer`):

Hard cap for the whole run, across all targets. Free accounts are always clamped to 10 items.

## `sortOrder` (type: `string`):

Product ordering inside each target.

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

Extra request per product for the richest nutrition/ingredient payload (fetched concurrently, limited by the concurrency setting). Off by default - the list endpoints already contain ingredients, nutrition, allergens and ratings.

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

Also scrape customer reviews (star rating, text, date, source) for every product found. Reviews go to a separate 'reviews' dataset so they never slow down or bloat the product output. Reviews are batched - many products are fetched per request, so the extra request count is far below one per product.

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

How many reviews to collect per product. Products with fewer reviews than this simply return what they have. Free accounts are always clamped to 5. Only used when 'Fetch product reviews' is enabled.

## `reviewsOrder` (type: `string`):

Which reviews to return when a product has more reviews than the per-product limit.

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

Skip a product that was already written earlier in the same run (useful when search terms or categories overlap).

## `delayMs` (type: `integer`):

Minimum gap between request starts. Keep at least 100 ms to stay polite with the origin.

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

How many HTTP/2 requests may be in flight at once on the shared connection.

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

Off by default: the origin is reachable directly over HTTP/2 with a plain cookie bootstrap, so a proxy is not required. Turn on Apify Proxy only if your run gets blocked.

## Actor input object example

```json
{
  "mode": "all",
  "searchTerms": [
    "milk"
  ],
  "categories": [
    "dairy-eggs-fridge"
  ],
  "specialsTargets": [],
  "maxItemsPerTarget": 120,
  "maxItemsTotal": 2000,
  "sortOrder": "TraderRelevance",
  "includeDetails": false,
  "includeReviews": false,
  "maxReviewsPerProduct": 10,
  "reviewsOrder": "latest",
  "deduplicate": true,
  "delayMs": 150,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `products` (type: `string`):

Every scraped Woolworths product. Use the ?view= parameter to pick a dataset view, e.g. ?view=pricing or ?view=nutrition.

## `productsOverview` (type: `string`):

Products rendered with the Overview dataset view - image, name, price and stock status.

## `productsPricing` (type: `string`):

Products rendered with the Pricing & promotions dataset view - prices, unit pricing and every promotion flag.

## `reviews` (type: `string`):

Customer reviews for the scraped products, one row per review. Only populated when includeReviews is enabled. Use the ?view= parameter to pick a dataset view, e.g. ?view=ratings for review text-free sentiment analysis.

## `reviewsRatings` (type: `string`):

Reviews rendered with the Ratings dataset view - star ratings, dates and product review totals without the review text.

## `runSummary` (type: `string`):

JSON record with per-target counts, duration, request statistics and the request budget status of this run.

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/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 = { "proxyConfiguration": { "useApifyProxy": False } }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/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 '{
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/woolworths-scraper --silent --output-dataset

```

## MCP server setup

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