# Mecca Product Search Scraper (`stealth_mode/mecca-product-search-scraper`) Actor

Scrape product listings from Mecca.com search and category pages across all country sites. Collect brand names, prices, ratings, stock status, variants, badges, and 20+ fields per product — built for beauty retail analysts, price trackers, and e-commerce researchers.

- **URL**: https://apify.com/stealth\_mode/mecca-product-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Mecca.com Products Search Scraper: Extract Beauty Product Data at Scale

**Excerpt:** Scrape product listings from Mecca.com search and category pages across all country sites. Collect brand names, prices, ratings, stock status, variants, badges, and 20+ fields per product — built for beauty retail analysts, price trackers, and e-commerce researchers.

---

### What Is Mecca.com?

Mecca is one of the Asia-Pacific region's most prominent prestige beauty retailers, operating across Australia, New Zealand, and other markets under mecca.com. Its catalog spans thousands of skincare, makeup, fragrance, and wellness products from both global luxury and independent brands. Manually gathering product data across categories and paginated search results is tedious and error-prone — the **Mecca.com Products Search Scraper** automates this entirely, turning category and search pages into clean, structured datasets ready for analysis or integration.

---

### Overview

The **Mecca Products Scraper** is designed to extract product listing data from Mecca.com category pages, search result pages, and filtered collections — across all supported country sites (e.g., `en-au`, `en-nz`). It processes paginated URLs and returns up to hundreds of product records per run.

Ideal for:

- **Beauty retail analysts** monitoring pricing and assortment changes
- **E-commerce teams** benchmarking product ranges against competitors
- **Price intelligence tools** tracking promotional and sale flags
- **Researchers** studying beauty brand distribution and availability

Key strengths: configurable item limits, fault-tolerant URL handling, and rich per-product output including promotional flags, variant data, and stock status.

---

### Input Format

The scraper accepts a JSON configuration object with the following fields:

