# Trustpilot Reviews Scraper: New Reviews & Replies (`plainrows/trustpilot-reviews`) Actor

Get Trustpilot reviews of any company: stars, title, text, date, language, verified flag and the company reply, plus the company's TrustScore and review count. Paste domains or Trustpilot links. No reviewer names. Only-new-reviews mode for alerts. Pay per review.

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

## Pricing

from $0.20 / 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.
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

Get **Trustpilot reviews of any company**: **stars, review title and text, publication date, language, the "verified" flag and the company's reply**, plus the company's name, address, TrustScore and total review count on every row. Paste website domains (`www.booking.com`) or Trustpilot links (trustpilot.com, uk.trustpilot.com, de.trustpilot.com…).

It calls a commercial data API instead of driving a browser: **no proxies, no CAPTCHAs, no Trustpilot account**. **Nothing about the reviewer is collected** (no name, profile link, picture, country or review count), and the replier's name is dropped too: you get the opinion, not the person.

### Typical uses

- **Review monitoring and alerts**: turn on **Only new reviews**, schedule a daily run and send new 1- and 2-star reviews to Slack, e-mail or a spreadsheet: you never get (or pay for) the same review twice.
- **Competitor benchmarking**: compare TrustScores, complaints and reply habits of the companies in your market.
- **Customer-experience research**: what customers praise or complain about, by star rating and language.
- **Sentiment analysis and AI summaries**: feed clean review text to an LLM, a BI tool or an AI agent (MCP).
- **Agencies**: weekly or monthly reputation reports for e-commerce and service clients.

### What you get

One row per review:

| Field | Description |
|---|---|
| `input` | The company as you gave it |
| `companyName`, `companyDomain`, `companyAddress`, `companyUrl` | Company name, domain, address and Trustpilot page |
| `companyRating`, `companyReviewsCount` | The company's TrustScore out of 5 and its total number of reviews |
| `reviewId`, `reviewUrl` | Trustpilot's review ID (stable: used to keep only new reviews) and a link to the review |
| `rating`, `title`, `text` | Stars (1-5), review title and text, as written |
| `language` | Language of the review (two-letter code) |
| `verified` | `true` when Trustpilot marks the review as verified |
| `publishedAt` | Publication date (UTC, ISO 8601) |
| `companyResponse`, `companyResponseAt` | The company's reply (text only) and its date |
| `imageUrls` | Photos attached to the review |
| `observedAt` | When the data was fetched (UTC) |

Missing values are always `null`, never guessed. A company with no Trustpilot page, no review, no review matching your filters, no new review, or the same reviews as another company of the run (two forms of one domain) gets one free row with `found: false` and `notFoundReason` (the blocks requested for it are still charged, see Pricing).

### Input

```json
{
  "companies": ["www.booking.com", "https://uk.trustpilot.com/review/www.asos.com"],
  "maxReviewsPerCompany": 100,
  "sortBy": "recency"
}
```

- **companies**: one per line, up to 500: the website domain as Trustpilot shows it in the page address (`trustpilot.com/review/www.booking.com` → `www.booking.com`), or the Trustpilot link itself. Trustpilot keys each company by that exact domain, `www.` included or not: if a company is not found, try the other form. Other values are skipped for free and listed in the run summary.
- **maxReviewsPerCompany**: 1 to 200 (default 100).
- **sortBy**: `recency` (default) or `relevance`.
- **ratings** (optional): keep only reviews with these stars, e.g. `["1", "2"]`.
- **languages** (optional): keep only reviews in these languages, e.g. `["en", "de"]`.
- **onlyNewReviews** (optional, monitoring) and **monitorName**: see below.

Trustpilot has no star or language filter at the source: these two filters are applied after the answer. The blocks requested are billed either way; only the reviews kept are billed.

Requests go out at high priority: a company is usually answered in 20 to 60 seconds, and companies run in parallel.

### Monitor companies: get only new reviews

