# Trustpilot Company Review Extractor (`vexaloom-labs/trustpilot-company-review-extractor`) Actor

Pull reviews from any Trustpilot company page with star rating, reviewer details, verification status, and company replies, filterable by rating, language, and verification.

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

## Pricing

from $0.49 / 1,000 results

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 Company Review Extractor

Collect Trustpilot reviews and company profiles in one run. Paste a company URL, a domain, or a company name and get review text, star ratings, reviewer details, owner replies, verification data, company statistics, contacts, and transparency information as flat records.

Trustpilot normally shows an anonymous visitor 200 reviews per filtered view. This actor reads Trustpilot's own review views and combines star and language slices to go beyond that limit, while reporting honestly when a very large brand has more history than the public web views expose.

### Three modes

- **Company reviews** — reviews for one or more companies. Accepts Trustpilot URLs, bare domains, or company names. Names are resolved through Trustpilot search.
- **Company profiles** — one record per company with TrustScore, star rating, lifetime and last-12-month review counts, rating distribution, language counts, categories, claimed status, contacts, owner reply behaviour, verification flags, consumer alerts, and transparency data.
- **Search companies** — find companies by keyword, optionally scoped to a search country, and return company profile rows with contacts and categories.

### What each review record contains

`businessName`, `businessDomain`, `businessId`, `businessUrl`, `trustpilotUrl`, `trustScore`, `companyStars`, `totalReviews`, `reviewsLast12Months`, `categories`, `isClaimed`, `companyCountry`, `ratingDistribution`, `contactEmail`, `contactPhone`, `reviewId`, `reviewUrl`, `title`, `text`, `rating`, `language`, `authorName`, `authorId`, `authorCountry`, `authorReviewCount`, `authorAvatarUrl`, `authorProfileUrl`, `authorIsVerified`, `isVerified`, `verificationLevel`, `verificationSource`, `publishedDate`, `experiencedDate`, `updatedDate`, `replyText`, `replyDate`, `replyUpdatedDate`, `hasReply`, `likes`, `source`, `reviewsOnSameDomain`, `locationId`, `locationName`, `sourcePage`, `recordType`, `scrapedAt`.

Company profiles also include `aiSummary`, `aiSummaryModel`, `aiSummaryTopics`, `locationsCount`, and a `locations` list (store name, address, rating and review count) when Trustpilot publishes locations. Search records use the same company fields plus their own profile fields. Every record has a `recordType` (`review`, `company`, or `companySearch`), so mixed datasets stay usable.

Missing values are omitted rather than written as `null`. Counts of zero and boolean `false` are kept when they are real.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `mode` | select | `reviews` | Reviews, company profiles, or company search |
| `startUrls` | URL list | – | Trustpilot company page URLs |
| `companies` | string list | – | Domains or names, e.g. `booking.com`, `Nike` |
| `searchQueries` | string list | – | Keywords for company search |
| `searchCountry` | select | `US` | Country context for company search (ranking, not a strict filter) |
| `maxCompanies` | integer | 20 | Maximum company results per search keyword |
| `maxReviews` | integer | 100 | Maximum reviews per company; values above 200 use star/language/topic slices |
| `maxItems` | integer | 50000 | Maximum reviews across all companies |
| `filterStars` | select | all | Only one-star through five-star reviews |
| `filterLanguage` | select | all | Only one review language; a company without that language returns no reviews instead of mixing languages |
| `filterDateRange` | select | all | Last 30 days, 3 months, 6 months, or 12 months |
| `sortBy` | select | `recency` | Newest first or most relevant |
| `onlyVerified` | boolean | false | Only verified-purchase reviews |
| `onlyWithReplies` | boolean | false | Only reviews with a company reply |
| `searchKeyword` | text | – | Only reviews whose title or text contains this phrase |
| `filterReviewerCountries` | string list | – | Keep only reviewers from these ISO country codes |
| `publishedAfter` | date | – | Only reviews newer than this exact date |
| `lastDays` | integer | – | Rolling cutoff for scheduled runs; if both cutoffs are set, the more recent wins |

### Examples

#### Scrape 500 reviews for one company

```json
{
  "mode": "reviews",
  "startUrls": [{ "url": "https://www.trustpilot.com/review/www.booking.com" }],
  "maxReviews": 500
}
```

