# Trustpilot Reviews Scraper ($0.25/1k, No 200 Cap) (`locaihost/trustpilot-reviews`) Actor

Scrape Trustpilot reviews for any company: stars, title, text, date, verified flag, reviewer country and company reply, plus TrustScore, star breakdown and reply rate per company. Filter by stars, language, date or topic, and get only new reviews on schedules. No login. $0.25 per 1,000 reviews.

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

## Pricing

from $0.14 / 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 (Replies and Reply Rate)

Get Trustpilot reviews for any company as clean JSON or CSV rows: stars, title, text, dates, verified flag, reviewer country and the company's reply, plus a business row with TrustScore, star breakdown and how often the company replies. No login, no cookies, no account.

- **Monitor your own reputation:** schedule it daily with `onlyNew` and get only the reviews posted since the last run.
- **Read competitors' complaints:** pull every 1- and 2-star review of a rival from the last 30 days and see what customers dislike.
- **Check how a company treats unhappy customers:** reply rate, reply rate on negative reviews and days to reply, next to the TrustScore.
- **Build a list of businesses:** search by keyword or category and get name, website, TrustScore, review count and location for each.
- **Feed analysis and dashboards:** one flat row per review, ready for sentiment analysis, a BI tool or a spreadsheet.

### Quick start

Paste this into the **JSON** tab of the input and click **Start**:

```json
{"companies": ["amazon.com", "monzo.com"], "maxReviewsPerCompany": 20, "maxBusinessesPerSearch": 20}
```

You get one business row per company and its 20 newest reviews: 42 rows in about 20 seconds. Domains, website links and Trustpilot links on any country site (`https://uk.trustpilot.com/review/www.monzo.com`) all work.

More examples:

```json
{"companies": ["booking.com"], "stars": ["1", "2"], "dateFrom": "30 days", "withRepliesOnly": true}
```

```json
{"searchQueries": ["vpn"], "maxBusinessesPerSearch": 30, "reviewsForFoundBusinesses": true, "maxReviewsPerCompany": 50}
```

```json
{"categories": ["electronics_technology"], "country": "GB", "maxBusinessesPerSearch": 100}
```

### What data can I get?

Every row has `type`: `review`, `business`, or `not-found` (free, says what to change).

| Group | Fields |
|---|---|
| Review | `reviewId`, `rating` (1 to 5), `title`, `text`, `language`, `likes` |
| Dates | `publishedAt`, `experiencedAt`, `updatedAt` |
| Trust signals | `isVerified`, `verificationLevel` (verified, invited, not-verified), `reviewSource` (Organic, or BusinessGeneratedLink for invited reviews) |
| Reviewer | `reviewerName` (display name), `reviewerCountry`, `reviewerReviewCount` |
| Company reply | `replyText`, `replyPublishedAt` |
| Business | `businessId`, `name`, `domain`, `websiteUrl`, `trustScore`, `stars`, `reviewCount`, `reviewsLast12Months`, `ratingBreakdown` (reviews per star) |
| Business details | `categories`, `primaryCategory`, `address`, `city`, `zipCode`, `country`, `email` and `phone` (as the business publishes them), `isClaimed`, `isClosed` |
| How it handles reviews | `replyRate`, `negativeReplyRate`, `avgDaysToReply`, `organicReviewShare`, `invitedReviewCount` |
| Context | `companyName`, `companyDomain`, `reviewUrl`, `companyUrl`, `source`, `query`, `rank`, `input`, `scrapedAt` |

The "how it handles reviews" fields come from the company's public Trustpilot transparency page and cover the last 12 months: `replyRate` is the percent of reviews answered, `negativeReplyRate` the percent of 1- and 2-star reviews answered, `avgDaysToReply` the average days to answer a negative review (`null` when it never replies), and `organicReviewShare` the percent written without an invitation. They come with the company row at no extra cost. Rows from a search or category leave them `null`; put the domain in `companies` to get them.

One real review row and its business row (run on 2026-10-18, shortened):

