# Myer Scraper - Products, Prices, Variants & Reviews (`abotapi/myer-au-scraper`) Actor

Scrape Myer (myer.com.au) department-store products: name, brand, price, was-price, saving, availability, category, images, attributes, colour & size variants, plus ratings and customer reviews. Search by keyword with brand, price and rating filters, or paste product, search or category URLs.

- **URL**: https://apify.com/abotapi/myer-au-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 4 total users, 0 monthly users, 89.3% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 product 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

## Myer Scraper: Products, Prices & Customer Reviews

Myer Scraper turns Myer's department-store catalogue into a clean, structured dataset. Search by keyword with brand, price and rating filters, browse Myer's own Sale and Clearance views, or paste product, search, category and sale URLs directly. Every product comes back with its price, was-price, saving and promo labels, and optionally the full description, size and colour variants, identifiers, an aggregate rating summary and customer reviews. Export to JSON, CSV or Excel, or pull results straight into your app through the API.

### Why This Scraper?

- **Two ways to find products.** Search by keyword with filters, or paste product, search, category and sale URLs directly. No need to build URLs by hand.
- **Sale and Clearance built in.** Browse one of Myer's own promotional views (All sale, Clearance, or a department sale) as its own target, on its own or alongside a keyword search in the same run, and every result carries its own was-price, saved amount and saving percentage.
- **Full product detail on demand.** Switch on detail enrichment to add the full description, attributes, size and colour variants, identifiers, an aggregate rating summary and customer reviews to every product.
- **Filters that actually filter.** Brand, price range, minimum rating and stock status narrow the result set before it is collected, so filtered-out products are never returned or charged.
- **Built for monitoring.** Resume one interrupted crawl with a run or dataset id, or turn on Incremental mode to track the same search over time and get only what changed on each scheduled run.
- **Nothing invented.** Promo labels, ratings and review counts are read from Myer's own feeds; a product's rating and review fields are only included when Myer's feed actually returns them, never fabricated.

### Use Cases

- **Price and deal tracking:** monitor was-price, saved amount and promo labels across Sale and Clearance to catch new markdowns first.
- **Brand and competitor monitoring:** track how a specific brand's range, pricing and stock status move on Myer's storefront over time.
- **Retail and merchandising research:** build category-level datasets of pricing, specifications and variant availability across departments.
- **Customer sentiment analysis:** collect ratings, review text and star distributions to analyse how a product is received.
- **Deal alert tools:** feed a shopper-facing app or bot with newly discounted or restocked products using Incremental mode.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `id` | `"700123456"` |
| `name` / `title` | `"Velvet Bloom Hydrating Night Cream 50mL"` |
| `brand` | `"Lumora"` |
| `url` | Myer link to the product, search or category page |
| `sourceUrl` | The pasted URL (url mode) or the search / category page of the keyword or specials target (search mode) that produced the row |
| `price` | `68.0` |
| `listPrice` / `wasPrice` | `85.0` / `85.0` |
| `savedAmount` / `savingsPercent` | `17.0` / `20` |
| `promoLabel` / `promoLabels` | `"Reduced to clear"` / `["Reduced to clear"]` |
| `isOnSale` / `isClearance` | `true` / `false` |
| `currency` | `"AUD"` |
| `isAvailable` / `isBuyable` | `true` / `true` |
| `afterPayEligible` / `hummEligible` | `true` / `false` |
| `category` / `categories` | `"skincare-moisturiser"` / `["beauty", "skincare", "skincare-moisturiser"]` |
| `shortDescription` / `longDescription` | `"A rich night cream that visibly plumps skin by morning."` / the full product description |
| `specifications` | `{ "Formulation": "Cream", "Skin Type": "Dry, Normal" }` |
| `variants` | size / colour list with id, ean, price, wasPrice and savingsPercent (detail enrichment on) |
| `colourVariants` | card-level colour list with id and colour (listing results only; `null` or absent for a pasted single product URL) |
| `imageUrl` / `images` | main product photo / full image gallery |
| `rating` / `reviewCount` | `4.69` / `1076` |
| `ratingDistribution` / `recommendedCount` | `{ "5": 812, "4": 210, "3": 40, "2": 9, "1": 5 }` / `940` |
| `reviews` | array of per-review rating, title, body, author, date and verified-purchase flag (shown truncated to one entry for brevity) |
| `reviewsCollected` | `1` (reviews actually returned this run, capped by Max reviews per product; equals the length of `reviews`) |
| `changeType` | `"NEW"` (also `"UPDATED"`, `"UNCHANGED"`, `"REAPPEARED"`, `"EXPIRED"`; incremental mode only, see "Resume and recurring updates" below) |

