# Watsons Product Search Scraper (`stealth_mode/watsons-product-search-scraper`) Actor

Scrape Watsons product search results across all regional sites (.com.my, .co.th, .com.sg, etc.) in real-time. Collect 80+ fields including pricing, inventory, ratings, loyalty points, promotions, and product metadata—perfect for price monitoring, market analysis, and e-commerce intelligence.

- **URL**: https://apify.com/stealth\_mode/watsons-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

## Watsons Products Scraper: Extract Multi-Country Retail Data Instantly

---

### What Is Watsons?

Watsons is one of Asia's largest health and beauty retailers, operating online stores across multiple countries including Malaysia, Thailand, Singapore, and beyond. Each regional site displays thousands of products with region-specific pricing, availability, and promotions. Manually collecting product data across these markets is impractical—the **Watsons Products Scraper** automates extraction of comprehensive product intelligence across all Watsons markets simultaneously.

---

### Overview

The **Watsons Products Search Scraper** extracts product listings from Watsons search results pages, returning structured data with 80+ fields per product. It's designed for:

- **Price monitoring teams** tracking competitor pricing and markdown trends
- **E-commerce aggregators** building universal product catalogs
- **Market researchers** analyzing health and beauty product availability across regions
- **Loyalty program analysts** understanding promotional and rewards strategies
- **Inventory managers** tracking stock status and regional availability

The scraper handles pagination automatically, supports multiple regional URLs, and includes robust error handling via configurable parameters.

---

### Input Format & Configuration

The scraper accepts a JSON configuration object controlling which pages to scrape and how many results to extract:

```json
{
  "ignore_url_failures": true,
  "max_items_per_url": 200,
  "urls": [
    "https://www.watsons.co.th/en/skincare/serum/c/010305?currentPage=1"
  ]
}
````

#### Parameter Details

| Parameter | Type | Description | Example |
|---|---|---|---|
| `urls` | Array | Watsons product search page URLs to scrape. Each URL should be a search results or category page. Supports all regional domains (.com.my, .co.th, .com.sg, etc.). | `https://www.watsons.com.my/search?text=skincare` |
| `max_items_per_url` | Integer | Maximum number of products to extract per URL. Useful for limiting scrape scope and API costs. Default: 20. Maximum: 200+ | `200` |
| `ignore_url_failures` | Boolean | If `true`, the scraper continues running even if one or more URLs fail. Prevents interruption during large batch jobs. | `true` |

**Pro tips:**

- Use full category or search URLs (e.g., `/skincare/serum/c/010305`) rather than homepage links
- Set `max_items_per_url: 200` for comprehensive data collection
- Always enable `ignore_url_failures: true` for production runs with multiple URLs

***

### Output Format & Field Reference

**Sample output**