Turn on **Only new reviews** (`"onlyNewReviews": true`), keep `sortBy: "recency"` and add an Apify **schedule** (daily, for example). The first run returns the reviews it finds and remembers their IDs in a key-value store of your own Apify account (default `plainrows-trustpilot-reviews-monitor`); each later run returns **and bills only reviews it has never delivered**. A company with nothing new gets a free row with `notFoundReason: "no-new-reviews"`. The blocks requested are still charged on every check (the data source bills them either way): set `maxReviewsPerCompany` just above the number of new reviews the company gets between two runs (20 = one block is enough for most companies checked daily).

- The history is kept per Trustpilot company: `www.booking.com` and `https://uk.trustpilot.com/review/www.booking.com` share it.
- Each run reads only the `maxReviewsPerCompany` most recent reviews. **If more new reviews arrive between two runs than that limit, the older new ones are not read again and are missed.** When a check finds a full page of reviews and none of them was delivered before, the run warns you (`more than … new reviews since the last run`, also counted in `companiesPossiblyMissingReviews` in the run summary): raise `maxReviewsPerCompany` or run the check more often. When a check reads new reviews that your limit leaves out (reviews are read in blocks of 20, so a limit of 10 reads 20), the run warns too (`… new reviews beyond your limit were not delivered this run`, counted in `reviewsBeyondLimitNotDelivered` in the run summary): they come with a later run only if still among the reviews it reads. With a star or language filter, reviews left out by the filter are not remembered (so they are still delivered if you remove the filter later), and the warning only appears when no review of that full page was left out.
- Use a different **monitorName** per monitoring task to keep separate histories, or a new name to start over.

### Output example

Real row (Booking.com, 2026-10-12; text shortened):

```json
{
  "input": "www.booking.com",
  "found": true,
  "companyName": "Booking.com",
  "companyDomain": "www.booking.com",
  "companyAddress": "Herengracht 597 Amsterdam NL",
  "companyUrl": "https://www.trustpilot.com/review/www.booking.com",
  "companyRating": 1.4,
  "companyReviewsCount": 128517,
  "reviewId": "6accbf70eaeff16da8f689b4",
  "reviewUrl": "https://www.trustpilot.com/reviews/6accbf70eaeff16da8f689b4",
  "rating": 1,
  "title": "Poor Customer Service",
  "text": "Booking.com gave us a reward of a free airport shuttle from the airport to our hotel which incentivised us to book with them...",
  "language": "en",
  "verified": false,
  "publishedAt": "2026-10-12T13:07:28.000Z",
  "companyResponse": null,
  "companyResponseAt": null,
  "imageUrls": [],
  "observedAt": "2026-10-12T13:33:00.000Z",
  "schemaVersion": "1.0"
}
```

### Pricing

Pay per result, no subscription, no proxy costs. See the **Pricing** tab for current prices. Three events, nothing else:

- **Review**: one per review returned, cheaper on higher Apify plans. The company's rating and reply are included.
- **Block of 20 reviews requested**: reviews are fetched in blocks of 20 per company, and the data source bills us every block requested. So 100 reviews = 5 blocks. A block is charged once Trustpilot has answered, even if the company has fewer reviews than you asked for, none matching your filters, no new review, or is not found. Tip: set `maxReviewsPerCompany` to what you need (a multiple of 20) to pay for fewer blocks.
- **Actor start**: a small fixed fee per run, charged by Apify when the run starts.

Example, 100 reviews of one company at free Apify plan prices, run start included: about **$0.043**, i.e. about $0.0004 per review. 10 companies × 100 reviews in one run: about **$0.41**.

Duplicates and malformed values cost nothing beyond the start fee (if two forms of one domain, such as `booking.com` and `www.booking.com`, bring back the same reviews, each review is delivered and billed once; the blocks of both are charged), and requests Trustpilot does not answer in time are not charged. A well-formed domain with no Trustpilot page still costs its blocks when Trustpilot answers "no review". A review that comes back without its text or date field at all (or without the star rating or language you filter on: the data source changed its format) is neither delivered nor charged, and neither are the blocks of a company where no review was readable. The run never spends more than the maximum cost you set.

**Free Apify plan:** each run returns up to 2 companies with up to 40 reviews each, so you can check the output. A paid Apify plan removes these limits.

### Use it from code, automations or AI agents

**API (one call, results returned directly):**

