# Trustpilot Reviews Scraper (no login, monitor new reviews) (`datahamster/trustpilot-reviews`) Actor

Trustpilot business reviews by domain or review URL: rating, title, text, dates, verification flag and the company reply as flat rows, no reviewer name, avatar or profile. Monitor mode alerts on new reviews. No login. Each page of 20 reviews uses Apify Web Unblocker platform usage, billed to you.

- **URL**: https://apify.com/datahamster/trustpilot-reviews.md
- **Developed by:** [Viktor Dubnytskiy](https://apify.com/datahamster) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 result items

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 (no login, monitor new reviews)

Read Trustpilot reviews for any business by domain or review-page URL: one flat row per review with rating, title, text, dates, verification flag, likes and the company's reply. No Trustpilot account, no login, no reviewer identity of any kind.

### What you get

Real rows from the example dataset (business `www.notion.so`):

| rating | title | isVerified | publishedAt | replyText |
|---|---|---|---|---|
| `1` | "When you move to Notion half of your life..." | `false` | `2026-09-21` | — (no reply yet) |
| `1` | "Public links blocked across my workspace with no clear support" | `false` | `2026-09-17` | — (no reply yet) |
| `2` | "Support is next to non-existent on their business accounts" | `false` | `2026-09-14` | — (no reply yet) |

Full row (review): `id`, `url`, `rowType`, `businessDomain`, `businessName`, `rating`, `title`, `text`, `language`, `publishedAt`, `experiencedAt`, `isVerified`, `verificationSource`, `likes`, `replyText`, `replyPublishedAt`, `query`, `scrapedAt`. With `includeBusinessSummary: true`, one extra `rowType: business` row per business adds `trustScore`, `stars`, `numberOfReviews`, `categories`, `website`, `claimed`.

**Not collected, ever:** the reviewer's name, id, avatar, country or their review count.

### Use cases

- Pull every review of your own business (or a competitor's) as structured rows for a spreadsheet or a dashboard, without a reviewer name in sight.
- Watch a business in monitor mode and get an alert the moment a new review lands, so you can reply fast.
- Read the company's own replies across many reviews at once to audit response coverage and turnaround.

### Try it in 10 seconds

Hit **Start**/**Try it** — the input already works: `businesses: ["www.notion.so"]`, `maxReviewsPerBusiness: 100`, `sort: "recency"`, `maxItems: 100`, nothing required.

To get alerted the moment a new review lands: save the task, set **Mode** to `monitor`, and put it on a schedule (Apify → Schedules → cron `0 */4 * * *` every 4 hours). Each run then returns only reviews new or changed since the previous check, ready for a webhook or Telegram alert.

### How it works

1. Each domain or URL you give resolves to a Trustpilot business (`trustpilot.com/review/<domain>`).
2. The actor reads that business's review pages (`?page=N&sort=...&languages=...`) 20 reviews at a time until it reaches `maxReviewsPerBusiness`, the last page (fewer than 20 reviews), or a page whose reviews were already seen.
3. A domain Trustpilot has no page for comes back as a legitimate "not found" - nothing is pushed for it, and no result event is charged.
4. Trustpilot's structured page state loads only through Apify Web Unblocker; every other proxy tier gets a verification wall on this site, so the actor uses Unblocker from the first request.

### Input

| Field | Meaning | Default |
|---|---|---|
| `businesses` | Trustpilot domains or review-page URLs | `["www.notion.so"]` |
| `maxReviewsPerBusiness` | Stop scanning a business after this many reviews | `100` |
| `sort` | `recency` or `relevance` | `recency` |
| `language` | `all` or a Trustpilot language code | `all` |
| `minRating` | Drop reviews rated below this (1-5) | `1` |
| `includeBusinessSummary` | Also push one summary row per business | `false` |
| `maxItems` | Stop after this many rows overall | `100` |
| `mode` | `scrape` or `monitor` (only new/changed reviews since last run) | `scrape` |
| `monitorStateId`, `webhookUrl`, `telegramBotToken`, `telegramChatId` | Monitor-mode state key and alert targets | empty |

### Pricing

| Event | Price |
|---|---|
| result | $0.002 per row ($2 per 1,000) |
| monitor-check | $0.006 per monitor run |
| change | $0.002 per new/changed review |

Charged only for rows actually pushed. Trustpilot is read through Apify Web Unblocker (roughly $0.0015 per page of 20 reviews); this platform usage is billed to you on top of the actor's own events, same as any other Unblocker-based actor.

### Why this actor

- No reviewer identity in the output at all - not a name, not an avatar, not a country. Just what the business itself needs: the review content and its own reply.
- Monitor mode with webhook and Telegram alerts the moment a new review is posted.
- A business Trustpilot has no page for is reported as "not found", never as a silent empty run.

### Limits

- Reviews come from Trustpilot's own public review pages; a business with reviews hidden behind a paywall or removed by Trustpilot will not appear.
- `minRating` is applied after fetching, so a business with mostly low ratings may need more `maxReviewsPerBusiness` to surface enough high-rated reviews.
- One business summary row per business, from the same page as its first batch of reviews.

### FAQ

**Does it need a Trustpilot login?** No. Every page is read as a logged-out visitor.

**Is the reviewer's name in the output?** No, never. Only the review content, rating, dates, verification flag and the company's reply.

**What happens for a business Trustpilot doesn't have?** No rows are pushed for it and no result events are charged for it; other businesses in the same run are unaffected.

### Changelog

- 0.1: initial release - review rows with no reviewer identity, business summary row, monitor mode.

***

If this actor saved you time, a short review on its Store page genuinely helps other people find it. Found a bug or need a field that is missing? Open a ticket on the **Issues** tab.

# Actor input Schema

## `maxItems` (type: `integer`):

Stop after this many results (you are charged only for pushed items)

## `mode` (type: `string`):

scrape = full results; monitor = only new/changed items since the previous run of this task

## `monitorStateId` (type: `string`):

Optional state id when not running as a saved task (monitor mode)

## `webhookUrl` (type: `string`):

POST a change summary here in monitor mode

## `telegramBotToken` (type: `string`):

Optional: bot token for monitor-mode change summaries

## `telegramChatId` (type: `string`):

Optional: chat id that receives monitor-mode summaries

## `businesses` (type: `array`):

Trustpilot business domains or review-page URLs, one per line, e.g. "www.notion.so", "anthropic.com", or "https://www.trustpilot.com/review/www.revolut.com".

## `maxReviewsPerBusiness` (type: `integer`):

Stop scanning a business after this many reviews (20 per page). Example: 100.

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

Order Trustpilot serves the reviews in. "recency" is best for monitor mode.

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

"all" for every language, or a Trustpilot language code such as "en", "de", "fr".

## `minRating` (type: `integer`):

Drop reviews rated below this (1-5, applied after fetching). Example: 1 keeps every rating.

## `includeBusinessSummary` (type: `boolean`):

true = also push one row per business with its Trustpilot score, star rating, category and total review count. Example: false.

## Actor input object example

```json
{
  "maxItems": 100,
  "mode": "scrape",
  "businesses": [
    "www.notion.so"
  ],
  "maxReviewsPerBusiness": 100,
  "sort": "recency",
  "language": "all",
  "minRating": 1,
  "includeBusinessSummary": false
}
```

# Actor output Schema

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

All pushed rows (dataset, JSON)

## `resultsTable` (type: `string`):

Dataset in the Console viewer

## `runSummary` (type: `string`):

RUN\_SUMMARY record

# 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 = {
    "businesses": [
        "www.notion.so"
    ],
    "maxReviewsPerBusiness": 100,
    "language": "all",
    "minRating": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("datahamster/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 = {
    "businesses": ["www.notion.so"],
    "maxReviewsPerBusiness": 100,
    "language": "all",
    "minRating": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("datahamster/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 '{
  "businesses": [
    "www.notion.so"
  ],
  "maxReviewsPerBusiness": 100,
  "language": "all",
  "minRating": 1
}' |
apify call datahamster/trustpilot-reviews --silent --output-dataset

```

## MCP server setup

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