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

Scrape Trustpilot reviews of any company: rating, title, text, dates, reviewer, country, verification and the company's reply, plus the company's TrustScore and profile. Filter by stars, language and date. No login.

- **URL**: https://apify.com/jmlp/trustpilot-reviews-scraper.md
- **Developed by:** [Mary Lou](https://apify.com/jmlp) (community)
- **Categories:** Lead generation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.15 / 1,000 reviews

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 Reviews Scraper

Scrape **Trustpilot reviews of any company**. Every review comes with its rating, title, full text and publication date. You also get the date of experience, the reviewer's name, country and review count, whether the review is verified, and the company's public reply. Each row also carries the company's TrustScore, review count and category.

No login, no Trustpilot account.

***

### What you can do with it

- **Reputation monitoring**: follow what customers say about your brand, and get every new review with a daily or weekly run
- **Competitor analysis**: compare ratings, complaints and how quickly competitors reply to negative reviews
- **Sentiment and AI analysis**: feed full review texts into your models, dashboards or LLM workflows
- **Product and service feedback**: pull the 1- and 2-star reviews to find what goes wrong
- **Lead generation**: find companies with low TrustScores or unanswered complaints, with their contact details
- **Agency reporting**: review exports for every client, in one run

***

### How to scrape Trustpilot reviews

**1.** Enter the **Companies**, one per line. Any of these works:

- a website: `gymshark.com`
- a Trustpilot page from any country: `https://uk.trustpilot.com/review/gymshark.com`
- a name: `Gymshark`, which reads every Trustpilot profile listed under that name

**2.** Optionally filter by **Star ratings**, **Review languages**, **Published since** or **Verified reviews only**.

**3.** Set **Max reviews per company**, then press Start.

```json
{
  "companies": ["gymshark.com", "https://www.trustpilot.com/review/www.nike.com"],
  "maxReviewsPerCompany": 1000,
  "stars": ["1", "2"],
  "languages": ["en"],
  "dateFrom": "90 days"
}
```

A pasted Trustpilot link keeps its own filters. `trustpilot.com/review/gymshark.com?stars=1&languages=de` gives that company's German 1-star reviews.

***

### How many reviews you get

Trustpilot shows a signed-out visitor **10 pages, 200 reviews, of each view** of a company. Each star rating and each language is its own view. So when a company has more than 200 reviews, the scraper splits them by language, then by star rating, and reads every view.

- **Most companies come whole.** Every view of 200 reviews or fewer is read completely. For example, gymshark.nl gave 68 of 68 and gymshark.dk 63 of 63.
- **The biggest brands give their newest reviews per view.** A view that still has more than 200 gives its newest 200. Gymshark's 40,000+ reviews give thousands, spread over every language and star rating.
- **New reviews are never missed.** Set **Published since** and schedule the run daily or weekly. Each run collects everything new since the date.

The run's `SUMMARY` record shows, per company, how many reviews Trustpilot lists, how many were collected, and which views reached the 200-review limit.

***

### Output

One row per review. Export as **JSON, CSV, Excel, XML or RSS**.

```json
{
  "review_id": "6ac7731eb6b0b175ed7c41ab",
  "review_url": "https://www.trustpilot.com/reviews/6ac7731eb6b0b175ed7c41ab",
  "rating": 1,
  "title": "Package hasn't arrived for 10 days and…",
  "text": "Package hasn't arrived for 10 days and didn't hear anything from Gymshark - so I had to reach out...",
  "language": "en",
  "published_at": "2026-10-08T12:40:30Z",
  "experienced_at": "2026-10-08",
  "likes": 0,
  "is_verified": false,
  "verification_level": "invited",
  "review_source": "BasicLink",
  "reviewer_name": "Philip",
  "reviewer_country": "GB",
  "reviewer_review_count": 7,
  "reply_text": null,
  "company_name": "Gymshark",
  "company_domain": "gymshark.com",
  "company_trust_score": 3.5,
  "company_review_count": 42123,
  "company_category": "Activewear Store"
}
```

| Field | Notes |
| --- | --- |
| `rating`, `title`, `text` | The stars given and the review in full |
| `published_at`, `experienced_at`, `updated_at` | When it was published, the date of the experience, and the last edit |
| `is_verified`, `verification_level`, `review_source` | Trustpilot's verification, and how the review came in: organic or a company invitation |
| `reviewer_*` | Name, country, how many reviews they have written, profile link and photo |
| `reply_text`, `reply_published_at` | The company's public reply |
| `likes` | How many readers found the review useful |
| `company_*` | The company's name, domain, Trustpilot page, TrustScore, review count, category and country |

Each company's full profile is saved as the `COMPANIES` record in the run's key-value store. It holds review counts by star rating and by language, categories, contact details and address, whether the profile is claimed, and how often and how fast the company replies to negative reviews.

***

### Reliable on big runs

- **Inputs are read forgivingly.** Websites, emails, any country's Trustpilot links and company names all work. So do star ratings written as `5`, `5 stars`, `Excellent` or `negative`, and languages as `en`, `English` or `Deutsch`. Anything that cannot be read is skipped with a note in the log, not the whole run.
- **Refusals are retried.** A refused request moves to a new IP. Companies still refused at the end get a second pass, and one that fails costs only itself.
- **No failed runs for blocks.** If Trustpilot refuses everything, the run ends normally and its status message says why.
- **Resumable.** Progress is saved every 30 seconds.

***

### FAQ

**Do I need a Trustpilot account?**
No. Trustpilot reviews are public, and the scraper reads them as a signed-out visitor.

**Which countries are covered?**
All of them. A company has one Trustpilot profile, whichever country's site shows it, so `uk.`, `de.` or `www.trustpilot.com` links all give the same reviews. To narrow the reviews down by language, use **Review languages**.

**Why do the biggest brands not give every review?**
Trustpilot shows a signed-out visitor 200 reviews per view. The scraper reads every view, by language and star rating, so only views with more than 200 reviews are cut short, and those give their newest. For a complete history going forward, schedule a daily or weekly run with **Published since**.

**Can I get only negative reviews?**
Yes. Set **Star ratings** to 1 and 2, or type `negative`.

**Which proxy should I use?**
The default residential proxy works. Other settings fall back to it when Trustpilot refuses them.

***

### Related scrapers

- **Website Contact Scraper**: emails, phones and social profiles from company websites
- **Google Search Scraper**: organic results for any query
- **Meta Ads Library Scraper**: the ads a company runs on Facebook and Instagram
- **TikTok Shop Scraper**: products, prices, sold counts and shops on TikTok Shop

# Actor input Schema

## `companies` (type: `array`):

One per line: the company's website (gymshark.com), its Trustpilot page (trustpilot.com/review/gymshark.com, from any country's Trustpilot), or its name (Gymshark). A pasted Trustpilot link keeps its own star and language filters.

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