```json
{
  "average_rating": 5.0,
  "can_buy_by_origin_price": false,
  "category_name_levels": [
    {
      "code": "010000",
      "level": 1,
      "name": "Skincare"
    },
    {
      "code": "010300",
      "level": 2,
      "name": "Facial"
    },
    {
      "code": "010305",
      "level": 3,
      "name": "Serum"
    }
  ],
  "classifications": [
    {
      "code": "WtcthClassificationCategory",
      "features": [
        {
          "code": "ThClassification/1.0/WtcthClassificationCategory.elabingredients",
          "comparable": true,
          "feature_values": [
            {
              "value": "AQUA, BUTYLENE GLYCOL, GLYCERIN, CITRUS JUNOS FRUIT EXTRACT, 3-O-ETHYL ASCORBIC ACID, CAPRYLIC/CAPRIC TRIGLYCERIDE, CENTELLA ASIATICA EXTRACT, PANTHENOL, BETAINE, ISOPROPYL PALMITATE, ALLANTOIN, GLYCERETH-26, AMMONIUM ACRYLOYLDIMETHYLTAURATE/VP COPOLYMER, PHENYLETHYL RESORCINOL, 1,2-HEXANEDIOL, HYDROXYACETOPHENONE, POLYACRYLATE-13, BUTYROSPERMUM PARKII (SHEA) BUTTER, DIMETHYL ISOSORBIDE, SODIUM HYALURONATE, XANTHAN GUM, CERAMIDE NS, CERAMIDE AP, HYDROXYPINACOLONE RETINOATE, PROPYLENE GLYCOL, CETEARYL ALCOHOL, DIMETHICONE, POLYSORBATE 20, CERAMIDE NP, TETRAPEPTIDE-1, NONAPEPTIDE-1, POLYISOBUTENE, PENTYLENE GLYCOL, SORBITAN ISOSTEARATE, AROMA, ROSA HYBRID FLOWER EXTRACT"
            }
          ],
          "name": "elabIngredients",
          "range": false
        }
      ],
      "name": "WTCTH Classification Category"
    }
  ],
  "code": "BP_315010",
  "content_size_unit": "17 Ml",
  "default_variant_code": "315010",
  "elab_clean_beauty": false,
  "elab_color_variant_product_data": [
    {
      "average_rating": 5.0,
      "brand_name": "Glad2Glow",
      "color": "#f7f7f7",
      "color_description": "White",
      "currency_isocode": "THB",
      "discount_price": 188.0,
      "elab_country_of_origin": "China",
      "elab_exclusive_brand": "Branded",
      "elab_ingredients": "AQUA, BUTYLENE GLYCOL, GLYCERIN, CITRUS JUNOS FRUIT EXTRACT, 3-O-ETHYL ASCORBIC ACID, CAPRYLIC/CAPRIC TRIGLYCERIDE, CENTELLA ASIATICA EXTRACT, PANTHENOL, BETAINE, ISOPROPYL PALMITATE, ALLANTOIN, GLYCERETH-26, AMMONIUM ACRYLOYLDIMETHYLTAURATE/VP COPOLYMER, PHENYLETHYL RESORCINOL, 1,2-HEXANEDIOL, HYDROXYACETOPHENONE, POLYACRYLATE-13, BUTYROSPERMUM PARKII (SHEA) BUTTER, DIMETHYL ISOSORBIDE, SODIUM HYALURONATE, XANTHAN GUM, CERAMIDE NS, CERAMIDE AP, HYDROXYPINACOLONE RETINOATE, PROPYLENE GLYCOL, CETEARYL ALCOHOL, DIMETHICONE, POLYSORBATE 20, CERAMIDE NP, TETRAPEPTIDE-1, NONAPEPTIDE-1, POLYISOBUTENE, PENTYLENE GLYCOL, SORBITAN ISOSTEARATE, AROMA, ROSA HYBRID FLOWER EXTRACT",
      "elab_mark_down_price": {
        "currency_iso": "THB",
        "formatted_value": "฿188.00",
        "price_type": "BUY",
        "value": 188.0
      },
      "elab_price": {
        "currency_iso": "THB",
        "formatted_value": "฿239.00",
        "price_type": "BUY",
        "value": 239.0
      },
      "elab_subscribable": false,
      "is_color_me": false,
      "is_new": false,
      "is_pre_order": false,
      "price": 239.0,
      "product_code": "315010",
      "product_image": "https://medias.watsons.co.th/publishing/WTCTH-315010-front-zoom.jpg?version=1733883223",
      "product_name": "Glad2Glow Serum Yuja 377 Dark Spot 17 Ml.",
      "product_number_of_review": 2,
      "stock_level_status": "inStock"
    }
  ],
  "elab_country_of_origin": "China",
  "elab_exclusive_brand": "Branded",
  "elab_halal": false,
  "elab_ingredients": "AQUA, BUTYLENE GLYCOL, GLYCERIN, CITRUS JUNOS FRUIT EXTRACT, 3-O-ETHYL ASCORBIC ACID, CAPRYLIC/CAPRIC TRIGLYCERIDE, CENTELLA ASIATICA EXTRACT, PANTHENOL, BETAINE, ISOPROPYL PALMITATE, ALLANTOIN, GLYCERETH-26, AMMONIUM ACRYLOYLDIMETHYLTAURATE/VP COPOLYMER, PHENYLETHYL RESORCINOL, 1,2-HEXANEDIOL, HYDROXYACETOPHENONE, POLYACRYLATE-13, BUTYROSPERMUM PARKII (SHEA) BUTTER, DIMETHYL ISOSORBIDE, SODIUM HYALURONATE, XANTHAN GUM, CERAMIDE NS, CERAMIDE AP, HYDROXYPINACOLONE RETINOATE, PROPYLENE GLYCOL, CETEARYL ALCOHOL, DIMETHICONE, POLYSORBATE 20, CERAMIDE NP, TETRAPEPTIDE-1, NONAPEPTIDE-1, POLYISOBUTENE, PENTYLENE GLYCOL, SORBITAN ISOSTEARATE, AROMA, ROSA HYBRID FLOWER EXTRACT",
  "elab_is_adult_only": false,
  "elab_is_donate": false,
  "elab_is_for_membership_application": false,
  "elab_is_organic": false,
  "elab_is_outlet": false,
  "elab_is_point_redemption": false,
  "elab_is_poison2": false,
  "elab_is_sc_product": null,
  "elab_is_sdd": null,
  "elab_is_store_only": false,
  "elab_is_store_pickup_allowed": true,
  "elab_is_virtual_product": false,
  "elab_mark_down_price": {
    "currency_iso": "THB",
    "discount_amount": 51.0,
    "discount_amount_formatted_value": "฿51.00",
    "discount_rate": 21,
    "formatted_value": "฿188.00",
    "price_type": "BUY",
    "value": 188.0
  },
  "elab_max_order_quantity": 12,
  "elab_old_price": {
    "currency_iso": "THB",
    "formatted_value": "฿239.00",
    "price_type": "BUY",
    "value": 239.0
  },
  "elab_pack_item": false,
  "elab_pre_order_product": false,
  "elab_prescription": false,
  "elab_price": {
    "currency_iso": "THB",
    "formatted_value": "฿239.00",
    "price_type": "BUY",
    "value": 239.0
  },
  "elab_product_name": "Glad2Glow Serum Yuja 377 Dark Spot 17 Ml.",
  "elab_refill_pack": false,
  "elab_subscribable": false,
  "elab_tpr_price_flag": false,
  "elab_variant_product_content_size_units": [
    "17 Ml"
  ],
  "elab_variant_type": "ColorVariant",
  "elab_wine_rating": {},
  "first_received_flag": false,
  "gift_wrappable": false,
  "gtm_category_path": "Skincare/Facial/Serum",
  "home_delivery_only": false,
  "home_express_eligible": false,
  "images": [
    {
      "url": "https://medias.watsons.co.th/publishing/WTCTH-315010-front-prodcat.jpg?version=1733883223"
    }
  ],
  "is_estamp_product": false,
  "is_free_gift": false,
  "is_loyalty_card_product": false,
  "is_loyalty_product": false,
  "is_multi_dimension": false,
  "is_sf_locker_not_allowed": null,
  "is_site_survey_flag": false,
  "is_stock_loaded": false,
  "master_brand": {
    "abrand": false,
    "brand_url": "/all-brands/list/158217/glad2glow",
    "code": "158217",
    "is_featured": false,
    "name": "Glad2Glow",
    "small_logo": {
      "url": "/medias/Glad2Glow-Logo-100x50px.jpg?context=bWFzdGVyfHJvb3R8MTg1NDJ8aW1hZ2UvanBlZ3xhRFExTDJneFl5OHhOakE1TWpjNE1Ua3pOalkzTUM5SGJHRmtNa2RzYjNjZ1RHOW5iMTh4TURCNE5UQndlQzVxY0djfGEyOTlmNjk5ZGE5NTk2MWZmMzQ0ZjNkNGFhOWM4MjJkMzQ3ZWM3YzZlNDQ5NWQxNmNkODIxNDhlYWNkNTliNmU"
    }
  },
  "max_order_quantity": 12,
  "name": "Glad2Glow Serum Yuja 377 Dark Spot 17 Ml.",
  "pharmacy": false,
  "pickup_express_eligible": false,
  "potential_loyalty_points": 0,
  "pre_order": false,
  "price": {
    "currency_iso": "THB",
    "formatted_value": "฿188.00",
    "price_type": "BUY",
    "value": 188.0
  },
  "price_range": {},
  "product_loyalty_points": 0,
  "product_number_of_review": 2,
  "promotion_tags": [],
  "purchasable": false,
  "review_avg_rating": "5.0",
  "selected_store_only": false,
  "sell_quantity": 1,
  "short_description": "เซรั่มนี้มีส่วนผสมของ Symwhite377 ที่ช่วยลดเลือนจุดด่างดำและรอยสิวได้อย่างมีประสิทธิภาพ เนื้อเซรั่มบางเบา ซึมซาบง่าย เหมาะสำหรับใช้ทั้งกลางวันและกลางคืน การใช้เป็นประจำจะช่วยให้รอยสิวจางลงอย่างเห็นได้ชัด ผลิตจากส่วนผสมที่มีประสิทธิภาพสูง โดยไม่รู้สึกแสบผิว",
  "stock": {
    "stock_level_status": "inStock"
  },
  "strike_through_price": 239.0,
  "top_promotion": {
    "badge": {
      "image": {}
    },
    "is_elite_member_promotion_flag": false,
    "is_estamp_promotion_flag": false,
    "is_flash_sale_promotion_flag": false,
    "is_member_promotion_flag": false,
    "tag": {}
  },
  "url": "/glad2glow-glad2glow-serum-yuja-377-dark-spot-17-ml./p/BP_315010",
  "volume_prices_flag": false,
  "videos": null,
  "slug": null,
  "name_html": null,
  "ng_normalized_url": null,
  "is_x_border_delivery_allowed": null,
  "is_cvs_pickup_allowed": null,
  "ng_product_name_without_html_tag": null,
  "from_url": "https://www.watsons.co.th/en/skincare/serum/c/010305?currentPage=1&ajax=true"
}
```

