# Yotpo Reviews Scraper (`piotrv1001/yotpo-reviews-scraper`) Actor

The Yotpo Reviews Scraper exports product reviews from stores using Yotpo — ratings, text, verified and incentivized flags, custom questions, photos and merchant replies, with grouped-product flags and new-review tracking. Ideal for product research and review monitoring.

- **URL**: https://apify.com/piotrv1001/yotpo-reviews-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### 🚀 Yotpo Reviews Scraper

Export product reviews from online stores that use **Yotpo** reviews. Add product page URLs and get ratings, review text, dates, verified-buyer and incentivized flags, custom questions, photos and merchant replies as clean JSON, CSV or Excel. Schedule it to get only reviews you haven't seen before.

### ✨ Features

- ⭐ **Full review data**: rating, title, body, date, verified-buyer and incentivized flags, helpful votes, language, sentiment score, photos and the merchant's reply.
- 📝 **Custom review questions**: answers to store questions such as *Quality*, *Value* or *Type of mattress*, with question, type and answer.
- 🧩 **Grouped and syndicated reviews, clearly marked**: many stores show reviews from related products (other colors, bundles, sister stores) on a product page. Each row has `isExactProduct`, `isGrouped`, `groupedProductName`, `isSyndicated` and `syndicatedProductName`, or you can pick **This product only** to drop them.
- 🔔 **New-review tracking**: switch to *New-review tracking* and schedule the run. Each run returns only reviews that earlier runs with the same tracker name have not already returned. That works well for review monitoring, alerts and CX dashboards.
- 🏬 **Many stores in one run**: mix product pages from different Yotpo stores. The store's widget and the page's product are detected automatically.
- 🧾 **Clear coverage report**: a `SUMMARY` record shows for each product whether the widget was found, the widget's total review count and average rating, how many reviews were returned and why collection stopped.
- 🔒 **Privacy-aware by default**: reviewer names are off unless you turn them on. Personal questions such as age, body, skin type or health are left out.

### 🛠️ How It Works

1. **Add product URLs**: paste product pages that show Yotpo reviews (for example `https://www.brooklinen.com/products/rise-ai-giftcard`).
2. **Choose the scope**: *As shown on the product page* (grouped reviews included and flagged) or *This product only*.
3. **Set Maximum reviews** and run. For monitoring, choose *New-review tracking*, give the tracker a name and schedule the run.

If a product page can't be loaded, enter the store's public Yotpo key and the product ID as `STORE_KEY/PRODUCT_ID` under *Store key / product ID pairs*. Both appear in the product page's source.

Each product ends with a status in the `SUMMARY` record: `ok` (including real products with zero reviews), `notYotpo` (no Yotpo widget on the page), `productNotFound` (the store has no widget for that product ID) or `widgetNotResolved` (the store key was not accepted). Stop reasons are `feedEnd`, `maxItems`, `windowEnd`, `pageLimit` and `budgetLimit`.

### 💰 Pricing

**$1.00 per 1,000 reviews** ($0.001 per review) plus a tiny per-run start fee. You only pay for reviews returned in your dataset. Reviews already returned by earlier tracking runs are not charged again, and products without reviews cost nothing extra.

### 📊 Sample Output Data

