# Trustpilot Scraper — Reviews, TrustScore & Companies (`tortuga/trustpilot-scraper`) Actor

Scrape Trustpilot reviews past the 200-review page limit, company profiles with TrustScore, star distribution and contact details, and category or search listings.

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

## Pricing

from $0.45 / 1,000 reviews

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Scraper

Scrape Trustpilot reviews, company profiles and category or search listings. For every review you get the star rating, title, full text, date of experience, published date, reviewer name and country as shown on the page, the verified label, and the company's reply. Company profiles carry the TrustScore, review count, star distribution, categories, website, the contact details the page shows, and the reply rate. Works for any company page, category page or search URL.

Trustpilot shows a visitor only the first 200 reviews of any list. This Actor reads past that limit: it splits a company's reviews by star rating and review language with Trustpilot's own filters and merges the slices without duplicates, so large companies can be collected far deeper than one list allows. It uses plain HTTP requests through Apify's Unblocker proxy: no headless browser, no login, no cookies. Every response is checked before it counts, and a request is only made when its results still fit your limits. You pay per item, with no start fee.

### What data does Trustpilot Scraper extract?

**Review items** (`mode: reviews`, default):

| Field | Description |
|---|---|
| `reviewId`, `reviewUrl` | Trustpilot review id and permalink (`https://www.trustpilot.com/reviews/…`) |
| `companyName`, `companyDomain`, `companyUrl` | Company the review belongs to ("Monzo", `www.monzo.com`, its Trustpilot page) |
| `rating` | 1-5 stars |
| `title`, `text` | Review headline and full review text |
| `language` | Language code of the review (`en`, `de`, …) |
| `experienceDate` | Date of experience the reviewer entered (`2026-09-28`) |
| `publishedDate`, `updatedDate` | When the review was published or last edited (ISO timestamps) |
| `isVerified` | Trustpilot's "Verified" label (the review came from a genuine customer invitation or was otherwise verified) |
| `verificationLevel`, `verificationSource`, `reviewSource` | Details behind the label: `verified` / `invited` / `not-verified`, `invitation`, and how the review was collected (`Organic`, `BusinessGeneratedLink`, `InvitationApi`, …) |
| `likes` | "Useful" votes |
| `reviewerName` | Reviewer's display name as Trustpilot shows it |
| `reviewerCountry` | Country code shown next to the name (`GB`, `US`, …) |
| `reviewerReviewCount` | How many reviews the reviewer has written on Trustpilot |
| `reviewerId`, `reviewerProfileUrl` | Public Trustpilot profile link (`https://www.trustpilot.com/users/…`) |
| `companyReply`, `companyReplyDate` | The company's public reply and when it was posted (`null` when there is none) |
| `locationName` | Branch / location the review is about, for companies with locations |

Reviewer avatars are not collected.

**Company profiles** (`mode: companies`, or `includeCompanyProfile` in reviews mode): `companyId`, `name`, `domain`, `url`, `website`, `trustScore`, `stars`, `reviewCount`, `reviewCountLast12Months`, `ratingDistribution` (`{"1": …, "5": …}`), `reviewLanguages` (review count per language), `categories`, `categoryIds`, `primaryCategory`, `categoryPath`, `description`, `email`, `phone`, `address`, `city`, `zipCode`, `country`, `countryCode`, `logoUrl`, `isClaimed`, `isClosed`, `isCollectingReviews`, `verifiedCompany`, `replyPercentage` and `averageDaysToReply` (Trustpilot's figures for negative reviews), `negativeReviewCount`, `consumerAlert`, `aiSummary` (Trustpilot's own review summary), `similarCompanies`.

**Listing cards** (`mode: listing`): `position`, `companyId`, `name`, `domain`, `url`, `trustScore`, `stars`, `reviewCount`, `website`, `email`, `phone`, `address`, `city`, `zipCode`, `country`, `categories`, `primaryCategory`, `logoUrl`, `isRecommended`, plus `source` (`category` or `search`), `categoryId` / `categoryName` / `listingCountry` or `searchQuery`.

