# Shopper Approved Merchant Reviews Scraper (`automation-lab/shopper-approved-merchant-reviews-scraper`) Actor

Extract public Shopper Approved merchant reviews with ratings, text, reviewer details, verification, merchant responses, survey answers, profile context, and date filters for reputation monitoring.

- **URL**: https://apify.com/automation-lab/shopper-approved-merchant-reviews-scraper.md
- **Developed by:** [Automation Lab](https://apify.com/automation-lab) (community)
- **Categories:** E-commerce, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.12 / 1,000 item extracteds

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

## Shopper Approved Merchant Reviews Scraper

Extract public **Shopper Approved merchant reviews** as structured records for reputation analysis, customer-feedback research, and recurring competitor monitoring.

Provide one or more public Shopper Approved profile URLs or merchant domains. The Actor returns individual reviews together with merchant identity, aggregate rating context, verification, reviewer metadata, dates, merchant responses, custom survey answers, and source links.

### What does this Actor do?

Shopper Approved Merchant Reviews Scraper reads public merchant profiles on `shopperapproved.com` and exports normalized review-level records.

It supports:

- Shopper Approved profile URLs and bare merchant domains;
- up to 100 merchants in one run;
- newest, oldest, highest-rating, and lowest-rating ordering;
- one-to-five-star filters;
- post-fulfillment, checkout, or combined survey records;
- an inclusive `fromDate` window for incremental monitoring;
- limits of up to 10,000 reviews per merchant;
- public merchant responses and custom survey answers when available.

The Actor uses the structured endpoints loaded by the public profile. It does not require a Shopper Approved account, cookies, or a browser.

### Who is it for?

#### Reputation and customer-experience teams

Collect recent reviews for dashboards, complaint triage, and recurring brand-health reports.

#### Agencies and consultants

Compare customer feedback across public merchant profiles without manually copying review pages.

#### Market researchers

Study rating distributions, written feedback, survey-stage differences, and merchant responses.

#### Data and BI teams

Send normalized records to spreadsheets, databases, warehouses, or sentiment-analysis pipelines.

#### Developers and AI teams

Use stable field names for classifiers, summaries, retrieval systems, and internal monitoring applications.

### Why use this Shopper Approved scraper?

- **Merchant context on every row:** each review includes merchant identity, aggregate rating, review count, and rating distribution.
- **Review-level detail:** export review text, rating, public reviewer details, verification, aspect ratings, custom answers, and responses.
- **Incremental collection:** combine newest-first order with `fromDate` for scheduled monitoring.
- **Server-side filters:** star rating, sort order, and survey stage are sent to Shopper Approved's public review endpoint.
- **Predictable limits:** the Actor stops at the requested per-merchant count, source exhaustion, or date boundary.
- **Integration-ready output:** results are stored in the default Apify dataset as JSON, CSV, Excel, XML, or RSS.

### What data can you extract?

| Field | Description |
| --- | --- |
| `reviewId` | Stable Shopper Approved feedback identifier |
| `reviewUrl` | Public profile URL linked to the review ID |
| `merchantDomain` | Normalized merchant domain |
| `merchantName` | Public merchant display name |
| `merchantWebsite` | Merchant website linked from the profile |
| `merchantSiteId` | Shopper Approved site identifier |
| `merchantRating` | Aggregate merchant rating at capture time |
| `merchantReviewCount` | Aggregate public review count |
| `merchantRatingDistribution` | One-through-five-star aggregate counts |
| `rating` | Overall rating for the individual review |
| `reviewText` | Written review feedback when present |
| `reviewerName` | Public reviewer display name |
| `reviewerLocation` | Public location label when present |
| `reviewDate` | Source review timestamp |
| `verifiedReview` | Shopper Approved verification flag |
| `surveyType` | Checkout, full/post-fulfillment, or imported source version |
| `merchantResponse` | Public merchant response when present |
| `aspectRatings` | Recommendation, service, delivery, price, product, and buy-again scores |
| `customAnswers` | Merchant-specific survey questions and public answers |
| `mediaUrls` | Public media URLs discovered on the review |
| `sourcePage` | Source pagination page |
| `scrapedAt` | ISO 8601 capture timestamp |

Some fields are naturally absent on checkout-only ratings or when a reviewer did not provide that information.

### How to scrape Shopper Approved merchant reviews

1. Open the Actor input page.
2. Add a public URL such as `https://www.shopperapproved.com/reviews/supplementwarehouse.com`.
3. Set **Maximum reviews per merchant**. Start with 10 for a quick test.
4. Keep **Post-fulfillment reviews** to prioritize richer written feedback, or choose checkout/all.
5. Optionally select star ratings or add a `fromDate`.
6. Click **Start**.
7. Open the **Shopper Approved reviews** dataset view.
8. Export the results or connect the dataset to your workflow.

### Input parameters

| Input | Type | Default | Purpose |
| --- | --- | --- | --- |
| `merchantUrls` | array | profile prefill | Public Shopper Approved merchant profile URLs |
| `merchantDomains` | array | none | Bare domains, useful in API/bulk jobs |
| `maxReviewsPerMerchant` | integer | `50` | Maximum unique records saved for each merchant |
| `sortBy` | string | `newest` | `newest`, `oldest`, `highest_rating`, or `lowest_rating` |
| `ratings` | string array | all ratings | Any selection of `1` through `5` |
| `surveyType` | string | `post_fulfillment` | `post_fulfillment`, `checkout`, or `all` |
| `fromDate` | string | none | Inclusive `YYYY-MM-DD` lower bound for newest-first runs |

Add at least one URL or domain. Duplicate merchants are removed after normalization.

`fromDate` intentionally works only with newest-first sorting. This lets the Actor stop as soon as it reaches records older than the monitoring window.

### Input examples

#### Recent reviews for one merchant

```json
{
  "merchantDomains": ["supplementwarehouse.com"],
  "maxReviewsPerMerchant": 10,
  "sortBy": "newest",
  "surveyType": "post_fulfillment"
}
```

#### Low-rating complaint research

```json
{
  "merchantUrls": [
    { "url": "https://www.shopperapproved.com/reviews/bulbamerica.com" }
  ],
  "maxReviewsPerMerchant": 25,
  "sortBy": "newest",
  "ratings": ["1", "2"],
  "surveyType": "all"
}
```

#### Incremental multi-merchant monitoring

```json
{
  "merchantDomains": [
    "supplementwarehouse.com",
    "bulbamerica.com"
  ],
  "maxReviewsPerMerchant": 100,
  "sortBy": "newest",
  "surveyType": "post_fulfillment",
  "fromDate": "2026-08-01"
}
```

### Output example

A current output record has this shape (public text shortened for documentation):

```json
{
  "recordType": "review",
  "reviewId": "223683525",
  "reviewUrl": "https://www.shopperapproved.com/reviews/supplementwarehouse.com?reviewid=223683525",
  "merchantDomain": "supplementwarehouse.com",
  "merchantName": "supplementwarehouse.com",
  "merchantWebsite": "https://supplementwarehouse.com",
  "merchantSiteId": "16361",
  "merchantRating": 4.8,
  "merchantReviewCount": 31094,
  "rating": 5,
  "reviewText": "Quick and easy ordering process...",
  "reviewerName": "Public reviewer",
  "reviewerLocation": "FL",
  "reviewDate": "2026-09-01 17:48:45",
  "verifiedReview": true,
  "surveyType": "full",
  "customAnswers": [],
  "mediaUrls": [],
  "sourcePage": 1,
  "scrapedAt": "2026-09-15T08:00:00.000Z"
}
```

The default dataset contains only review records. Merchant profile and aggregate fields are included on every row so a downstream export remains self-contained.

### How much does it cost to extract Shopper Approved reviews?

This Actor uses pay-per-event pricing:

- one `start` event is charged once per run;
- one `item` event is charged for each review saved to the dataset;
- rejected, duplicate, filtered-out, and failed records are not item-charged.

The one-time start event is **$0.005**. Item prices decrease by Apify subscription tier:

| Tier | Price per saved review |
| --- | ---: |
| Free | $0.00598 |
| Bronze | $0.00520 |
| Silver | $0.004056 |
| Gold | $0.00312 |
| Platinum | $0.00312 |
| Diamond | $0.00312 |

For example, on the Bronze tier the estimated Actor charge is:

| Saved reviews | Bronze-tier calculation |
| ---: | --- |
| 10 | `$0.005 + (10 × $0.00520)` |
| 100 | `$0.005 + (100 × $0.00520)` |
| 1,000 | `$0.005 + (1,000 × $0.00520)` |

Each example uses the $0.005 start fee and $0.00520 per saved review. Use `maxReviewsPerMerchant` and `fromDate` to control paid output records. Infrastructure usage is included in PPE pricing rather than billed as a separate Actor fee.

### Scheduling reputation monitoring

Create an Apify schedule with newest-first sorting and a rolling `fromDate`.

A common workflow is:

1. run daily or weekly;
2. export `reviewId` as the deduplication key;
3. upsert unseen reviews into a database;
4. compare `merchantRating` and `merchantReviewCount` with the prior capture;
5. alert on new low ratings or unanswered complaints.

The Actor does not maintain cross-run state or send alerts itself. Apify schedules, webhooks, integrations, and your destination system handle those steps.

### Sentiment and complaint analysis

For complaint discovery, select ratings `1` and `2` and use `surveyType: "all"`.

Useful downstream fields include:

- `reviewText` for sentiment and topic extraction;
- `customAnswers` for merchant-specific reasons and product choice;
- `aspectRatings` for service, price, delivery, and product comparisons;
- `merchantResponse` for response-rate and response-content analysis;
- `reviewDate` for trend windows.

Remember that checkout records may contain ratings without long written feedback.

### Export and integration options

Apify datasets support:

- JSON and JSONL for applications and warehouses;
- CSV and Excel for analysts;
- XML and RSS for compatible automation tools;
- direct API reads;
- webhooks after successful runs;
- Make, Zapier, Google Sheets, Slack, and other Apify integrations.

For incremental loads, deduplicate using `merchantDomain` plus `reviewId`.

### Run with the Apify API

Replace `<APIFY_TOKEN>` with your token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~shopper-approved-merchant-reviews-scraper/runs?token=<APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "merchantDomains": ["supplementwarehouse.com"],
    "maxReviewsPerMerchant": 10,
    "sortBy": "newest"
  }'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const actor = client.actor('automation-lab/shopper-approved-merchant-reviews-scraper');