Each entry inside `reviews[]` also carries `reviewId`, `verifiedPurchase`, `helpfulCount`, `notHelpfulCount`, `pros` and `cons`. Each entry inside `variants[]` also carries `size`, `colour` and `isBuyable`. In incremental mode, every record also carries `changedFields` (populated only for `UPDATED`), `firstSeenAt` and `lastSeenAt`. Internal identifiers (`internalId`, `seoToken`, `mfPartNumber`), the raw `merchCategory` and `categoryUri` strings, `metaDescription`, `supplierColour`, `hasMoreColours`, `brandUrl` and `productExclusive` are also included for completeness.

### How to Use

1. Pick a **mode**: `search` (keyword and filters) or `url` (paste product, search, category or sale links).
2. For search mode, add one or more **Search keywords**, and optionally a **Specials / sale category**, brand, price range or minimum rating.
3. Turn **Fetch full product detail + reviews** on or off, and set **Max products** and **Max pages** to control run size and cost.
4. Click **Start**, then download the dataset as JSON, CSV or Excel, or read it through the API.

**Search by keyword with filters:**

```json
{
  "mode": "search",
  "queries": ["moisturiser"],
  "brand": "Chanel",
  "minRating": 4,
  "sortBy": "priceAsc",
  "maxItems": 50,
  "maxPages": 10
}
```

**Browse the Clearance sale, listing fields only (no detail, no surcharge):**

```json
{
  "mode": "search",
  "specialsCategory": "clearance",
  "detailEnrichment": false,
  "maxItems": 100
}
```

**Paste a product URL and a category URL (replace the placeholder product link with a real one):**

```json
{
  "mode": "url",
  "urls": [
    "https://www.myer.com.au/p/<product-slug-and-id>",
    "https://www.myer.com.au/c/beauty/skincare"
  ],
  "maxReviewsPerProduct": 10
}
```

**Scheduled run: only new, changed or freshly-expired products for one search (uncapped so a complete scan is possible):**