The newest this many reviews of each company. Empty means every review a signed-out visitor can read.

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

Only reviews with these ratings. Empty means all.

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

Only reviews written in these languages: codes or names (en, de, French). Empty means every language.

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

Only reviews published on or after this date: 2025-01-01, or relative such as '30 days' or '6 months'. For daily or weekly runs that collect only what is new.

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

Only reviews Trustpilot marks as verified.

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

Stop after this many reviews across every company. Caps both runtime and cost.

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

Trustpilot lets a browser through on a residential exit. The default works; other settings fall back to it.

## `resume` (type: `boolean`):

Save progress every ~30s so a run that gets migrated or restarted by the platform picks up where it stopped, without repeating reviews.

## `continueFromLastRun` (type: `boolean`):

If your previous run with the same input was interrupted, scrape only what it missed. Reviews already collected stay in THAT run's dataset.

## Actor input object example

```json
{
  "companies": [
    "gymshark.com"
  ],
  "maxReviewsPerCompany": 100,
  "verifiedOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "resume": true,
  "continueFromLastRun": false
}
```

# Actor output Schema

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

One record per review.

## `companies` (type: `string`):

Each company's Trustpilot profile.

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

What each company gave, and whether anything was refused or not found.

# 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 = {
    "companies": [
        "gymshark.com"
    ],
    "maxReviewsPerCompany": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jmlp/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 = {
    "companies": ["gymshark.com"],
    "maxReviewsPerCompany": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("jmlp/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 '{
  "companies": [
    "gymshark.com"
  ],
  "maxReviewsPerCompany": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call jmlp/trustpilot-reviews-scraper --silent --output-dataset

```

## MCP server setup

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