# Clinique Product Scraper (`dromb/clinique-wave1`) Actor

Scrape Clinique AU product search results, categories, prices, and detailed item data from the public storefront. Supports search, category browsing, and detailed product information with GraphQL enrichment.

- **URL**: https://apify.com/dromb/clinique-wave1.md
- **Developed by:** [Dmitriy Gyrbu](https://apify.com/dromb) (community)
- **Categories:** Automation, E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Clinique Product Scraper

The **Clinique Product Scraper** is a powerful tool designed to extract comprehensive product information from the Clinique AU storefront. It is ideal for price monitoring, market research, competitor analysis, and tracking product availability.

### ⚠️ Disclaimer

This actor is not affiliated with, endorsed by, or sponsored by Clinique. It is a third-party tool for accessing publicly available product information. Users are responsible for ensuring their use complies with Clinique's terms of service and applicable laws.

### Supported Operations

| Operation | Description | Required Fields |
|-----------|-------------|-----------------|
| `probe` | Check if Clinique AU storefront is accessible | None |
| `categories` | List all product categories from sitemap | None |
| `category` | Browse products by category URL/id/slug | `url` |
| `search` | Search products by keyword | `query` |
| `item` | Get detailed product information | `slug` |

### Input Guide

#### Common Fields

- **operation** (required): Select the operation to perform
- **proxyMode**: How to use proxies (`auto`, `direct`, `apify`, `custom`)
- **includeRaw**: Include raw API response in output
- **disableFreeTrialGuard**: Disable daily run limit (owner only)

#### Operation-Specific Fields

##### Probe

- No additional fields required

##### Categories

- **refresh**: Force refresh sitemap cache (default: `false`)

##### Category

- **url** (required): Category URL, id, or slug (e.g., `https://www.clinique.com.au/products/200/` or `200`)
- **page**: Page number (default: `1`)
- **limit**: Results per page, max 50 (default: `20`)
- **details**: Fetch additional details (slower, default: `false`)

##### Search

- **query** (required): Search term (e.g., "moisturizer")
- **page**: Page number (default: `1`)
- **limit**: Results per page, max 50 (default: `20`)
- **details**: Fetch additional details (slower, default: `false`)

##### Item

- **slug** (required): Product slug or URL (e.g., product ID or full URL)

### Example Inputs

#### Search for products

```json
{
  "operation": "search",
  "query": "moisturizer",
  "limit": 10
}
```

#### Browse a category

```json
{
  "operation": "category",
  "url": "https://www.clinique.com.au/products/200/",
  "limit": 20
}
```

#### Get item details

```json
{
  "operation": "item",
  "slug": "12345"
}
```

#### List categories

```json
{
  "operation": "categories"
}
```

#### Check API availability

```json
{
  "operation": "probe"
}
```

### Output Fields

#### Product Item Fields

- `id`: Unique product identifier
- `slug`: URL slug
- `name`: Full product name
- `brand`: Brand name (Clinique)
- `barcode`: UPC/EAN barcode
- `source_url`: Product page URL
- `category`: Main category
- `breadcrumbs`: Category path hierarchy
- `price`: Current price
- `discount_price`: Sale/discount price
- `price_info`: Price breakdown array with per-unit pricing
- `currency`: Currency code (AUD)
- `size`: Product size
- `unit_quantity`: Unit quantity
- `unit`: Unit of measurement
- `image`: Primary image URL
- `images`: All image URLs
- `in_stock`: Boolean stock availability
- `stock_status`: Stock status string
- `rating`: Average rating
- `review_count`: Number of reviews
- `description`: Full product description (when `details=true`)
- `short_description`: Brief description
- `ingredients`: Full ingredient list (when `details=true`)
- `usage_instructions`: How to use the product (when `details=true`)
- `variants`: Available variants/sizes/shades (when `details=true`)
- `attributes`: Additional attributes (key ingredients, benefits, etc.)

#### Category Fields

- `id`: Category ID
- `slug`: Category slug
- `name`: Human-readable name
- `source_url`: Category page URL
- `parent_id`: Parent category ID

### Proxy Behavior

Clinique AU is a retail site that is generally accessible without proxies. The actor uses a smart fallback strategy:

- **Default mode**: Direct connection with proxy fallback on block
- **Proxy modes**: `auto`, `direct`, `apify`, `custom`
- **Fallback methods**: httpx, tls\_client, cloudscraper, curl\_cffi
- **Recommendation**: Start with `auto` mode, use proxies only if blocked

### Technical Details

- **Base URL**: https://www.clinique.com.au
- **Discovery**: Sitemap.xml parsing (cached for 4 hours)
- **Product API**: GraphQL endpoint with specific headers
- **Methods**: httpx, tls\_client, cloudscraper, curl\_cffi (with fallback)
- **Pagination**: Supports page-based pagination (max 50 items per page)

### Limitations

- **Rate limiting**: Excessive requests may trigger rate limits
- **Sitemap changes**: Sitemap structure may change, affecting category listing
- **GraphQL API**: API structure may change without notice
- **Maximum limit**: 50 items per page for search/category operations
- **Geo-restriction**: Site is optimized for AU region

### Free Trial Limit

Free/trial users are limited to 10 runs per day. This limit can be disabled by the actor owner using the `disableFreeTrialGuard` input field.

### Monetization

This actor is configured for pay-per-event monetization:

- **Model**: Pay-per-event
- **Result event name**: `result-item`
- **Recommended actor start**: ~$0.005
- **Recommended result item**: ~$0.0003-0.0005
- **Charge limit**: Stops automatically when budget limit reached

### Categories

`ECOMMERCE`, `AUTOMATION`, `DEVELOPER_TOOLS`

# Actor input Schema

## `operation` (type: `string`):

Select the operation to perform

## `query` (type: `string`):

Search query for products (required for search operation)

## `url` (type: `string`):

Category or product URL (for category and item operations)

## `slug` (type: `string`):

Product slug (for item operation)

## `page` (type: `integer`):

Page number (for search and category operations)

## `limit` (type: `integer`):

Number of results per page (max 50)

## `details` (type: `boolean`):

Fetch additional details (slower, includes ingredients, usage instructions, variants)

## `refresh` (type: `boolean`):

Force refresh sitemap cache (for categories operation)

## `includeRaw` (type: `boolean`):

Include raw API response in output

## `proxyMode` (type: `string`):

How to use proxies

## `disableFreeTrialGuard` (type: `boolean`):

Disable daily run limit for free trial users (owner only)

## Actor input object example

```json
{
  "operation": "categories",
  "query": "moisturizer",
  "page": 1,
  "limit": 10,
  "details": false,
  "refresh": false,
  "includeRaw": false,
  "proxyMode": "direct",
  "disableFreeTrialGuard": false
}
```

# Actor output Schema

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

Normalized dataset items returned by the actor.

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

Run summary JSON stored under the OUTPUT key.

# 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 = {
    "query": "moisturizer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("dromb/clinique-wave1").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 = { "query": "moisturizer" }

# Run the Actor and wait for it to finish
run = client.actor("dromb/clinique-wave1").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 '{
  "query": "moisturizer"
}' |
apify call dromb/clinique-wave1 --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dromb/clinique-wave1"
        }
    }
}

```

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/wAIyr7cIDMf9gJUw9/builds/Vwl4jx3vHWM35T6Fi/openapi.json
