# REVIEWS.io Reviews Scraper for Shopify stores (`stanvanrooy6/reviews-io-scraper`) Actor

Export every REVIEWS.io review from any Shopify store: rating, title, text, photos, author, date and product. Store-wide or per product. No login, no API key. JSON, CSV or Excel.

- **URL**: https://apify.com/stanvanrooy6/reviews-io-scraper.md
- **Developed by:** [Stan Van Rooy](https://apify.com/stanvanrooy6) (community)
- **Categories:** E-commerce, Marketing
- **Features:** Limited permissions
- **Stats:** 6 total users, 4 monthly users, 91.9% runs succeeded, 0 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

## REVIEWS.io Reviews Scraper for Shopify stores

**Free-plan sample:** Apify Free accounts can collect up to **100 review rows total per run**, shared across all input URLs. 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 monthly allowance.

Export every REVIEWS.io review from any Shopify store. Paste a store URL for the complete review history or a product URL for one product, and get the rating, title, text, photos, author, date, verified-buyer flag and product for each review. A store URL returns product reviews and company (merchant) reviews together, newest first. No login, no API key, no browser. Download as JSON, CSV or Excel.

### How to export REVIEWS.io reviews

1. Open the store in your browser and copy its URL (for example `https://flamingocandles.co.uk`). For a single product, copy the product page URL instead (for example `https://kambukka.com/products/olympus-300-ml-blush-horizon`).
2. Paste it into **Start URLs**. You can add as many stores and products as you like; each one is scraped in turn.
3. Set **Maximum reviews per URL**. Use `0` to export the full history.
4. Click **Start**. When the run finishes, open the **Output** tab and download the reviews as JSON, CSV, Excel or XML.

### What data you get

| Field | What it holds |
|---|---|
| `review_id` | REVIEWS.io review id |
| `rating` | Star rating, 1 to 5 |
| `review_title` | Review headline, when the reviewer wrote one |
| `body` | Full review text |
| `author` | Reviewer name as shown on the store |
| `date`, `date_utc` | Date as REVIEWS.io reports it, and the same instant as ISO 8601 UTC |
| `verified_buyer` | `true` when REVIEWS.io shows the Verified Buyer badge |
| `images` | Full-size URLs of customer photos |
| `product_name` | The reviewed product (empty for company reviews) |
| `platform` | Always `reviewsio` |

`review_type` tells product reviews (`product_review`) from company reviews (`store_review`). Per-question ratings from the REVIEWS.io form are passed through in `ratings`. A product URL is matched the same way the REVIEWS.io widget does it: variant SKUs, variant ids, product id and handle.

### How to tell if a store uses REVIEWS.io

REVIEWS.io stores show the REVIEWS.io carousel or a rating snippet that links to reviews.io. In the page source search for `reviews.io`, `ReviewsWidget(` or `reviewsIoStore`. You do not have to check first: if the store runs another review app, the run says which one and links the scraper for it.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | array, required | Store URLs (`flamingocandles.co.uk`, `https://flamingocandles.co.uk`) for every review in the store, or product URLs (`https://kambukka.com/products/olympus-300-ml-blush-horizon`) for that product only. |
| `minRating`, `maxRating` | integer | Filter by star rating (1 to 5). For example, `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 | Stop after this many reviews per URL. Default `100`, `0` means no limit. |
| `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. |

```json
{
  "startUrls": [{ "url": "https://flamingocandles.co.uk" }],
  "maxReviews": 500
}
```

### Output example

```json
{
  "review_id": "store_review-30976536",
  "author": "Louise van Delft",
  "rating": 5,
  "review_title": null,
  "body": "Cute keyrings. Very happy with my purchase",
  "date": "2026-09-20 10:31:52",
  "date_utc": "2026-09-20T10:31:52Z",
  "product_name": null,
  "verified_buyer": true,
  "images": [],
  "platform": "reviewsio"
}
```

Next to these standard fields, every raw REVIEWS.io field is passed through unchanged, so nothing the widget shows is lost.

### 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 `reviewsio-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://flamingocandles.co.uk" }
  ],
  "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: **$1.00 per 1,000 reviews** plus a small Actor start fee ($0.0025 per GB of memory, one event per run). Volume users on higher Apify plans pay less per review.