```json
{
  "mode": "search",
  "queries": ["moisturiser"],
  "incrementalMode": true,
  "emitExpired": true,
  "maxItems": 0
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/myer-au-scraper").call(run_input={"mode": "search", "queries": ["moisturiser"]})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["name"], product["price"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/myer-au-scraper').call({ mode: 'search', queries: ['moisturiser'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### How Max pages shapes a search or URL walk

`maxPages` caps the number of pages walked per keyword, specials category, or search/category URL, not an absolute page number, and only applies with the default relevance sort; any other sort order reads the whole listing first before trimming to Max products, so `maxPages` has no effect there, set `maxPages` to a real bound when sorting by anything other than relevance. A pasted URL that already names a start page (for example `pageNumber=5`) counts from that page, so `maxPages=2` on a page-5 URL walks pages 5 and 6. If the platform restarts this same run (a migration or a Resurrect), the automatic checkpoint continues the page count from where that run left off; a separate run started with `resumeFromRunId` gets its own fresh page cap starting at page 1. Use `0` to walk every page: the run still stops on its own once **Max products** is reached, a page repeats with no new products, or Myer's own result total for that search is reached.

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one specific interrupted or previous run: paste its run or dataset id and this run skips products already collected there by id, returning only the remaining new products. This dedup is by product id, so it applies to search, specials category and category/search URL results; a pasted single product URL is always fetched and pushed again even if it was already collected in that earlier run. An automatic same-run checkpoint also protects against platform migrations without any input needed.
- **Incremental mode** (`incrementalMode`) is for scheduling the same search or URL set repeatedly (for example, daily). The first run returns everything as `NEW`. Later runs return only `NEW` and `UPDATED` products by default; unchanged products are suppressed and not charged unless `emitUnchanged` is on. `EXPIRED` rows are only produced when `emitExpired` is on and a run completes a full, uncapped scan of every tracked search or URL (not limited by Max products or Max pages, and not a Resume run); that same scan is also what first marks a product "not present". `REAPPEARED` can then only occur for a product that a prior complete `emitExpired` scan already marked "not present" and that is now seen again; it never appears on its own. `stateKey` names or shares a monitoring campaign; left empty, the actor derives one automatically from your mode, search terms or URLs, and filters, so different searches never mix state. `UPDATED` is decided by the product's own catalogue data: price, was-price and savings, availability, promo badges, name, brand, category, specifications, descriptions, images and per-variant price and stock (`changedFields` names what moved). Ratings, review counts, `ratingDistribution`, `reviews` and the first promo badge (`promoLabel`) never drive `changeType`: they change far more often than catalogue data, so they are excluded from change detection (but still returned normally). The order of promo badges, variants and colour variants is ignored too. `EXPIRED` is skipped (with a log line) whenever a run is a partial scan: a pasted link starting at a later page, a Max products or Max pages limit, or a run continued from an automatic checkpoint. Use **Ignore fields when detecting changes (incremental mode only)** (`ignoreFieldsForChanges`) to exclude more fields, for example `imageUrl`; a name matches at any nesting depth, and ignored fields are still returned. Changing the list never causes a one-time wave of `UPDATED` rows, because saved state is compared again with your current list.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → API & Integrations**.
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where item pages should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (keyword and filters) or `url` (paste product, search, category or sale URLs). |
| `queries` | array | prefill only: `["perfume"]` | One or more keywords to search. Each keyword is searched separately, and runs as its own target alongside any Specials category. |
| `specialsCategory` | string | `""` (none) | Optional. Browse one of Myer's promotional views (All sale, Clearance, or a department sale) as an extra target in the same run, standalone or alongside Search keywords. Every product from it carries its own was-price and saving fields. |
| `urls` | array | default: one example per shape (category, category with `brand=`/`sort=`, keyword search, product, brand page) | Product, search, category or brand (`/b/<brand>`) URLs to scrape (url mode). A product URL returns that single product; search, category and brand URLs return multiple pages, continuing forward from the page in the URL. `m.` and bare-host links and legacy `/shop/mystore/<dept>` links are accepted. A pasted `brand=` or `sort=` (price-asc / price-desc) is applied to that URL. Unsupported URL shapes are skipped with a warning in the log. |
| `brand` | string | (none) | Optional. Keep only products whose brand matches this value. Applies to both search and url mode. |
| `sortBy` | string | `relevance` | Ordering within each keyword, specials category or URL, approximate rather than exact since enriched products push in the order their detail fetch finishes. Only relevance order respects Max pages; any other sort reads the whole listing first before trimming to Max products. |
| `minPrice` | integer | (none) | Optional. Only keep products priced at or above this amount (AUD). |
| `maxPrice` | integer | (none) | Optional. Only keep products priced at or below this amount (AUD). |
| `minRating` | integer | (none) | Optional. Only keep products with an average rating at or above this value (1 to 5). Only takes effect when detail enrichment actually ran for that product (search/URL-listing paths need detail enrichment on; a pasted single product URL always has it); otherwise the rating isn't known yet and the filter has no effect. |
| `includeOutOfStock` | boolean | `true` | Include products that are currently unavailable. Turn off to keep only available products. |
| `detailEnrichment` | boolean | `true` | For each product found via search or a search/category URL, also fetch the product page for full description, attributes, variants, identifiers, ratings and reviews. A pasted single product URL always fetches full detail regardless of this setting. |
| `maxReviewsPerProduct` | integer | `20` | Cap on reviews collected per product when detail is fetched. `0` means as many as available, up to 900 per product; values above 900 are capped at 900. Each enriched product carries one detail-enrichment unit regardless of how many reviews are collected. |
| `maxItems` | integer | `20` | Maximum number of products to return across the whole run. Use `0` for unlimited. |
| `maxPages` | integer | `0` | Safety cap on result pages walked per keyword, specials category or URL. `0` walks every page. See "How Max pages shapes a search or URL walk" above. |
| `resumeFromRunId` | string | (none) | Optional. A previous run id or dataset id. Products already in that dataset are skipped by id, so this run returns only the remaining new products; a pasted single product URL is not deduped this way and is always fetched again. |
| `incrementalMode` | boolean | `false` | Turn on for recurring monitoring of the same search or URL set. Returns only `NEW` and `UPDATED` products by default on repeat runs; see "Resume and recurring updates" above for `REAPPEARED` / `EXPIRED`. |
| `stateKey` | string | (none) | Optional, incremental mode only. Names or shares a monitoring campaign's state. Left empty, a key is derived automatically from the run's search/filter setup. |
| `emitUnchanged` | boolean | `false` | Incremental mode only. Also return (and bill) products unchanged since the last run, marked `UNCHANGED`. |
| `emitExpired` | boolean | `false` | Incremental mode only. Also return (and bill) products no longer found, marked `EXPIRED`, but only once a run fully scans the tracked search or URL set (not capped by Max products/Max pages, not a Resume run). |
| `ignoreFieldsForChanges` | array | `[]` | Incremental mode only. Extra output field names that must not make a product `UPDATED` (matched at any nesting depth). Ratings, review fields and `promoLabel` are always ignored. Ignored fields are still returned. |
| `proxy` | object | Apify Proxy | Connection settings. |
| `mcpConnectors` | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which item pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. Does not affect the dataset. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record. `reviews` is shown truncated to one entry for brevity; `reviewsCollected` reflects the shown count.

```json
{
  "id": "700123456",
  "internalId": "8123456",
  "name": "Velvet Bloom Hydrating Night Cream 50mL",
  "brand": "Lumora",
  "url": "https://www.myer.com.au/p/velvet-bloom-hydrating-night-cream-700123456",
  "price": 68.0,
  "listPrice": 85.0,
  "wasPrice": 85.0,
  "savedAmount": 17.0,
  "savingsPercent": 20,
  "promoLabel": "Reduced to clear",
  "promoLabels": ["Reduced to clear"],
  "isOnSale": true,
  "isClearance": false,
  "currency": "AUD",
  "isAvailable": true,
  "isBuyable": true,
  "category": "skincare-moisturiser",
  "categories": ["beauty", "skincare", "skincare-moisturiser"],
  "shortDescription": "A rich night cream that visibly plumps skin by morning.",
  "specifications": { "Formulation": "Cream", "Skin Type": "Dry, Normal" },
  "imageUrl": "https://myer-media.com.au/wcsstore/MyerCatalogAssetStore/images/700123456_1_1_720x928.jpg",
  "rating": 4.69,
  "reviewCount": 1076,
  "ratingDistribution": { "5": 812, "4": 210, "3": 40, "2": 9, "1": 5 },
  "recommendedCount": 940,
  "reviews": [
    {
      "reviewId": "58231",
      "rating": 5,
      "title": "Great texture, noticeable results",
      "body": "Absorbs quickly and my skin feels firmer after a few weeks.",
      "author": "GlowSeeker22",
      "date": "2026-03-14T09:15:00.000+00:00",
      "verifiedPurchase": true,
      "helpfulCount": 4
    }
  ],
  "reviewsCollected": 1
}
```

### Plan Requirement

No paid proxy group is needed to start: in testing, Myer served normal pages to datacenter connections, with no challenge or block page. Leave the proxy setting at its default and the run picks the best connection your plan allows, trying them in order. Apify free plans do not include residential proxies or any Apify proxy access; if the selected connection is unavailable to your run, the log shows a boxed warning, the run continues on a backup connection, and the status message says "Served over the backup connection (the default connection was unavailable)." Some pages may still fail there. For large or frequent runs, pick the residential group under Connection, or supply your own proxy URLs. If your account is refused any proxy connection, the run fails instead of finishing empty (see the FAQ).

### FAQ

#### How much does it cost?

You pay a small per-run start fee, plus per product returned, plus a detail-enrichment surcharge for every product whose full detail page was actually fetched and returned. **Fetch full product detail + reviews** defaults to on, so most runs pay that surcharge on every returned product: each enriched product carries one detail-enrichment unit, regardless of how many reviews are collected. Turn it off in search/URL-listing runs for listing-card fields only, with no surcharge. Pasting a specific product URL in url mode always fetches and returns the full detail plus reviews, and is always charged the surcharge, regardless of that setting. The detail-enrichment charge is made per product right after it is pushed. Reviews per product are capped at 900. Suppressed incremental-mode rows (`UNCHANGED` with Emit unchanged off) are never charged for either event. The **Pricing** tab shows the current rates, and **Max products** caps the size of any run.

#### Is it legal to scrape Myer?

This actor collects only publicly available product data. You are responsible for how you use it: follow Myer's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product descriptions, photos and review text may be subject to third-party rights.

#### Can I get only new or changed products on a schedule?

Yes. Schedule the actor from the **Schedules** tab with the same search or URLs and turn on **Incremental mode**. Each run then returns only new and updated products by default, and unchanged ones are not billed.

#### What's the difference between Resume and Incremental mode?

**Resume** (`resumeFromRunId`) continues one specific earlier run so it isn't re-collected or re-charged. **Incremental mode** is for running the exact same search or URLs again and again on a schedule and only wanting what changed each time; it remembers its own state, so you never paste a run id.

#### Why did my run finish successfully with an empty dataset instead of erroring out?

It does not: a run that could not load a single page ends as FAILED, never as a successful empty run, so a connection problem is never confused with a genuine "no products found" result. The status message tells you which case it is: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required" (check your plan, or your own proxy URLs if you entered any), "No results: residential proxies are unavailable on this run ... and the backup connection could not load the requested Myer pages" (upgrade or supply your own proxy URLs), or "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search" (try again later). A search that loads fine but matches nothing still completes as a normal successful run. A run also stops with an error for an invalid Resume id or dataset, or when Incremental mode already has saved state for that search and Resume was also set.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

#### URL mode: supported links and default

| Link shape | Example |
| --- | --- |
| Category page | `https://www.myer.com.au/c/beauty/skincare` |
| Sub-category page | `https://www.myer.com.au/c/beauty/skincare/eye-creams` |
| Category page with a start page | `https://www.myer.com.au/c/beauty/skincare?pageNumber=2` |
| Category page with sort and brand | `https://www.myer.com.au/c/beauty/skincare?pageNumber=1&sort=price-desc&brand=Clarins` |
| Keyword search | `https://www.myer.com.au/search?query=nike%20shoes` |
| Keyword search with a start page | `https://www.myer.com.au/search?query=nike%20shoes&pageNumber=2` |
| Keyword search the site redirects to a category | `https://www.myer.com.au/search?query=perfume` |
| Product page | `https://www.myer.com.au/p/chanel-nourish-soften-illuminate` |
| Brand page | `https://www.myer.com.au/b/chanel` |
| Brand-boutique category page | `https://www.myer.com.au/c/beauty/featured-beauty-brands/featured-brand-chanel` |
| Legacy department link | `https://www.myer.com.au/shop/mystore/beauty` |
| Mobile host | `https://m.myer.com.au/c/beauty/skincare` |
| Bare host | `https://myer.com.au/c/beauty/skincare` |