Contact fields are filled only when the company published them on Trustpilot; many leave them empty.

### How to scrape Trustpilot reviews

1. Paste one or more URLs into **Start URLs**: a company page (`https://www.trustpilot.com/review/www.amazon.com`), a category page (`https://www.trustpilot.com/categories/bank`) or a search page (`https://www.trustpilot.com/search?query=pizza`). Or type domains such as `monzo.com` into **Company domains**, or names into **Search queries**.
2. Pick **What to scrape**: reviews (default), company profiles, or the category / search listing.
3. Set **Max items** and, for more than one company, **Max reviews per company**.
4. Optionally filter: **Only these star ratings**, **Review language**, **Date posted**, **Verified reviews only**, **Reviews with a company reply only**, **Reviews mentioning**, and **Sort reviews**. Filters you set in a company URL in the browser are kept.
5. Click **Start**. Results appear in the **Dataset** tab; export as JSON, CSV or Excel, or read them through the API.

### Input example

```json
{
  "startUrls": [
    { "url": "https://www.trustpilot.com/review/www.amazon.com" },
    { "url": "https://www.trustpilot.com/categories/bank?country=GB" }
  ],
  "companyDomains": ["monzo.com"],
  "mode": "reviews",
  "maxItems": 2000,
  "maxReviewsPerCompany": 500,
  "includeCompanyProfile": true,
  "stars": ["1", "2"],
  "language": "all",
  "datePosted": "last12months"
}
```

### Output example

```json
{
  "type": "review",
  "reviewId": "6ac43194e14adc14cb379442",
  "reviewUrl": "https://www.trustpilot.com/reviews/6ac43194e14adc14cb379442",
  "companyName": "Monzo",
  "companyDomain": "www.monzo.com",
  "companyUrl": "https://www.trustpilot.com/review/www.monzo.com",
  "rating": 1,
  "title": "My account is going to be closed on 7th…",
  "text": "My account is going to be closed on 7th October 2026. I have tried talking with Monzo but no help was given and no one listed to me of wanted to get my explanation. ",
  "language": "en",
  "experienceDate": "2026-10-06",
  "publishedDate": "2026-10-06T01:24:04.000Z",
  "updatedDate": null,
  "isVerified": true,
  "verificationLevel": "invited",
  "verificationSource": "invitation",
  "reviewSource": "BusinessGeneratedLink",
  "likes": 0,
  "reviewerName": "AnnahK",
  "reviewerCountry": "GB",
  "reviewerReviewCount": 2,
  "reviewerId": "6a1848d3dd910c874e76d5de",
  "reviewerProfileUrl": "https://www.trustpilot.com/users/6a1848d3dd910c874e76d5de",
  "companyReply": null,
  "companyReplyDate": null,
  "locationName": null
}
```

A company profile (`"type": "company"`) for the same company starts like this: `"name": "Monzo"`, `"trustScore": 4.6`, `"reviewCount": 73116`, `"ratingDistribution": {"1": 7366, "2": 841, "3": 1056, "4": 4295, "5": 59558}`, `"address": "38 Finsbury Square"`, `"city": "London"`, `"replyPercentage": 50.3`.

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

Trustpilot serves visitors without an account 10 pages of 20 reviews for any list; page 11 sends you to the login page. Up to 200 reviews per company you get exactly that list, newest first (or most relevant first), 20 reviews per request.

When **Max reviews per company** is higher, the Actor reads the slices Trustpilot's own filters offer: each star rating, then each review language. Every slice is a list of its own with its own 200 reviews, and every slice contributes in proportion to its size, so the result keeps the company's real mix of ratings and languages. A slice that is still larger than 200 (for example English 1-star reviews of a big retailer) is also read in relevance order and as verified-only, replied-only and date-window lists, and the new reviews are merged. Companies with up to a few thousand reviews can be collected completely or in large part; for the very largest (tens of thousands) the Actor goes as deep as those filters reach, which is several thousand reviews, and the run's `SUMMARY` reports per company how many reviews Trustpilot lists and how many were saved. Duplicates are never saved or charged.