| Export | Reviews | Cost |
|---|---|---|
| One product | 200 | about $0.20 |
| A mid-size store | 5,000 | about $5.00 |
| A large store, full history | 50,000 | about $50 |

### FAQ

#### Do I need a REVIEWS.io account or API key?

No. The scraper reads the same public review feed the store's REVIEWS.io widget loads for every visitor. You only need the store URL.

#### Can I export the reviews of one product only?

Yes. Use the product URL (`https://store.com/products/handle`). Store URLs return every review in the store.

#### Can I filter for negative reviews or verified buyers?

Yes. Use `minRating: 1, maxRating: 2` to export negative reviews, or `verifiedOnly: true` for verified buyer feedback. Only reviews that match your filters are saved.

#### How many reviews can I get?

All of them. Set `maxReviews` to `0` and give the run enough timeout. REVIEWS.io serves 100 reviews per request, so large stores export in minutes.

#### Why did my run return no reviews?

Usually the store uses a different review app. The status message then names the app it found and links the right scraper. If the store does run REVIEWS.io and still returns nothing, open an issue on the Issues tab with the store URL.

#### Can I scrape several stores in one run?

Yes. Add one URL per store or product to **Start URLs**. Each URL gets its own `maxReviews` budget.

#### Is it legal to scrape REVIEWS.io reviews?

The scraper only collects reviews that are publicly shown on the store. Reviews include names that customers chose to publish; handle them in line with the privacy rules that apply to you (for example GDPR).

### Feedback and support

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

### Not sure which app a store uses?

The [Shopify Review Scraper (Judge.me, Loox, Yotpo, Stamped + more)](https://apify.com/stanvanrooy6/shopify-review-scraper) detects the review app of any Shopify store automatically and returns the same output as this scraper. Use it for a list of stores with mixed review apps.

### Scrapers for other Shopify review apps

- [Judge Me Review Scraper for Shopify stores](https://apify.com/stanvanrooy6/judge-me-scraper)
- [Loox Review Scraper for Shopify stores](https://apify.com/stanvanrooy6/loox-scraper)
- [Yotpo Review Scraper for Shopify stores](https://apify.com/stanvanrooy6/yotpo-scraper)
- [Okendo Review Scraper for Shopify stores](https://apify.com/stanvanrooy6/okendo-scraper)
- [Stamped Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/stamped-reviews-scraper)
- [Junip Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/junip-reviews-scraper)
- [Klaviyo Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/klaviyo-reviews-scraper)
- [Fera Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/fera-reviews-scraper)
- [Opinew Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/opinew-reviews-scraper)
- [Rivyo Reviews Scraper for Shopify stores](https://apify.com/stanvanrooy6/rivyo-reviews-scraper)
- [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

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

Shopify store URLs (every review in the store) or product URLs (that product only). The store must use REVIEWS.io for its reviews.

Examples:

- Store-wide: https://flamingocandles.co.uk
- Product only: https://kambukka.com/products/olympus-300-ml-blush-horizon

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

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

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

How many reviews to collect per URL. Set to 0 for no input limit. Apify Free accounts are capped at 100 review rows total per run across all URLs; upgrade your Apify plan for larger runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://flamingocandles.co.uk"
    }
  ],
  "verifiedOnly": false,
  "mediaOnly": false,
  "maxScannedReviews": 10000,
  "onlyNewReviews": false,
  "maxReviews": 100
}
```

# Actor output Schema

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

Review id, author, rating, title, product and date.

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

Every review with all fields as JSON. Append ?format=csv or ?format=xlsx for other formats.

# 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://flamingocandles.co.uk"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("stanvanrooy6/reviews-io-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://flamingocandles.co.uk" }] }

# Run the Actor and wait for it to finish
run = client.actor("stanvanrooy6/reviews-io-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://flamingocandles.co.uk"
    }
  ]
}' |
apify call stanvanrooy6/reviews-io-scraper --silent --output-dataset

```

## MCP server setup

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