Each scraped product returns up to 80 fields organized by category:

#### Core Product Information

| Field | Description | Example |
|---|---|---|
| `Code` | Internal Watsons product SKU or product code | `WAT12345` |
| `Name` | Product display name | `Neutrogena Ultra Sheer Dry-Touch Sunscreen SPF 50` |
| `Name HTML` | Product name with HTML formatting preserved | `Neutrogena <b>Ultra Sheer</b> Sunscreen` |
| `NG Product Name Without HTML Tag` | Clean product name without any markup | `Neutrogena Ultra Sheer Sunscreen SPF 50` |
| `Short Description` | Brief product summary | `Lightweight, fast-absorbing sunscreen protection` |
| `Master Brand` | Primary brand name | `Neutrogena` |
| `Slug` | URL-friendly product identifier | `neutrogena-ultra-sheer-sunscreen` |
| `URL` | Direct link to product detail page | `https://www.watsons.co.th/en/.../p/123456` |
| `NG Normalized URL` | Search engine normalized product URL | `https://www.watsons.co.th/p/neutrogena-sunscreen` |

#### Pricing & Financial

| Field | Description |
|---|---|
| `Price` | Current selling price in local currency |
| `Elab Price` | E-label catalog price (base price) |
| `Elab Old Price` | Previous price before discount |
| `Elab Mark Down Price` | Discount or markdown amount |
| `Strike Through Price` | Original price shown with strikethrough |
| `Can Buy By Origin Price` | Whether purchase at original price is allowed |
| `Price Range` | Min-max price for variants (if applicable) |
| `Elab TPR Price Flag` | Temp Price Reduction indicator flag |
| `Volume Prices Flag` | Whether bulk/volume pricing is available |