#### Negative verified reviews from the last 12 months

```json
{
  "mode": "reviews",
  "companies": ["octopus.energy"],
  "filterStars": "1",
  "filterDateRange": "last12months",
  "onlyVerified": true,
  "maxReviews": 200
}
```

#### Company profiles for several brands

```json
{
  "mode": "companies",
  "companies": ["notion.so", "www.booking.com", "wise.com"]
}
```

#### Find plumbing companies

```json
{
  "mode": "searchCompanies",
  "searchQueries": ["plumber"],
  "searchCountry": "US",
  "maxCompanies": 50
}
```

### How deep can it go?

Trustpilot serves 20 reviews per page and stops anonymous visitors at page 10 — 200 reviews for a single filtered view. The actor fetches the unfiltered view, then each of the five star views (up to 200 each), then star-by-language views for global brands. For multi-location businesses it also slices by Trustpilot location, which can add substantially more coverage. When a company's star × language views still stop short of the requested count, the actor reads Trustpilot's AI topics and adds topic × star slices, bounded by `maxReviews`. Star × language slices can reach up to the 10,000-review input maximum for global brands; smaller companies are fully covered.

There is no public absolute-date filter on Trustpilot, so a brand with hundreds of thousands of reviews cannot be exported in full without an account. The actor tells you in its status message when it hit this wall.

### FAQ

**Do I need a Trustpilot account, cookies, or a proxy?**
No. The actor reads public Trustpilot pages and handles the site's connection check itself. You do not configure a proxy.

**Why did I get fewer reviews than I asked for?**
Either the company has fewer reviews than requested, or it has more than the public views can expose. The status message says which. For big brands, request up to 1,000 to use the star slices efficiently.

**Does setting a language filter return other languages if the company has none in that language?**
No. The actor checks the company's own language counts first. If the language is absent, that company returns no reviews instead of falling back to all languages.

**What does "verified" mean?**
`isVerified` follows Trustpilot's verification flag. The `onlyVerified` input keeps the strict verified-purchase level; `verificationLevel` and `verificationSource` are included for every review.

**Are owner replies included?**
Yes. `replyText`, `replyDate`, `replyUpdatedDate`, and `hasReply` are returned when a reply exists. The company profile also includes overall reply percentage and average reply time.

**Can I get reviewer email addresses?**
No. Trustpilot does not publish reviewer contact details. Company contact email and phone are included when Trustpilot publishes them.

**What is the difference between `companyStars`, `trustScore`, and the rating distribution?**
`trustScore` is Trustpilot's weighted score; `companyStars` is the rounded display value; `ratingDistribution` is the raw count of reviews per star. They are different numbers by design.

**Can I run this on a schedule for new reviews only?**
Yes. Set `lastDays` (for example `1` for daily) or `publishedAfter` to an exact date. The actor reads newest-first and stops once it passes the cutoff.

**Does it include Trustpilot's AI summary?**
Yes, on company profile records (`mode=companies`). `aiSummary` is Trustpilot's own English-page summary; `aiSummaryTopics` carries the per-topic summaries. Review rows do not repeat the summary.

**Is this affiliated with Trustpilot?**
No. This is an independent tool that reads publicly available Trustpilot pages. It is not affiliated with, endorsed by, or sponsored by Trustpilot A/S.

### Limitations

- 200 reviews per filtered view; up to 1,000 through star slices, up to 10,000 through star × language slices, and topic × star slices where Trustpilot publishes AI topics (34/40 companies in the survey).
- Topic slices are bounded by `maxReviews`; companies without AI topics stop at the star/language ceiling and report it.
- No absolute date-range filter in Trustpilot's public web views, so very large brands are sampled rather than complete.
- Company search country affects ranking, not a strict country filter.
- Reviewer-country filtering happens after collection and can return fewer rows than requested.
- Trustpilot test/placeholder reviews without a valid 1–5 rating are skipped.
- Company contact email and phone are present only when Trustpilot publishes them (22.5 % email / 27.5 % phone in the 40-company survey). Trustpilot search and transparency pages do not add missing contacts; scraping the company's own website is a separate data source.
- AI summaries are available on company profiles only; the review data route does not carry them.

# Actor input Schema

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

What to collect. Reviews: scrape reviews. Companies: one profile record per company, with contacts and transparency data. Search companies: find companies by keyword.

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