### Can I get only negative reviews, or only new ones?

Yes. **Only these star ratings** with `1` and `2` returns complaints only; Trustpilot applies the filter, so you do not pay for reviews you do not want. **Reviews with a company reply only** gives you the conversations, **Verified reviews only** the labelled ones, and **Reviews mentioning** searches the review text for a word such as "refund".

For monitoring, turn on **Only new or changed items** (see below): each scheduled run then outputs only reviews that earlier runs did not, with no deduplication on your side.

### Monitor changes on a schedule

Turn on **Only new or changed items** and save the input as a task with a Schedule (Apify Console: **Saved tasks** -> **Schedule**, for example daily). Each run remembers what earlier runs of the same input returned and outputs only what is new: in reviews mode the reviews posted since the last run (read newest first; paging stops as soon as a page reaches reviews from an earlier run, so a daily check of one company usually costs a single Unblocker request), in companies and listing mode the companies that are new or whose TrustScore, stars or closed/alert status changed. Unchanged items are skipped before they are saved, so they are not charged, and the company profile is output on the first run only. **Date posted** (`Last 30 days`) is the date filter to combine it with: it bounds how far back the first run reads. Monitored items carry `changeType` (`new` or `changed`) and, for changed companies, `previousValues` with the old values (e.g. `{"trustScore": 4.3}`); use **Monitoring key** to keep several schedules on the same input apart.

### Proxy note

Trustpilot answers datacenter and residential IPs with a "Verifying Connection" page, so this Actor uses **Apify's Unblocker proxy** by default. Unblocker is billed to your Apify account per successful request: 10 Unblocker units, about $0.0015 on the free plan and less on paid plans. Failed requests are free. One request returns 20 reviews (one company profile comes with the first one for free) or 10-20 listing cards, so the proxy adds about **$0.08 per 1,000 reviews** for the first 200 of a company and roughly $0.10-0.15 per 1,000 beyond that (deep slices overlap). The run's `SUMMARY` record reports the number of successful requests. Responses through Unblocker take 5-30 seconds each; the Actor keeps five requests in flight.

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

Pay per item: **$0.00045 per review**, $0.0015 per company profile, $0.0008 per listing card. No start fee, no subscription. On top of that you pay the Unblocker proxy (see above) and normal Apify platform usage. 1,000 reviews cost about $0.55 all-in on the free plan.

### Does it need a Trustpilot account or a browser?

No. Everything comes from pages Trustpilot serves to logged-out visitors: the Actor reads the data the page embeds for its own rendering, through plain HTTP requests. No login, no cookies, no headless browser; 512 MB of memory is enough.

### Integrations and API

Use the run in Zapier, Make, n8n, Google Sheets, or call it from Python/Node with the Apify client (see the **API** tab). Schedule it to monitor new reviews of your company or competitors, or feed the review texts into an LLM for theme analysis.

### Is it legal to scrape Trustpilot?

This Actor collects only data Trustpilot shows publicly to logged-out visitors: review texts and ratings, the reviewer's display name, country and public profile link as shown on the page, company replies, and business information the companies published. It does not collect avatars or anything behind a login. Reviewer names and profile links are personal data under GDPR and similar laws: make sure you have a lawful basis for processing them, and do not use them to contact or profile individuals. You are responsible for how you use the data and for complying with Trustpilot's terms and applicable law.

### Support

Found a bug or need a field added? Open an issue in the **Issues** tab.

# Actor input Schema

## `startUrls` (type: `array`):

