# Trustpilot Reviews & TrustScore Scraper (`heyitsgautham/trustpilot-reviews-scraper`) Actor

Give it domains such as monzo.com or Trustpilot URLs, in bulk. Get each review's rating, text, date and company reply, plus a free TrustScore summary. Filter by stars, language, date, keyword, topic or reviewer country. Reads past the 200-review limit without logging in. $0.25 per 1,000 reviews.

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

## Pricing

from $0.18 / 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 & TrustScore Scraper

Get Trustpilot reviews and each company's TrustScore as clean rows, for competitor analysis, customer research and reputation monitoring.

Use cases, each with a ready-to-run example:

- [Pull a company's 1-star reviews](https://apify.com/heyitsgautham/trustpilot-reviews-scraper/examples/one-star-trustpilot-reviews-bank)
- [Compare the TrustScores of competitors](https://apify.com/heyitsgautham/trustpilot-reviews-scraper/examples/compare-trustscores-competitors)
- [Get reviews together with the company's replies](https://apify.com/heyitsgautham/trustpilot-reviews-scraper/examples/trustpilot-reviews-with-company-replies)
- [Find reviews that mention a word such as refund](https://apify.com/heyitsgautham/trustpilot-reviews-scraper/examples/trustpilot-reviews-mentioning-refund)
- [Monitor the reviews from the last 30 days](https://apify.com/heyitsgautham/trustpilot-reviews-scraper/examples/recent-trustpilot-reviews-airline)
- [Compare the reviews of competing online shops](https://apify.com/heyitsgautham/trustpilot-reviews-scraper/examples/trustpilot-ecommerce-competitor-reviews)

It works for any business on any Trustpilot country site.
Paste review page URLs or plain domains, set filters, and get one row per review plus one summary row per business.

You pay **$0.25 per 1,000 reviews** ($0.00025 each), and less on Apify Store discount tiers (Bronze, Silver, Gold), down to $0.175 per 1,000 on Gold.
Company summary rows are **free**, and businesses that fail or have no Trustpilot page are **never charged**.

### At a glance

| Topic | Details |
|---|---|
| Input | Many businesses per run, as Trustpilot review URLs from any country site or plain domains such as `monzo.com`. Filters: any mix of star ratings, language, date period (last 30 days up to last 12 months), verified only, replied only, keyword search, Trustpilot topics and reviewer countries. Newest first by default |
| Output | One JSON row per review: rating, title, text, language, dates, verified flag and the company's reply. Plus one free company row per business with TrustScore and star distribution |
| Price | $0.00025 per review ($0.25 per 1,000), or $0.225 per 1,000 on Bronze, $0.20 on Silver and $0.175 on Gold. No start fee. Company rows, unknown domains and failed fetches are free |
| Depth | Past Trustpilot's 200-review page limit without logging in. Above 200 reviews per business the scraper reads narrower filters, and on small and mid-size companies it returns most of the history, back to 2007 on Amazon. See "Past the 200-review limit" for what to expect by company size |
| Tested | 56 real businesses with up to 100,000 reviews each: all 56 returned reviews, 95,165 in total, in one 58-minute run. 112 businesses at 100 reviews each: 110 returned reviews, the other 2 have no Trustpilot page, in 58 seconds |

### What you get

**One company summary per business** (free):

| Field | What it holds |
|---|---|
| `domain`, `name`, `url` | Trustpilot's domain key, display name and review page |
| `trustScore`, `stars` | TrustScore (for example 4.3) and the rounded star rating |
| `totalReviews`, `reviewsLast12Months` | Review counts Trustpilot shows on the page |
| `starDistribution` | Reviews per star rating, `{"1": 547, "2": 52, ...}` |
| `categories`, `primaryCategory` | Trustpilot categories |
| `isClaimed`, `claimedDate` | Whether the business claimed its profile, and when |
| `country`, `websiteUrl`, `isClosed` | Business country, website, closed flag |
| `replyPercentage`, `averageDaysToReply` | How the business answers negative reviews |
| `reviewLanguages` | Review count per language |
| `matchingReviews`, `reviewsReturned`, `moreBehindLogin` | How many reviews match your filters, how many you got, and whether Trustpilot hid the rest behind its login |

**One row per review** (charged):

| Field | What it holds |
|---|---|
| `businessDomain`, `businessName` | Which business the review is about |
| `reviewId`, `reviewUrl` | Trustpilot review ID and link |
| `rating`, `title`, `text`, `language` | The review itself |
| `reviewDate`, `experienceDate`, `updatedDate` | When it was published, the date of the experience, and the last edit |
| `isVerified`, `source`, `likes` | Verified label, review source (for example `Organic`) and useful votes |
| `replyText`, `replyDate` | The company's reply, when there is one |
| `reviewerCountry`, `reviewerReviewCount` | Reviewer's country and how many reviews they have written |

The scraper does not collect reviewer names, emails, phone numbers or business contact details.

### Input

```json
{
  "businesses": [
    "https://www.trustpilot.com/review/www.booking.com",
    "https://de.trustpilot.com/review/www.zalando.de",
    "monzo.com"
  ],
  "maxReviewsPerBusiness": 500,
  "stars": ["1", "2"],
  "language": "all",
  "datePeriod": "last12months",
  "verifiedOnly": false,
  "withRepliesOnly": false,
  "keyword": "refund",
  "topics": ["customer_service"],
  "reviewerCountries": ["US", "GB"],
  "sort": "recency"
}
```

| Input | What it does |
|---|---|
| `businesses` | Trustpilot review URLs from any country site, website URLs or plain domains. `booking.com` finds `www.booking.com` on its own |
| `maxReviewsPerBusiness` | Stop after this many reviews per business |
| `stars` | Only these star ratings. Empty means all |
| `language` | `all` (default) or a code such as `en`, `de`, `fr`. Trustpilot's own site shows only English unless you change it |
| `datePeriod` | `any`, `last30days`, `last3months`, `last6months` or `last12months` |
| `verifiedOnly` | Only reviews with Trustpilot's verified label |
| `withRepliesOnly` | Only reviews the company answered |
| `keyword` | Only reviews containing this word, through Trustpilot's own search. See below |
| `topics` | Only reviews Trustpilot tagged with these topics. See below |
| `reviewerCountries` | Only reviews from reviewers in these countries, as two-letter codes. See below |
| `sort` | `recency` (newest first) or `relevance` |
| `splitToGetMore` | Go past the 200-review page limit, see below. On by default |
| `onlyNewSinceLastRun` | Off by default. See Monitoring below |
| `publishedAfter` | Empty by default. See Monitoring below |

### Monitoring: only new reviews and a date cutoff

Two optional inputs turn a scheduled run into a feed of new reviews.
Both are off by default, and a run without them works exactly as before.

| Option | What it does |
|---|---|
| `onlyNewSinceLastRun` | Returns only reviews this scraper has not returned to you before for the same business and filters, and nothing older than the newest one it returned last time. The first run returns the usual results and remembers them |
| `publishedAfter` | Only reviews published on or after a date: `2026-10-01`, `2026-10-01T12:00:00Z` (UTC), or a relative value such as `7 days` |

With `sort: "recency"` the run stops at the first page that holds nothing new, so a daily run reads only the pages it needs.
With other orders it still skips old reviews, but it reads further to find new ones.
You pay only for the reviews returned.
`publishedAfter` takes an exact date, where `datePeriod` only offers Trustpilot's fixed periods.
The memory is a key-value store named `trustpilot-reviews-scraper-monitor` in your own Apify account, one record per business and filter set.
Delete that store to start over.
The free company row still comes back on every run, and its `reviewsReturned` counts only the new reviews.

### Run it on a schedule

A daily run with `onlyNewSinceLastRun: true` turns the scraper into a review alert for the businesses you follow.
The default `sort: "recency"` lets each run stop at the first page with nothing new.
We ran the same 112 businesses on 15 Oct and again on 20 Oct.
The 20 Oct run returned 3,564 reviews, and a script found none that the 15 Oct run had returned and none older than its newest review per business.

1. Set your input with `onlyNewSinceLastRun: true` and click **Save as a new task**.
2. On the task page, click **Actions**, then **Schedule**, and pick how often it runs.
   [Apify's schedules guide](https://docs.apify.com/actors/running/schedules) covers cron times and time zones.
3. On the task's **Integrations** tab, choose where each run's results go.

| Integration | What it does |
|---|---|
| [Slack](https://docs.apify.com/integrations/slack) | Posts a message to your channel when a run finishes |
| [Google Drive](https://docs.apify.com/integrations/drive) | Saves each run's results as a file in your Drive |
| [Webhook](https://docs.apify.com/integrations/webhooks) | Sends the finished run, with its dataset ID, to your own URL |
| [Make](https://docs.apify.com/integrations/make), [Zapier](https://docs.apify.com/integrations/zapier), [n8n](https://docs.apify.com/integrations/n8n) | Adds each new row to a Google Sheet, a CRM or a database |

Each review has a stable `reviewId`, so a sheet or database can skip rows it already holds.

### Keyword, topics and reviewer countries

| Filter | How it works |
|---|---|
| `keyword` | Trustpilot's own search. Whole words, not case-sensitive, and accents count (`rücksendung` is not `rucksendung`). Several words match any of them, and a phrase in double quotes matches exactly. Trustpilot marks matches with `<em>` tags, which the scraper removes, so `title` and `text` read as written |
| `topics` | Trustpilot's topic tags. Several topics match reviews that have all of them. IDs Trustpilot accepts: `customer_service`, `delivery_service`, `product`, `order`, `refund`, `value_for_money`, `staff`, `price`, `quality`, `app`, `website`, `contact`, `payment`, `booking_process`, `location`, `delivery`. Trustpilot silently ignores an ID it does not know, so the scraper checks, and a business where an ID was ignored returns a free `invalid_input` row naming it instead of unfiltered reviews |
| `reviewerCountries` | Trustpilot has no country filter, so the scraper reads reviews and keeps the ones from the countries you list, such as `["US", "GB"]`. You pay only for the reviews kept. A business stops after 50 pages plus 10 pages for every 20 matching reviews, so a country with few reviewers ends quickly |

In our tests, `"keyword": "refund"` on Amazon and Booking.com returned 80 reviews that all contain the word.
`"topics": ["refund", "payment"]` matched 4,203 Booking.com reviews.
`"reviewerCountries": ["DE", "US"]` on four companies returned 307 reviews, every one from Germany or the US.

### Past the 200-review limit

Trustpilot shows visitors who are not logged in 10 pages of 20 reviews for each filter combination.
Page 11 sends you to the login page.
This scraper never logs in, and needs no account or cookie of yours.

Each narrower filter combination gets its own 200, so the scraper reads a business in stages.

1. The plain list, then each star rating in each language. This runs whenever `splitToGetMore` is on, as before.
2. When `maxReviewsPerBusiness` is above 200, it goes deeper inside each star and language: verified reviews, replied reviews, each of Trustpilot's 16 topics, then searches for words taken from the reviews it has already read.

A slice stops when it finds under 1 new review per request.
With `maxReviewsPerBusiness` at 200 or less, nothing changes from before.
Only-new monitoring runs stay on the fast newest-first path and never start stage 2.

How much of the history comes back depends on the company's size and on how many businesses share the run.
Trustpilot answers Apify's servers at about 4 to 5 requests per second, so a run's timeout sets the budget.
These are measured, as a share of the reviews Trustpilot lists for the company (`matchingReviews`):

| Company, three in one run with the default 1-hour timeout | Listed reviews | Returned | Share | Oldest returned |
|---|---|---|---|---|
| Allbirds (10 languages) | 2,646 | 2,597 | 98.1% | 2018-09-19 |
| Chewy (English only, three quarters 5 stars) | 13,208 | 11,644 | 88.2% | 2011-09-14 |
| Amazon (39 languages) | 46,850 | 36,668 | 78.3% | 2007-08-09 |

Amazon stopped at the cap of 6,000 page reads per business for the deeper stages, and Chewy where new reviews ran out at under 1 per request.
The run took 51 minutes.

| Company size, 56 businesses in one run with the default 1-hour timeout | Businesses | Share returned, median (range) |
|---|---|---|
| Up to 200 reviews | 10 | 100% (100 to 100%) |
| 200 to 1,000 | 12 | 99.6% (78 to 100%) |
| 1,000 to 5,000 | 11 | 58% (20 to 99%) |
| 5,000 to 20,000 | 14 | 20% (5 to 54%) |
| Over 20,000 | 9 | 11% (2 to 24%) |

A business whose first page keeps failing against Trustpilot's rate limit gets one more try after the others, and only then becomes a free `error` row.
A few small companies returned slightly more than their listed count, because new reviews arrived after Trustpilot counted. They show as 100%.

So for full history of a big company, run it alone or with a few others, and raise the run timeout if you need more.
On big companies expect part of the history, not all of it.
The company row says how far it got.
Compare `reviewsReturned` with `matchingReviews`, and `moreBehindLogin: true` means Trustpilot held more back.
A `message` appears when the run's time, the business's share of it or the page cap ran out.

Two limits keep a run healthy.
Every business gets its plain pages and star and language slices first, and only then do the deeper stages share the time that is left, equally, so one huge company cannot keep the others from starting.
The run also watches its own timeout and stops reading shortly before it, so it ends as succeeded with the reviews it fetched saved, never as timed out.
The status message then says "Time cap reached".

Reviews come grouped by filter rather than in one date order.
Sort by `reviewDate` afterwards if you need a timeline.

### Output example

This is real output from a test run.

A review row:

```json
{
  "type": "review",
  "status": "ok",
  "businessDomain": "wise.com",
  "businessName": "Wise",
  "reviewId": "6ac90d55aa6da2e8b4600dbe",
  "rating": 5,
  "title": "Easy banking with the App",
  "text": "Easy banking with the App and on my PC/Laptop. No matter where you are, always very fast transaction times. I am very satisfied with Wise until now.",
  "language": "en",
  "reviewDate": "2026-10-09T17:50:45.000Z",
  "experienceDate": "2026-10-01",
  "updatedDate": null,
  "isVerified": true,
  "source": "BusinessGeneratedLink",
  "likes": 0,
  "replyText": "Hey there! \n\nKeeping your transfers quick and smooth across all your devices is what we're here for! Thanks for choosing us to handle your international payments.\n\nWise",
  "replyDate": "2026-10-09T20:26:52.000Z",
  "reviewerCountry": "BE",
  "reviewerReviewCount": 6,
  "reviewUrl": "https://www.trustpilot.com/reviews/6ac90d55aa6da2e8b4600dbe"
}
```

A review row from `"keyword": "refund"`, with Trustpilot's `<em>` marks already removed:

```json
{
  "type": "review",
  "status": "ok",
  "businessDomain": "www.amazon.com",
  "businessName": "Amazon",
  "reviewId": "6ad11c24ce0460b5c09749f4",
  "rating": 1,
  "title": "Amazon is getting worse and worse",
  "text": "Amazon is getting worse and worse.  I can't get my refund I'm due,  their deliveries are never here the day they're supposed to be, and their customer service is  a joke.  This is what I pay $145.00 a year for?????\nAmazon needs investigating.",
  "language": "en",
  "reviewDate": "2026-10-15T20:32:04.000Z",
  "experienceDate": "2026-10-13",
  "updatedDate": null,
  "isVerified": false,
  "source": "Organic",
  "likes": 1,
  "replyText": null,
  "replyDate": null,
  "reviewerCountry": "US",
  "reviewerReviewCount": 9,
  "reviewUrl": "https://www.trustpilot.com/reviews/6ad11c24ce0460b5c09749f4"
}
```

The company summary row for `monzo.com` (`reviewLanguages` shortened here, the real row lists all 39 languages):

```json
{
  "input": "monzo.com",
  "type": "company",
  "status": "ok",
  "domain": "www.monzo.com",
  "name": "Monzo",
  "trustScore": 4.6,
  "stars": 4.5,
  "totalReviews": 73247,
  "reviewsLast12Months": 14037,
  "starDistribution": {
    "1": 7379,
    "2": 843,
    "3": 1057,
    "4": 4305,
    "5": 59663
  },
  "categories": [
    "Bank"
  ],
  "primaryCategory": "Bank",
  "isClaimed": true,
  "claimedDate": "2016-09-16T09:28:12.000Z",
  "isClosed": false,
  "country": "GB",
  "websiteUrl": "https://www.monzo.com",
  "replyPercentage": 49.948927477017364,
  "averageDaysToReply": 3.06,
  "reviewLanguages": {
    "en": 71954,
    "pl": 55,
    "es": 38,
    "ro": 19
  },
  "businessUnitId": "57da77be0000ff000594bcdb",
  "url": "https://www.trustpilot.com/review/www.monzo.com",
  "matchingReviews": 72160,
  "reviewsReturned": 100,
  "moreBehindLogin": false
}
```

The company row for `www.allegro.pl` from a 56-business deep run, where it got 2,447 of its 2,488 listed reviews (`reviewLanguages` shortened here, the real row lists 17 languages):

```json
{
  "input": "www.allegro.pl",
  "type": "company",
  "status": "ok",
  "domain": "www.allegro.pl",
  "name": "Allegro",
  "trustScore": 1.4,
  "stars": 1.5,
  "totalReviews": 2924,
  "reviewsLast12Months": 403,
  "starDistribution": {
    "1": 2546,
    "2": 112,
    "3": 50,
    "4": 45,
    "5": 171
  },
  "categories": [
    "Home & Garden"
  ],
  "primaryCategory": null,
  "isClaimed": true,
  "claimedDate": "2019-12-10T09:06:54.000Z",
  "isClosed": false,
  "country": "PL",
  "websiteUrl": "https://www.allegro.pl",
  "replyPercentage": 94.18282548476455,
  "averageDaysToReply": 0.3,
  "reviewLanguages": {
    "pl": 2213,
    "en": 205,
    "de": 20,
    "it": 12
  },
  "businessUnitId": "46d40693000064000500b7ad",
  "url": "https://www.trustpilot.com/review/www.allegro.pl",
  "matchingReviews": 2488,
  "reviewsReturned": 2447,
  "moreBehindLogin": true,
  "message": "Stopped when its share of the run's time ran out, so the other businesses get their turn. Run fewer businesses at once, or raise the run timeout, to get more"
}
```

### Pricing

Prices are per 1,000 reviews.

| Event | No discount | Bronze | Silver | Gold |
|---|---|---|---|---|
| Review returned | $0.25 | $0.225 | $0.20 | $0.175 |
| Company summary row | Free | Free | Free | Free |
| Business not found, invalid input or failed fetch | Free | Free | Free | Free |

Bronze, Silver and Gold are Apify Store discount tiers, and Apify's Pricing tab shows them as Starter, Scale and Business.
Apify decides which tier an account is on.

Set a maximum cost per run in the run options.
The scraper stops once that limit is reached.

### Use it from AI agents and code

The scraper works as a tool through the [Apify MCP server](https://mcp.apify.com) in Claude, Cursor, VS Code and other MCP clients.
You can also call it through the [Apify API](https://docs.apify.com/api/v2) or the Python and JavaScript clients, schedule it, or connect it to Make, Zapier and n8n.

### More from heyitsgautham

Other actors from the same account.

- [Hotel Reviews Scraper (Booking.com + Agoda)](https://apify.com/heyitsgautham/hotel-reviews-scraper) for guest reviews from Booking.com and Agoda, by hotel URL or hotel name.
- [Tripadvisor Reviews Scraper: Hotels, Restaurants, Tours](https://apify.com/heyitsgautham/tripadvisor-reviews-scraper) for Tripadvisor reviews of hotels, restaurants, attractions and tours, with sub-ratings and owner responses.
- [Capterra Reviews Scraper](https://apify.com/heyitsgautham/software-reviews-scraper) for Capterra software reviews, by product URL or product name.
- [YouTube Video & Shorts Comments Scraper with Replies](https://apify.com/heyitsgautham/youtube-comments-scraper) for the comments and replies on a video or Short, for sentiment analysis and audience research.
- [Google Trends Scraper: Related Queries & Trending Searches](https://apify.com/heyitsgautham/google-trends-scraper) for Google Trends interest over time, related queries and Trending Now.

### FAQ

**Do I need a proxy?**
No.
Trustpilot runs a browser check on every visitor.
The scraper passes it once with a real headless browser, then reads the review data directly, which keeps runs fast and cheap.
The proxy setting is there only in case Trustpilot starts blocking Apify's servers.

**Why do I get fewer reviews than `totalReviews`?**
Three reasons, in order of how often they happen.
Your filters exclude some reviews, and `matchingReviews` shows how many match.
Trustpilot hides reviews past the 200-per-filter limit, and `moreBehindLogin` shows when. Set `maxReviewsPerBusiness` above 200 to read deeper, as described above.
Trustpilot also counts some reviews it no longer shows.

**What happens with a domain that has no Trustpilot page?**
You get a free company row with `"status": "not_found"`.
The scraper tries the domain with and without `www.` before giving up.

**How fast is it?**
At 200 reviews or fewer per business, fast: 112 businesses with 100 reviews each (8,207 reviews) finished in 58 seconds.
Deep runs take longer, because Trustpilot answers Apify's servers at about 4 to 5 requests per second.
56 businesses with up to 100,000 reviews each used the whole hour and returned 95,165 reviews.

**Will the run time out?**
No.
The scraper reads the run's own timeout and stops reading shortly before it, keeping everything it fetched.
A business it had no time to start gets a free `error` row that says so.
The default timeout is 1 hour. Raise it in the run options to get more of a big company's history.

### Limitations

- Logged-out page limit of 200 reviews per filter combination. The deeper stages get past it for most small and mid-size companies, but on companies with tens of thousands of reviews a run returns part of the history, as the tables above show.
- Trustpilot rate-limits heavy reading from Apify's servers. The scraper slows down when that happens, and a page that still fails after 10 tries is skipped and counted in the company row's `message`.
- Trustpilot's `last7days` filter is not offered, because Trustpilot ignores it.
- Review text is what Trustpilot shows publicly. Reviews Trustpilot removed or hid are not available.
- Only use the data in ways that respect Trustpilot's terms and the privacy of reviewers.

# Actor input Schema

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

Trustpilot review page URLs (any country site, such as de.trustpilot.com) or plain website domains such as booking.com.

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

Stop after this many reviews for each business. Every successful business also gets one free company summary row. Above 200, the scraper reads deeper filter combinations to get past Trustpilot's logged-out page limit, which takes longer. See the README for the coverage to expect by company size.

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

Only reviews with these star ratings. Leave empty for all ratings.

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

all, or a two-letter language code such as en, de, fr, es or it. Trustpilot's own site shows only English by default; this scraper defaults to all languages.

## `datePeriod` (type: `string`):

Only reviews published in this period.

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

Only reviews Trustpilot marks as verified.

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

Only reviews the business replied to.

## `keyword` (type: `string`):

Only reviews that contain this word in the title or text, using Trustpilot's own search. Whole words, not case-sensitive, accents count (rücksendung is not rucksendung). Several words match any of them. Put a phrase in double quotes to match it exactly.

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

Only reviews Trustpilot tagged with these topics. Several topics match reviews that have all of them. IDs Trustpilot accepts: customer_service, delivery_service, product, order, refund, value_for_money, staff, price, quality, app, website, contact, payment, booking_process, location, delivery. If Trustpilot ignores an ID, that business returns a free row saying so and no reviews.

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

Only reviews written by reviewers from these countries, as two-letter codes such as US, GB or DE. Trustpilot has no country filter, so the scraper reads reviews and keeps the matching ones. You pay only for those. A business stops after 50 pages plus 10 pages for every 20 matching reviews, so a rare country does not run for long.

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

Order Trustpilot returns reviews in.

## `splitToGetMore` (type: `boolean`):

Trustpilot shows logged-out visitors only 10 pages (200 reviews) per filter. When on, the scraper also reads each star rating and language separately, and when Max reviews per business is above 200 it goes on to verified, replied, topic and keyword filters inside each of those, to collect more. Results then come grouped by filter instead of one date order.

## `onlyNewSinceLastRun` (type: `boolean`):

For scheduled runs. Returns only reviews this actor has not returned to you before for the same business and filters, and nothing older than the newest one it returned last time. The first run returns the usual results and remembers them. Works best with newest-first order, where the run stops at the first page with nothing new. The memory is a key-value store named trustpilot-reviews-scraper-monitor in your Apify account.

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

Only reviews published on or after this date. Use a date such as 2026-10-01, an ISO time such as 2026-10-01T12:00:00Z (UTC), or a relative value such as 7 days, meaning the last 7 days. With newest-first order the run stops as soon as it reaches older ones.

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

How many pages to fetch in parallel.

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

Not needed. Trustpilot pages load fine from Apify's own servers. Turn on only if you see blocks.

## Actor input object example

```json
{
  "businesses": [
    "https://www.trustpilot.com/review/www.booking.com",
    "monzo.com"
  ],
  "maxReviewsPerBusiness": 20,
  "stars": [],
  "language": "all",
  "datePeriod": "any",
  "verifiedOnly": false,
  "withRepliesOnly": false,
  "topics": [],
  "reviewerCountries": [],
  "sort": "recency",
  "splitToGetMore": true,
  "onlyNewSinceLastRun": false,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per review (type review, charged) and one free company summary row per business (type company) with TrustScore, total reviews, star distribution and categories.

# 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": [
        "https://www.trustpilot.com/review/www.booking.com",
        "monzo.com"
    ],
    "maxReviewsPerBusiness": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("heyitsgautham/trustpilot-reviews-scraper").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": [
        "https://www.trustpilot.com/review/www.booking.com",
        "monzo.com",
    ],
    "maxReviewsPerBusiness": 20,
}

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

```

## MCP server setup

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

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/j26bc1XCePBuMAdlB/builds/LHcFR7NkFjb7XTpb0/openapi.json