Trustpilot company page URLs, e.g. https://www.trustpilot.com/review/notion.so. You can also paste a company's own website URL. Merged with 'Company domains or names'.

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

Domains (booking.com, notion.so) or company names (Nike, Notion). Names are resolved through Trustpilot search. Merged with 'Company URLs'.

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

Keywords for mode=searchCompanies, e.g. plumber, dentist, CRM software.

## `searchCountry` (type: `string`):

Country context for company search. It affects ranking and localisation, not a strict country filter.

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

Maximum company results per search keyword (mode=searchCompanies).

## `maxReviews` (type: `integer`):

Maximum reviews per company. Values above 200 are collected by splitting Trustpilot's 200-review view across star, language, and topic slices.

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

Maximum reviews across all companies in one run.

## `filterStars` (type: `string`):

Only include reviews with this star rating. Leave on 'All stars' to include every rating.

## `filterLanguage` (type: `string`):

Only include reviews in this language. Trustpilot only serves a language a company actually has; otherwise the run returns no reviews for that company instead of mixing languages.

## `filterDateRange` (type: `string`):

Only include reviews posted in this rolling window.

## `sortBy` (type: `string`):

How Trustpilot orders reviews before collection.

## `onlyVerified` (type: `boolean`):

Only include reviews Trustpilot marks as verified purchases.

## `onlyWithReplies` (type: `boolean`):

Only include reviews that already have a company reply.

## `searchKeyword` (type: `string`):

Only include reviews whose title or text contains this phrase. Applied by Trustpilot before collection. Works with mode=reviews.

## `filterReviewerCountries` (type: `array`):

Only keep reviews from reviewers in these ISO country codes, e.g. US, GB, DE. Applied after collection.

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

Exact cutoff date (YYYY-MM-DD). Reviews older than this are skipped. Works with mode=reviews.

## `lastDays` (type: `integer`):

Rolling cutoff for scheduled runs, e.g. 7 for weekly or 1 for daily. If both this and the exact date are set, the more recent cutoff wins.

## Actor input object example

```json
{
  "mode": "reviews",
  "startUrls": [
    {
      "url": "https://www.trustpilot.com/review/notion.so"
    }
  ],
  "searchCountry": "US",
  "maxCompanies": 5,
  "maxReviews": 3,
  "maxItems": 3,
  "filterStars": "",
  "filterLanguage": "all",
  "filterDateRange": "all",
  "sortBy": "recency",
  "onlyVerified": false,
  "onlyWithReplies": false
}
```

# Actor output Schema

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

Dataset containing review, company, or companySearch records, tagged by recordType.

# 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 = {
    "mode": "reviews",
    "startUrls": [
        {
            "url": "https://www.trustpilot.com/review/notion.so"
        }
    ],
    "searchCountry": "US",
    "maxCompanies": 5,
    "maxReviews": 3,
    "maxItems": 3,
    "filterStars": "",
    "filterLanguage": "all",
    "filterDateRange": "all",
    "sortBy": "recency",
    "onlyVerified": false,
    "onlyWithReplies": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/trustpilot-company-review-extractor").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 = {
    "mode": "reviews",
    "startUrls": [{ "url": "https://www.trustpilot.com/review/notion.so" }],
    "searchCountry": "US",
    "maxCompanies": 5,
    "maxReviews": 3,
    "maxItems": 3,
    "filterStars": "",
    "filterLanguage": "all",
    "filterDateRange": "all",
    "sortBy": "recency",
    "onlyVerified": False,
    "onlyWithReplies": False,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/trustpilot-company-review-extractor").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 '{
  "mode": "reviews",
  "startUrls": [
    {
      "url": "https://www.trustpilot.com/review/notion.so"
    }
  ],
  "searchCountry": "US",
  "maxCompanies": 5,
  "maxReviews": 3,
  "maxItems": 3,
  "filterStars": "",
  "filterLanguage": "all",
  "filterDateRange": "all",
  "sortBy": "recency",
  "onlyVerified": false,
  "onlyWithReplies": false
}' |
apify call vexaloom-labs/trustpilot-company-review-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/trustpilot-company-review-extractor"
        }
    }
}
```

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/GxhFe08FWhhuHEcFZ/builds/EBDiJJKewcsfmWgXA/openapi.json