#### Inventory & Fulfillment

| Field | Description |
|---|---|
| `Stock` | Current inventory quantity available |
| `Sell Quantity` | Number of units sold |
| `Is Stock Loaded` | Boolean flag indicating stock status |
| `Purchasable` | Whether the product can currently be purchased |
| `Elab Max Order Quantity` | Maximum quantity allowed per order |
| `Max Order Quantity` | Alternative max order limit field |
| `Home Delivery Only` | Restricted to home delivery (no pickup) |
| `Home Express Eligible` | Eligible for express home delivery |
| `Pickup Express Eligible` | Eligible for express pickup service |
| `Is Store Pickup Allowed` | Whether in-store pickup is available |
| `Is CVS Pickup Allowed` | Pickup at convenience store partner allowed |
| `Is SF Locker Not Allowed` | Self-service locker delivery not available |
| `Is X Border Delivery Allowed` | Cross-border shipping eligibility |
| `Selected Store Only` | Only available at specific store locations |

#### Ratings & Reviews

| Field | Description |
|---|---|
| `Average Rating` | Overall product rating (typically 1-5 stars) |
| `Review Avg Rating` | Alternative average rating field |
| `Product Number Of Review` | Count of customer reviews |
| `Elab Wine Rating` | Special rating metric (for applicable products) |

