# Shopify Review Scraper (Judge.me, Loox, Yotpo, Stamped + more) (`stanvanrooy6/shopify-review-scraper`) Actor

Scrape all reviews from any Shopify store. Auto-detects Judge.me, Loox, Yotpo, Okendo, Stamped.io, REVIEWS.io, Junip, Fera, Opinew, Rivyo, Klaviyo Reviews and Vitals. Store-wide or per product, unified JSON/CSV with rating, text, author, date, photos and verified badge. No login.

- **URL**: https://apify.com/stanvanrooy6/shopify-review-scraper.md
- **Developed by:** [Stan Van Rooy](https://apify.com/stanvanrooy6) (community)
- **Categories:** E-commerce, Marketing
- **Features:** Limited permissions
- **Stats:** 212 total users, 48 monthly users, 97.4% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 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.
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

## Shopify Review Scraper (Judge.me, Loox, Yotpo, Stamped + more)

**Free-plan sample:** Apify Free accounts can collect up to **100 result rows total per run**, shared across all inputs. Upgrade your [Apify plan](https://console.apify.com/billing/subscription) for larger runs. Normal Actor charges apply. The sample resets each run; it is not a daily or monthly quota.

Scrape all reviews from any Shopify store with one or more URLs. The scraper detects which review app the store runs and pulls reviews directly through that app's public data feed. It supports **Judge.me, Loox, Yotpo, Okendo, Stamped.io, REVIEWS.io, Junip, Fera, Opinew, Rivyo, Klaviyo Reviews and Vitals**, store-wide or for specific products, returning one unified schema with rating, text, author, date, verified-buyer status, product details, and reviewer photos/videos. No login, no cookies, no API key, and no slow browser automation.

### Why use this scraper

- **Automatic app detection**: You do not need to know which review app the store uses. Paste any Shopify store or product URL and the scraper detects the app automatically.
- **Twelve review apps, one unified output**: Judge.me, Loox, Yotpo, Okendo, Stamped.io, REVIEWS.io, Junip, Fera, Opinew, Rivyo, Klaviyo Reviews and Vitals all return in the same clean format, with raw app attributes preserved.
- **Batch URL processing**: Provide multiple store or product URLs in `startUrls` to scrape multiple competitors in a single execution.
- **Precision review filters**: Filter by star rating (`minRating` / `maxRating`), verified buyers only (`verifiedOnly`), media attachments (`mediaOnly`), keyword search (`reviewText`), and custom date ranges (`reviewDateFrom` / `reviewDateTo`).
- **High-speed direct API feeds**: Fast, lightweight data extraction directly from review endpoints without running a resource-heavy headless browser.
- **Full transparency**: A run that collects nothing clearly explains why in the run report, so you always know whether a store lacks reviews or uses an unsupported widget.

### Supported Shopify review apps

| Review app | Store-wide | Per product | Notes |
|---|---|---|---|
| Judge.me | yes | yes | largest install base, includes review photos |
| Loox | yes | yes | photo reviews, relative dates are converted to timestamps |
| Yotpo | yes | yes | reviews app key is detected automatically |
| Okendo | yes | yes | works with headless and Hydrogen storefronts |
| Stamped.io | yes | yes | verified badge, photos and videos, store replies |
| REVIEWS.io | yes | yes | product and company reviews, per-question ratings |
| Junip | yes | yes | survey answers and photo attachments |
| Fera | yes | yes | product and store reviews with media |
| Opinew | yes | yes | imported (Amazon, AliExpress) and native reviews |
| Rivyo | yes | yes | WebContrive Rivyo product reviews |
| Klaviyo Reviews | yes | yes | store-wide walks every product of the store |
| Vitals | yes | yes | the reviews module of the Vitals bundle, photos included |

If a store uses a review app we recognise but do not scrape yet (such as Bazaarvoice, PowerReviews or Trustpilot), the run ends cleanly and the status message names that app. If no review app is found at all, the run reports `no supported review platform detected` with the list of supported apps. Open an issue on the Issues tab with the store URL and the app will be added.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | List of store URLs (`norlanglass.com`, `https://norlanglass.com`) or product URLs (`https://norlanglass.com/products/glass-set`) to scrape in batch. |
| `startUrl` | string | Single store or product URL (legacy convenience; merged into `startUrls`). |
| `minRating`, `maxRating` | integer | Filter by star rating (1 to 5). For example, set `minRating: 1, maxRating: 2` for negative reviews. |
| `verifiedOnly` | boolean | Keep only verified buyer reviews. Default `false`. |
| `mediaOnly` | boolean | Keep only reviews with customer photos or videos. Default `false`. |
| `reviewText` | string | Search term to match within the review title or body text. |
| `reviewDateFrom`, `reviewDateTo` | string | Inclusive date window (`YYYY-MM-DD` in UTC) to extract reviews from. |
| `maxReviews` | integer | Maximum matching reviews to deliver per URL. Default `100`, `0` means unlimited. |
| `maxScannedReviews` | integer | Maximum source reviews inspected across all URLs in the run when filters are active. Default 10,000. The scan budget can stop collection before maxReviews is reached. |

#### Example 1: Standard store export

```json
{
  "startUrls": [{ "url": "https://norlanglass.com" }],
  "maxReviews": 500
}
```

#### Example 2: Batch competitor monitoring (negative verified reviews only)

```json
{
  "startUrls": [
    { "url": "https://store-a.com" },
    { "url": "https://store-b.com" }
  ],
  "minRating": 1,
  "maxRating": 2,
  "verifiedOnly": true,
  "maxReviews": 200
}
```

### Output

Every review is one dataset item with these standard fields, whatever the review app:

```json
{
  "review_id": "165964582",
  "author": "Jason",
  "rating": 5,
  "review_title": "Great pack",
  "body": "Well made. Great pockets and organization.",
  "date": "2026-09-20T03:19:29Z",
  "date_utc": "2026-09-20T03:19:29Z",
  "product_name": "Bannoch Backpack",
  "verified_buyer": true,
  "images": ["https://cdn.stamped.io/uploads/photos/257675_1774517878850.jpg"],
  "platform": "stamped",
  "source": "stamped"
}
```

`date` is the date as the app reports it and `date_utc` is the same instant as ISO 8601 UTC. `platform` and `source` carry the same value (`source` is kept for older integrations). Each app's own fields (`product_url`, `store_reply`, `videos`, `votes_up`, `location`, per-question ratings, survey answers and so on) are passed through unchanged next to the standard ones. Download the dataset as JSON, CSV, Excel or XML from the run's Storage tab.

### Scrape Judge.me reviews

Judge.me is the most installed Shopify review app. Give the scraper a store URL for the complete store review feed (product reviews with photos, verified flags and store replies) or a product URL for one product. Example input: `{"startUrl": "https://norlanglass.com", "maxReviews": 1000}`. Judge.me rate-limits large exports; the scraper backs off and continues automatically.

### Scrape Loox reviews

Loox is a photo-review app, so most items carry `images`. Loox shows relative dates ("2 days ago") in its widget; the scraper resolves the exact timestamp when the widget exposes it and otherwise keeps the relative text in `date`. Example input: `{"startUrl": "https://blendjet.com/products/best-of-blendjet-bundle"}`.

### Scrape Yotpo reviews

Yotpo reviews are fetched through the store's public reviews app key, which the scraper reads from the page (loyalty and SMS loader keys are ignored). Output includes `content`, `score`, `votes_up`, `votes_down` and the reviewer object. Example input: `{"startUrl": "https://www.brooklinen.com"}`.

### Scrape Okendo reviews

Okendo installs on classic themes and on headless (Hydrogen) storefronts; the scraper finds the subscriber id in either. Rows include `reviewer`, `productName`, `isVerifiedBuyer` and attribute ratings. Example input: `{"startUrl": "https://blueland.com/products/the-clean-essentials"}`.

### Scrape Stamped.io reviews

Stamped.io reviews come with the Verified Buyer badge, review photos and videos, the store's reply, helpful votes and the reviewer's country. The scraper finds the public widget key on the page or resolves it from the store's myshopify domain, so theme-extension installs work too. Example input: `{"startUrl": "https://trakke.co.uk", "maxReviews": 0}`.

### Scrape REVIEWS.io reviews

A REVIEWS.io store URL returns product reviews and company (merchant) reviews together, newest first, with `review_type` set to `product_review` or `store_review`. A product URL returns that product's reviews, matched the same way the REVIEWS.io widget does (variant SKUs, variant ids, product id and handle). Per-question ratings are passed through in `ratings`. Example input: `{"startUrl": "https://kambukka.com/products/olympus-300-ml-blush-horizon"}`.

### Scrape Junip reviews

Junip is popular with DTC brands. The scraper reads the Junip store key from the page and pages through the store or product feed (50 reviews per page). Rows include the reviewer name, `would_recommend`, survey answers (skin type, age, fit and similar) and photo attachments. Example input: `{"startUrl": "https://vessi.com"}`.

### Scrape Fera reviews

Fera returns product reviews and store reviews; `review_type` tells them apart (`product` or `store`). Photos and videos are in `images` and `videos`, the reviewer's location in `location`. Example input: `{"startUrl": "https://intensho.com"}`.

### Scrape Opinew reviews

Opinew stores often hold reviews imported from Amazon or AliExpress next to native ones; both are exported with `verified_buyer`, `language` and `location`. Opinew serves 10 reviews per page, so a full export of a large store takes a few minutes. Example input: `{"startUrl": "https://subcold.com", "maxReviews": 0}`.

### Scrape Rivyo reviews

Rivyo (WebContrive) product reviews are exported with the review title, body, product, store reply and helpful votes. Example input: `{"startUrl": "https://gestaltenselbst.com"}`.

### Scrape Klaviyo Reviews

Klaviyo Reviews has no store-wide feed, so for a store URL the scraper lists the store's products, asks Klaviyo which ones have reviews and exports each of them; a product URL goes straight to that product. Rows include the verified flag, review photos, the store's public reply and `is_store` for company reviews. Example input: `{"startUrl": "https://mejmej.com", "maxReviews": 0}`.

### Scrape Vitals reviews

Vitals bundles 40+ features; its product reviews module serves 1,000 reviews per page, so even large stores export in seconds. Rows carry the author, rating, text, date, product id, photos and the store reply. Example input: `{"startUrl": "https://premiertablelinens.com"}`.

### Monitor a store for new reviews

Only one run can update the same URL and monitoring list at a time. Let it finish before starting another. After an interrupted run, the list may stay busy until that run's timeout expires. Newest-first feeds stop after a stretch of known reviews, so edits deeper in old history may not be detected.

Turn on **Only new reviews (monitoring)** (`onlyNewReviews: true`) and schedule the run. The scraper remembers the reviews it has seen for each store or product URL, so every scheduled run returns only reviews that are new or were edited since the last run. You pay for those rows and the usual start fee; a run that finds nothing new saves no rows.

- **First run (baseline):** works like a normal run and saves up to `maxReviews` reviews per URL (`0` saves the full history once). It then reads the rest of the store without saving it, so every existing review counts as known. On a large store this first run takes longer.
- **Later runs:** return new reviews and reviews whose rating, title, text or store reply changed. Each row carries `monitor_status`: `new` or `changed`. Unchanged reviews are skipped and not charged.
- The memory is kept per URL in a key-value store named `shopify-reviews-monitor` in your Apify account. Use `monitorName` to keep separate lists for the same stores, for example one per client.
- Filters still apply. Reviews outside your filters are not remembered, so widening the filters later can return older reviews that now match.
- Deleted reviews are not reported, and a review missing from a shortened run is never treated as deleted.
- Let a run finish before the next one starts on the same stores, otherwise both runs can return the same new review.

Schedule example:

1. Save this input as a task:

```json
{
  "startUrls": [
    { "url": "https://store-a.com" },
    { "url": "https://store-b.com/products/best-seller" }
  ],
  "onlyNewReviews": true,
  "maxReviews": 100
}
```

2. In Apify Console open **Schedules**, create a schedule (for example every day at 08:00, cron `0 8 * * *`) and add the task.
3. Connect an integration (Slack, email, Zapier, Make or a webhook) to the task to receive each run's new reviews.

### Pricing

Pay per result. You are charged **$1.00 per 1,000 reviews** plus a small Actor start fee ($0.0025 per GB of memory, one event per run). A 5,000-review export costs about $5. Volume users on higher Apify plans pay less per review.

### FAQ

#### How do I export Stamped.io reviews from a Shopify store?

Paste the store URL (or a product URL) as `startUrl` and run. The scraper detects Stamped.io, finds the store's public widget key and downloads every review with photos, videos and the verified badge. Set `maxReviews` to `0` for the complete history.

#### Does this work with Judge.me?

Yes. Judge.me, Loox, Yotpo, Okendo, Stamped.io, REVIEWS.io, Junip, Fera, Opinew, Rivyo, Klaviyo Reviews and Vitals are all supported from the same input.

#### Can I scrape reviews for one product only?

Yes. Use the product URL (`https://store.com/products/handle`) as `startUrl`. Every supported app filters to that product.

#### How do I know which review app a store uses?

You do not need to. The run log prints `Detected platform: ...` and every result carries `platform`. If the store has leftovers from a previously installed app, the scraper tries the next best match automatically.

#### What if a store uses a review app that is not listed?

The run ends with a status message that names the app it found, and no reviews are charged. Open an issue on the Issues tab with the store URL and the app will be added.

#### Can I scrape millions of reviews?

Yes. The scraper talks to each app's JSON feed directly, pages at the app's maximum page size and retries rate limits with backoff. Set `maxReviews` to `0` and give the run enough timeout.

#### Do I need a proxy or cookies?

No. All twelve apps expose their storefront review feeds publicly; the scraper only needs the store URL.

### Feedback and support

I actively maintain this scraper. Found a bug or need another review app? Open an issue on the Issues tab with the store URL.

### Related tools

### Scrape a single review app

Already know the app? These scrapers run the same engine and return the same output, one review app each, so each listing shows only what matters for that app.

| Review app | What it covers | Scraper |
|---|---|---|
| Judge.me | largest install base, review photos | [Judge Me Review Scraper for Shopify stores](https://apify.com/stanvanrooy6/judge-me-scraper) |
| Loox | photo reviews | [Loox Review Scraper for Shopify stores](https://apify.com/stanvanrooy6/loox-scraper) |
| Yotpo | votes, custom fields, sentiment | [Yotpo Review Scraper for Shopify stores](https://apify.com/stanvanrooy6/yotpo-scraper) |
| Okendo | classic and headless storefronts | [Okendo Review Scraper for Shopify stores](https://apify.com/stanvanrooy6/okendo-scraper) |
| Stamped.io | verified badge, photos, videos, store replies | [Stamped Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/stamped-reviews-scraper) |
| REVIEWS.io | product and company reviews | [REVIEWS.io Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/reviews-io-scraper) |
| Junip | survey answers and photo attachments | [Junip Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/junip-reviews-scraper) |
| Klaviyo Reviews | every reviewed product of the store | [Klaviyo Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/klaviyo-reviews-scraper) |
| Fera | product and store reviews with media | [Fera Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/fera-reviews-scraper) |
| Opinew | native and imported (Amazon, AliExpress) reviews | [Opinew Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/opinew-reviews-scraper) |
| Rivyo | WebContrive Rivyo product reviews | [Rivyo Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/rivyo-reviews-scraper) |
| Vitals | the Vitals bundle reviews module, photos included | [Vitals Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/vitals-reviews-scraper) |

### More review scrapers

- [TikTok Shop Reviews Scraper: Up to 25,000 Reviews per Product](https://apify.com/stanvanrooy6/tiktok-shop-scraper)

If this Actor saved you time, a rating on its Apify Store page helps other users find it.

# Actor input Schema

## `startUrl` (type: `string`):

Shopify store URL to get every review in the store, or a product URL to get the reviews of that product only.

The review app is detected automatically: Judge.me, Loox, Yotpo, Okendo, Stamped.io, REVIEWS.io, Junip, Fera, Opinew, Rivyo, Klaviyo Reviews or Vitals.

Examples:

- Store-wide: norlanglass.com, www.norlanglass.com, https://norlanglass.com
- Product only: https://norlanglass.com/products/norlan-whisky-glass-gift-set

## `maxReviews` (type: `integer`):

How many reviews to collect. Set to 0 for unlimited (capped at 999,999 per run).

## `minRating` (type: `integer`):

Keep reviews within the inclusive star range. Leave blank for any rating.

## `maxRating` (type: `integer`):

Keep reviews within the inclusive star range. Leave blank for any rating.

## `reviewDateFrom` (type: `string`):

Optional ISO date (YYYY-MM-DD) or timestamp. Inclusive; date-only boundaries use UTC and the end date includes the entire day. Reviews with unknown dates are excluded.

## `reviewDateTo` (type: `string`):

Optional ISO date (YYYY-MM-DD) or timestamp. Inclusive; date-only boundaries use UTC and the end date includes the entire day. Reviews with unknown dates are excluded.

## `reviewText` (type: `string`):

Case-insensitive phrase in the title or body.

## `verifiedOnly` (type: `boolean`):

Exclude reviews without a confirmed verified-buyer flag.

## `mediaOnly` (type: `boolean`):

Keep reviews with at least one photo or video supplied by the review app.

## `maxScannedReviews` (type: `integer`):

Total source reviews checked across all URLs when filters are active. Stops work even if there are fewer matches than maxReviews. Rejected reviews are not saved or charged as results. Without filters this setting has no effect.

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

Batch of URLs, merged with startUrl. Provide at least one URL in either field.

## `onlyNewReviews` (type: `boolean`):

Remember the reviews seen for each URL and return only new or edited reviews on later runs. The first run saves up to the maximum reviews per URL and records the rest of the store as known. Schedule the run to monitor stores. Skipped reviews are not charged.

## `monitorName` (type: `string`):

Optional. A separate memory for the same URLs, for example one list per client. Leave empty to use the default list. Only used with monitoring.

## Actor input object example

```json
{
  "startUrl": "https://norlanglass.com",
  "maxReviews": 100,
  "verifiedOnly": false,
  "mediaOnly": false,
  "maxScannedReviews": 10000,
  "onlyNewReviews": false
}
```

# Actor output Schema

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

One row per review, whichever review app the store uses. JSON; append ?format=csv or ?format=xlsx for other formats.

## `reviewsCsv` (type: `string`):

The same rows as a CSV download.

# 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 = {
    "startUrl": "https://norlanglass.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("stanvanrooy6/shopify-review-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 = { "startUrl": "https://norlanglass.com" }

# Run the Actor and wait for it to finish
run = client.actor("stanvanrooy6/shopify-review-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 '{
  "startUrl": "https://norlanglass.com"
}' |
apify call stanvanrooy6/shopify-review-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stanvanrooy6/shopify-review-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/rD7yPd8x8ra8A0f6a/builds/K2yE13AtYlLBLRKSg/openapi.json