```bash
curl -X POST "https://api.apify.com/v2/acts/plainrows~trustpilot-reviews/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["www.booking.com"], "maxReviewsPerCompany": 40}'
```

**n8n, Make, Zapier:** use the Apify integration, pick `plainrows/trustpilot-reviews`, schedule it daily with Only new reviews and post new 1- or 2-star reviews to Slack.

**AI agents (MCP):** add `https://mcp.apify.com?tools=plainrows/trustpilot-reviews` to Claude, Cursor or any MCP client.

### See also

- [Google Maps Reviews Scraper](https://apify.com/plainrows/google-maps-reviews): Google reviews of the same companies' shops and offices, same format and pricing model.
- [Tripadvisor Reviews Scraper](https://apify.com/plainrows/tripadvisor-reviews): hotel, restaurant and attraction reviews.
- [App Store & Google Play Reviews Scraper](https://apify.com/plainrows/app-reviews-scraper): reviews of the company's apps.

### What this is not

- **No reviewer names, profile links, pictures, countries or review counts, and no name of the person who replied** (privacy by design, in line with GDPR data minimisation). Review and reply texts are delivered as written: they may themselves mention names.
- **Not a full export of a big company's reviews: at most the 200 most recent (or most relevant) reviews per company and run.** This is a limit of the data source, not of the Actor. For a full history, start monitoring with Only new reviews and let it build up day by day.
- Not a search tool: give each company's domain or Trustpilot page.
- Not affiliated with Trustpilot.

### Run summary

Each run stores a summary in the key-value store (`OUTPUT`): companies submitted and run, blocks charged, how many returned nothing, reviews billed, reviews left out by your star or language filters (`reviewsFilteredOut`), requests Trustpilot did not answer, monitored companies that probably got more new reviews than `maxReviewsPerCompany` since the last run (`companiesPossiblyMissingReviews`), new reviews read but left out by that limit (`reviewsBeyondLimitNotDelivered`), duplicates (`duplicatesRemoved`, and `reviewsDuplicatedAcrossCompanies` for reviews already delivered under another input), reviews dropped because the data source changed its format (`reviewsWithChangedFormat`) and invalid values (with the reason, e.g. `NOT_A_DOMAIN`), and anything skipped because of the free-plan or budget limit.

### FAQ

**How do I export the Trustpilot reviews of a company?**
Paste its domain (as in its Trustpilot page address) or its Trustpilot link and run: one row per review with stars, title, text, date, language and the company's reply.

**How many reviews per company?**
Up to 200 per run, the most recent first (or the most relevant). The data source returns no more than 200 per company. To follow a company over time, schedule a daily run with Only new reviews: each run adds the new reviews only.

**How long does a run take?**
Usually about a minute for a few companies: requests are sent at high priority and answered in 20 to 60 seconds, and companies are processed in parallel. Large lists take longer (for example, a daily check of a few hundred companies can take up to an hour), because companies start a few at a time until reviews come back.

**Can I get only 1-star reviews, or only German reviews?**
Yes, with `ratings` and `languages`. They filter what is delivered and billed per review; the blocks requested are billed either way.

**Does it include reviewer names?**
No: nothing about the reviewer is collected.

### More PlainRows tools

Same pay-per-result pricing, same clean JSON, built to chain together in n8n, Make, Zapier or AI agents.

- **SEO and keywords:** [Keyword Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) · [Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) · [Google Autocomplete & People Also Ask](https://apify.com/plainrows/google-autocomplete-questions) · [Google Trends Explorer](https://apify.com/plainrows/google-trends-explorer) · [Website Organic Traffic & Top Keywords](https://apify.com/plainrows/domain-seo-overview) · [Bulk Domain Authority Checker](https://apify.com/plainrows/domain-authority-checker) · [Backlink Checker](https://apify.com/plainrows/backlink-checker) · [Broken Link Checker](https://apify.com/plainrows/broken-link-checker) · [AI Search Visibility Tracker (ChatGPT, Gemini, AI Mode)](https://apify.com/plainrows/ai-search-brand-visibility) · [Google Maps Rank Tracker (Geo-Grid Local SEO)](https://apify.com/plainrows/google-maps-rank-tracker)
- **Leads and companies:** [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) · [Website Technology Checker](https://apify.com/plainrows/website-tech-stack) · [ATS Jobs Scraper (Workday, Greenhouse, Lever, Ashby)](https://apify.com/plainrows/ats-job-postings) · [Google Jobs Scraper](https://apify.com/plainrows/google-jobs-scraper) · [Google Ads Scraper (Transparency Center)](https://apify.com/plainrows/google-ads-transparency) · [Company Registry Lookup (SIRENE, LEI, Brreg)](https://apify.com/plainrows/company-registry-lookup) · [Public Tenders Search (EU TED & UK)](https://apify.com/plainrows/public-tenders-search)
- **E-commerce and travel:** [Amazon Product Search Scraper](https://apify.com/plainrows/amazon-product-search) · [Google Shopping Prices Scraper](https://apify.com/plainrows/google-shopping-prices) · [Google Hotels Prices Scraper](https://apify.com/plainrows/google-hotels-prices) · [Tripadvisor Reviews Scraper](https://apify.com/plainrows/tripadvisor-reviews)
- **Content and media:** [Google News Scraper](https://apify.com/plainrows/google-news-scraper) · [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper) · [YouTube Comments Scraper](https://apify.com/plainrows/youtube-comments-scraper) · [Google Images Scraper](https://apify.com/plainrows/google-images-scraper) · [Website Screenshot API](https://apify.com/plainrows/website-screenshot) · [Google Maps Reviews Scraper](https://apify.com/plainrows/google-maps-reviews) · [App Store & Google Play Reviews Scraper](https://apify.com/plainrows/app-reviews-scraper)

**Compared with other APIs:** [Trustpilot reviews API](https://nadaho.github.io/plainrows/trustpilot-reviews-api/)

### Support

Missing a field or found a bug? Open an issue on this page. Issues are read and answered.

# Actor input Schema

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

One per line: the company's website domain as Trustpilot shows it (www.booking.com) or its Trustpilot page (https://www.trustpilot.com/review/www.booking.com, uk.trustpilot.com, de.trustpilot.com…). Other values are skipped for free. Up to 500 companies per run.

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

Up to 200 (the most Trustpilot returns per company). Reviews are fetched in blocks of 20: each block requested and each review returned is billed; see Pricing.

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

Most recent first suits monitoring.

## `ratings` (type: `array`):

Keep only reviews with these stars. Applied after Trustpilot answers: the blocks requested are billed either way, only kept reviews are billed. Empty = all.

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

Keep only reviews in these languages, as two-letter codes (en, de, fr…). Applied after Trustpilot answers: the blocks requested are billed either way, only kept reviews are billed. Empty = all.

## `onlyNewReviews` (type: `boolean`):

Return only reviews this tool has never delivered to you for the same company. The first run returns the reviews and remembers them; later runs (for example a daily schedule) return and bill only new reviews. Each run reads only the most recent "Max reviews per company": set it above the number of new reviews expected between two runs, or older new reviews are missed (the run warns you). The block fee still applies.

## `monitorName` (type: `string`):

Name of the key-value store in your Apify account that remembers delivered reviews (default "plainrows-trustpilot-reviews-monitor"). Use a different name per monitoring task to keep separate histories, or a new name to start over. Lowercase letters, digits and hyphens.

## Actor input object example

```json
{
  "companies": [
    "www.booking.com"
  ],
  "maxReviewsPerCompany": 20,
  "sortBy": "recency",
  "onlyNewReviews": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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 = {
    "companies": [
        "www.booking.com"
    ],
    "maxReviewsPerCompany": 20,
    "sortBy": "recency"
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainrows/trustpilot-reviews").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": ["www.booking.com"],
    "maxReviewsPerCompany": 20,
    "sortBy": "recency",
}

# Run the Actor and wait for it to finish
run = client.actor("plainrows/trustpilot-reviews").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": [
    "www.booking.com"
  ],
  "maxReviewsPerCompany": 20,
  "sortBy": "recency"
}' |
apify call plainrows/trustpilot-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,plainrows/trustpilot-reviews"
        }
    }
}
```

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/rlWwT3oM1kzkIr6CK/builds/GSmV4OAIWbGTWvEqc/openapi.json