```json
[
  {
    "type": "review",
    "site": "trustpilot",
    "reviewId": "6ad3f06a500ddee159c1e018",
    "companyName": "Amazon",
    "companyDomain": "www.amazon.com",
    "rating": 1,
    "title": "Poor delivery standards",
    "text": "Whilst the products purchased are generally of at least a reasonable quality, tha Amazon service is of a very poor standard, same day delivery constantly not carried out...",
    "language": "en",
    "publishedAt": "2026-10-18T00:02:18.000Z",
    "experiencedAt": "2026-10-17",
    "isVerified": false,
    "verificationLevel": "not-verified",
    "reviewSource": "Organic",
    "likes": 0,
    "reviewerCountry": "GB",
    "reviewerReviewCount": 9,
    "replyText": null,
    "reviewUrl": "https://www.trustpilot.com/reviews/6ad3f06a500ddee159c1e018",
    "input": "amazon.com"
  },
  {
    "type": "business",
    "name": "Amazon",
    "domain": "www.amazon.com",
    "trustScore": 1.6,
    "stars": 1.5,
    "reviewCount": 49904,
    "reviewsLast12Months": 9224,
    "ratingBreakdown": {"one": 33574, "two": 3018, "three": 1896, "four": 2460, "five": 8956},
    "primaryCategory": "Book Store",
    "isClaimed": true,
    "replyRate": 0,
    "negativeReplyRate": 0,
    "avgDaysToReply": null,
    "organicReviewShare": 99.9,
    "invitedReviewCount": 10,
    "source": "company"
  }
]
```

The dataset has four views (**Reviews**, **Businesses**, **How companies reply**, **Not found (free)**) and exports to JSON, CSV, Excel or HTML. The run's `SUMMARY` record has pages read, rows by kind, free rows by reason and timing.

### How much does it cost?

You pay per review or business row returned. There is no charge for Apify platform usage on top.

| Row | Free and Starter | Scale | Business |
|---|---|---|---|
| Review | $0.25 per 1,000 | $0.1875 per 1,000 | $0.1375 per 1,000 |
| Business | $0.25 per 1,000 | $0.1875 per 1,000 | $0.1375 per 1,000 |

Plus $0.00005 per run start. **Apify's free $5 monthly credit covers about 20,000 reviews.** Free-plan runs stop at 1,000 rows each; any paid Apify plan removes the cap.

**What's free:** companies that are not on Trustpilot, unknown categories, searches with no results and unusable inputs (each comes back as a free `not-found` row saying what to change), reviews skipped by `onlyNew`, business rows whose TrustScore and review count haven't changed under `onlyNew`, and reviews left out by **Reviewer countries**. To cap a run's spend, set **Maximum cost per run** in the run options, or **Max rows in total** in the input.

### Limits, stated up front

- Only what a logged-out visitor sees. Trustpilot shows a visitor 10 pages (200 reviews) of any one list, and this Actor never asks for a page past that.
- Asking for more than 200 reviews of a company makes it also read the other lists any visitor can open from the page's own filters: each star rating, each language and the other sort order, each up to 200 reviews, with duplicates removed. Busy companies give thousands of reviews this way. Past the first 200, rows follow those lists rather than one strict date order. If every list was read before your limit, the run says so.
- A company is identified by its website domain. To find one by name, use **Search keywords**.
- About reviewers it keeps only the display name, country code and review count shown on the review: no profile links or photos. Email addresses and phone numbers typed into a review are replaced with `[contact removed]`.
- **Verified only** uses Trustpilot's own Verified filter, which is stricter than the badge invited reviews carry, so many companies have few such reviews.
- With **Published on or after** and newest-first order, the run stops reading at that date, so it reads only the pages it needs. With most-relevant order it can only filter.
- Big requests are split fairly across the run's time limit. If time runs short, the run ends successfully with the rows so far and says what to narrow.

### Only new since last run, and schedules

Turn on **Only new since the last run** and schedule the Actor daily. Each run returns only reviews that earlier runs with the same companies, searches and filters did not, and stops reading a company at the first review it already sent. A run with nothing new charges nothing. Business rows come back only when the TrustScore or review count changed, so a schedule also tracks score changes. Set up a schedule under **Schedules** in Apify Console.

