# Trustpilot Reviews Scraper (`smart_albatross/trustpilot-reviews-scraper`) Actor

- **URL**: https://apify.com/smart\_albatross/trustpilot-reviews-scraper.md
- **Developed by:** [Dev](https://apify.com/smart_albatross) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 reviews

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?

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 Reviews Scraper — Full History, Past the 200 Cap

Export Trustpilot reviews for any company — **far beyond the 200 reviews Trustpilot shows per filter** — with full text, star rating, company replies, reviewer country and verification labels, plus a company profile row with TrustScore, star histogram, language breakdown, categories and public contact details.

Every run tells you **exactly how much of the company it got**: each company row carries `reviewsCollected`, `coveragePct` and `stopReason`, and the `COVERAGE` record summarises every input.

### What you get

| | |
|---|---|
| 📝 Review rows | title, full text, 1–5 stars, language, likes, published / experienced / updated dates, source (organic, invited…), verification level |
| 💬 Company replies | reply text, reply date, hours-to-reply |
| 👤 Reviewer | name, country, profile link, avatar, total reviews written, reviews on the same company |
| 🏢 Company profile | TrustScore, stars, total reviews, reviews in last 12 months, 1–5★ histogram, per-language counts, categories, claimed/verified flags, consumer alerts, email/phone/address, reply rate & speed, Trustpilot AI summary |
| 📊 Coverage | per company: reviews on Trustpilot matching your filters, reviews collected, % coverage, why it stopped |

### How deep does it go?

Trustpilot's website stops at page 10 (200 reviews) for any filter combination. This actor asks for the same company in thousands of different, narrower ways — per language, per star rating, with/without replies, and by review keywords learned from the reviews themselves — and merges the results without duplicates.

Measured on the Apify platform, 30 Sep 2026 (default datacenter proxy, no cap):

| Company | Reviews on Trustpilot | Collected | Time | Oldest review |
|---|---|---|---|---|
| nordvpn.com | 50,744 | **36,521** (73 %) | 13 min | 2015 |
| bitdefender.com | 12,540 | **11,516** (92 %; 97 % of the reviews Trustpilot lists publicly) | 5 min | 2007 |
| nordvpn.com, 1★ in German | 497 | **479** (96 %) | 1 min | 2019 |

With a cap, 3,000 nordvpn reviews take about 45 seconds. Other Trustpilot scrapers tested the same day stopped at 200–3,000 reviews for nordvpn, and two returned nothing.

### Input

```json
{
  "startUrls": ["nordvpn.com", "https://www.trustpilot.com/review/www.bitdefender.com?stars=1"],
  "maxReviewsPerCompany": 0,
  "languages": ["all"]
}
```

- **Companies** — domains or Trustpilot review URLs. Filters in a pasted URL are applied to that company.
- **Max reviews per company** — default 1,000; `0` = as many as reachable.
- **Filters** — stars, languages (default all), published within, verified only, with company reply only, keyword (`"quoted phrase"` for exact match). Filters are applied to every request, so filtered runs still go past 200.
- **Only reviews newer than** — monitoring mode for scheduled runs: newest-first, stops at your date.
- **Company profile row** — on by default.

### Output

One dataset; `type` is `review` or `company`. Every field is always present (`null` when Trustpilot has no value). Two views: **Reviews** and **Companies**. The key-value store record `COVERAGE` lists every input with `status` (`ok`, `not-found`, `failed`), coverage and stop reason.

`stopReason` values:

- `complete` — everything matching your filters was collected
- `cap` — reached your max reviews per company
- `diminishing` / `exhausted` / `budget` — the remaining reviews are not reachable at reasonable cost
- `depth-limit` — (monitoring) the window holds more reviews than Trustpilot exposes
- `charge-limit` — your spending limit was reached
- `not-found` — no Trustpilot page for that domain (not charged)
- `invalid-filter` — Trustpilot rejected one of your filters
- `blocked` / `error` — Trustpilot could not be reached reliably; partial results are kept

### Pricing

Pay per result: **$0.75 per 1,000 reviews** and **$0.003 per company profile**. No start fee. Duplicates, companies that don't exist on Trustpilot and failed requests are never charged. Set a spending limit on the run and the actor stops cleanly when it is reached.

### FAQ

**Do I need a Trustpilot account or API key?** No. Only public review pages are used.

**Why not 100 % coverage?** Trustpilot hides reviews beyond page 10 of every view. Coverage depends on how varied a company's reviews are; the company row tells you exactly what you got.

**Which proxy?** The default Apify datacenter proxy works; residential is used automatically only if datacenter IPs get blocked.

**Is scraping Trustpilot legal?** The actor reads publicly visible review pages. Reviewer names are personal data under GDPR — make sure you have a lawful basis for how you store and use them.

# Actor input Schema

## `startUrls` (type: `array`):

Company domains (nordvpn.com) or Trustpilot review URLs (https://www.trustpilot.com/review/nordvpn.com). Filters in a pasted URL (?stars=1\&languages=de) are applied to that company.

## `maxReviewsPerCompany` (type: `integer`):

Stop after this many reviews per company. 0 = collect as many as Trustpilot exposes (goes far past the 200-review web limit).

## `stars` (type: `array`):

Only reviews with these star ratings. Leave empty for all.

## `languages` (type: `array`):

ISO language codes (en, de, fr...). Default: all languages. Trustpilot's own page shows only English unless told otherwise.

## `datePreset` (type: `string`):

Only reviews published in this period.

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

Only reviews Trustpilot marks as verified.

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

Only reviews the company has replied to.

## `keyword` (type: `string`):

Trustpilot's review search. Words separated by spaces match any word; put a phrase in quotes to match it exactly.

## `reviewsNewerThan` (type: `string`):

Monitoring mode: collect only reviews published on or after this date. Ideal for scheduled daily or weekly syncs.

## `includeCompanyProfile` (type: `boolean`):

Add one row per company with TrustScore, star histogram, language breakdown, categories, contact details, reply behaviour and coverage.

## `maxRequestsPerCompany` (type: `integer`):

Safety limit on requests per company. 0 = automatic (scales with the company's review count).

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

Apify datacenter proxy works well. Residential is used automatically as a fallback when datacenter IPs are blocked.

## Actor input object example

```json
{
  "startUrls": [
    "nordvpn.com"
  ],
  "maxReviewsPerCompany": 1000,
  "languages": [
    "all"
  ],
  "datePreset": "all",
  "verifiedOnly": false,
  "withRepliesOnly": false,
  "includeCompanyProfile": true,
  "maxRequestsPerCompany": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `coverage` (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 = {
    "startUrls": [
        "nordvpn.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("smart_albatross/trustpilot-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 = { "startUrls": ["nordvpn.com"] }

# Run the Actor and wait for it to finish
run = client.actor("smart_albatross/trustpilot-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 '{
  "startUrls": [
    "nordvpn.com"
  ]
}' |
apify call smart_albatross/trustpilot-reviews-scraper --silent --output-dataset

```

## MCP server setup

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