Any other link is skipped with a warning in the log.

Behaviour change: the **Myer URLs** field now has a default list with one example of each main shape. A URL-mode run started with the field untouched scrapes those examples instead of finding nothing to do; clear the field or paste your own links to scrape only those.

#### Output views

The dataset has four views in the Console: **Products** (listing fields), **Product detail** (description, specifications and variants), **Reviews** and **Changes** (incremental mode `changeType` and `changedFields`).

#### Billing

Each run pays one start event. Each product pushed to the dataset is one dataset-item event. Each enriched product also pays the detail-enrichment event: one unit per enriched product regardless of the review count, charged per product right after it is pushed. Reviews per product are capped at 900. Suppressed incremental rows and failed fetches are never charged. Current rates are on the **Pricing** tab.

### 🔗 Want more e-commerce data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🛒 <a href="https://apify.com/abotapi/bigw-marketplace-scraper"><b>BIG W Marketplace Scraper</b></a><br>Scrape BIG W Marketplace seller listings from bigw.com.au: name, brand, price, was-price...</td><td>🛒 <a href="https://apify.com/abotapi/target-au-scraper"><b>Target AU Scraper</b></a><br>Scrape products and customer reviews from Target.com.au. Search by keyword or use...</td></tr>
<tr><td>🛒 <a href="https://apify.com/abotapi/officeworks-scraper"><b>Officeworks Scraper</b></a><br>Scrape Officeworks products by keyword, category, or URL. Extract names, brands, prices...</td><td>🛒 <a href="https://apify.com/abotapi/kmart-au-scraper"><b>Kmart Scraper</b></a><br>Scrape products and customer reviews from Kmart.com.au. Search by keyword or use...</td></tr>
<tr><td>🛒 <a href="https://apify.com/abotapi/chemistwarehouse-com-au-scraper"><b>Chemist Warehouse AU</b></a><br>Scrape chemistwarehouse.com.au products with prices, RRP, discounts, stock, images...</td><td>🔌 <a href="https://apify.com/abotapi/appliancesonline-com-au-scraper"><b>Appliances Online Scraper</b></a><br>Scrape appliancesonline.com.au by category, keyword, or URL. Extract title, brand, AUD...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/myer-au-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

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