### Integrations: API, n8n, Make and AI agents

**API.** Run it and get the rows back in one call:

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

Apify's API clients for Python and JavaScript work the same way.

**n8n, Make, Zapier, Google Sheets, Slack, webhooks.** Apify's built-in integrations send each run's dataset wherever you need it, for example new 1-star reviews into a Slack channel.

**AI agents (MCP).** Add this Actor to Claude, Cursor or any MCP client with `https://mcp.apify.com/?tools=locaihost/trustpilot-reviews`, then ask something like *"What did customers complain about in Booking.com's 1- and 2-star Trustpilot reviews this month, and does the company reply?"*

### FAQ

#### How much does it cost to scrape Trustpilot reviews?

$0.25 per 1,000 reviews or businesses on the Free and Starter plans, less on Scale and Business. Apify's free $5 monthly credit covers about 20,000 reviews.

#### Can I use it through the API or from Python?

Yes. Use the `run-sync-get-dataset-items` call above, or Apify's Python and JavaScript clients. Every run's data is also available as JSON, CSV or Excel from its dataset.

#### Can I use it from an AI agent?

Yes. Through the Apify MCP server (`https://mcp.apify.com/?tools=locaihost/trustpilot-reviews`) any MCP client can call it with a list of companies and read the reviews back.

#### Is it legal to scrape Trustpilot?

The Actor reads only pages any logged-out visitor can open; it never logs in or uses cookies from an account. Trustpilot's own terms restrict automated collection, so check them against your use. It keeps only a reviewer's display name, country and review count, and removes contact details typed into reviews. Review texts are written by members of the public: respect copyright when republishing them, follow privacy law (such as GDPR) if you store reviewer names, and never use the data to contact, profile or harass reviewers. You are responsible for how you use the results.

#### How many reviews can I get per company?

Up to 200 from any one list, and for busy companies thousands, by reading every star, language and sort list a visitor can open (see Limits). Set **Max reviews per company** to a large number like 100000 for everything a visitor can reach.

#### Can I get only reviews about delivery, refunds or customer service?

Yes. **Topics** keeps only reviews Trustpilot tags with a topic, like `delivery_service`, `customer_service`, `product`, `value_for_money` or `refund`. Each company's page shows its own topics above the reviews.

#### Why are some fields empty?

`replyText` is empty when the company didn't reply, `updatedAt` when the review was never edited, and the reply-rate fields on rows from searches and categories (put the domain in `companies` to get them). Address, email and phone exist only where the business published them on Trustpilot.

### More from locaihost data