#### Product Attributes & Classification

| Field | Description |
|---|---|
| `Category Name Levels` | Hierarchical category path (e.g., Skincare > Serum > Face Serum) |
| `GTM Category Path` | Go-To-Market category classification |
| `Classifications` | Product classification tags |
| `Elab Variant Type` | Product variant dimension (size, color, etc.) |
| `Elab Color Variant Product Data` | Color-specific variant information |
| `Elab Variant Product Content Size Units` | Variant size measurements (ml, oz, etc.) |
| `Content Size Unit` | Unit of measurement for product size |
| `Default Variant Code` | Default selected variant SKU |
| `Is Multi Dimension` | Product has multiple variant dimensions |

#### Product Certifications & Special Attributes

| Field | Description |
|---|---|
| `Elab Halal` | Product has Halal certification |
| `Elab Organic` | Certified organic product |
| `Elab Clean Beauty` | Meets clean beauty standards |
| `Elab Country Of Origin` | Manufacturing country |
| `Elab Ingredients` | Full ingredient list |
| `Elab Prescription` | Requires prescription (pharmacy products) |
| `Elab Is Poison 2` | Restricted/controlled substance indicator |
| `Pharmacy` | Available through pharmacy section |
| `Is Estamp Product` | E-stamp certified product |

#### Promotions & Loyalty

| Field | Description |
|---|---|
| `Promotion Tags` | Active promotion codes or labels |
| `Top Promotion` | Featured promotion for the product |
| `Elab Subscribable` | Eligible for subscription purchase |
| `Elab Refill Pack` | Refill/refillable product option |
| `Is Free Gift` | Includes complimentary gift |
| `Gift Wrappable` | Gift wrapping service available |
| `Potential Loyalty Points` | Estimated loyalty points earned |
| `Product Loyalty Points` | Actual loyalty points value |
| `Is Loyalty Product` | Eligible for loyalty program |
| `Is Loyalty Card Product` | Loyalty card required/applicable |

#### Special Flags & Restrictions

| Field | Description |
|---|---|
| `Elab Is Adult Only` | Age-restricted product (18+) |
| `Elab Is Store Only` | Available exclusively in physical stores |
| `Elab Is Virtual Product` | Digital/non-physical product |
| `Elab Is Store Pickup Allowed` | In-store pickup available |
| `Elab Is SDD` | Same-day delivery eligible |
| `Elab Is SC Product` | Special category product |
| `Elab Is Outlet` | Outlet/clearance item |
| `Elab Is Pre Order Product` | Pre-order item with future delivery |
| `Elab Pre Order Product` | Alternative pre-order indicator |
| `Elab Is Point Redemption` | Redeemable with loyalty points |
| `Elab Is Donate` | Part of donation program |
| `Elab Is For Membership Application` | Reserved for membership applicants |
| `Elab Exclusive Brand` | Exclusive brand to Watsons |
| `First Received Flag` | New arrival indicator |
| `Is Site Survey Flag` | Included in customer surveys |