Choose 'search' to use keywords and filters, or 'url' to scrape specific product, search or category URLs you paste below.

## `queries` (type: `array`):

One or more keywords to search, for example 'perfume' or 'coffee machine'. Each keyword is searched separately.

## `specialsCategory` (type: `string`):

Optional. Scrape one of Myer's promotional views (Sale, Clearance or a department sale) instead of, or alongside, a keyword search. Every product returned carries its was-price, saving amount and saving percentage. Leave as 'None' for a normal keyword search. You can also reach these views in URL mode by pasting the sale / clearance category URL.

## `urls` (type: `array`):

Product, search, category or brand URLs to scrape, for example https://www.myer.com.au/p/some-product, https://www.myer.com.au/search?query=perfume, https://www.myer.com.au/c/beauty/skincare or https://www.myer.com.au/b/chanel. m. and bare-host links and legacy /shop/mystore/<dept> links are accepted. A pasted brand= / sort= query is applied to that URL. Multiple URLs supported.

## `brand` (type: `string`):

Optional. Keep only products whose brand matches this value, for example 'Chanel' or 'Nespresso'. Combine with a specials category to filter that sale to one brand.

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

Ordering applied to the collected results. Myer serves relevance order; price / name / rating ordering is applied to the collected set.

## `minPrice` (type: `integer`):