- [App Store and Google Play reviews](https://apify.com/locaihost/app-stores): ratings and reviews of mobile apps, for the same company's app.
- [Google Maps business leads](https://apify.com/locaihost/google-maps-leads): local businesses with ratings and contact details from Google Maps.
- [Company enrichment by domain](https://apify.com/locaihost/company-profile): company name, description, logo, socials and role contact addresses from each site.
- [Website traffic checker](https://apify.com/locaihost/website-traffic): monthly visits and traffic sources for the companies you track.

### Did it help?

If this saved you time, a quick rating on the Store helps other people find it.

### Support

Something not working, a filter you need, or another review site with the same columns? Open an issue on the **Issues** tab: we answer issues within 24 hours.

# Changelog

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

# Actor input Schema

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

Companies to read reviews for. Type the website domain (amazon.com) or paste a Trustpilot review link (https://www.trustpilot.com/review/www.amazon.com, any country site works). To find a company by its name, use Search keywords below.

## `searchQueries` (type: `array`):

Find businesses the way Trustpilot's search box does. Each result is a business row: name, website, TrustScore, review count, categories and location.

## `categories` (type: `array`):

Trustpilot category ids or links, for example electronics_technology, bank or https://www.trustpilot.com/categories/pet_store. Returns the businesses listed in the category, in Trustpilot's order.

## `country` (type: `string`):

Two-letter country code for category listings, like US, GB, DE or AU. Leave empty for Trustpilot's default (US). Has no effect on companies or search.

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

Newest first by default. 0 returns only the company row (TrustScore, review count, star breakdown) with no reviews. Trustpilot shows a logged-out visitor 200 reviews per filter view; above that, the Actor also reads each star rating, language and sort order as separate views, so busy companies give thousands. Use a large number like 100000 for everything a visitor can reach.

## `maxBusinessesPerSearch` (type: `integer`):

How many businesses to return for each keyword or category. 0 means all.

## `reviewsForFoundBusinesses` (type: `boolean`):

Read the reviews of every business that a search or category returns, using the review settings below (each review is a charged row). Their business rows are not repeated.

## `includeCompanyInfo` (type: `boolean`):

Add one business row per company in Companies, charged like a review: TrustScore, stars, review count, reviews in the last 12 months, star breakdown, categories, address, claimed or not, and how the company replies to reviews.

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

Only reviews with these ratings. Leave empty for all.

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

Only reviews written in this language. All languages by default.

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

Only reviews published on or after this date, like 2026-09-01, or a period back from today like 30 days. With newest-first order the Actor stops reading at this date, so it is fast and cheap.

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

Only reviews Trustpilot's own Verified filter returns. It is stricter than the badge on invited reviews (verificationLevel shows which), so many companies have few such reviews.

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

Only reviews the company has replied to.

## `topics` (type: `array`):

Only reviews Trustpilot tags with one of these topics, e.g. delivery_service, customer_service, product, value_for_money, refund. A company's page shows its own topics as chips above the reviews; a review with any of the topics you list counts. Leave empty for all.

## `reviewerCountries` (type: `array`):

Only reviews by reviewers from these countries, as two-letter codes like US, GB, DE. Reviews from other countries are left out and not charged. Leave empty for all.

## `sort` (type: `string`):

Newest first suits monitoring and date limits. Most relevant is Trustpilot's default order on the page.

## `onlyNew` (type: `boolean`):

Skip reviews an earlier run with the same companies, searches and filters already returned, so a daily schedule only pays for new reviews. Business rows come back only when their TrustScore or review count changed. Nothing new means nothing charged.

## `maxResults` (type: `integer`):

Stop after this many charged rows across everything. 0 means no limit beyond the settings above.

## Actor input object example

```json
{
  "companies": [
    "amazon.com",
    "https://www.trustpilot.com/review/www.monzo.com",
    "booking.com"
  ],
  "searchQueries": [
    "vpn",
    "car insurance",
    "pet food"
  ],
  "categories": [
    "electronics_technology",
    "bank"
  ],
  "country": "GB",
  "maxReviewsPerCompany": 20,
  "maxBusinessesPerSearch": 20,
  "reviewsForFoundBusinesses": false,
  "includeCompanyInfo": true,
  "stars": [
    "1",
    "2"
  ],
  "language": "all",
  "dateFrom": "2026-09-01",
  "verifiedOnly": false,
  "withRepliesOnly": false,
  "topics": [
    "delivery_service",
    "customer_service"
  ],
  "reviewerCountries": [
    "US",
    "GB"
  ],
  "sort": "recency",
  "onlyNew": false,
  "maxResults": 0
}
```

# Actor output Schema

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

One row per review: company, stars, title, text, dates, reviewer name and country, verified flag, company reply, link.

## `businesses` (type: `string`):

One row per business: name, domain, TrustScore, review count, category, location, how it was found.

## `full` (type: `string`):

Every field of every row, including free not-found rows.

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

Counts, free rows by reason, anything that failed, access stats and cost.

# 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": [
        "amazon.com",
        "monzo.com"
    ],
    "maxReviewsPerCompany": 20,
    "maxBusinessesPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("locaihost/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": [
        "amazon.com",
        "monzo.com",
    ],
    "maxReviewsPerCompany": 20,
    "maxBusinessesPerSearch": 20,
}

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

```

## MCP server setup

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