DEV Community

김종현
김종현

Posted on Fully Autonomous

Export Olive Young Product Reviews to JSON with Apify

Olive Young product reviews can answer specific product questions: What complaints recur for one mask pack? Does a newer formulation get different ratings? The useful first step is not a store-wide crawler. Export a small, identifiable sample from one product, inspect it, then decide whether you need more.

I publish Korean Reviews Bundle on Apify. It supports public Olive Young product reviews and Naver Shopping Smart Store/Brand Store reviews in a common dataset. It does not support Coupang. This tutorial focuses on Olive Young and uses one product's goods number; it is not an independent benchmark.

Identify the product and bound the run

An Olive Young goods number looks like A000000223414 (the A and 12 digits are significant). Use that identifier or a supported product URL. The example requests at most ten reviews and caps the event charge at $0.15. It starts a real, billable Apify run when executed:

{
  "productIds": ["A000000223414"],
  "maxReviewsPerProduct": 10,
  "sortType": "USEFUL_SCORE_DESC",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
Enter fullscreen mode Exit fullscreen mode

The event is reviews-50: $0.15 per started block of 50 returned reviews, across the run. A zero-result run emits no review event; 51–100 returned reviews use two events. Splitting a batch into many small runs rounds each run up independently. Apify platform/proxy usage is included in that event price. A failed run or source change is not evidence that the product has zero reviews.

Call the synchronous API without putting your token in source

Use Node.js 24+ and set APIFY_TOKEN in your shell's secret environment. Do not put a token in a GitHub README or a URL. The endpoint can time out for long runs, so use an asynchronous run and dataset readback for larger batches.

const token = process.env.APIFY_TOKEN;
if (!token) throw new Error('Set APIFY_TOKEN in your secret environment');

const url = new URL('https://api.apify.com/v2/acts/ingenuous_signature~korean-reviews-bundle/run-sync-get-dataset-items');
url.searchParams.set('maxTotalChargeUsd', '0.15');
url.searchParams.set('timeout', '120');

const response = await fetch(url, {
  method: 'POST',
  headers: {
    authorization: `Bearer ${token}`,
    'content-type': 'application/json',
  },
  body: JSON.stringify({
    productIds: ['A000000223414'],
    maxReviewsPerProduct: 10,
    sortType: 'USEFUL_SCORE_DESC',
    proxyConfiguration: { useApifyProxy: true, apifyProxyGroups: ['RESIDENTIAL'] },
  }),
});
if (!response.ok) throw new Error(`Apify run returned HTTP ${response.status}`);
const rows = await response.json();
console.log(rows.map(({ source, productId, reviewId, rating, text, date }) =>
  ({ source, productId, reviewId, rating, text, date })));
Enter fullscreen mode Exit fullscreen mode

Each item also has photo flags/paths, helpfulCount, optional skin-profile attributes, and scrapedAt. reviewId is a source identifier: pair it with source and productId when de-duplicating. The Actor does not output reviewer names or account IDs. Naver's review-list response lacks some Olive Young attributes, so the same fields can be zero, null, or empty on Naver. The publisher-maintained runnable example includes an output schema.

Check the source sites' terms and your applicable privacy requirements before using the data. Reviews and markup change; evaluate coverage on the specific product you care about. A returned sample is not a complete store census, and neither a started event nor a successful run proves an external customer payment.

Disclosure: WebiStudio built the Actor described here. This article was drafted with AI assistance and technically reviewed against the published input schema and Apify API documentation.

Top comments (0)