```json
{
  "urls": [
    "https://www.mecca.com/en-au/fragrance/?page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 200
}
````

#### Field Definitions

| Field | Type | Default | Description |
|---|---|---|---|
| `urls` | `array` | — | One or more URLs pointing to Mecca.com product search or category listing pages. Supports paginated URLs (e.g., `?page=2`). Add URLs one by one or paste a prepared list using Bulk Edit mode. |
| `ignore_url_failures` | `boolean` | `true` | When set to `true`, the scraper continues running even if individual URLs fail to load or return no data. Recommended for bulk runs. |
| `max_items_per_url` | `integer` | `20` | Maximum number of product records to collect per URL. Increase up to `200` or more for full-category extraction. |

#### Input Tips

- **Supported URL formats:** Category pages (`/fragrance/`), brand pages (`/brands/chanel/`), and search result pages (`/search/?q=toner`) are all valid inputs.
- **Pagination:** To scrape multiple pages of a category, add each paginated URL separately (e.g., `?page=1`, `?page=2`, `?page=3`).
- **Country sites:** Specify the locale in the URL path — `en-au` for Australia, `en-nz` for New Zealand, etc.
- **Bulk runs:** Set `ignore_url_failures: true` to prevent a single broken URL from halting the entire job.

***

### Output Format

#### Sample Output Record

```json
{
  "secret_sale": false,
  "minimum_level": 0,
  "image": {
    "url": "https://contenthub-delivery.mecca.com/api/public/content/I-031308-I-031308-M1-MAISONMARGIELA-JazzClubEDT-Ribz9uH902r851c62E8KQ.jpg",
    "caption": "Jazz Club EDT, ",
    "alt_text": "Hero MAISONMARGIELA Jazz Club EDT"
  },
  "brand_name": "MAISON MARGIELA",
  "item_code": "V-031308",
  "name": "Jazz Club EDT",
  "price": {
    "is_price_range": true,
    "single_price": null,
    "min_price": {
      "current_price": "$60.00",
      "strikethrough_price": null,
      "value": 60
    },
    "max_price": {
      "current_price": "$245.00",
      "strikethrough_price": null,
      "value": 245
    },
    "currency_code": "AUD",
    "valued_at": null
  },
  "rating": {
    "value": 4.75,
    "number_of_reviews": 283
  },
  "banners": [
    {
      "code": "trending-now",
      "name": "Trending Now",
      "short_name": null,
      "priority": 1
    }
  ],
  "badges": [
    {
      "display_format": "Default",
      "code": "refillable",
      "name": "Refillable",
      "short_name": null,
      "priority": 20
    },
    {
      "display_format": "Default",
      "code": "scent-sample",
      "name": "Scent Sample",
      "short_name": "Scent Sample",
      "priority": 23
    }
  ],
  "variant_label": "4 sizes",
  "seo_friendly_url": "/maison-margiela/jazz-club-edt-V-031308/?cgpath=fragrance",
  "is_terminated": false,
  "parent_item_code": "V-031308",
  "single_line_description": "",
  "product_type": "Master",
  "current_variant": null,
  "categories": [
    "Fragrance",
    "Personal",
    "Fragrance"
  ],
  "item_colour": "",
  "item_variant": {
    "size": "",
    "colour": ""
  },
  "item_stock_status": "",
  "from_url": "https://www.mecca.com/en-au/fragrance/?page=2"
}
```

Each scraped product returns a structured record with 20+ fields:

#### Pricing & Promotions

| Field | Meaning |
|---|---|
| `Price` | Current listed price of the product in the local currency |
| `Secret Sale` | Flag indicating whether the product is part of a hidden or member-only sale |
| `Minimum Level` | Minimum membership or eligibility tier required to view or purchase the item (if applicable) |
| `Banners` | Promotional banners attached to the listing (e.g., "New Arrival", "Limited Edition") |
| `Badges` | Visual badges displayed on the product card (e.g., "Best Seller", "Exclusive") |

#### Product Identity

| Field | Meaning |
|---|---|
| `Name` | Full product name as displayed on the listing page |
| `Brand Name` | The brand or manufacturer of the product |
| `Item Code` | Unique SKU or internal identifier for this specific product item |
| `Parent Item Code` | The parent product code grouping all variants of a product together |
| `Single Line Description` | Short one-line summary shown beneath the product title |
| `Product Type` | Category classification of the product (e.g., serum, lipstick, perfume) |
| `SEO Friendly URL` | The canonical URL slug for the product detail page |
| `Is Terminated` | Boolean flag indicating whether the product has been discontinued or removed from sale |

#### Variants & Options

| Field | Meaning |
|---|---|
| `Variant Label` | The label describing the available variant (e.g., size, shade, formulation) |
| `Item Variant` | Specific variant identifier for this listing (e.g., `50ml`, `Medium`) |
| `Current Variant` | The variant currently selected or defaulted on the listing |
| `Item Colour` | Colour attribute of the product variant, particularly relevant for makeup items |

#### Discovery & Classification

| Field | Meaning |
|---|---|
| `Image` | URL of the primary product image |
| `Rating` | Aggregate customer review rating (typically out of 5) |
| `Categories` | List of category and subcategory tags associated with the product |

#### Availability

| Field | Meaning |
|---|---|
| `Item Stock Status` | Current stock availability (e.g., in stock, low stock, out of stock) |

***

***

### How to Use

1. **Select your target pages** — Navigate to Mecca.com and open the category, brand, or search results page you want to scrape. Copy the full URL including any filters or pagination parameters.
2. **Configure the input** — Paste your URLs into the `urls` array. Set `max_items_per_url` based on how many products you expect per page (typically 24–48 per page; increase for full extraction).
3. **Set fault tolerance** — Keep `ignore_url_failures: true` for multi-URL runs to avoid interruptions from occasional load failures.
4. **Run the scraper** — Start the actor and monitor progress in the run log.
5. **Export your data** — Download results as JSON, CSV, or Excel for use in spreadsheets, databases, or BI dashboards.

**Best practices:**

- For full category extraction, generate paginated URLs programmatically (`?page=1` through `?page=N`) and paste all into the `urls` field.
- Use locale-specific URLs (`en-au`, `en-nz`) to ensure pricing and availability data reflects the correct market.
- If `Item Stock Status` returns inconsistently, re-run with a fresh proxy session.

***

### Use Cases & Business Value

- **Assortment analysis:** Map Mecca's full product range by brand, category, or product type across markets
- **Price monitoring:** Track pricing movements and detect secret sale activations over time
- **Competitive intelligence:** Benchmark Mecca's catalog depth and promotional strategy against other beauty retailers
- **SEO & content research:** Use `SEO Friendly URL`, `Categories`, and `Single Line Description` fields to study retail content structure
- **Inventory tracking:** Monitor `Item Stock Status` across high-demand products or limited-edition launches

***

### Conclusion

The **Mecca.com Products Search Scraper** delivers fast, reliable access to one of the Asia-Pacific beauty market's richest product catalogs. With 20+ output fields covering pricing, promotions, variants, ratings, and stock status, it provides everything needed to turn Mecca's browsable listings into actionable intelligence. Configure your URLs, set your limits, and start extracting today.

# Actor input Schema

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

Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.mecca.com/en-au/fragrance/?page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.mecca.com/en-au/fragrance/?page=2"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/mecca-product-search-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 = {
    "urls": ["https://www.mecca.com/en-au/fragrance/?page=2"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

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

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.mecca.com/en-au/fragrance/?page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/mecca-product-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stealth_mode/mecca-product-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Mecca Product Search Scraper",
        "description": "Scrape product listings from Mecca.com search and category pages across all country sites. Collect brand names, prices, ratings, stock status, variants, badges, and 20+ fields per product — built for beauty retail analysts, price trackers, and e-commerce researchers.",
        "version": "0.0",
        "x-build-id": "d4pdcNXIYNANgStPE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~mecca-product-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-mecca-product-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/stealth_mode~mecca-product-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-mecca-product-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/stealth_mode~mecca-product-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-mecca-product-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "urls": {
                        "title": "URLs of the product search list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
