# Trustpilot Reviews Scraper & New Review Monitor (`ivora/trustpilot-review-monitor`) Actor

Scrape Trustpilot reviews for many brands in one run and get only reviews that are new since the last run. Filter 1-2 star or unanswered reviews. Review text, rating, date, author country, company reply status.

- **URL**: https://apify.com/ivora/trustpilot-review-monitor.md
- **Developed by:** [Ivora Tools](https://apify.com/ivora) (community)
- **Categories:** Marketing, Automation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 new 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 & New Review Monitor

**Trustpilot reviews scraper and review monitor.** Give it brand domains or Trustpilot URLs; it returns their reviews (text, rating, date, author country, reply status) and, on scheduled runs, only the reviews that are new since the previous run.

Most Trustpilot scrapers give you a big pile of reviews. That's great for research, but if you look after the reputation of a few brands (or a few dozen clients), what you actually want every morning is a short answer: **what's new since yesterday, and is any of it bad?**

That's what this Actor does. Put in a list of brands, schedule it, and each run returns only the reviews that appeared since the previous run. You can narrow it down to negative reviews (for example 1-2 stars) and to reviews the company hasn't replied to yet.

### What makes it different

- **Many brands in one run.** Paste 5, 20 or 50 domains. One run checks them all, one dataset, one webhook.
- **Only new reviews.** The first run quietly saves a baseline. After that you only get reviews you haven't seen. No de-duplication on your side.
- **Negative-only and unanswered-only filters.** "Tell me about every new 1-2 star review nobody has replied to" is one setting, not a spreadsheet formula.
- **Cheap when nothing happens.** A brand with no new reviews costs $0.003 per check. You pay per new review only when there is one.
- **A summary row per brand** with TrustScore, total reviews and how many new, negative and unanswered reviews came in. Handy for a client report.

### Who it's for

- Agencies and freelancers who manage reviews or reputation for several clients
- Customer support leads who want to answer bad reviews quickly
- Founders keeping an eye on their own brand and a couple of competitors

### How to use it

1. Add your brands. Use the domain as it appears on Trustpilot (`allbirds.com`, `www.amazon.com`) or just paste the Trustpilot page URL (`https://www.trustpilot.com/review/www.booking.com`). The URL is the safest option.
2. Optional: set **Alert on ratings up to** to `2` to get only 1-2 star reviews. Tick **Only reviews without a company reply** if you only care about reviews still waiting for an answer.
3. Run it once. That first run saves the baseline. If you want to see some data straight away, pick "Output the latest reviews" in **First run of a monitor**.
4. Schedule it (every hour, every morning, whatever suits you) and connect the output to Slack, email, Google Sheets or Make/Zapier via an Apify integration or webhook.

Use a different **Monitor name** for each separate monitor, for example one per client. That name decides where the "already seen" list is kept.

#### Example input

```json
{
  "brands": ["www.booking.com", "gymshark.com", "https://www.trustpilot.com/review/www.ovoenergy.com"],
  "maxRating": 2,
  "onlyUnanswered": true,
  "stateStoreName": "client-a-negative-reviews"
}
```

### Output

One row per new review:

```json
{
  "type": "review",
  "brand": "OVO",
  "brandDomain": "www.ovoenergy.com",
  "rating": 1,
  "isNegative": true,
  "title": "The OVO energy one of the worst energy…",
  "text": "The OVO energy one of the worst energy supplier company in the UK...",
  "language": "en",
  "publishedAt": "2026-10-10T12:46:20.000Z",
  "experiencedAt": "2026-10-10T00:00:00.000Z",
  "authorName": "Peter S.",
  "authorCountry": "GB",
  "authorReviewCount": 29,
  "verified": false,
  "hasReply": true,
  "replyText": "Hi Peter, Thanks for taking the time to leave us a review...",
  "replyPublishedAt": "2026-10-10T14:50:36.000Z",
  "reviewUrl": "https://www.trustpilot.com/reviews/6aca177c525500d34087105d",
  "brandTrustScore": 4.7,
  "detectedAt": "2026-10-11T12:41:02Z"
}
```

Plus one free `summary` row per brand (TrustScore, total reviews, new / negative / unanswered counts, average rating of the new reviews) and a free `error` row for any brand that couldn't be read. The dataset has ready-made views: **New reviews**, **Brand summary** and **Errors**.

### Pricing

Pay per event, no monthly fee:

| Event | Price |
|---|---|
| Run start | $0.005 |
| Brand checked | $0.003 per brand |
| New review row | $0.001 per review |

Brands that fail (not on Trustpilot, blocked) are not charged. Summary and error rows are free.

Example: an agency watching 20 client brands once a day, with around 5 new reviews per brand per day, pays about $0.005 + 20 × $0.003 + 100 × $0.001 = **$0.17 a day**, roughly $5 a month. If you only watch negative reviews, it's usually much less.

You can cap any run with Apify's "Maximum cost per run" setting. The Actor stops cleanly at the limit, and reviews it didn't get to are delivered on the next run.

### Honest limits

- **It's a monitor, not a full-history exporter.** It reads the newest reviews (20 per page, up to 5 pages per brand by default). If a brand gets more than ~100 matching reviews between two runs, raise **Max pages per brand** or run more often. You'll see a note in the summary row when this happens.
- **Edited or deleted reviews aren't tracked.** A review is reported once, when it first appears. Reply status is what it was at that moment.
- **Trustpilot moderation.** Reviews can show up late (after moderation) with an older date. They're still reported as new when they appear, as long as they're not older than the reviews already saved.
- **Trustpilot's bot check.** Trustpilot is protected by a browser check. The Actor passes it once per run with a real headless browser, then reads pages normally. There's an automatic residential proxy fallback if a run gets blocked. If Trustpilot changes its site, things can break until I fix them. Please report it in the Issues tab.
- **Domain names must match Trustpilot.** Some brands live under `www.` (www.amazon.com), some don't. If you get a "no Trustpilot page" error, paste the Trustpilot URL instead.
- Only public data visible on Trustpilot is collected. Reviewer names are public on Trustpilot, but they're still personal data, so handle them in line with GDPR.

### Related actors

This is part of a small **competitor-intelligence suite** by the same developer, with the same conventions throughout: pay per event, failed items never charged, and monitors that return only what changed since the last run.

- [Shopify Store Monitor](https://apify.com/ivora/shopify-store-monitor): new products, price drops, sales and stock changes in competitor Shopify stores.
- [App Store & Google Play Scraper](https://apify.com/ivora/app-store-monitor): ratings, versions, chart and keyword ranks of iOS and Android apps.
- [Google Hotels Scraper & Rate Monitor](https://apify.com/ivora/google-hotels-rate-monitor): hotel prices by booking site, with price-change alerts.
- [Google Ads Transparency Scraper & New Ads Monitor](https://apify.com/ivora/google-ads-transparency-monitor): what your competitors advertise on Google Search, Display and YouTube.
- [LinkedIn Ad Library Scraper & New Ads Monitor](https://apify.com/ivora/linkedin-ad-library-monitor): competitors' LinkedIn ads without login.
- [Bing Ads Library Scraper - Microsoft Ads Monitor (EU)](https://apify.com/ivora/microsoft-ads-library-monitor): Bing ads from Microsoft's official Ad Library.
- [ATS Jobs Scraper & Hiring Monitor](https://apify.com/ivora/company-hiring-monitor): new and closed jobs from Greenhouse, Lever, Ashby, Workday and more.
- [Google Trends Scraper & API](https://apify.com/ivora/google-trends-api): interest over time, by region, top queries and Trending now.

### FAQ

**Do I need a proxy?** No. It worked without one in every test. The residential fallback switches on automatically if needed, and I pay for it, not you.

**Can I get all old reviews of a brand?** Not with this Actor. It's built to watch for new ones. For a one-off full export, use a full Trustpilot scraper.

**How do I get alerts in Slack or email?** Schedule the Actor, then add an integration (Slack, email, Make, Zapier) or a webhook on "Run succeeded". Filter on rows with `"type": "review"`.

**I want to reset a monitor.** Change the **Monitor name**, or delete that named key-value store in your Apify storage.

# Actor input Schema

## `brands` (type: `array`):

Company domains as they appear on Trustpilot (allbirds.com, www.amazon.com) or Trustpilot page URLs (https://www.trustpilot.com/review/allbirds.com). Add all your clients here: one run checks them all.

## `maxRating` (type: `integer`):

5 = every new review. 2 = only new 1-2 star reviews (negative). 3 = 1-3 stars. The rating filter is applied on Trustpilot's side, so it is also cheaper for busy brands.

## `onlyUnanswered` (type: `boolean`):

Skip new reviews that the company has already answered.

## `firstRunBehavior` (type: `string`):

On the first run there is nothing to compare with. baseline = remember the current reviews and output nothing but a summary. outputRecent = also output up to 'First-run rows limit' latest reviews per brand.

## `firstRunRowsLimit` (type: `integer`):

How many of the latest reviews to output per brand on the first run when 'Output the latest reviews' is selected (max 20).

## `maxPagesPerBrand` (type: `integer`):

Safety cap. One page = 20 reviews. 5 pages = up to 100 new reviews per brand between two runs. Raise it for very busy brands or run more often.

## `stateStoreName` (type: `string`):

Named key-value store that remembers which reviews you have already seen. Use a different name for each separate monitor (e.g. one per client group). Only a-z, 0-9 and '-'.

## `includeSummary` (type: `boolean`):

Free row per brand with TrustScore, total reviews and counts of new / negative / unanswered reviews.

## `residentialFallback` (type: `boolean`):

If Trustpilot blocks the request, retry through Apify residential proxy (paid by the developer, not by you).

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

Optional. Not needed normally.

## `maxConcurrency` (type: `integer`):

How many brands are checked at the same time.

## Actor input object example

```json
{
  "brands": [
    "allbirds.com",
    "www.gymshark.com"
  ],
  "maxRating": 5,
  "onlyUnanswered": false,
  "firstRunBehavior": "outputRecent",
  "firstRunRowsLimit": 5,
  "maxPagesPerBrand": 5,
  "stateStoreName": "trustpilot-review-monitor-state",
  "includeSummary": true,
  "residentialFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 3
}
```

# Actor output Schema

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

No description

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

No description

## `runSummary` (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 = {
    "brands": [
        "allbirds.com",
        "www.gymshark.com"
    ],
    "firstRunBehavior": "outputRecent",
    "firstRunRowsLimit": 5,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ivora/trustpilot-review-monitor").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 = {
    "brands": [
        "allbirds.com",
        "www.gymshark.com",
    ],
    "firstRunBehavior": "outputRecent",
    "firstRunRowsLimit": 5,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ivora/trustpilot-review-monitor").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 '{
  "brands": [
    "allbirds.com",
    "www.gymshark.com"
  ],
  "firstRunBehavior": "outputRecent",
  "firstRunRowsLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call ivora/trustpilot-review-monitor --silent --output-dataset

```

## MCP server setup

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

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/ZoNgKxmU6RPutDtjF/builds/gY3c6Ta5xrhxGAa3b/openapi.json