Optional. Only keep products priced at or above this amount (AUD).

## `maxPrice` (type: `integer`):

Optional. Only keep products priced at or below this amount (AUD).

## `minRating` (type: `integer`):

Optional. Only keep products with an average customer rating at or above this value (1 to 5). Requires detail enrichment (the rating is read during enrichment).

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

Include products that are currently unavailable. On by default; turn off to keep only available products.

## `detailEnrichment` (type: `boolean`):

For each product, also fetch the product page for the full description, attributes, size/colour variants and identifiers, plus ratings and customer reviews. Adds one request per product. Turn off for a faster, lower-cost run that returns the listing card fields only (no reviews).

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

Cap on reviews collected per product when detail enrichment is on. 0 means as many as available, up to 900 per product; values above 900 are capped at 900. Each enriched product carries one detail-enrichment unit regardless of how many reviews are collected.

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

Maximum number of products to return across the whole run. Use 0 for unlimited.

## `maxPages` (type: `integer`):

Optional safety cap on result pages walked per keyword / URL. A pasted URL that names its own start page counts from that page (maxPages=2 on a page=5 URL walks pages 5-6). A resumed run counts from page 1 of the original run, so the cap is cumulative across resumes, not reset per run. Use 0 to walk every page (the run still stops automatically once Max products is reached, or once a page repeats or the store's own result total is reached).

## `proxy` (type: `object`):

Apify Proxy is recommended for reliable results. On the free plan, coverage may be limited and some runs may return no results.

## `resumeFromRunId` (type: `string`):

Optional. ID of a previous run of this actor (or a dataset ID). Products already in that dataset are skipped, so this run returns only NEW products (a delta). Combine both runs' datasets for the full set. Max products then counts only the new products. For recurring daily monitoring of the same search, use Incremental mode below instead.

## `incrementalMode` (type: `boolean`):

Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. A product counts as UPDATED when its own catalogue data changed: price, was-price and savings, availability and buyable flags, promo badges, name, brand, category, specifications, descriptions, images and per-variant price and stock. Ratings, review counts, ratingDistribution and the reviews list never trigger UPDATED (they change far more often); they are still returned. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). State is kept separately for each distinct search/filter setup (or by State key below).

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from your search/filter/detail settings — different searches then never mix state with each other.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Max products or Max pages capped it, or when Resume was used. This returns — and bills — extra synthetic rows.

