# Trustpilot Reviews Scraper with New-Review Monitor (`shrid5/trustpilot-reviews`) Actor

Scrape Trustpilot reviews for any company: ratings, text, replies, reviewer info, and TrustScore. Monitor mode fetches only new reviews since the last run.

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

## Pricing

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

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Trustpilot Reviews Scraper — Cheap, Fast, with New-Review Monitor

Unofficial. Not affiliated with, endorsed by, or sponsored by Trustpilot.

Scrape Trustpilot reviews for any company at **$0.40 per 1,000 reviews**: ratings, review text, company replies, reviewer country, verification, and TrustScore. Built for reputation teams, agencies, and review-alert workflows. Turn on monitor mode to fetch only new reviews since the last run — schedule it daily without re-paying for history.

### What you get

Each dataset item is one review. Primary key is `reviewId`. Company profile fields (name, domain, TrustScore, total reviews) are duplicated onto every row so CSV exports stay flat.

```json
{
  "companyDomain": "notion.so",
  "companyName": "Notion",
  "trustScore": 4.2,
  "companyTotalReviews": 1834,
  "reviewId": "68a1f0c0newest0000000001",
  "rating": 5,
  "title": "Best workspace we have used",
  "text": "Notion replaced three tools for our team. Setup took a weekend.",
  "publishedDate": "2026-08-20T10:11:12.000Z",
  "experienceDate": "2026-08-18",
  "reviewerName": "John D.",
  "reviewerCountry": "US",
  "reviewerReviewCount": 3,
  "verified": true,
  "companyReply": {
    "text": "Thanks for the kind words, John!",
    "publishedDate": "2026-08-21T09:00:00.000Z"
  }
}
```

### How to use

1. Open this Actor in Apify Console. Add **Companies** as domains (`notion.so`) or full Trustpilot URLs (`https://www.trustpilot.com/review/notion.so`). At least one company is required.
2. Optionally filter by **stars** (`[1,2]` for complaints) and **languages** (`en`). Set **Published after** to stop paginating once a page's oldest review is older than that date (reviews are newest-first). Cap cost with **Max reviews per company** (default **20** — raise it for a full history scrape).
3. Click **Start**. Export the dataset as JSON, CSV, or Excel when the run finishes.

Worked example input (Notion reviews, English, up to 100):

```json
{
  "companies": ["notion.so"],
  "languages": ["en"],
  "maxReviewsPerCompany": 100
}
```

Filter URL params used on Trustpilot: `stars=`, `languages=`, `page=` (1-indexed). Review data is read from `__NEXT_DATA__` at `props.pageProps.reviews` (not CSS cards).

### Pricing

| Event | Price | When you are charged |
| --- | --- | --- |
| Actor start (`apify-actor-start`) | $0.00005 | Once per run (automatic; first 5 seconds of compute are covered) |
| Review (`review`) | $0.0004 | Each unique review written to the dataset |

Scraping 5,000 reviews costs **$2.00 + $0.00005 start fee**. Company profile fields on each row are included — not a separate event.

You are not charged `review` on a zero-result run (beyond the start fee). This actor never charges `apify-actor-start` in code.

### Monitor mode / scheduling

Turn on **Monitor mode** and create a daily or weekly schedule in Apify Console (Actor → Schedules).

- The actor stores a per-company cursor (`reviewId` + `publishedDate` of the newest review emitted) in a named key-value store, keyed by your companies / search / star / language / publishedAfter filters, so two schedules do not overwrite each other.
- **First monitor run** (no cursor yet): emits every matching review up to your cap, then saves the cursor.
- **Later runs**: stop at the first already-seen review per company and emit only newer reviews — a feed for reputation alerts.
- Changing `maxReviewsPerCompany` does not reset the cursor.

### Integrations

- **API:** Call actor `shrid5/trustpilot-reviews` (or `https://apify.com/shrid5/trustpilot-reviews`) with the Apify REST API or JS/Python client. Pass the same JSON input as the Console form.
- **MCP:** Apify Actors are callable from MCP/AI-agent clients, so an assistant can pull Trustpilot reviews into a briefing or CRM note.
- **Webhooks:** Fire a webhook on run success to notify Slack, PagerDuty, or your own endpoint when new reviews land.
- **Make / Zapier / n8n:** Use the official Apify apps to send new review rows into Google Sheets, HubSpot, or email.

### FAQ

**How do I scrape all 1- and 2-star Trustpilot reviews for a company?**
Set Companies to the domain and Stars to `[1, 2]`. Raise Max reviews per company if you need more than the default 20.

**Can I search for a company by name instead of domain?**
No. Pass `companies[]` with the domain (`notion.so`) or the full Trustpilot review URL.

**Does monitor mode re-download old reviews?**
No. After the first run it stops at the first already-seen review (newest-first pages) and only writes newer ones. You are charged only for reviews pushed that run.

**Is scraping Trustpilot legal?**
This actor reads public review pages only. You are responsible for how you use the data (GDPR/CCPA, Trustpilot's terms, and any downstream messaging). We do not log in, bypass paywalls, or invent reviews.

**Why did my run get HTTP 403?**
Trustpilot sits behind AWS WAF. This actor uses Playwright plus Apify **RESIDENTIAL** proxy on the platform so the WAF JS challenge can complete. Local runs without `APIFY_TOKEN` will still fail. Re-run on Apify.

**How does billing work if I hit my spending cap?**
The actor charges `review` after each batch of reviews is written. If your max-total-charge limit is reached it logs `Charge limit reached, stopping gracefully`, saves the monitor cursor, and stops without throwing.

### Support

Maintained by [Shrithan](https://apify.com/shrid5). Open an issue on this Actor or email shrithanofficial@gmail.com.

# Actor input Schema

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

Domains (notion.so) or full Trustpilot review URLs. At least one company is required.

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

Only include reviews with these star ratings (integers 1–5).

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

ISO language codes (for example en).

## `publishedAfter` (type: `string`):

Stop paginating once a page's oldest review is older than this ISO date (reviews are newest-first).

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

Maximum number of reviews to emit per company. Keep this small on trial runs (Store default input must finish in 5 minutes).

## `monitorMode` (type: `boolean`):

When true, stop at the first already-seen review per company (cursor store: trustpilot-reviews-state).

## Actor input object example

```json
{
  "companies": [
    "notion.so"
  ],
  "maxReviewsPerCompany": 10,
  "monitorMode": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset of Trustpilot review rows with company profile fields.

# 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": [
        "notion.so"
    ],
    "maxReviewsPerCompany": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("shrid5/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": ["notion.so"],
    "maxReviewsPerCompany": 10,
}

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

```

## MCP server setup

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