# Shopify Reviews Scraper - Counts & Ratings Across Widgets (`thirdwatch/shopify-reviews-scraper`) Actor

Detect the review widget on any Shopify store (Judge.me, Yotpo, Loox, Stamped, Okendo, Reviews.io) and pull total review count and average rating. Works on any Shopify store regardless of which review app they use.

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

## Pricing

from $1.20 / 1,000 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Shopify Reviews Scraper

> Detect the review widget on any Shopify store and pull total review count and average rating. Works across Judge.me, Yotpo, Loox, Stamped, Okendo, Reviews.io, and Shopify's native product reviews.

### What you get

Point this scraper at any Shopify storefront and get back the review provider it uses, the total number of **product reviews** across sampled products, and a weighted average rating. These are reviews that customers leave on individual product pages (via Yotpo, Judge.me, Stamped, Loox, Okendo, Reviews.io, or Shopify's native product reviews app) — not store-level reviews on third-party sites like Trustpilot. Ideal for benchmarking brand reputation at scale, surfacing review volume for lead lists, or auditing review widgets across your own brand portfolio.

### Output fields

| Field | Description |
|-------|-------------|
| `domain` | Store domain (e.g., `allbirds.com`) |
| `url` | Original store URL provided |
| `provider` | Detected review widget (`judge.me`, `yotpo`, `loox`, `stamped`, `okendo`, `reviews.io`, `shopify-product-reviews`, or `null`) |
| `totalReviews` | Sum of review counts across sampled products |
| `averageRating` | Review-count-weighted average rating (0-5 scale) |
| `productsSampled` | How many product pages were fetched |
| `productsWithRatings` | How many of the sampled products had reviews |

### Example output

```json
{
    "domain": "allbirds.com",
    "url": "https://www.allbirds.com",
    "provider": "yotpo",
    "totalReviews": 48219,
    "averageRating": 4.6,
    "productsSampled": 10,
    "productsWithRatings": 9
}
````

### Input parameters

| Parameter | Required | Description |
|-----------|----------|-------------|
| `storeUrls` | Yes | Shopify store URLs to analyze. Example: `["https://www.allbirds.com", "https://www.kith.com"]`. |
| `sampleProducts` | No | Number of product pages to sample per store. Default `10`. Range 1-50. Larger samples give more reliable site-wide totals. |

### Use cases

- **DTC founders & marketers**: Benchmark your review volume and rating vs. competing Shopify brands.
- **Investors & analysts**: Screen Shopify brands by social proof at scale.
- **Sales teams**: Qualify Shopify prospects by review volume before outreach.
- **Review platform vendors**: Audit which brands use your product vs. competitors for competitive intelligence.

### Limitations

- Only works for stores using public Shopify review apps (Yotpo, Judge.me, Stamped, Loox, Okendo, Reviews.io, or Shopify's native product reviews) that expose review counts and ratings on product pages. Stores using private/custom review systems will return `null`.
- These are **product-level reviews on the storefront** — not store-level Trustpilot/Sitejabber reviews.
- Stores whose review widgets only render ratings client-side (without embedding them in product page markup) will return `null` for totals. Most modern Shopify themes publish them by default.
- Totals are extrapolated from a sample; results converge as `sampleProducts` increases. Defaults (10) are accurate for most stores.
- Does not pull individual review text — only aggregate counts and ratings. For individual reviews, a provider-specific scraper is required.

### Compared to alternatives

- **vs. manual audits**: Checking dozens of stores by hand takes hours. This actor handles thousands in minutes.
- **vs. provider-specific scrapers**: Other scrapers work only for Judge.me or only for Yotpo. This one auto-detects across all major providers, so you can run a single list across mixed brands.

Pairs well with the [Shopify Store Scraper](https://apify.com/thirdwatch) for product-level data.

### FAQ

**Does this need a Shopify partner app or API key?**
No. It only uses publicly visible product pages on the store.

**Can I use custom domains?**
Yes. Pass the brand's primary domain (e.g., `allbirds.com`). The actor works whether the store uses `myshopify.com` or a custom domain.

**What if a store isn't actually on Shopify?**
The actor will attempt detection and return `provider: null` with `totalReviews: null`. No charge is incurred on misdetected non-Shopify sites if the sampling yields zero products.

**How accurate is the average rating?**
It's a review-count-weighted mean of all sampled products — i.e., products with more reviews contribute proportionally more to the average. For stores with consistent quality, the sampled average converges within 0.1 stars at `sampleProducts: 10`.

Last verified: 2026-05

More scrapers at [thirdwatch.dev](https://thirdwatch.dev).

# Actor input Schema

## `storeUrls` (type: `array`):

Shopify store URLs to collect review stats for. We detect the review provider (Judge.me / Yotpo / Loox / Stamped / Okendo / Reviews.io) and return total review count and average rating across sampled product pages.

## `sampleProducts` (type: `integer`):

How many product pages to sample for ratings (larger = more reliable site-wide totals).

## Actor input object example

```json
{
  "storeUrls": [
    "https://www.allbirds.com"
  ],
  "sampleProducts": 10
}
```

# Actor output Schema

## `results` (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 = {
    "storeUrls": [
        "https://www.allbirds.com"
    ],
    "sampleProducts": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("thirdwatch/shopify-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 = {
    "storeUrls": ["https://www.allbirds.com"],
    "sampleProducts": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("thirdwatch/shopify-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "storeUrls": [
    "https://www.allbirds.com"
  ],
  "sampleProducts": 10
}' |
apify call thirdwatch/shopify-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=thirdwatch/shopify-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shopify Reviews Scraper - Counts & Ratings Across Widgets",
        "description": "Detect the review widget on any Shopify store (Judge.me, Yotpo, Loox, Stamped, Okendo, Reviews.io) and pull total review count and average rating. Works on any Shopify store regardless of which review app they use.",
        "version": "1.0",
        "x-build-id": "6BoojcQigNGZYCbuU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/thirdwatch~shopify-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-thirdwatch-shopify-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/thirdwatch~shopify-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-thirdwatch-shopify-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/thirdwatch~shopify-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-thirdwatch-shopify-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "storeUrls"
                ],
                "properties": {
                    "storeUrls": {
                        "title": "Shopify store URLs",
                        "type": "array",
                        "description": "Shopify store URLs to collect review stats for. We detect the review provider (Judge.me / Yotpo / Loox / Stamped / Okendo / Reviews.io) and return total review count and average rating across sampled product pages.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "sampleProducts": {
                        "title": "Products sampled per store",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "How many product pages to sample for ratings (larger = more reliable site-wide totals).",
                        "default": 10
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
