# Trustpilot Reviews Scraper: Coverage Per Company (`automation_craft/trustpilot-reviews-scraper`) Actor

Scrape Trustpilot reviews and company profiles for any domain, no login. Rating, title, text, dates, verification, reviewer country, company reply. Splits filters by star, language, date and topic to get past the 200 review wall and reports coverage per company. Pay per review.

- **URL**: https://apify.com/automation\_craft/trustpilot-reviews-scraper.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** Marketing, Lead generation, AI
- **Stats:** 1 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.
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: Coverage Per Company

**Scrape Trustpilot reviews** for any company domain with no login, and know exactly what you got. Every review row carries the rating, title, full text, published and experience dates, language, verification status, reviewer country, likes and the company's reply. Trustpilot shows the public at most 200 reviews per filter combination; this Actor splits your filters by star rating, language, date window and topic to collect past that wall, and writes one **coverage row per company** that says how many reviews exist on Trustpilot for your filters, how many you received, and why it stopped. A second mode finds companies by search keyword or Trustpilot category and returns one row per company with TrustScore, review count, categories, website, email, phone and address as listed.

You pay per review delivered. Duplicates, reviews already in your dedup memory, coverage rows, status rows, blocked pages, companies Trustpilot does not know and empty runs cost nothing.

### Quick start

1. Open the Actor and paste one company per line into **Companies**: a domain as Trustpilot writes it (`www.amazon.com`, `wise.com`) or any Trustpilot review page URL. Non canonical domains are followed to the canonical page.
2. Set **Max reviews per company** (0 means everything the public pages serve) and, if you want them, star ratings, languages, a date window, verified only, with reply only, topics or a text search.
3. Leave **Full coverage** on to collect past the 200 review wall, and tick **Include a company profile row** for TrustScore, rating distribution, categories, contact details, claim status, reply behaviour and Trustpilot's AI summary.
4. Run it. Download the **Reviews**, **Companies** or **Coverage** view as JSON, CSV or Excel, or read the dataset through the API.
5. For a weekly monitor, give the run a **Dedup memory name** and schedule it: every later run returns only reviews published since, free of charge for the ones it already delivered.

### What you get

#### Review rows (`type: "review"`)

Measured on 1,013 reviews from 6 companies (Amazon, Wise, eBay, Flodesk, Focusmate, Zara) in platform runs on 2026-09-16.

| Field | What it is | Filled |
|---|---|---|
| `reviewId`, `reviewUrl` | Trustpilot's id and the public review page | 100% |
| `companyDomain`, `companyName` | the canonical Trustpilot slug and display name | 100% |
| `rating` | 1 to 5 stars | 100% |
| `title`, `text` | headline and full review body | 100% |
| `language` | ISO code of the review | 100% |
| `publishedDate`, `experiencedDate`, `updatedDate` | ISO 8601 timestamps; `updatedDate` only when edited | 100%, 100%, about 5% |
| `isVerified`, `verificationLevel`, `verificationSource`, `reviewSource` | Trustpilot's verification labels (invited, organic, verified); 16% of sampled reviews were verified | 100% |
| `reviewer.name`, `reviewer.countryCode`, `reviewer.reviewCount`, `reviewer.id` | reviewer display name (optional), two letter country, how many reviews they wrote | 100% |
| `hasReply`, `reply.text`, `reply.publishedDate` | whether the company answered, and what it said | flag 100%; a reply existed on 26% of the sampled reviews |
| `likes` | useful votes | 100% |
| `shard` | the filter combination that surfaced the review (for audit) | 100% |

`location` and `productReviews` exist for the few businesses that use Trustpilot locations and product reviews and are empty otherwise.

#### Coverage rows (`type: "coverage"`), one per company, free

