# Trustpilot Reviews Scraper – Ratings, Replies & TrustScore (`ninhothedev/trustpilot-scraper`) Actor

Scrape Trustpilot reviews for any company: rating, text, dates, reviewer, verified flag and company replies plus TrustScore and star distribution. For reputation monitoring and research.

- **URL**: https://apify.com/ninhothedev/trustpilot-scraper.md
- **Developed by:** [ninhothedev](https://apify.com/ninhothedev) (community)
- **Categories:** Lead generation, Marketing, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 93.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

### What does Trustpilot Reviews Scraper do?

**Trustpilot Reviews Scraper** extracts customer reviews from [Trustpilot](https://www.trustpilot.com) for any company – star rating, title, full review text, publish and experience dates, reviewer name and country, verified flag, likes and the **company's reply** – plus the company's **TrustScore, total review count, star distribution and categories** on every row. Paste a Trustpilot URL, a website or just a domain, and export the collected reviews to JSON, CSV, Excel or straight into your tools via API. No Trustpilot account or API key required; the Actor attempts a browser session when Trustpilot presents a JavaScript challenge. Upstream blocks can still prevent collection.

### What data can you extract?

Every dataset row is one review with the company summary attached (50+ fields):

| Field | Example |
|-------|---------|
| `business_name` | `Zalando GmbH` |
| `business_trust_score` / `business_overall_rating` | `1.4` |
| `business_total_reviews` | `11734` |
| `business_reviews_1_star` … `business_reviews_5_stars` | `9274` … `1198` |
| `business_categories` / `business_primary_category` | `["Shoe Store"]` |
| `business_website`, `business_country`, `business_is_claimed` | `https://www.zalando.de`, `DE`, `true` |
| `review_id`, `review_url` | `621549cd…`, `https://www.trustpilot.com/reviews/621549cd…` |
| `rating` | `1` |
| `title`, `text` | `Worst Customer Experience`, full text |
| `language` | `en` |
| `date_published`, `date_experience`, `date_updated` | `2022-02-22T20:38:37Z` |
| `reviewer_name`, `reviewer_country`, `reviewer_review_count` | `Sameh`, `DE`, `3` |
| `reviewer_profile_url`, `reviewer_id` | `https://www.trustpilot.com/users/61fa37e8…` |
| `is_verified`, `verification_level`, `review_source` | `false`, `not-verified`, `Organic` |
| `helpful_count` (likes) | `1` |
| `owner_reply`, `owner_reply_date`, `has_owner_reply` | company reply text and date |
| `input`, `scraped_at` | what you entered, when it was scraped |

A per-company summary (TrustScore, star distribution, review count per language, AI summary, contact info) is also saved to the key-value store record `COMPANIES`, and a run report to `RUN_SUMMARY`.

### How to use

1. Open the actor and add companies – one per line. Any of these work: `https://www.trustpilot.com/review/www.amazon.com`, `https://de.trustpilot.com/review/www.zalando.de`, `https://www.booking.com`, `booking.com`, or even a company name like `Deutsche Bahn` (resolved via Trustpilot search).
2. Set **Max reviews per company** and optional filters: star rating (e.g. only 1–2 star complaints), language, "published within" period, date range, verified only, only reviews with a company reply, or a keyword such as `refund`.
3. Click **Start**. Download the results as JSON, CSV, Excel or HTML, or fetch them via API.

```json
{
  "businessSlugs": ["https://www.trustpilot.com/review/www.amazon.com", "booking.com"],
  "maxReviews": 2,
  "language": "all",
  "sortBy": "recency",
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

#### More than 200 reviews per company

Trustpilot shows logged-out visitors only 10 pages (200 reviews) per filter combination. With **Collect more than 200 reviews per company** enabled (default), the actor automatically splits the request by language, star rating and sort order and de-duplicates by review ID, which can expose additional public reviews. It does not guarantee all reviews or bypass a login requirement. When you need *exactly the newest N reviews*, keep N ≤ 200 or use the date filters.

### Output example

Real output from a test run (review text shortened):

```json
{
  "source": "trustpilot",
  "business_name": "Zalando GmbH",
  "business_external_id": "49b922710000640005042610",
  "business_url": "https://www.trustpilot.com/review/www.zalando.de",
  "business_overall_rating": 1.4,
  "business_total_reviews": 11734,
  "review_id": "621549cde0365cc27e76840c",
  "review_url": "https://www.trustpilot.com/reviews/621549cde0365cc27e76840c",
  "rating": 1,
  "title": "Worst Customer Experience",
  "text": "I am a plus customer, order something and transfered the money normally, in my order status everything is fine. Recently, they claimed the payment has been cancelled ...",
  "language": "en",
  "date_published": "2022-02-22T20:38:37Z",
  "date_experience": "",
  "reviewer_name": "Sameh",
  "reviewer_country": "DE",
  "reviewer_profile_url": "https://www.trustpilot.com/users/61fa37e80bb0a60012643798",
  "reviewer_review_count": 3,
  "helpful_count": 1,
  "likes_count": 1,
  "is_verified": false,
  "owner_reply": "Good day,\n\nunfortunately, the given reference number could not be verified. Please contact our customer service. ...",
  "owner_reply_date": "2022-03-08T14:24:14Z",
  "photos": [],
  "has_owner_reply": true,
  "date_updated": "2022-04-13T07:46:38Z",
  "review_source": "Organic",
  "verification_level": "not-verified",
  "reviewer_id": "61fa37e80bb0a60012643798",
  "business_domain": "www.zalando.de",
  "business_website": "https://www.zalando.de",
  "business_trust_score": 1.4,
  "business_stars": 1.5,
  "business_reviews_1_star": 9274,
  "business_reviews_2_stars": 656,
  "business_reviews_3_stars": 284,
  "business_reviews_4_stars": 322,
  "business_reviews_5_stars": 1198,
  "business_reviews_last_12_months": 1014,
  "business_categories": ["Shoe Store"],
  "business_primary_category": "Shoe Store",
  "business_country": "DE",
  "business_is_claimed": true,
  "input": "https://www.trustpilot.com/review/www.zalando.de",
  "scraped_at": "2026-10-15T18:04:35Z"
}
```

### How much does Trustpilot scraping cost?

This Actor currently uses **pay per usage** (shown as `FREE` in the Actor API): there is **no separate per-review or Actor rental fee**. You pay Apify platform usage, including compute, storage and any proxy traffic. The [Pricing tab](https://apify.com/ninhothedev/trustpilot-scraper/pricing) is the authoritative place to check the current model.

Begin with `maxReviews: 2` for each company and inspect the run's Usage breakdown before increasing volume. A browser session and residential traffic can dominate small runs, so there is no fixed cost per review. `maxReviews` is **per company**, and `0` requests all reachable reviews; it is not a dollar spending cap. A pay-per-event Max charge setting is not a cap on this Actor's pay-per-usage platform costs. Use a bounded timeout and review your Apify usage limits.

### Run reports and limitations

`RUN_SUMMARY.totalReviews` counts rows accepted during this execution. Each company includes its result count and notes. `status: partial` indicates a budget stop or company issue; `incomplete` identifies a dataset delivery failure and the run fails even if earlier reviews were saved. Keep useful existing dataset rows when investigating a failed run. No new rows are intentionally submitted after a delivery failure. A `complete` execution means the requested processing finished without a recorded delivery/company error; **it does not certify a full historical export**. Public pagination, filter combinations, date boundaries and the requested limit still apply.

Start a fresh run for a new collection. Persistent cross-run deduplication and resume checkpoints are not provided: deduplication is by review ID within each company's current execution. A scheduled run can return reviews that were already collected; deduplicate by `review_id` in your destination.

### Use cases

- **Reputation management** – monitor new reviews and company replies daily, alert on new 1–2 star reviews.
- **Competitor benchmarking** – compare TrustScore, star distribution and complaint themes across your market.
- **Lead generation for agencies** – find companies with low TrustScore, unanswered negative reviews or unclaimed profiles and pitch review-management or CX services.
- **Customer experience & product research** – mine complaints by keyword ("refund", "delivery", "support") and language.
- **Sentiment analysis & AI training data** – multilingual, labelled (1–5 stars) real-world review text.
- **Due diligence & investment research** – track review velocity (`business_reviews_last_12_months`) and rating trends.

### Integrations

Use the results anywhere: the [Apify API](https://docs.apify.com/api/v2), **Make**, **Zapier**, **n8n**, **Google Sheets**, Slack, Airbyte or **webhooks** that fire when a run finishes. Schedule the actor (e.g. daily with `datePeriod: "last30days"`) to build a review-monitoring feed.

Python (`apify-client` 3.x; store your token in an environment variable):

```python
import os
from datetime import timedelta
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("ninhothedev/trustpilot-scraper").call(
    run_input={"businessSlugs": ["www.amazon.com"], "maxReviews": 2},
    run_timeout=timedelta(seconds=180),
    memory_mbytes=1024,
)
if run is None or run.status != "SUCCEEDED":
    raise RuntimeError("Inspect the run log and RUN_SUMMARY before using partial results")
for review in client.dataset(run.default_dataset_id).iterate_items():
    print(review["business_name"], review["rating"], review["title"])
```

The timeout bounds runtime, not a fixed dollar cost. Configure residential proxy access in the input when required by your environment.

### FAQ

**Is it legal to scrape Trustpilot reviews?**
The actor collects only publicly visible review data, the same content anyone sees in a browser without logging in. Reviews contain personal data (reviewer names), so make sure your use complies with GDPR and other applicable laws and with Trustpilot's terms. If unsure, consult a lawyer.

**How many reviews can I get?**
Up to 200 per filter combination directly; with deep pagination (default) the Actor combines languages, star ratings and sort orders when available. Very large profiles (e.g. 100,000+ reviews) cannot be downloaded completely without a Trustpilot login.

**Do I need a proxy?**
Trustpilot is protected by an AWS WAF challenge, for which the Actor attempts a browser session before making further requests. Success is not guaranteed. The input prefill selects an Apify RESIDENTIAL proxy; if a connection is blocked the actor automatically falls back to other options.

**Why do I get English reviews only on trustpilot.com, but all languages here?**
Trustpilot's website filters to English by default. This actor requests `languages=all` unless you choose a language.

**Can I schedule it?**
Yes – use Apify Schedules (e.g. every morning) together with `datePeriod` or `dateFrom` to restrict review dates. Repeated runs can still overlap; deduplicate by review ID downstream.

**Something doesn't work?**
Check the `RUN_SUMMARY` record in the run's key-value store, then open an issue on the actor's Issues tab – include the run ID, input and the relevant error without sharing credentials.

### Related actors

- [Google Reviews Scraper](https://apify.com/ninhothedev/google-reviews-scraper) – reviews and ratings from Google Maps.
- [App Store Reviews Scraper](https://apify.com/ninhothedev/app-store-reviews-scraper) and [Google Play Reviews Scraper](https://apify.com/ninhothedev/google-play-reviews-scraper) – app reviews.
- [Email Finder](https://apify.com/ninhothedev/email-finder-scraper) – find contacts for the companies you discover.

# Changelog

This Actor's version history is a separate document: https://apify.com/ninhothedev/trustpilot-scraper/changelog.md

# Actor input Schema

## `businessSlugs` (type: `array`):

One company per line. Accepts Trustpilot review URLs (https://www.trustpilot.com/review/www.amazon.com, any country subdomain such as de. or uk.), company website URLs (https://www.zalando.de) or plain domains (booking.com). The 'www.' prefix is resolved automatically.

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

Maximum number of reviews to collect for each company. 0 = all reachable reviews. Trustpilot shows 200 reviews per filter combination to logged-out visitors; above 200 the actor automatically splits the query by language and star rating to collect more.

## `filterStars` (type: `string`):

Only collect reviews with this star rating. Via API you can also pass several ratings, e.g. "1,2" for all negative reviews.

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

Only collect reviews written in this language. 'all' returns every language (note: trustpilot.com itself defaults to English only - this actor really returns all languages). Via API any ISO 639-1 code is accepted.

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

'recency' = newest reviews first (best for monitoring). 'relevance' = Trustpilot's 'most relevant' ordering.

## `datePeriod` (type: `string`):

Server-side date filter offered by Trustpilot. Fastest way to get only recent reviews.

## `dateFrom` (type: `string`):

Only keep reviews published on or after this date. With 'Newest first' sorting the actor stops as soon as it reaches older reviews.

## `dateTo` (type: `string`):

Only keep reviews published on or before this date.

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

Only collect reviews Trustpilot marks as verified.

## `withRepliesOnly` (type: `boolean`):

Only collect reviews the company has replied to.

## `searchKeyword` (type: `string`):

Only collect reviews containing this word or phrase (Trustpilot's own review search), e.g. 'refund' or 'delivery'.

## `deepPagination` (type: `boolean`):

Request additional public filter combinations when one combination reaches its page limit. Deduplicates review IDs within a company run; a full historical export is not guaranteed.

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

The prefill selects Apify RESIDENTIAL proxies, which incur traffic costs under pay per usage. The Actor attempts a browser session for JavaScript challenges; success is not guaranteed. If a selected proxy is unavailable or blocked, fallback can include a direct connection and another Apify proxy.

## Actor input object example

```json
{
  "businessSlugs": [
    "https://www.trustpilot.com/review/www.amazon.com",
    "booking.com",
    "https://www.zalando.de"
  ],
  "maxReviews": 50,
  "filterStars": "",
  "language": "all",
  "sortBy": "recency",
  "datePeriod": "",
  "verifiedOnly": false,
  "withRepliesOnly": false,
  "deepPagination": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

## `companies` (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 = {
    "businessSlugs": [
        "www.amazon.com"
    ],
    "maxReviews": 50,
    "language": "all",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ninhothedev/trustpilot-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 = {
    "businessSlugs": ["www.amazon.com"],
    "maxReviews": 50,
    "language": "all",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("ninhothedev/trustpilot-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 '{
  "businessSlugs": [
    "www.amazon.com"
  ],
  "maxReviews": 50,
  "language": "all",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call ninhothedev/trustpilot-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ninhothedev/trustpilot-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/9cpFmlvPjWqNhqfFy/builds/8XBE6JhU8eVxvJgsY/openapi.json