#### Media & Visual

| Field | Description |
|---|---|
| `Images` | Array of product image URLs |
| `Videos` | Array of product video URLs (if available) |

***

### How to Use the Scraper

#### Step 1: Prepare Your URLs

Navigate to Watsons.com.my, Watsons.co.th, or any regional site. Perform a product search or browse to a category page. Copy the full URL from your browser's address bar—it should include search parameters or category paths.

**Example URLs by region:**

- Malaysia: `https://www.watsons.com.my/search?text=skincare`
- Thailand: `https://www.watsons.co.th/en/skincare/serum/c/010305`
- Singapore: `https://www.watsons.com.sg/search?q=sunscreen`

#### Step 2: Configure Input Parameters

Paste your URLs into the `urls` array. Adjust `max_items_per_url` based on your needs:

- **20–50**: Quick snapshots, minimal API usage
- **100–200**: Comprehensive category scrapes

Always set `ignore_url_failures: true` if running multiple URLs.

#### Step 3: Run the Scraper

Start the scraping job and monitor the run log. The scraper automatically handles pagination and collects all specified items.

#### Step 4: Export & Analyze

Download the output as JSON or CSV. Import into Excel, Python, or your BI platform for analysis.

**Common troubleshooting:**

- If results are empty, verify the URL is a valid search results or category page
- For regional sites, ensure you're using the correct domain (.com.my, .co.th, .com.sg, etc.)
- If certain fields are null, that product may not have that attribute in the source data

***

### Use Cases & Business Value

- **Price Intelligence:** Monitor competitor pricing, track markdowns, and optimize your pricing strategy
- **Product Intelligence:** Aggregate product attributes, ingredients, and certifications across all Watsons regions
- **Inventory Monitoring:** Track stock levels and fulfillment options across markets
- **Loyalty Program Analysis:** Understand how Watsons weights loyalty points and promotions by product
- **Market Research:** Analyze product trends, brand presence, and category growth across Asian markets
- **Supply Chain Planning:** Identify regional product availability, country of origin patterns, and sourcing insights

By automating product data extraction, you eliminate manual research, reduce decision-making time, and unlock competitive insights across multiple markets simultaneously.

***

### Conclusion

The **Watsons Products Scraper** delivers comprehensive, multi-market e-commerce intelligence in seconds. With 80+ fields covering pricing, inventory, certifications, and promotions across all Watsons regional sites, it's the essential tool for competitive pricing, market analysis, and product intelligence. Start scraping today and transform Watsons product data into actionable business insights.

# 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.watsons.com.my/search?text=lip&useDefaultSearch=false&brandRedirect=true"
  ],
  "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.watsons.com.my/search?text=lip&useDefaultSearch=false&brandRedirect=true"
    ],
    "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/watsons-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.watsons.com.my/search?text=lip&useDefaultSearch=false&brandRedirect=true"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/watsons-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.watsons.com.my/search?text=lip&useDefaultSearch=false&brandRedirect=true"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/watsons-product-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Watsons Product Search Scraper",
        "description": "Scrape Watsons product search results across all regional sites (.com.my, .co.th, .com.sg, etc.) in real-time. Collect 80+ fields including pricing, inventory, ratings, loyalty points, promotions, and product metadata—perfect for price monitoring, market analysis, and e-commerce intelligence.",
        "version": "0.0",
        "x-build-id": "ccrPZpPVBEMHRYCn1"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~watsons-product-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-watsons-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~watsons-product-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-watsons-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~watsons-product-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-watsons-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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
