# YesStyle Scraper - K-Beauty, Fashion, Prices & Reviews (`abotapi/yesstyle-com-scraper`) Actor

Scrape YesStyle products by keyword or URL. Extract prices, discounts, ratings, stock, images, categories, variants and customer reviews across K-beauty, fashion and lifestyle. Incremental mode tracks daily changes.

- **URL**: https://apify.com/abotapi/yesstyle-com-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 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

## YesStyle Scraper: K-Beauty, Fashion & Lifestyle Products + Reviews

YesStyle Scraper turns the YesStyle store into structured product and review data. Search by keyword or paste product, brand, category or search links, and get each product's price, discount, rating, review count, stock status, images and category trail, plus the store's own customer reviews. Export to JSON, CSV or Excel, or read the results straight through the API. Incremental mode tracks what changed since your last run.

### Why This Scraper?

- **Two ways in.** Run keywords through the store's own search, or paste product, brand, category and search links for a fixed catalogue.
- **75+ fields per product.** Price in local currency and USD, original price, discount, rating to two decimals, review count, brand id, variant and variant family, bestseller rank, awards, sale status, every active promotion, origin country, plus where the row came from and its rank in those results.
- **Full product pages.** Every gallery image at full size, the complete product details (size, benefits, how to use), ingredients, the rating breakdown by star, bestseller ranks per category, brand profile and satisfaction score, bundle offers, catalog number, delivery estimate and the category trail with ids.
- **Customer reviews attached.** Each product can carry its reviews as a nested list: title, rating, text, date, reviewer, helpful-vote counts, review images with thumbnails and the exact variant reviewed, sorted and filtered the way you choose.
- **Regional storefronts.** The connection's exit country decides which YesStyle storefront and currency a run reads (US by default).
- **Built for schedules.** Incremental mode returns only new, changed, reappeared or expired products on later runs, with the changed fields named on each row.

### Use Cases

- **Price and discount monitoring:** schedule a daily run over your brands or keywords and let incremental mode return only what changed.
- **Review mining:** pull ratings, review text, dates and helpful-vote counts for sentiment analysis or competitor research.
- **Catalogue feeds:** build a structured feed of a brand's or category's listings with full image galleries, ingredients, product details and category trails.
- **Stock, ranking and launch tracking:** watch availability, bestseller ranks and search positions, and catch new arrivals as they enter the results.

### Data You Get

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

| Field | Example |
| --- | --- |
| `productId` | `"1000000001"` |
| `url` | `"https://www.yesstyle.com/en/sample-sheet-mask/info.html/pid.1000000001"` |
| `name` | `"Sample Hydrating Sheet Mask"` |
| `brand` / `brandId` | `"Sample Brand"` / `300001` |
| `variant` | `"25ml"` |
| `price` / `currency` | `12.34` / `"USD"` |
| `originalPrice` / `discountPercent` | `18.0` / `31` |
| `priceUsd` | `12.34` |
| `rating` / `reviewCount` | `4.82` / `1000` |
| `ratingBreakdown` | `{"5": 800, "4": 150, "3": 30, "2": 10, "1": 10}` |
| `bestsellerRank` | `2` |
| `promotions` | `["limitedDeal", "highDiscount"]` |
| `itemStatus` | `"FLASH SALE"` |
| `images` | main shot plus every gallery image at full size (detail enrichment) |
| `productDescription` | `"Full product description appears here when detail enrichment is on."` |
| `productDetails` | size, benefits, types and how to use, as text (detail enrichment) |
| `ingredients` | `"Water, Glycerin, Niacinamide, ..."` (detail enrichment) |
| `brandOrigin` | `"South Korea"` (detail enrichment) |
| `bestsellerRanks` | `[{"rank": 2, "category": "Face Masks", "categoryId": 15561}]` (detail enrichment) |
| `variantProductIds` | ids of the other variants in the family |
| `bundles` | bundle offers that contain the product (detail enrichment) |
| `categories` | `["Home", "Beauty", "Skin Care", "Face Masks"]` (detail enrichment) |
| `searchRank` / `sourceQuery` | `3` / `"sheet mask"` |
| `reviews` | nested review rows, each key prefixed `review` (review enrichment) |