```json
[
    {
        "reviewId": "790318298",
        "rating": 1,
        "title": "Nice thought turns embarrassing",
        "body": "Wanted to order gift cards for my team at work. After entering four of them, realize I can only order one at a time...",
        "isVerifiedBuyer": true,
        "isIncentivized": false,
        "incentiveType": null,
        "createdAt": "2025-12-12T17:28:18.000Z",
        "languageCode": "en",
        "sentimentScore": 0.041324265,
        "helpfulCount": 0,
        "unhelpfulCount": 0,
        "customFields": [],
        "images": [],
        "merchantReply": "Thank you for sharing this feedback—and I'm so sorry for how stressful this experience has been...",
        "merchantReplyAt": "2025-12-12T17:43:26",
        "productName": "E-Gift Card",
        "productImageUrl": "https://cdn-yotpo-images-production.yotpo.com/Product/245309284/176185359/square.png?1707965430",
        "requestedProductId": "6562759180378",
        "isExactProduct": true,
        "isGrouped": false,
        "groupedProductName": null,
        "groupedProductUrl": null,
        "isSyndicated": false,
        "syndicatedProductName": null,
        "syndicatedFromStoreKey": null,
        "storeKey": "MdtpPOdzecvdDWwA3pFvhLyB6ab4osWf5p8TQHpj",
        "productUrl": "https://www.brooklinen.com/products/rise-ai-giftcard",
        "sourceUrl": "https://www.brooklinen.com/products/rise-ai-giftcard",
        "scrapedAt": "2026-09-22T17:25:17.470Z"
    },
    {
        "reviewId": "893224632",
        "rating": 5,
        "title": "The Dryrobe Nexus is exactly",
        "body": "The Dryrobe Nexus is exactly what I was looking for. I can't wait to use it when I go for beach walks in October",
        "isVerifiedBuyer": true,
        "createdAt": "2026-09-21T21:17:35.000Z",
        "sentimentScore": 0.888628,
        "customFields": [
            { "title": "Quality", "type": "SingleChoice", "value": "Super - can't wait to use it more" },
            { "title": "Value", "type": "SingleChoice", "value": "Fantastic value for money" }
        ],
        "productName": "Limited Edition Ocean Blue Grey RNLI x Dryrobe® Nexus",
        "requestedProductId": "16140639797626",
        "isExactProduct": false,
        "isGrouped": true,
        "groupedProductName": "Black Nexus",
        "groupedProductUrl": "https://yotpo.com/go/qeyqEgQh",
        "storeKey": "SnIE6bqbIukpZOzWVpTJ86HO0oluAk8VjcmkFKtR",
        "productUrl": "https://dryrobe.com/products/rnli-limited-edition-dryrobe-nexus",
        "sourceUrl": "https://dryrobe.com/products/rnli-limited-edition-dryrobe-nexus"
    }
]
```

### ❓ FAQ

**Why do product-page reviews mention other products?** The store groups related products so they share reviews. Filter on `isExactProduct`, or run with *This product only*. The widget's total review count and average rating in `SUMMARY` cover the whole group, not the single product.

**What happens on the first tracking run?** It returns every review created inside the tracking window (30 days by default). Later runs with the same tracker name return only reviews that are new since then. New reviews can take a few hours to appear in the store's widget.

**The run says "No Yotpo reviews widget found".** That store uses a different review provider, or the page doesn't load the Yotpo widget. Try another product page from the same store.

**Does it return variant (size/color) information?** No. Yotpo reviews are attached to the product, not to a specific variant.

Turn Yotpo reviews into product, quality and customer-experience insights with **Yotpo Reviews Scraper**! 🚀

# Actor input Schema

## `startUrls` (type: `array`):

Product pages of stores that show Yotpo reviews. The scraper finds the store's Yotpo widget and the page's product automatically.

## `yotpoProducts` (type: `array`):

For product pages that cannot be loaded directly, enter the store's public Yotpo key and the product ID as STORE\_KEY/PRODUCT\_ID (for example MdtpPOdzecvdDWwA3pFvhLyB6ab4osWf5p8TQHpj/6562759180378). Both appear in the page source of the product page.

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

Maximum number of reviews returned across all URLs.

## `reviewScope` (type: `string`):

Stores often group related products (colors, bundles) so a product page shows reviews of its siblings too. 'As shown on the product page' keeps grouped reviews and marks each with isExactProduct and the product it was written for; 'This product only' drops reviews the store marks as grouped or syndicated from another product.

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

Export reviews newest first, or return only reviews not delivered by earlier runs of the same tracker. The first tracking run returns every review in the tracking window.

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

Reuse the same name in scheduled runs. Use a different name to start a fresh tracker. Only used in new-review tracking.

## `lookbackDays` (type: `integer`):

New-review tracking only looks at reviews created within this many days.

## `includeReviewerNames` (type: `boolean`):

Add the public display name shown on the review (usually first name and initial).

## `proxyConfiguration` (type: `object`):

Proxy servers used to load pages.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.brooklinen.com/products/rise-ai-giftcard"
    }
  ],
  "maxItems": 50,
  "reviewScope": "widget",
  "mode": "snapshot",
  "stateKey": "default",
  "lookbackDays": 30,
  "includeReviewerNames": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

No description

## `summary` (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 = {
    "startUrls": [
        {
            "url": "https://www.brooklinen.com/products/rise-ai-giftcard"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/yotpo-reviews-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 = {
    "startUrls": [{ "url": "https://www.brooklinen.com/products/rise-ai-giftcard" }],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/yotpo-reviews-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 '{
  "startUrls": [
    {
      "url": "https://www.brooklinen.com/products/rise-ai-giftcard"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call piotrv1001/yotpo-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/yotpo-reviews-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/whPbXpaCrjg964Z3V/builds/dNLSZtxLHWgbaEhJF/openapi.json