## `ignoreFieldsForChanges` (type: `array`):

Output field names that should NOT make a product count as UPDATED, even when they changed. Ratings, review fields and the first promo badge (promoLabel) are always ignored already, and the order of promo badges, variants and colour variants is ignored. Add more names here, for example imageUrl or savedAmount. A name matches at any nesting depth (for example size inside variants). Ignored fields are still returned in the output.

## `mcpConnectors` (type: `array`):

Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "perfume"
  ],
  "specialsCategory": "",
  "urls": [
    "https://www.myer.com.au/c/beauty/skincare",
    "https://www.myer.com.au/c/beauty/skincare/eye-creams",
    "https://www.myer.com.au/c/beauty/skincare?pageNumber=2",
    "https://www.myer.com.au/c/beauty/skincare?pageNumber=1&sort=price-desc&brand=Clarins",
    "https://www.myer.com.au/search?query=nike%20shoes",
    "https://www.myer.com.au/search?query=nike%20shoes&pageNumber=2",
    "https://www.myer.com.au/search?query=perfume",
    "https://www.myer.com.au/p/chanel-nourish-soften-illuminate",
    "https://www.myer.com.au/b/chanel",
    "https://www.myer.com.au/c/beauty/featured-beauty-brands/featured-brand-chanel",
    "https://www.myer.com.au/shop/mystore/beauty",
    "https://m.myer.com.au/c/beauty/skincare",
    "https://myer.com.au/c/beauty/skincare"
  ],
  "sortBy": "relevance",
  "includeOutOfStock": true,
  "detailEnrichment": true,
  "maxReviewsPerProduct": 20,
  "maxItems": 20,
  "maxPages": 0,
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `detail` (type: `string`):

