# Trustpilot Review & Business Rating Scraper (`nimbryxo-studio/trustpilot-review-and-business-rating-scraper`) Actor

Pull Trustpilot reviews or per-business rating summaries for any number of domains in one run, filtered by rating, language, date range, keyword, verified status or whether the business replied.

- **URL**: https://apify.com/nimbryxo-studio/trustpilot-review-and-business-rating-scraper.md
- **Developed by:** [Nimbryxo-studio](https://apify.com/nimbryxo-studio) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Trustpilot Review & Business Rating Scraper

Trustpilot hosts consumer reviews for millions of businesses, each with its own TrustScore and rating distribution. This actor reads any number of business review pages in one run and returns either every individual review or a per-business rating summary, with rating, language, date, verification and reply filters applied before you see the data.

### What this actor does

- Returns per-review records for any number of business domains in a single run
- Or returns per-business summary records (TrustScore, total reviews, rating distribution, categories, claimed status)
- Filters: `minRating` / `maxRating`, `verifiedOnly`, `responseRequired`, `language`, `dateRangeFrom` / `dateRangeTo`, `containsKeyword`
- Collects up to 1,000 reviews per business
- Requires a residential proxy, since Trustpilot blocks datacenter IPs behind a JS challenge — see the FAQ
- No empty or null fields ever appear in records — only data that was actually found

### Output: per-review (mode = `reviews`)

- `businessDomain`, `businessName`
- `reviewId`, `reviewUrl`
- `rating` (1-5), `title`, `body`
- `reviewerName`, `reviewerCountry`, `reviewerId`, `reviewerReviewCount`
- `reviewedAt` (publish date), `experiencedAt` (when the customer used the service)
- `verified` (bool), `language`
- `helpfulCount`
- `businessReply` — `{text, repliedAt}` when present
- `recordType: "review"`, `scrapedAt`

### Output: per-business (mode = `summary`)

- `businessDomain`, `businessName`, `identifyingName`, `businessUnitId`
- `websiteUrl`, `trustpilotUrl`
- `trustScore` (1.0–5.0), `stars` (rounded), `totalReviews`
- `ratingDistribution` — `{"1": n, "2": n, "3": n, "4": n, "5": n}`
- `categories[]`
- `verified` (bool), `claimedAt`
- `address` — `{city, country, ...}` when available
- `recordType: "businessSummary"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `businessDomains` | array | `["amazon.com"]` | List of business domains (e.g. `amazon.com`, `airbnb.com`). Trustpilot URLs are accepted too. |
| `mode` | string | `reviews` | `reviews` (per-review records) / `summary` (one record per business) |
| `maxReviewsPerBusiness` | int | `100` | Hard cap per business in `reviews` mode (1–1000) |
| `language` | string | `""` | Filter to a single language (`en`, `de`, `fr`, …) |
| `minRating` / `maxRating` | int | – | 1–5 bounds for the `rating` field |
| `verifiedOnly` | bool | `false` | Only emit reviews flagged as verified |
| `responseRequired` | bool | `false` | Only emit reviews that received a business reply |
| `dateRangeFrom` / `dateRangeTo` | string | – | ISO date filters on `reviewedAt` |
| `containsKeyword` | string | – | Case-insensitive substring match on title/body |
| `maxItems` | int | `500` | Global hard cap across all businesses (1–50000) |
| `proxyConfiguration` | object | RESIDENTIAL | Apify residential proxy — required (datacenter IPs are blocked) |

#### Example: latest 1-star reviews of Amazon with replies

```json
{
  "businessDomains": ["amazon.com"],
  "mode": "reviews",
  "maxReviewsPerBusiness": 100,
  "minRating": 1,
  "maxRating": 1,
  "responseRequired": true,
  "language": "en"
}
```

#### Example: bulk summary of competitors

```json
{
  "businessDomains": ["airbnb.com", "vrbo.com", "booking.com"],
  "mode": "summary"
}
```

#### Example: keyword monitor for a brand

```json
{
  "businessDomains": ["mybrand.com"],
  "mode": "reviews",
  "containsKeyword": "shipping",
  "dateRangeFrom": "2025-01-01"
}
```

#### Example: 5-star reviews mentioning "support" — German market

```json
{
  "businessDomains": ["yourcompany.de"],
  "mode": "reviews",
  "minRating": 5,
  "language": "de",
  "containsKeyword": "support"
}
```

### Use cases

- **Reputation management** — daily monitor of new reviews and replies for tracked brands
- **Competitor research** — bulk-summarize TrustScores + rating distributions across competitors
- **Brand sentiment tracking** — keyword filter (e.g. `delivery`, `cancel`) for high-volume brands
- **Compliance / consumer protection** — pull every 1-star review citing specific issues
- **Customer-success ROI** — count replies-to-reviews ratio per business
- **Localization research** — filter by `language` to compare sentiment across markets
- **Investor due diligence** — track multi-month rating-distribution trends for a private brand
- **Journalism** — bulk-export negative reviews for an investigative piece

### FAQ

**Why is residential proxy required?**  Trustpilot's pages are protected by AWS WAF, which blocks datacenter IPs with a JS-challenge interstitial. Residential IPs pass the challenge transparently. The actor fails fast if no residential proxy is configured.

**Does it require login or cookies?**  No. All Trustpilot business pages are public.

**What's the difference between `reviewedAt` and `experiencedAt`?**  `reviewedAt` is when the consumer published the review on Trustpilot. `experiencedAt` is the service date the consumer reported (when they actually used the service). Both are extracted when present.

**Are reviewer profiles included?**  Yes — `reviewerName`, `reviewerCountry`, and `reviewerId` (when public). Some reviewers post anonymously and only the display name is available.

**Can I scrape replies-only?**  Yes — set `responseRequired: true`. Note: many high-volume retailers (Amazon, Walmart, etc.) don't reply to most recent reviews on Trustpilot, so this filter may return 0 results for big brands; smaller businesses with active customer-care typically yield more matches.

**What's the throughput?**  Trustpilot loads 20 reviews per page. Expect roughly 1,000 reviews per business within about a minute, including initial proxy session setup.

**Are old reviews available?**  Yes — Trustpilot keeps reviews dating back years. `dateRangeFrom` lets you filter the window. Heads-up: Trustpilot returns reviews newest-first and caps deep pagination at ~10-12 pages (~200-240 reviews) from many IPs, so a tight `dateRangeFrom`/`dateRangeTo` window targeting reviews older than the actor can reach may return 0 records on high-volume businesses. For the broadest result set, use `dateRangeFrom` alone (no upper bound) or run on a smaller, lower-traffic business.

**What's a "verified" review?**  Trustpilot flags a review as verified if it can confirm the reviewer used the service (e.g. via the company's review-invitation flow).

**Can I scrape Trustpilot consumer profiles?**  Not in v1 — only business pages are supported.

**Why don't I see a `helpfulCount` on every review?**  Trustpilot only surfaces helpful counts on reviews with at least one upvote. Reviews with zero helpful votes have `helpfulCount: 0` (kept) or omit the field if Trustpilot doesn't expose it.

**Is this affiliated with Trustpilot?**  No, this actor is third-party and uses publicly accessible business pages.

# Actor input Schema

## `businessDomains` (type: `array`):

List of business domains as they appear on Trustpilot URLs (e.g. `amazon.com`, `airbnb.com`, `apple.com`). The domain is the part after `/review/` in the Trustpilot URL.

## `mode` (type: `string`):

What to emit. `reviews` returns one record per review (default). `summary` returns one record per business with TrustScore, total reviews, and rating distribution.

## `maxReviewsPerBusiness` (type: `integer`):

Hard cap on reviews fetched per business domain (mode=reviews). Trustpilot shows 20 reviews per page; this paginates.

## `language` (type: `string`):

Limit reviews to a specific language code (e.g. `en` for English, `de` for German). Leave empty for all languages.

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

Drop reviews with a rating below this value.

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

Drop reviews with a rating above this value.

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

Only emit reviews flagged as verified.

## `dateRangeFrom` (type: `string`):

Drop reviews older than this date.

## `dateRangeTo` (type: `string`):

Drop reviews newer than this date.

## `containsKeyword` (type: `string`):

Only emit reviews whose title or body contains this substring (case-insensitive).

## `responseRequired` (type: `boolean`):

Only emit reviews that received a reply from the business.

## `maxItems` (type: `integer`):

Hard cap on total emitted records across all businesses.

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

Apify proxy. Residential proxy is REQUIRED for Trustpilot — datacenter IPs are blocked by AWS WAF.

## Actor input object example

```json
{
  "businessDomains": [
    "amazon.com"
  ],
  "mode": "reviews",
  "maxReviewsPerBusiness": 100,
  "language": "",
  "verifiedOnly": false,
  "responseRequired": false,
  "maxItems": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Dataset containing all scraped Trustpilot reviews and (when mode=summary) business summaries.

# 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 = {
    "businessDomains": [
        "amazon.com"
    ],
    "mode": "reviews",
    "maxReviewsPerBusiness": 100,
    "verifiedOnly": false,
    "responseRequired": false,
    "maxItems": 500,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nimbryxo-studio/trustpilot-review-and-business-rating-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 = {
    "businessDomains": ["amazon.com"],
    "mode": "reviews",
    "maxReviewsPerBusiness": 100,
    "verifiedOnly": False,
    "responseRequired": False,
    "maxItems": 500,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("nimbryxo-studio/trustpilot-review-and-business-rating-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 '{
  "businessDomains": [
    "amazon.com"
  ],
  "mode": "reviews",
  "maxReviewsPerBusiness": 100,
  "verifiedOnly": false,
  "responseRequired": false,
  "maxItems": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call nimbryxo-studio/trustpilot-review-and-business-rating-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nimbryxo-studio/trustpilot-review-and-business-rating-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/9pVZkNkgMEmGyoZYW/builds/L8lYHM93hR3Ho7hzw/openapi.json
