# Trustpilot Reviews & Company Scraper (`alexmorain/trustpilot-scraper`) Actor

Scrape Trustpilot reviews, company ratings and public contact details (email, phone, address). Discover companies by category and country for lead generation. Handles the language filter that hides most reviews of non-English companies. No login, no cookies.

- **URL**: https://apify.com/alexmorain/trustpilot-scraper.md
- **Developed by:** [Alex Morain](https://apify.com/alexmorain) (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.80 / 1,000 review scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

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

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

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

# README

## Trustpilot Reviews & Company Scraper

Scrape Trustpilot at scale without a login, an account, or cookies. Pull every review of a
company, grab its rating and public contact details, or discover all companies in a category
and country. Built for lead generation, reputation monitoring and market research.

### What it does

Two things, picked automatically from what you give it:

- **Company reviews.** Give one or more domains (or Trustpilot profile URLs) and get the full
  company profile plus its reviews. Trustpilot serves at most 200 reviews per request, so
  beyond that this actor splits the profile into disjoint rating and language cells and walks
  each one, which typically returns 3 to 4 times more than a plain paginated scrape.
- **Category discovery.** Give a category slug and a country, get the list of companies ranked
  in it: name, domain, score, review count. A ready-made prospect list by industry.

Trustpilot caps its own category listings, so discovery returns what the site actually ranks
for that filter, often a few dozen companies. The run log states the total it found.

### Why this one

Most Trustpilot scrapers return reviews and stop there. This one also extracts the **public
contact block** (email, phone, address) from each company profile, and it discovers companies
**by category and country**, so it doubles as a lead source, not just a review dump.

It also handles two traps that silently break other scrapers. Trustpilot hides reviews that are
not in the request language: a French company with 200 reviews shows only 1 unless you ask for
all languages, so this actor defaults to every language. And Trustpilot stops serving after page
10 while still advertising thousands of pages, which caps a naive scraper at 200 reviews per
company; the rating and language segmentation is how this one gets past that.

### How to scrape Trustpilot

1. Open the **Input** tab. One company is already filled in, so you can press **Start** right away and see the output.
2. Replace it with the companies you care about. The safest way to get the domain right: search the company on Trustpilot and paste the profile URL from your browser. `www.qonto.com` and `qonto.com` can be two different profiles.
3. Or, instead of companies, fill **Category slugs** and a **Country** to discover the companies ranked in an industry. That is the prospecting mode. Filling both at once is refused, because they are two different jobs.
4. Leave **Review languages** on `all` and the **proxy** on residential. Those two defaults exist to avoid the two traps of the site.
5. Press **Start**, then download the dataset. Companies and reviews come out as two record types, each with its own view.

#### Which fields should I fill?

| If you want to... | Fill in | Leave alone |
|---|---|---|
| Read a company's reviews | `companyDomains` | everything else |
| Monitor your own reputation | `companyDomains` and a schedule | everything else |
| Build a prospect list for an industry | `categorySlugs`, `country` | `companyDomains` |
| Get contact details of companies | either mode, the contact block always comes with the profile | — |
| Analyse reviews in one language | `languages: fr` | everything else |

Nothing else is mandatory: fill one of the two entry fields and press Start.

### Input

| Field | What it does |
|---|---|
| `companyDomains` | Domains or profile URLs to scrape reviews from |
| `categorySlugs` | Category slugs to discover companies from (e.g. `accountant`, `bank`) |
| `country` | ISO code to filter category results (`FR`, `GB`, `US`, ...) |
| `maxReviewsPerCompany` | Cap on reviews per company |
| `maxCompaniesPerCategory` | Cap on companies per category |
| `languages` | Review languages, `all` by default |
| `proxyConfiguration` | Residential proxies recommended |

Example:

```json
{
  "categorySlugs": ["accountant"],
  "country": "FR",
  "maxCompaniesPerCategory": 50
}
```

```json
{
  "companyDomains": ["www.qonto.com", "keobiz.fr"],
  "maxReviewsPerCompany": 500
}
```

### Output

Two record types in the dataset, each with its own view (Companies, Reviews).

Company: `name`, `domain`, `trustScore`, `stars`, `numberOfReviews`, `reviewsLast12Months`,
`isClaimed`, `countryCode`, `categories`, `email`, `phone`, `address`, `city`, `zipCode`.

Review: `rating`, `title`, `text`, `language`, `experiencedDate`, `publishedDate`,
`consumerName`, `consumerCountry`, `isVerified`, `replyMessage` (the company's reply).

### Pricing

Pay per event. You pay for what you extract, nothing for empty runs: a small fee per company
profile and a smaller one per review. No monthly rental.

### Notes

Residential proxies keep success rates high because Trustpilot rate-limits by IP. The actor
refreshes its access automatically and skips a company cleanly if it stays blocked, so one hard
block never aborts the whole run.

Scrape only public data and use it in line with Trustpilot's terms and applicable law.

# Actor input Schema

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

One company per line. Two accepted forms, freely mixed:<br>• the <b>domain</b> as Trustpilot knows it: <code>www.qonto.com</code>, <code>keobiz.fr</code><br>• the full <b>Trustpilot profile URL</b>: <code>https://www.trustpilot.com/review/www.qonto.com</code><br><br><b>Getting the domain right matters:</b> Trustpilot keys profiles on the exact domain, and <code>qonto.com</code> and <code>www.qonto.com</code> can be two different pages. The safe move is to search the company on Trustpilot and paste the profile URL straight from your browser; the Actor extracts the domain from it.<br><br>Leave empty if you are discovering companies by category instead.

## `categorySlugs` (type: `array`):

Trustpilot category slugs to discover companies from, one per line: <code>accountant</code>, <code>bank</code>, <code>insurance\_agency</code>.<br><br><b>Where to find a slug:</b> browse the Trustpilot categories, open the one you want, and take the last part of the URL, <code>trustpilot.com/categories/<b>accountant</b></code>. Underscores are part of the slug.<br><br>You get one row per company, with name, domain, score and review count: a ready-made prospect list for an industry. Combine with the country filter below to make it local.

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

ISO country code used to filter category results: <code>FR</code>, <code>GB</code>, <code>US</code>, <code>DE</code>.<br><br>Only applies to category discovery, and ignored when you scrape company reviews. Leave empty to get the companies of every country.

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

<b>Leave this on Auto.</b> Auto picks the job from what you filled in: company domains means reviews, category slugs means discovery. It only has to be set by hand if you keep both fields filled in a saved task and want to switch between them without clearing one, in which case Auto refuses to guess and asks you to choose.

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

Upper bound on reviews collected per company.<br><br><b>Read this before setting a big number.</b> Trustpilot serves at most 200 reviews for any single request, however many thousands it advertises on the page. Above 200 this Actor splits the profile into disjoint rating and language cells and walks each one, which typically brings a 4,500-review profile to 700 or 800 rather than 200. It cannot return the full corpus, because Trustpilot does not serve it, and no scraper can.<br><br>So: <code>200</code> is one fast pass, <code>1000</code> triggers the segmentation and takes noticeably longer for roughly three to four times more reviews. The run log always states what was collected against the advertised total.

## `maxCompaniesPerCategory` (type: `integer`):

Upper bound on companies returned per category, paged 20 at a time. Only applies to category discovery.<br><br>Trustpilot caps its own category listings, so a category often holds a few dozen to a few hundred companies whatever you ask for. The log states the total it found.

## `languages` (type: `string`):

Which review languages to collect. <code>all</code>, the default, returns every review whatever its language. A single code such as <code>fr</code> or <code>en</code> returns only that one.<br><br><b>Leave it on <code>all</code> unless you have a specific reason.</b> Trustpilot's own default hides reviews written in other languages, and that quietly guts the result: a French company with 200 reviews can show a single one. Restrict this only when you feed a downstream tool that handles one language.

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

<b>Keep residential proxies on.</b> Trustpilot rate-limits by IP and challenges suspicious ones; residential proxies spread the load and keep the success rate high. This is the one Actor here where the proxy setting genuinely matters.<br><br>Switching to datacenter proxies, or to no proxy at all, will get large runs blocked. A company that stays blocked is skipped with an explanation and never stops the rest of the run.

## Actor input object example

```json
{
  "companyDomains": [
    "www.qonto.com",
    "keobiz.fr"
  ],
  "categorySlugs": [
    "accountant"
  ],
  "country": "FR",
  "mode": "auto",
  "maxReviewsPerCompany": 200,
  "maxCompaniesPerCategory": 100,
  "languages": "all",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `companies` (type: `string`):

Company profiles with rating, review counts and public contact details (email, phone, address).

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

Individual Trustpilot reviews with rating, text, dates, author and company reply.

# 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 = {
    "companyDomains": [
        "www.qonto.com"
    ],
    "maxReviewsPerCompany": 200,
    "maxCompaniesPerCategory": 100,
    "languages": "all",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexmorain/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 = {
    "companyDomains": ["www.qonto.com"],
    "maxReviewsPerCompany": 200,
    "maxCompaniesPerCategory": 100,
    "languages": "all",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("alexmorain/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 '{
  "companyDomains": [
    "www.qonto.com"
  ],
  "maxReviewsPerCompany": 200,
  "maxCompaniesPerCategory": 100,
  "languages": "all",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call alexmorain/trustpilot-scraper --silent --output-dataset

```

## MCP server setup

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