Every listing row also carries `originalPriceDisplay`, `priceDisplay`, `discountAmountUsd`, `isNew`, `hasVideos`, `variantCount`, `awards`, `productPackLabel`, `badges`, `originCountry`, `imageUrl` and `sourceUrl`. Detail enrichment adds `imageCount`, `coverImageUrl`, `productDetailSections`, `size`, `howToUse`, `benefits`, `brandUrl`, `brandDescription`, `brandSatisfactionPercent`, `brandReviewCount`, `brandPositiveReviewCount`, `yesStylerCount`, `availability`, `availabilityText`, `isSellable`, `condition`, `selectedOption`, `dealClaimedPercent`, `saleEndDate`, `parentProductId`, `productInformation`, `importedFrom`, `catalogNumber`, `categoryId`, `categoryIds`, `categoryUrls`, `searchKeywords`, `shipsTo`, `freeShippingOffer`, `deliveryEstimate`, `purchaseNote` and `nonReturnable`. Review enrichment adds `reviewsSummary` (total, satisfaction and per-star counts). Both enrichments are on by default. With Incremental mode on, every row also carries `changeType` (`NEW`, `UPDATED`, `UNCHANGED`, `REAPPEARED` or `EXPIRED`) and `changedFields`.

### How to Use

1. Pick a **mode**: `search` (run keywords through the store's own search) or `url` (paste product, browse or search links).
2. Toggle **Fetch product details** and **Fetch customer reviews** for the enriched fields; both are on by default.
3. Set **Max products** to control run size and cost, then click **Start**.
4. Download the dataset as JSON, CSV or Excel, or read it through the API.

**Search by keyword:**

```json
{
  "mode": "search",
  "queries": ["sheet mask"],
  "sortBy": "bestsellers",
  "maxItems": 50
}
```

**Watch one brand's full catalogue:**

```json
{
  "mode": "url",
  "urls": ["https://www.yesstyle.com/en/anua/list.html/bpt.299_bid.325602"],
  "maxItems": 0,
  "fetchReviews": false
}
```

**One product, all its reviews, newest first:**

```json
{
  "mode": "url",
  "urls": ["https://www.yesstyle.com/en/aplb-glutathione-niacinamide-sheet-mask-25ml/info.html/pid.1124536886"],
  "reviewSort": "newest",
  "maxReviewsPerProduct": 0
}
```

**Daily change monitoring:**

```json
{
  "mode": "search",
  "queries": ["sheet mask"],
  "incrementalMode": true,
  "stateKey": "my-monitor",
  "maxItems": 100
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/yesstyle-com-scraper").call(run_input={
    "mode": "search", "queries": ["sheet mask"], "maxItems": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["productId"], item["name"], item.get("price"), item.get("currency"))
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/yesstyle-com-scraper').call({
    mode: 'search', queries: ['sheet mask'], maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((i) => [i.productId, i.name, i.price]));
```

#### How `maxItems` shapes a scheduled run

**Max products** (`maxItems`, default 20) caps the whole run; `0` removes the cap. **Max pages** (`maxPages`) caps each keyword or listing separately; leave it empty to walk every page. Reviews are read only for products actually returned, and **Max reviews per product** (default 20, `0` = all) caps each product's list.

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one interrupted run: paste its run or dataset id and the actor skips every product already collected there, so you don't pay twice.
- **Incremental mode** (`incrementalMode`) is for scheduled runs over the same input. Each product is classified `NEW`, `UPDATED` (with `changedFields`), `UNCHANGED` (suppressed and not billed unless `emitUnchanged` is on), `REAPPEARED`, or `EXPIRED` (only after a complete scan, and only with `emitExpired` on). `stateKey` names or shares the stored state. Change detection tracks product-level fields (price, rating, review count, availability and so on), so a product with a new review comes back as `UPDATED` without re-sending every historical review. List any fields you don't want treated as changes in `ignoreFieldsForChanges`.

### 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 → Integrations** (Notion, Linear, Airtable, or Apify).
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 items 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. `maxNotifyListings` caps how many products are sent per run (default 50).

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (keywords) or `url` (pasted links, routed by their own shape). |
| `queries` | array | `["sheet mask"]` (prefilled) | Keywords for search mode. |
| `sortBy` | string | `bestsellers` | Search mode only: `bestsellers`, `new_arrivals`, `price_low_high`, `price_high_low`, `best_value`, `availability` or `discount_high_low`. Pasted links keep their own sort. |
| `urls` | array | sample (prefilled) | Product, brand, category or search links for URL mode. |
| `minPrice` | string | (none) | Both modes: keep only products priced at or above this value. |
| `maxPrice` | string | (none) | Both modes: keep only products priced at or below this value. |
| `inStockOnly` | boolean | `false` | Both modes: keep only products the store marks in stock (needs product details). |
| `fetchDetails` | boolean | `true` | Read each product's own page for the description, images, variant, stock wording and categories. |
| `fetchReviews` | boolean | `true` | Attach the product's customer reviews as a nested list, billed per review. |
| `reviewSort` | string | `relevant` | `relevant`, `newest`, `highest` or `helpful`. |
| `reviewFilter` | string | `all` | `all`, `five_star` to `one_star`, `positive`, `negative`, `photo` or `video`. |
| `maxReviewsPerProduct` | integer | `20` | Stop after this many reviews per product (`0` = all). |
| `maxItems` | integer | `20` | Product cap for the whole run (`0` = no limit). |
| `maxPages` | integer | (none) | Page cap per keyword or listing (empty = all pages). |
| `resumeFromRunId` | string | (none) | Continue one interrupted run; products it already collected are skipped. |
| `incrementalMode` | boolean | `false` | Return only new and changed products on scheduled runs. |
| `stateKey` | string | (none) | Name or share an incremental-mode state. |
| `emitUnchanged` | boolean | `false` | Also return (and bill) unchanged products. |
| `emitExpired` | boolean | `false` | Also return (and bill) products that disappeared after a complete scan. |
| `ignoreFieldsForChanges` | array | (none) | Field names that alone should not mark a product `UPDATED`. |
| `proxy` | object | Apify Proxy, Residential, US (prefilled) | Connection settings; the exit country decides the regional storefront and currency. |
| `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 records are created. |
| `maxNotifyListings` | integer | `50` | Cap on products written to each connector per run. |

### Output Example

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

```json
{
  "productId": "1000000001",
  "url": "https://www.yesstyle.com/en/sample-sheet-mask/info.html/pid.1000000001",
  "name": "Sample Hydrating Sheet Mask",
  "brand": "Sample Brand",
  "brandId": 300001,
  "variant": "25ml",
  "price": 12.34,
  "currency": "USD",
  "priceDisplay": "US$ 12.34",
  "originalPrice": 18.0,
  "originalPriceDisplay": "US$ 18.00",
  "discountPercent": 31,
  "priceUsd": 12.34,
  "discountAmountUsd": 5.66,
  "rating": 4.82,
  "reviewCount": 1000,
  "ratingBreakdown": {"5": 800, "4": 150, "3": 30, "2": 10, "1": 10},
  "itemStatus": "FLASH SALE",
  "promotions": ["limitedDeal", "highDiscount"],
  "bestsellerRank": 2,
  "bestsellerRanks": [{"rank": 2, "category": "Face Masks", "categoryId": 10002}],
  "variantProductIds": ["1000000002", "1000000003"],
  "variantCount": 3,
  "originCountry": "KR",
  "images": [
    "https://d1flfk77wl2xk4.cloudfront.net/Assets/00/000/l_p0000000000.jpg",
    "https://d1flfk77wl2xk4.cloudfront.net/Assets/GalleryImage/00/000/L_g0000000001.jpg"
  ],
  "imageCount": 2,
  "productDescription": "Full product description appears here when detail enrichment is on.",
  "size": "25ml",
  "howToUse": "Apply to cleansed skin and remove after 15 minutes.",
  "ingredients": "Water, Glycerin, Niacinamide",
  "brandOrigin": "South Korea",
  "brandSatisfactionPercent": 98.5,
  "availability": "InStock",
  "dealClaimedPercent": 60,
  "saleEndDate": "2026-01-01T00:00:00Z",
  "categories": ["Home", "Beauty", "Skin Care", "Face Masks"],
  "categoryIds": [10000, 10001, 10002],
  "bundles": [{"bundleProductId": "1000000009", "bundleTitle": "Sample Sheet Mask Bundle Set", "bundlePrice": 49.0}],
  "importedFrom": "South Korea",
  "deliveryEstimate": "6 - 8 business days",
  "searchRank": 3,
  "sourceQuery": "sheet mask",
  "scrapedAt": "2026-01-01T00:00:00Z",
  "reviewsSummary": {"totalReviews": 1000, "satisfactionPercent": "98%", "ratingBreakdown": {"5": 800, "4": 150, "3": 30, "2": 10, "1": 10}},
  "reviews": [
    {
      "reviewId": 10000001,
      "reviewTitle": "Excellent for hydrating",
      "reviewRating": 5,
      "reviewText": "Review text appears here.",
      "reviewDate": "January 1, 2026",
      "reviewerName": "Jane Doe",
      "reviewHelpfulVotes": 10,
      "reviewTotalVotes": 12,
      "reviewImages": [],
      "reviewImageThumbnails": [],
      "reviewProductId": "1000000001"
    }
  ]
}
```

### Plan Requirement

The prefilled connection (Apify Proxy, Residential, US) works out of the box. Change the proxy country to read another regional storefront and its currency.

### FAQ

#### How much does it cost?

You pay per product returned, plus detail enrichment per product whose page was read and review enrichment per review attached. Turning both enrichments off gives the cheapest run. The **Pricing** tab shows the current rates. Use **Max products** and **Max reviews per product** to cap the cost of any run.

#### Is it legal to scrape YesStyle?

This actor collects only publicly available store data, without logging in. You are responsible for how you use it: follow YesStyle's terms and the laws that apply to you, including privacy law for reviewer names, and get legal advice if you plan commercial redistribution. Product 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 and turn on **Incremental mode**. The first run records a baseline; later runs return only new, updated and reappeared products (and expired ones after a complete scan, if you turn on **Emit expired products**). Unchanged products are not billed.

#### Why did a run return fewer products than the store shows?

**Max products**, **Max pages**, the price bounds and **In stock only** all narrow results. The store also reorders results between visits, so two runs of the same keyword can differ slightly near the cut-off.

#### Why did my run fail instead of returning an empty dataset?

If every listing page is refused after retries, the run stops with a clear message, so "no products" is never confused with "nothing could be read". Run it again in a few minutes, or check the connection setting you selected.

#### 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.

### 🔗 Want more fashion data?

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

<table>
<tr><td>👗 <a href="https://apify.com/abotapi/24s-com-scraper"><b>24S Scraper</b></a><br>Scrape 24S luxury fashion by category, filters, or URL. Extract brand, name, price...</td><td>🥦 <a href="https://apify.com/abotapi/elcorteingles-es-scraper"><b>El Corte Inglés Scraper</b></a><br>Scrape El Corte Inglés elcorteingles.es products across fashion, electronics, home...</td></tr>
<tr><td>👗 <a href="https://apify.com/abotapi/zozotown-scraper"><b>ZOZOTOWN</b></a><br>Scrape ZOZOTOWN (zozo.jp), Japan's largest fashion marketplace: name, brand, JPY price...</td><td>👗 <a href="https://apify.com/abotapi/otto-de-scraper"><b>OTTO.de Scraper</b></a><br>Scrape OTTO.de products by search or URL. Extract prices, discounts, variants...</td></tr>
<tr><td>👗 <a href="https://apify.com/abotapi/next-uk-product-scraper"><b>Next.co.uk Scraper</b></a><br>Scrape Next.co.uk: keyword search, category and product-listing walks, full product...</td><td>🏷️ <a href="https://apify.com/abotapi/vinted-marketplace-scraper"><b>Vinted Multi-Country Scraper</b></a><br>Scrape Vinted across 27 country marketplaces: keyword search with brand, price and...</td></tr>
</table>

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

### 💬 Support & custom scrapers

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

# Actor input Schema

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

Choose 'search' to run one or more keywords through YesStyle's own search, or 'url' to scrape pasted links: product pages, browse (list.html) pages and search pages are all accepted.

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

Only used when mode = search, ignored in url mode. One or more keywords, for example sheet mask, anua serum, korean dress.

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

Search mode only. Sort order applied to keyword searches, using the store's own sort codes. Pasted links in URL mode always keep their own ordering.

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

Only used when mode = url, ignored in search mode. Paste product page links, browse links (brand/category listings) or search links from yesstyle.com.

## `minPrice` (type: `string`):

Both modes. Keep only products priced at or above this value (in the storefront currency your run reads). Leave empty for no lower bound.

## `maxPrice` (type: `string`):

Both modes. Keep only products priced at or below this value. Leave empty for no upper bound.

## `inStockOnly` (type: `boolean`):

Both modes. Keep only products the product page marks as in stock. Needs Fetch product details enabled.

## `fetchDetails` (type: `boolean`):

Read each product's own page for the description, availability, condition, selected variant, full image set and category trail. Costs one Detail enrichment unit per product returned.

## `fetchReviews` (type: `boolean`):

Attach the product's customer reviews to its record as a nested list. Costs one Review enrichment unit per review attached. Reviews are only read for products actually returned.

## `reviewSort` (type: `string`):

Both modes. Which reviews come first, using the store's own review orderings.

## `reviewFilter` (type: `string`):

Both modes. Which reviews the store includes, using its own review filters.

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

Both modes. Stop reading a product's reviews after this many. Use 0 to read every review the store returns for the product.

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

Stop after this many products. The run ends cleanly once the cap is reached.

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

Walk at most this many result pages per keyword or listing. Leave empty or 0 to walk every page of results.

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

Continue an interrupted run: paste a previous run's ID (or a dataset ID) from this account and every product it already collected is skipped.

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

Track the same search or links across scheduled runs and return only what changed: NEW, UPDATED, UNCHANGED (suppressed by default), REAPPEARED and EXPIRED products. The first run for a scope reports everything as NEW.

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

Optional name for the incremental baseline. Runs sharing a state key share one baseline; leave empty to derive it from the search configuration automatically.

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

Also return products that did not change since the last incremental run (changeType UNCHANGED) instead of suppressing them.

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

After a complete scan, also return tracked products that are no longer in the results (changeType EXPIRED).

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

Advanced. Top-level field names whose changes alone should not mark a product UPDATED (for example badges). The record's other fields still fingerprint normally.

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

Apify Proxy is enabled by default on the residential pool - the store's edge refuses datacenter exits on listing pages. The exit country decides the regional storefront and currency (US default).

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

Optional MCP connector IDs. Each returned product is also sent to the connector (for example a Notion database).

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

Used with a Notion MCP connector: the parent page or database the product pages are created under.

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

Cap how many of the returned products are sent to MCP connectors.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "sheet mask"
  ],
  "sortBy": "bestsellers",
  "urls": [
    "https://www.yesstyle.com/en/aplb-glutathione-niacinamide-sheet-mask-25ml/info.html/pid.1124536886"
  ],
  "inStockOnly": false,
  "fetchDetails": true,
  "fetchReviews": true,
  "reviewSort": "relevant",
  "reviewFilter": "all",
  "maxReviewsPerProduct": 20,
  "maxItems": 20,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

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

No description

## `reviews` (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": [
        "sheet mask"
    ],
    "sortBy": "bestsellers",
    "urls": [
        "https://www.yesstyle.com/en/aplb-glutathione-niacinamide-sheet-mask-25ml/info.html/pid.1124536886"
    ],
    "fetchDetails": true,
    "fetchReviews": true,
    "reviewSort": "relevant",
    "reviewFilter": "all",
    "maxReviewsPerProduct": 20,
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    },
    "maxNotifyListings": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/yesstyle-com-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": ["sheet mask"],
    "sortBy": "bestsellers",
    "urls": ["https://www.yesstyle.com/en/aplb-glutathione-niacinamide-sheet-mask-25ml/info.html/pid.1124536886"],
    "fetchDetails": True,
    "fetchReviews": True,
    "reviewSort": "relevant",
    "reviewFilter": "all",
    "maxReviewsPerProduct": 20,
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
    "maxNotifyListings": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/yesstyle-com-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": [
    "sheet mask"
  ],
  "sortBy": "bestsellers",
  "urls": [
    "https://www.yesstyle.com/en/aplb-glutathione-niacinamide-sheet-mask-25ml/info.html/pid.1124536886"
  ],
  "fetchDetails": true,
  "fetchReviews": true,
  "reviewSort": "relevant",
  "reviewFilter": "all",
  "maxReviewsPerProduct": 20,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "maxNotifyListings": 50
}' |
apify call abotapi/yesstyle-com-scraper --silent --output-dataset

```

## MCP server setup

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