Trustpilot company pages (https://www.trustpilot.com/review/www.amazon.com), category pages (https://www.trustpilot.com/categories/electronics_technology) or search pages (https://www.trustpilot.com/search?query=pizza). Filters in a company URL copied from the browser (stars, languages, date, sort, verified, replies, search) are kept and override the filter fields below. Category and search pages are paginated automatically; in Reviews or Company profiles mode every company on them is processed.

## `companyDomains` (type: `array`):

Shortcut for company pages: the domain Trustpilot uses for the company, e.g. "www.amazon.com" or "monzo.com" (redirects are followed).

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

Company names or keywords to look up with Trustpilot's company search (same as https://www.trustpilot.com/search?query=...).

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

reviews: one item per review (default). companies: one profile per company (TrustScore, review count, star distribution, categories, website, contact details, reply rate, AI summary). listing: one card per company on category or search pages (TrustScore, review count, website, email, phone, address, categories).

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

Stop after this many items in total (reviews, profiles or listing cards across all inputs). No page is requested for items that would not fit.

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

Reviews mode: cap per company. Trustpilot shows visitors 200 reviews per filter combination; above 200 the actor splits the list by star rating and review language (and, for very large slices, also reads the relevance order, verified-only, replied-only and date-window views) and merges the results without duplicates.

## `includeCompanyProfile` (type: `boolean`):

Reviews mode: also save one company profile item per company (charged as a company profile). It comes from the first review page, so it needs no extra request.

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

Optional: keep only reviews with these star ratings, e.g. 1 and 2 for complaints. Applied by Trustpilot, so you do not pay for reviews you do not want. Empty = all.

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

Two-letter language code (en, de, fr, it, es, nl, da, sv, ...) or "all" (default). Note that Trustpilot's own site shows only English reviews by default; this actor asks for all languages unless you set one.

## `datePosted` (type: `string`):

Only reviews posted in this period.

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

Order in which reviews are collected (matters whenever a cap is set).

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

Only reviews Trustpilot labels as verified.

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

Only reviews the company has replied to.

## `reviewKeyword` (type: `string`):

Optional: only reviews containing this word or phrase (Trustpilot's own review search).

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this input returned and output only what is new or changed. Reviews mode: only reviews no earlier run output, read newest first (the sort is set to Most recent) and paging stops as soon as a page ends with reviews from an earlier run, so a daily run of one company usually costs one request; the company profile is output on the first run only. Companies and listing modes: only companies that are new or whose TrustScore, stars or closed/alert status changed (review counts are not watched). Use with a Schedule; unchanged items are not charged. Combine with Date posted to bound the first run.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input. Only used with Only new or changed items.

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

Trustpilot blocks datacenter and residential IPs with a "Verifying Connection" page, so the default is Apify's UNBLOCKER proxy group. Each successful Unblocker request is billed by Apify as 10 proxy units (about $0.0015) to your account; one request returns 20 reviews or 10-20 listing cards, i.e. roughly $0.08-0.15 of proxy per 1,000 reviews. Failed requests are free.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.trustpilot.com/review/www.monzo.com"
    }
  ],
  "companyDomains": [],
  "searchQueries": [],
  "mode": "reviews",
  "maxItems": 100,
  "maxReviewsPerCompany": 100,
  "includeCompanyProfile": false,
  "stars": [],
  "language": "all",
  "datePosted": "all",
  "sort": "recency",
  "verifiedOnly": false,
  "withRepliesOnly": false,
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://www.trustpilot.com/review/www.monzo.com"
        }
    ],
    "companyDomains": [],
    "searchQueries": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/trustpilot-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 = {
    "startUrls": [{ "url": "https://www.trustpilot.com/review/www.monzo.com" }],
    "companyDomains": [],
    "searchQueries": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/trustpilot-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 '{
  "startUrls": [
    {
      "url": "https://www.trustpilot.com/review/www.monzo.com"
    }
  ],
  "companyDomains": [],
  "searchQueries": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call tortuga/trustpilot-scraper --silent --output-dataset

```

## MCP server setup

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