# SmartCustomer Review Scraper (Pay-Per-Event) (`prodiger/smartcustomer-review-scraper`) Actor

Scrape consumer reviews from SmartCustomer by domain. Self-contained review records with embedded business metadata, rating, date, user, and run-summary. Pay-per-event pricing — only pay for businesses resolved + reviews extracted.

- **URL**: https://apify.com/prodiger/smartcustomer-review-scraper.md
- **Developed by:** [Arnas](https://apify.com/prodiger) (community)
- **Categories:** Business, Marketing
- **Stats:** 8 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## SmartCustomer Review Scraper (Pay-Per-Event)

**SmartCustomer Review Scraper** extracts consumer reviews from any business listed on [SmartCustomer](https://www.smartcustomer.com). This is the **Pay-Per-Event** edition — there is no monthly rental, no compute-unit guesswork, and no minimum spend. **You pay only for businesses successfully resolved + reviews actually extracted.** Filtered-out reviews don't cost a cent.

Use it on the Apify platform for scheduling, API access, dataset exports (JSON, CSV, Excel, HTML), residential proxy rotation, run monitoring, and integration with Make, Zapier, and 5000+ other tools.

### What does SmartCustomer Review Scraper do?

Give it one or more **business domains** (e.g. `amazon.com`, `airbnb.com`, `booking.com`) — or full SmartCustomer **review URLs** — and the actor reads SmartCustomer's public reviews API for `<domain>` and emits one self-contained record per review. Full business metadata is embedded on every review record so downstream consumers don't have to join two record types.

The scraper extracts:

- **Review fields** — review text, star rating, date, user name + avatar, review permalink, review ID.
- **Business (owner) response** — the business's public reply to the review (`business_response`: text, when it was posted, and who posted it), or `null` when there's no reply. Great for support/ORM teams and competitor-response analysis.
- **Embedded business metadata** — name, business URL, category, business rating, total review count.
- **Photos** — user-uploaded review photos, validated against SmartCustomer's image hosts. Many reviews emit `photos: []` because SmartCustomer surfaces photos inconsistently.
- **Status enum per record** — `ok`, `partial`, `business_not_found`, `blocked`, `rate_limited`.
- **Run-level summary** — one final dataset record (`type: "run_summary"`) with aggregate counts.

The actor is **HTTP-only** (Crawlee `CheerioCrawler` + got-scraping) — no browser, fast cold-start, runs on residential proxies.

#### Business (owner) responses on reviews

Every review carries a `business_response` field — the business's public reply to that review, as `{ text, published, author_name }`, or `null` when the business hasn't replied. Turn it off with `includeBusinessResponses: false`. Responses add **no extra charge** — they ride along with the reviews you already collect.

### Why use SmartCustomer Review Scraper?

- **Reputation monitoring** — Track new reviews + ratings for your business and competitors.
- **Sentiment & content analysis** — Feed review text into LLMs or sentiment classifiers.
- **Competitive research** — Compare review counts and ratings across local-market competitors.
- **Lead enrichment** — Combine business metadata + review-volume signals to score prospects.
- **Trust & safety analysis** — SmartCustomer covers many less-mainstream domains that Trustpilot and Google Reviews don't.

### How to use SmartCustomer Review Scraper

1. **Click "Try for free"** on this actor's page.
2. **Enter business domains** in the input form, one per line (e.g., `amazon.com`).
3. **Set "Max reviews per run"** to cap your spend. The default `50` makes test runs cheap.
4. **(Optional) Toggle "Only emit reviews that have photos"** — but note SmartCustomer's photo coverage is inconsistent.
5. **(Optional) Pick a sort order** — `relevance` (default), `newest`, `highest_rated`, `lowest_rated`.
6. **Click "Save & Start"**. Watch the live log; reviews stream into the dataset as they're scraped.
7. **Export** as JSON, CSV, Excel, or HTML, or hit the Apify [Dataset API](https://docs.apify.com/api/v2#/reference/datasets) directly.

### Input

| Parameter            | Type    | Required        | Description                                                                                                                                                              |
| -------------------- | ------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `domains`            | Array   | One-of required | Business domains (e.g., `["amazon.com", "airbnb.com"]`). Each is mapped to `https://www.smartcustomer.com/reviews/<domain>`. Domain regex enforced.                         |
| `businessUrls`       | Array   | One-of required | Full SmartCustomer review URLs (e.g., `https://www.smartcustomer.com/reviews/airbnb.com`). Host must be smartcustomer.com. Canonicalized to domain before processing.             |
| `maxReviews`         | Integer | No              | **Total** cap on reviews emitted across the run. Budget splits greedily across resolved businesses. Default `50`. Max `1000`.                                            |
| `sortBy`             | String  | No              | `relevance` (default) / `newest` / `highest_rated` / `lowest_rated`.                                                                                                     |
| `onlyWithPhotos`     | Boolean | No              | When `true`, drops reviews with no photos. **PPE charges only for emitted (post-filter) reviews** — filtered-out reviews are not billed. SmartCustomer photo coverage varies. |
| `includeBusinessResponses` | Boolean | No        | Attach the business's public reply to each review in `business_response`. Default `true`. No extra charge. Set `false` to omit.                                          |
| `maxConcurrency`     | Integer | No              | HTTP concurrency. Default `5`, max `30`.                                                                                                                                 |
| `requestTimeoutSecs` | Integer | No              | Per-request timeout. Default `45`.                                                                                                                                       |
| `proxyConfiguration` | Object  | No              | Apify proxy. Residential is the default and recommended.                                                                                                                 |

At least one of `domains` or `businessUrls` must be provided.

#### Input examples

| Use case                                       | Input JSON                                                                                                                |
| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Scrape Amazon's first 50 reviews               | `{ "domains": ["amazon.com"], "maxReviews": 50, "sortBy": "relevance" }`                                                  |
| Newest reviews for an Airbnb listing           | `{ "domains": ["airbnb.com"], "sortBy": "newest", "maxReviews": 30 }`                                                     |
| Multiple businesses sharing a 60-review budget | `{ "domains": ["amazon.com", "etsy.com", "ebay.com"], "maxReviews": 60 }`                                                 |
| Direct URL input + photos-only                 | `{ "businessUrls": ["https://www.smartcustomer.com/reviews/marriott.com"], "onlyWithPhotos": true }`                          |

### Output

All results land in the run's default dataset. Each record has a `type` field — `"review"` for review records and `"run_summary"` for the final aggregate at end of run.

#### Sample review record

```json
{
    "type": "review",
    "review_url": "https://www.smartcustomer.com/reviews/amazon.com#41154",
    "url": "https://www.smartcustomer.com/reviews/amazon.com#41154",
    "business_url": "https://www.smartcustomer.com/reviews/amazon.com",
    "review_id": "41154",
    "rating": 1.0,
    "review_date": "2026-04-26",
    "text": "Just like a butcher who puts his thumb on the scale or a used car dealer that rolls back the odometer, Amazon is engaging in similar unscrupulous bait-and-switch activities...",
    "user_name": "Les D.",
    "user_avatar_url": "https://static.smartcustomer.com/img/users/lesvdavis/thumbnail_large.1777241188.jpg",
    "photos": [],
    "business_response": {
        "text": "We're sorry to hear about your experience. Please reach out to us at support@amazon.com so we can make this right.",
        "published": "2026-04-28T12:09:03+00:00",
        "author_name": "Amazon"
    },
    "status": "ok",
    "business": {
        "alias": "amazon.com",
        "name": "Amazon",
        "business_url": "https://www.smartcustomer.com/reviews/amazon.com",
        "city": null,
        "categories": ["Shopping"],
        "price_tier": null,
        "business_rating": 2.5,
        "review_count": 11108
    },
    "scraped_at": "2026-05-05T18:00:00.000Z"
}
```

#### Sample run-summary record

```json
{
    "type": "run_summary",
    "businesses_resolved": 1,
    "reviews_emitted": 50,
    "blocked": 0,
    "rate_limited": 0,
    "consecutive_blocks_at_end": 0,
    "run_outcome": "normal",
    "scraped_at": "2026-05-05T18:00:42.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data table

| Field                  | Type            | Description                                                                                                  |
| ---------------------- | --------------- | ------------------------------------------------------------------------------------------------------------ |
| `type`                 | string          | `"review"` or `"run_summary"`.                                                                               |
| `review_url`           | string | null  | SmartCustomer-canonical permalink. Always on `*.smartcustomer.com`.                                                |
| `url`                  | string | null  | Review permalink (same SmartCustomer-canonical URL as `review_url`).                                         |
| `business_url`         | string | null  | SmartCustomer business page URL.                                                                                |
| `review_id`            | string | null  | Review's ID from SmartCustomer.                                                                                 |
| `rating`               | number | null  | Star rating, 1–5.                                                                                            |
| `review_date`          | string | null  | Date as SmartCustomer displays it.                                                                              |
| `text`                 | string | null  | Review body. Original locale.                                                                                |
| `user_name`            | string | null  | Reviewer's display name (typically first-name + last-initial).                                               |
| `user_avatar_url`      | string | null  | Avatar URL on `*.smartcustomer.com`.                                                                         |
| `photos`               | string\[]        | Always present. Each URL is a validated SmartCustomer image URL. Empty for most reviews.                     |
| `business_response`    | object | null  | The business's public reply: `{ text, published, author_name }`, or `null` when there is no reply.           |
| `status`               | string          | `ok` | `partial` | `business_not_found` | `blocked` | `rate_limited`.                                    |
| `business`             | object          | Embedded business metadata (alias, name, business\_url, categories, business\_rating, review\_count).           |

### Pricing — How much does it cost?

Pay-per-event pricing with two events:

- **`business-resolved`** — fired once per business successfully resolved (page returned reviews + business metadata).
- **`review-extracted`** — fired once per emitted review record (after the `onlyWithPhotos` filter).

You don't pay for filtered-out reviews, blocked navigation, or businesses that fail to resolve. Specific per-event prices are shown on this actor's pricing page in Apify Console.

### Tips

- **SmartCustomer's photo coverage varies by business.** If photo extraction is critical, check a sample run on your target domain before turning on `onlyWithPhotos`.
- **Business responses are common on claimed profiles** (e.g. Shein, Fashion Nova) and rare on others — `business_response` is `null` whenever the business simply hasn't replied.
- **The reviews API paginates 10 reviews per page**; `maxReviews` caps the total and pagination advances automatically until the cap or the last page.
- **If `consecutive_blocks_at_end` ≥ 3 in your run summary**, SmartCustomer rate-limited your session. Wait a few minutes or reduce `maxConcurrency`.

### FAQ, disclaimers, and support

**Why SmartCustomer and not Yelp / Trustpilot?** v0.1 of this actor targeted Yelp. Yelp's DataDome WAF blocks Apify's standard residential proxy pool comprehensively (verified across 6+ proxy/strategy combinations). Trustpilot uses AWS WAF which also blocks the same proxy pool. SmartCustomer exposes a clean, public reviews API (the same one its own website reads) that returns structured reviews — including business responses — over plain HTTP. See CHANGELOG for full empirical history.

**Is scraping SmartCustomer legal?** SmartCustomer's Terms of Service govern automated access. This actor is provided for legitimate research, monitoring, and competitive-intelligence use cases that respect SmartCustomer's rate limits and robots.txt. **You are responsible for compliance with SmartCustomer's ToS and applicable local laws (including GDPR Art. 6 / 14 / 17 obligations toward review authors when persisting personal data).** This actor produces a dataset only — caller-side persistence and data-subject obligations are not in its scope.

**Multi-language reviews?** SmartCustomer reviews are predominantly English. The actor emits original-locale text without translation.

**Search by business name?** Not in v0.2. Reserved for v0.3 — pass domain or full SmartCustomer URL for now.

**Issues, ideas, custom builds?** Open an issue on this actor's Issues tab on the Apify platform.

# Actor input Schema

## `domains` (type: `array`):

Domains to scrape, one per line (e.g., 'amazon.com', 'airbnb.com'). Each is mapped to https://www.smartcustomer.com/reviews/<domain>.

## `businessUrls` (type: `array`):

Full SmartCustomer review URLs (e.g., 'https://www.smartcustomer.com/reviews/airbnb.com'). Host must be smartcustomer.com. Canonicalized to domain before processing.

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

Total cap on reviews emitted across the run. Budget is split greedily across resolved businesses. SmartCustomer paginates 20 reviews per page.

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

Sort order on SmartCustomer. 'relevance' = featured order; 'newest' = most recent first; 'highest\_rated'/'lowest\_rated' = star extremes.

## `onlyWithPhotos` (type: `boolean`):

When true, drops reviews with no photos. PPE charges only for emitted (post-filter) reviews. Note: SmartCustomer surfaces user-uploaded review photos inconsistently — many reviews emit empty `photos: []`.

## `includeBusinessResponses` (type: `boolean`):

When true (default), each review carries the business's public reply in the `business_response` field ({ text, published, author\_name }, or null when the business hasn't replied). Turn off to omit responses. No extra charge — responses ride along with the reviews you already collect.

## `maxConcurrency` (type: `integer`):

5 is a safe default. SmartCustomer rate-limits aggressively at higher concurrency.

## `requestTimeoutSecs` (type: `integer`):

Wall-clock timeout for one HTTP fetch.

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

RESIDENTIAL is recommended — SmartCustomer may rate-limit datacenter IPs.

## Actor input object example

```json
{
  "domains": [
    "amazon.com"
  ],
  "maxReviews": 50,
  "sortBy": "relevance",
  "onlyWithPhotos": false,
  "includeBusinessResponses": true,
  "maxConcurrency": 5,
  "requestTimeoutSecs": 45,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Scraped Yelp reviews with embedded business metadata. Records are discriminated by the `type` field ('review' | 'run\_summary'). The final record per run is `type: 'run_summary'` with aggregate counts.

# 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 = {
    "domains": [
        "amazon.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("prodiger/smartcustomer-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 = {
    "domains": ["amazon.com"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("prodiger/smartcustomer-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 '{
  "domains": [
    "amazon.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call prodiger/smartcustomer-review-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,prodiger/smartcustomer-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/LVRTUraYMjoQUxXeu/builds/s1xs1MpeHZTQ7zHhf/openapi.json