| Field | Meaning |
|---|---|
| `reviewsAvailable`, `reviewsAvailableExact` | reviews matching your filters on Trustpilot (the site's own count). Trustpilot counts star, language and date selections exactly; with a topic, verified, reply or text filter the count is unknown and `reviewsAvailable` is null |
| `reviewsAvailableAllFilters` | the company's total review count in every language |
| `reviewsReturned`, `coveragePercent` | what this run delivered |
| `capReason` | `complete`, `max-reviews-reached` (your per company cap), `max-total-reviews-reached` and `charge-limit-reached` (run wide stops), `public-wall` (200 per filter, full coverage off), `public-wall-after-sharding` (splitting could not reach everything), `page-budget-reached` (the request budget for one company), `fetch-errors` (a page could not be loaded or stored after retries; the rows delivered before it are kept and billed once) |
| `shardsFetched`, `pagesFetched` | how much work it took |

Measured 2026-09-16: a 356 review company reached 89 percent (317 reviews, 28 shards, 64 pages); a company under 200 reviews per star and language reaches 100 percent; Amazon (46,256 reviews) cannot be completed by any public scraper and the coverage row says so.

#### Company rows (`type: "company"`)

In reviews mode (when **Include a company profile row** is on) and in companies mode: `domain`, `name`, `trustpilotUrl`, `websiteUrl`, `trustScore`, `stars`, `numberOfReviews`, `numberOfReviewsLast12Months`, `ratingDistribution` (one to five star counts), `reviewLanguages` (count per language), `categories`, `primaryCategory`, `categoryPath`, `isClaimed`, `claimedDate`, `isClosed`, `isUsingPaidFeatures`, `countryCode`, `contact` (email, phone, address, city, zipCode, country as listed on Trustpilot), `replyBehavior` (reply percentage, average days to reply), `aiSummary`, `topicSummaries`, `similarCompanies` (Trustpilot's own list of eight, with TrustScore and review count), `logoUrl`. Company search and category rows carry the listing fields; turn on **Enrich each company from its profile page** for the full set. In category and search listings the contact fields were filled for 71% (email), 51% (phone) and 57% (address) of 70 sampled companies; Trustpilot lists them only where the business provided them.

#### The run summary (`type: "summary"`), free

Counters for companies, reviews delivered and charged, duplicates and known reviews skipped, pages and shards fetched, login walls met, HTTP statistics, token refreshes, and billing counters that report attempted and platform confirmed charges separately.

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

Live prices at the BRONZE tier; Silver 10 percent and Gold 20 percent off the result events, no discount on the Actor start event.

| Event | Price | When it is charged |
|---|---|---|
| Review | $0.0005 ($0.50 per 1,000 reviews) | once per unique review row delivered |
| Company profile | $0.002 ($2.00 per 1,000 companies) | once per company row delivered |
| Actor start | $0.001 per GB of memory, once per run | the headless browser hop that clears Trustpilot's access challenge |

Worked examples: 1,000 reviews of one company with its profile row cost $0.50 + $0.002 + $0.001 = $0.503. A weekly monitor that finds 12 new reviews costs $0.006 + $0.001 = $0.007. A category export of 500 companies costs $1.00 + $0.001. The Store pricing card shows the same prices per 1,000 events: "$2.00 / 1,000" on the Company profile row means one company costs 0.2 cents.

Nothing is charged for duplicates, reviews your dedup memory already holds, coverage rows, status rows, the summary, blocked pages, companies that do not exist on Trustpilot or invalid input.

### Input

| Field | Type | Notes |
|---|---|---|
| `mode` | `reviews` or `companies` | default `reviews`; `companies` is picked automatically when only search queries or categories are given |
| `companies` | list | domains or Trustpilot URLs, up to 200; two aliases of one profile are delivered once. An empty `{}` input runs the Console default (`www.amazon.com`, 200 reviews) |
| `maxReviewsPerCompany` | integer | default 200, 0 = unlimited |
| `maxTotalReviews` | integer | run wide stop, 0 = unlimited |
| `fullCoverage` | boolean | default true |
| `stars` | list of `"1"` to `"5"` | empty = all; with several values the reviews are collected per star rating |
| `languages` | list of ISO codes | empty = every language (not Trustpilot's English only default) |
| `dateRange` | `all`, `last30days`, `last3months`, `last6months`, `last12months` | Trustpilot's own windows |
| `verifiedOnly`, `withRepliesOnly` | boolean | server side filters |
| `topics` | list of topic ids | e.g. `customer_service`, `delivery_service`, `refund` |
| `searchText` | string | Trustpilot's search inside reviews |
| `sort` | `recency` or `relevance` | |
| `includeCompanyProfile` | boolean | one paid company row per company |
| `includeReviewerDetails` | boolean | default true; false drops reviewer names |
| `dedupMemoryName`, `resetDedupMemory` | string, boolean | cross run memory for monitors |
| `searchQueries`, `categories`, `country`, `minTrustScore`, `claimedOnly`, `maxCompanies`, `enrichCompanyProfiles` | companies mode | category ids or category URLs; country as a two letter code |
| `maxConcurrency` | 1 to 5 | companies scraped in parallel |
| `proxyConfiguration` | proxy | Apify's automatic datacenter pool is enough |

API example:

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~trustpilot-reviews-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["wise.com"], "stars": ["1", "2"], "maxReviewsPerCompany": 100, "includeCompanyProfile": true}'
```

```python
from apify_client import ApifyClient
client = ApifyClient("APIFY_TOKEN")
run = client.actor("automation_craft/trustpilot-reviews-scraper").call(run_input={
    "companies": ["www.booking.com"], "dateRange": "last30days", "dedupMemoryName": "booking-weekly"})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item["type"] == "review":
        print(item["rating"], item["publishedDate"], item["title"])
```

### What this Actor does NOT do

- It does not log in, use cookies or borrowed tokens. The public wall is 200 reviews per filter combination; splitting reaches more, and the coverage row tells you how much. A company with tens of thousands of reviews in one language and star rating cannot be completed by any public scraper.
- It does not translate reviews, download review images, or write to Trustpilot.
- It does not return the Trustpilot Business API's private fields (invitation data, tags, private notes).
- Trustpilot's `robots.txt` disallows automated access and its Terms of Use restrict scraping; you are responsible for how you use the data.

### FAQ

#### Why do most Trustpilot scrapers stop at 200 reviews, and what does this Actor do about it?

Trustpilot serves pages 1 to 10 of any review list to the public and redirects page 11 to a login page. That is 200 reviews per filter combination. This Actor never asks for page 11; with Full coverage on it splits your filter by star rating, then by language (using Trustpilot's own per language counts), then by date window and topic, and adds the relevance ordering, verified only and with reply views, each of which opens another 200. Every company gets a coverage row so you can see the result.

#### Can I get more than 200 reviews by splitting the run across star ratings, languages or date windows?

Yes, and you do not have to do it by hand: Full coverage does the splitting, deduplicates by review id and charges each review once. You can still narrow a run yourself with `stars`, `languages`, `dateRange` or `topics`; the Actor then splits only the remaining dimensions.

#### Can I scrape only the 1 and 2 star reviews?

Set `stars` to `["1", "2"]`. The filter is applied on Trustpilot's side, so you pay only for the low rated reviews you receive.

#### Does the output include the company's reply, and can I find reviews the business never answered?

Every review row has `hasReply` and, where present, `reply.text` and `reply.publishedDate`. Filter the export on `hasReply` false for unanswered reviews, or set `withRepliesOnly` to true for the opposite.

#### Can I scrape several companies in one run, or discover companies from a category instead of listing domains?

Give up to 200 domains in one run, each with its own coverage row. Switch to companies mode with a category id or URL (up to 10,000 companies per category, filtered by country, TrustScore and claimed status) or a search keyword to get company rows, then feed the domains back into a reviews run.

#### Can I schedule this weekly and get only the reviews that are new since the last run?

Set a `dedupMemoryName`. The Actor keeps a named key-value store of delivered review ids per memory name; later runs skip those reviews free of charge and deliver only new ones. Combine with `dateRange: "last30days"` so each run reads only recent pages.

#### Why does this Actor run with limited permissions?

It needs only its own storages and the named dedup memory it creates itself. Limited permissions mean it cannot touch anything else in your account, which is the least privilege the platform offers.

### Changelog

- 0.1 (2026-09-16): first release. Reviews mode with full coverage sharding and coverage rows, companies mode (search and categories), dedup memory, company profile rows.

### More data tools by Automation Craft

- [G2 Reviews Scraper](https://apify.com/automation_craft/g2-reviews-scraper)
- [Google Trends Scraper](https://apify.com/automation_craft/google-trends-scraper)
- [Google News Scraper: Search, Topics, Decoded URLs](https://apify.com/automation_craft/google-news-scraper)
- [Airbnb Scraper: Prices, Calendar, Reviews](https://apify.com/automation_craft/airbnb-scraper)
- [Amazon Data Scraper](https://apify.com/automation_craft/amazon-data-scraper)
- [UK Food Hygiene Ratings Scraper](https://apify.com/automation_craft/uk-food-hygiene-ratings-scraper)

# Actor input Schema

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

Reviews of specific companies (give their domains below), or find companies by search keyword or Trustpilot category and get one company row each.

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

One company per line: a domain as Trustpilot writes it (www.amazon.com, wise.com) or any Trustpilot review page URL. Non canonical domains are followed to the canonical page. Up to 200 per run.

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

Stop after this many reviews for each company. 0 means no limit (bounded only by what Trustpilot serves). You pay per review delivered.

## `maxTotalReviews` (type: `integer`):

Hard stop for the run across all companies. 0 means no limit.

## `fullCoverage` (type: `boolean`):

When a filter combination has more than 200 reviews, split it by star rating, then language, then date window, then topic, and collect each part. Turn off to read only the first 10 pages of your filter (fastest, at most 200 reviews per company).

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

Only reviews with these ratings. Empty means all ratings.

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

ISO codes such as en, de, fr, es, it, nl, da, sv, pt. Empty means every language (Trustpilot's own default of English only is NOT applied).

## `dateRange` (type: `string`):

Trustpilot's date filter. Only these windows exist on the site.

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

Only reviews Trustpilot marks as verified (invitation based).

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

Skip reviews the company has not answered.

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

Trustpilot topic ids, for example customer\_service, delivery\_service, product, refund, price. Empty means all topics.

## `searchText` (type: `string`):

Only reviews whose text matches this word or phrase (Trustpilot's own search box, server side).

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

Newest first (recency) or Trustpilot's relevance ranking.

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

Adds one company row per company: TrustScore, stars, review counts per rating and language, categories, contact details, claim status, reply behaviour, Trustpilot's AI summary and similar companies. Charged as one Company profile event per company.

## `includeReviewerDetails` (type: `boolean`):

Keep the reviewer's display name on each row. Reviewer country and review count are always included. Turn off to drop names for privacy.

## `dedupMemoryName` (type: `string`):

Give a name such as 'amazon-weekly' and later runs with the same name skip every review already delivered, free of charge. Ideal for a scheduled monitor. Leave empty for no cross run memory.

## `resetDedupMemory` (type: `boolean`):

Forget everything the named memory has seen and start over on this run.

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

Company search terms such as 'car insurance', 'web hosting' or a brand name. Each returns up to 560 companies (56 pages of 10).

## `categories` (type: `array`):

Trustpilot category ids such as electronics\_technology, insurance\_agency, or a category page URL. Up to 10,000 companies per category (500 pages of 20).

## `country` (type: `string`):

Two letter country code that filters category listings, for example US, GB, DE. Empty means Trustpilot's default for the category.

## `minTrustScore` (type: `integer`):

Skip companies below this TrustScore (0 to 5). Categories support 3, 4 and 4.5 server side; other values are applied after fetching.

## `claimedOnly` (type: `boolean`):

Only companies that have claimed their Trustpilot profile.

## `maxCompanies` (type: `integer`):

Stop after this many company rows. 0 means no limit.

## `enrichCompanyProfiles` (type: `boolean`):

Fetch every company's Trustpilot page to add the rating distribution, review languages, reply behaviour, claim date, AI summary and similar companies. Same Company profile price, one extra request per company.

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

How many companies are scraped at the same time (1 to 5).

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

Apify's automatic datacenter pool is enough: the access token is not tied to the exit IP. Residential proxies only add cost.

## Actor input object example

```json
{
  "mode": "reviews",
  "companies": [
    "www.amazon.com"
  ],
  "maxReviewsPerCompany": 40,
  "maxTotalReviews": 0,
  "fullCoverage": true,
  "stars": [],
  "languages": [],
  "dateRange": "all",
  "verifiedOnly": false,
  "withRepliesOnly": false,
  "topics": [],
  "sort": "recency",
  "includeCompanyProfile": true,
  "includeReviewerDetails": true,
  "resetDedupMemory": false,
  "searchQueries": [],
  "categories": [],
  "claimedOnly": false,
  "maxCompanies": 100,
  "enrichCompanyProfiles": false,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (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 = {
    "companies": [
        "www.amazon.com"
    ],
    "maxReviewsPerCompany": 40,
    "includeCompanyProfile": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/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 = {
    "companies": ["www.amazon.com"],
    "maxReviewsPerCompany": 40,
    "includeCompanyProfile": True,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/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 '{
  "companies": [
    "www.amazon.com"
  ],
  "maxReviewsPerCompany": 40,
  "includeCompanyProfile": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automation_craft/trustpilot-reviews-scraper --silent --output-dataset

```

## MCP server setup

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