No description

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

No description

## `changes` (type: `string`):

No description

## `summary` (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 = {
    "mode": "search",
    "queries": [
        "perfume"
    ],
    "urls": [
        "https://www.myer.com.au/c/beauty/skincare",
        "https://www.myer.com.au/c/beauty/skincare/eye-creams",
        "https://www.myer.com.au/c/beauty/skincare?pageNumber=2",
        "https://www.myer.com.au/c/beauty/skincare?pageNumber=1&sort=price-desc&brand=Clarins",
        "https://www.myer.com.au/search?query=nike%20shoes",
        "https://www.myer.com.au/search?query=nike%20shoes&pageNumber=2",
        "https://www.myer.com.au/search?query=perfume",
        "https://www.myer.com.au/p/chanel-nourish-soften-illuminate",
        "https://www.myer.com.au/b/chanel",
        "https://www.myer.com.au/c/beauty/featured-beauty-brands/featured-brand-chanel",
        "https://www.myer.com.au/shop/mystore/beauty",
        "https://m.myer.com.au/c/beauty/skincare",
        "https://myer.com.au/c/beauty/skincare"
    ],
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": true
    },
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/myer-au-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 = {
    "mode": "search",
    "queries": ["perfume"],
    "urls": [
        "https://www.myer.com.au/c/beauty/skincare",
        "https://www.myer.com.au/c/beauty/skincare/eye-creams",
        "https://www.myer.com.au/c/beauty/skincare?pageNumber=2",
        "https://www.myer.com.au/c/beauty/skincare?pageNumber=1&sort=price-desc&brand=Clarins",
        "https://www.myer.com.au/search?query=nike%20shoes",
        "https://www.myer.com.au/search?query=nike%20shoes&pageNumber=2",
        "https://www.myer.com.au/search?query=perfume",
        "https://www.myer.com.au/p/chanel-nourish-soften-illuminate",
        "https://www.myer.com.au/b/chanel",
        "https://www.myer.com.au/c/beauty/featured-beauty-brands/featured-brand-chanel",
        "https://www.myer.com.au/shop/mystore/beauty",
        "https://m.myer.com.au/c/beauty/skincare",
        "https://myer.com.au/c/beauty/skincare",
    ],
    "maxItems": 20,
    "proxy": { "useApifyProxy": True },
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/myer-au-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 '{
  "mode": "search",
  "queries": [
    "perfume"
  ],
  "urls": [
    "https://www.myer.com.au/c/beauty/skincare",
    "https://www.myer.com.au/c/beauty/skincare/eye-creams",
    "https://www.myer.com.au/c/beauty/skincare?pageNumber=2",
    "https://www.myer.com.au/c/beauty/skincare?pageNumber=1&sort=price-desc&brand=Clarins",
    "https://www.myer.com.au/search?query=nike%20shoes",
    "https://www.myer.com.au/search?query=nike%20shoes&pageNumber=2",
    "https://www.myer.com.au/search?query=perfume",
    "https://www.myer.com.au/p/chanel-nourish-soften-illuminate",
    "https://www.myer.com.au/b/chanel",
    "https://www.myer.com.au/c/beauty/featured-beauty-brands/featured-brand-chanel",
    "https://www.myer.com.au/shop/mystore/beauty",
    "https://m.myer.com.au/c/beauty/skincare",
    "https://myer.com.au/c/beauty/skincare"
  ],
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true
  },
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/myer-au-scraper --silent --output-dataset

```

## MCP server setup

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