const run = await actor.call({
  merchantDomains: ['supplementwarehouse.com'],
  maxReviewsPerMerchant: 10,
  sortBy: 'newest',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("automation-lab/shopper-approved-merchant-reviews-scraper").call(
    run_input={
        "merchantDomains": ["supplementwarehouse.com"],
        "maxReviewsPerMerchant": 10,
        "sortBy": "newest",
    }
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with MCP and AI agents

Add this Actor to Claude Code through Apify MCP:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/shopper-approved-merchant-reviews-scraper"
```

#### Claude Desktop, Cursor, and VS Code setup

Use the same HTTP server configuration in Claude Desktop, Cursor, or VS Code:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/shopper-approved-merchant-reviews-scraper"
    }
  }
}
```

Example prompts:

- “Collect the 20 newest post-fulfillment reviews for supplementwarehouse.com.”
- “Export one- and two-star BulbAmerica reviews and summarize recurring complaint topics.”
- “Collect reviews since 2026-08-01 for these two Shopper Approved merchant domains.”

### Reliability, retries, and failure behavior

The Actor makes lightweight direct requests to the current public merchant profile and structured review endpoints.

Transient network failures, HTTP 408, HTTP 429, and server errors are retried up to three times with bounded backoff. Invalid URLs, missing public merchant profiles, and unexpected response shapes fail closed instead of returning misleading empty data.

If multiple merchants are supplied, a failed merchant is logged while other merchants continue. The run fails only when every merchant fails. A valid filter or future monitoring window with no matching reviews succeeds with an empty dataset.

### Limits and important behavior

- Only public HTTPS Shopper Approved merchant profiles are supported.
- A run accepts at most 100 merchant inputs.
- The maximum is 10,000 reviews per merchant.
- Shopper Approved controls source availability, fields, and sort behavior.
- Profile totals can include checkout ratings that do not contain written comments.
- `post_fulfillment` is the default because these records usually contain richer feedback.
- Source timestamps do not expose a timezone; `reviewDate` preserves the public source value.
- Media is not downloaded. Public URLs are exported when exposed in review metadata.
- The Actor does not bypass login pages, CAPTCHAs, or private data controls.

### Troubleshooting

#### “Invalid merchant domain”

Use a bare domain such as `bulbamerica.com`, or the exact public profile form:

`https://www.shopperapproved.com/reviews/bulbamerica.com`

Do not submit a merchant's own website URL in `merchantUrls`; use `merchantDomains` for bare domains.

#### “No public Shopper Approved merchant profile was found”

Open the supplied profile URL in a browser. The merchant may not have a public Shopper Approved certificate, or the profile path may have changed.

#### My dataset is empty

Check `fromDate`, selected ratings, and `surveyType`. An empty successful run means the profile was valid but no records matched the requested window and filters.

#### Checkout reviews have no text

Checkout surveys can be rating-only. Choose `post_fulfillment` when written customer feedback is the main goal.

#### The run fails after retries

Inspect the run log for the merchant and HTTP status. Retry later if Shopper Approved is temporarily unavailable. Reduce merchant count for diagnosis rather than repeating a large run.

### Responsible use and legality

This Actor extracts information displayed on public Shopper Approved merchant profiles. Public availability does not remove your legal responsibilities.

Use the data only for lawful purposes. Follow applicable privacy, database, copyright, and consumer-protection rules, Shopper Approved's terms, and the terms of your destination systems. Avoid redistributing personal data unnecessarily. Apply suitable retention, access control, and deletion policies.

Do not use the Actor to harass reviewers, infer sensitive attributes, build invasive profiles, or automate decisions with material effects on individuals without appropriate review and legal basis.

### Related Automation Lab Actors

For broader source-specific reputation research, consider:

- [Yelp Business Reviews Scraper](https://apify.com/automation-lab/yelp-business-reviews-scraper)
- [OMR Reviews Scraper](https://apify.com/automation-lab/omr-reviews-scraper)
- [PissedConsumer Company Reviews Scraper](https://apify.com/automation-lab/pissedconsumer-company-reviews-scraper)
- [Naver Place Business Reviews Scraper](https://apify.com/automation-lab/naver-place-business-reviews-scraper)

These Actors target different public sources. They do not expand the scope of this Shopper Approved Actor.

### FAQ

#### Does it require a Shopper Approved account or API key?

No. It reads the public merchant profile and the structured requests used by that profile.

#### Does it use a browser or residential proxy?

No. The current implementation uses lightweight direct HTTP. This keeps runs fast and avoids browser/proxy overhead.

#### Can I collect several merchants in one run?

Yes. Supply up to 100 profile URLs and domains. The review limit applies separately to each normalized merchant.

#### Can I collect only verified reviews?

The output always exposes `verifiedReview`, but the public endpoint does not provide a dedicated verified-only control in this Actor. Filter the dataset downstream if required.

#### How do I monitor only new reviews?

Run on a schedule with newest-first sorting and a suitable `fromDate`, then upsert using `merchantDomain` plus `reviewId`.

#### Are merchant responses included?

Yes, when Shopper Approved exposes a public response. Markup is removed and normalized into `merchantResponse`.

#### Can I scrape product reviews?

This Actor focuses on merchant/company review records and their embedded public survey context. It does not crawl Shopper Approved's separate product-review catalog.

#### Will it download photos or videos?

No. It exports public media URLs when present, which avoids unnecessary transfer and storage costs.

#### What happens when no review matches?

The run succeeds with an empty dataset if the merchant profiles were valid. This is useful for scheduled monitoring windows with no new records.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation-lab/shopper-approved-merchant-reviews-scraper/changelog.md

# Actor input Schema

## `merchantUrls` (type: `array`):

Shopper Approved profile URLs such as https://www.shopperapproved.com/reviews/supplementwarehouse.com.

## `merchantDomains` (type: `array`):

Alternatively add merchant domains such as supplementwarehouse.com. Useful for API and bulk workflows that already store domains.

## `maxReviewsPerMerchant` (type: `integer`):

Stop after saving this many unique reviews from each supplied merchant.

## `sortBy` (type: `string`):

Choose the order provided by Shopper Approved. Newest first is required when using a start date.

## `ratings` (type: `array`):

Optional star ratings to include. Leave unset to collect all ratings.

## `surveyType` (type: `string`):

Post-fulfillment reviews usually contain the richest written feedback. Checkout includes ratings collected during checkout; All combines both.

## `fromDate` (type: `string`):

Optional inclusive start date in YYYY-MM-DD format. The Actor stops paging once older reviews are reached.

## Actor input object example

```json
{
  "merchantUrls": [
    {
      "url": "https://www.shopperapproved.com/reviews/supplementwarehouse.com"
    }
  ],
  "maxReviewsPerMerchant": 10,
  "sortBy": "newest",
  "surveyType": "post_fulfillment"
}
```

# Actor output Schema

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

Table view of ratings, review text, reviewer metadata, merchant responses, and source links.

# 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 = {
    "merchantUrls": [
        {
            "url": "https://www.shopperapproved.com/reviews/supplementwarehouse.com"
        }
    ],
    "maxReviewsPerMerchant": 10,
    "sortBy": "newest",
    "surveyType": "post_fulfillment"
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/shopper-approved-merchant-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 = {
    "merchantUrls": [{ "url": "https://www.shopperapproved.com/reviews/supplementwarehouse.com" }],
    "maxReviewsPerMerchant": 10,
    "sortBy": "newest",
    "surveyType": "post_fulfillment",
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/shopper-approved-merchant-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 '{
  "merchantUrls": [
    {
      "url": "https://www.shopperapproved.com/reviews/supplementwarehouse.com"
    }
  ],
  "maxReviewsPerMerchant": 10,
  "sortBy": "newest",
  "surveyType": "post_fulfillment"
}' |
apify call automation-lab/shopper-approved-merchant-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/shopper-approved-merchant-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/kgefgGWhWW29OCps7/builds/rxJAkn6cgaDKK3YQK/openapi.json
