# Trustpilot Business Reviews Scraper (`maximedupre/trustpilot-business-reviews`) Actor

Collect public Trustpilot business reviews from page URLs, company domains, or business keywords. Get review text, ratings, dates, reviewer context, and business reputation metrics, plus replies when available, in an Apify dataset.

- **URL**: https://apify.com/maximedupre/trustpilot-business-reviews.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Business, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.01 / 1,000 business reviews

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 business reviews for reputation research

Researchers, marketers, and business teams can collect public Trustpilot business reviews from company review pages, domains, or business keywords. Each dataset row joins one review with its business page, reputation metrics, and public context, so you can study customer feedback and compare reputation signals in one export.

No Trustpilot login or customer-provided source credential is needed.

- Collect reviews from a public Trustpilot business page with **[Trustpilot Review Data](https://apify.com/maximedupre/trustpilot-business-reviews/examples/trustpilot-review-data)**.
- Gather one company's public feedback and business context with **[Trustpilot Company Reviews](https://apify.com/maximedupre/trustpilot-business-reviews/examples/trustpilot-company-reviews)**.
- Filter reviews by stars, language, dates, replies, or keywords with **[Trustpilot Review Scraper](https://apify.com/maximedupre/trustpilot-business-reviews/examples/trustpilot-review-scraper)**.
- Review titles, full text, ratings, and dates with **[Trustpilot Reviews](https://apify.com/maximedupre/trustpilot-business-reviews/examples/trustpilot-reviews)**.
- Compare review details with a business reputation snapshot using **[Trustpilot Business Reviews](https://apify.com/maximedupre/trustpilot-business-reviews/examples/trustpilot-business-reviews)**.

#### 📦 Review rows with a business snapshot

Each dataset row represents one collected public Trustpilot business review. The `business` object includes Trustpilot identity, reputation metrics, categories, public profile details, and source links. The `review` object includes the title, full text, star rating, both dates, language, verification, useful votes, a plain-language summary, reviewer context, and a business reply when available.

Optional fields appear when the source provides them. The genuine row below has no business contact object or reply because those fields were not present in that run.

#### ▶️ Collect reviews from Trustpilot pages or keywords

1. Choose **Trustpilot pages or domains** or **Business keywords** in `Find reviews by`.
2. Add full Trustpilot business review page URLs or company domains, or add ordinary business keywords and short phrases. Only fields for the selected choice are used.
3. Add any star, language, date, verification, reply, or review-keyword filters you need.
4. Set `Max reviews per company` when you want a per-company limit. Leave it empty to collect all available public reviews until the source is exhausted.
5. Start the run and open the review dataset from the output.

Each review is saved on its first eligible match. If the same source review appears again through another submitted URL, keyword, or similar target value, the later match is ignored. The saved row describes the first match only.

#### ⚙️ Input

Use one source choice at a time. The table lists every public input field.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `discoveryMethod` | string | Required. Choose `trustpilotPages` for page or domain targets, or `businessKeywords` for business keyword discovery. |
| `companyUrls` | array of objects | Add one object for each full URL. Use this field when `discoveryMethod` is `trustpilotPages`. Up to 200 company targets are allowed by the input schema. |
| `companyUrls[].url` | string | A Trustpilot business review page URL or a company domain URL. |
| `businessKeywords` | array of strings | Add ordinary business keywords or short phrases. Use this field when `discoveryMethod` is `businessKeywords` to find matching Trustpilot business pages. |
| `maxReviewsPerCompany` | integer | Optional per-company review limit. The schema has no fixed upper bound. Leave it empty to collect all available public reviews until the source is exhausted. |
| `ratingFilter` | object | Optional star filter. Set both values to the same number for an exact rating, or use different values for a range. Leave both empty for every rating. |
| `ratingFilter.minStars` | integer | Lowest star rating to include, from 1 to 5. |
| `ratingFilter.maxStars` | integer | Highest star rating to include, from 1 to 5. |
| `languageCodes` | array of strings | Optional language filter. Add codes such as `en` or `de`, or leave it empty for all available languages. |
| `publishedFrom` | string | Include reviews published on or after this date. Use `YYYY-MM-DD`. |
| `publishedTo` | string | Include reviews published on or before this date. Use `YYYY-MM-DD`. |
| `verifiedOnly` | boolean | When `true`, include only reviews marked as verified. Leave it `false` to include all reviews. |
| `repliedOnly` | boolean | When `true`, include only reviews with a public business reply. Leave it `false` to include reviews with or without a reply. |
| `reviewKeyword` | string | Optional keyword filter for the review title or full text. Leave it empty to include all reviews. |

**Successful default-input example**

This public input is copied from a successful current-beta run.

```json
{
  "discoveryMethod": "trustpilotPages",
  "companyUrls": [
    {
      "url": "https://www.trustpilot.com/review/www.amazon.com"
    }
  ],
  "maxReviewsPerCompany": 1,
  "verifiedOnly": false,
  "repliedOnly": false
}
```

#### 🧾 Output

The default dataset has one row shape. Every row contains `business` and `review` objects. Fields marked as available may be absent when the public source does not provide them.

**Dataset link**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | string | Opens the collected Trustpilot business review dataset. |

**Trustpilot business review row**

| Field | Type | What it does |
| --- | --- | --- |
| `business` | object | Business identity, reputation, categories, and public profile details. |
| `business.id` | string | Stable public Trustpilot identifier for the business. |
| `business.name` | string | Public business name on Trustpilot. |
| `business.trustpilotUrl` | string | Direct URL for the business page on Trustpilot. |
| `business.reputation` | object | Reputation metrics shown on the business page. |
| `business.reputation.overallRating` | number | Overall business rating on a five-point scale. |
| `business.reputation.totalReviewCount` | integer | Total reviews counted on the business page. |
| `business.reputation.starDistribution` | object | Counts for each Trustpilot star level. |
| `business.reputation.starDistribution.oneStar` | integer | Number of one-star reviews. |
| `business.reputation.starDistribution.twoStars` | integer | Number of two-star reviews. |
| `business.reputation.starDistribution.threeStars` | integer | Number of three-star reviews. |
| `business.reputation.starDistribution.fourStars` | integer | Number of four-star reviews. |
| `business.reputation.starDistribution.fiveStars` | integer | Number of five-star reviews. |
| `business.categories` | array of strings | Public categories listed for the business. |
| `business.websiteUrl` | string | Public business website URL when available. |
| `business.contact` | object | Public business contact details when available. |
| `business.contact.email` | string | Public business email address when available. |
| `business.contact.phone` | string | Public business phone number when available. |
| `business.location` | object | Public business location details when available. |
| `business.location.address` | string | Public street address when available. |
| `business.location.city` | string | Public city when available. |
| `business.location.postalCode` | string | Public postal code when available. |
| `business.location.country` | string | Public country when available. |
| `business.description` | string | Public business description when available. |
| `business.verification` | object | Public business verification details when available. |
| `business.verification.isClaimed` | boolean | Whether Trustpilot shows the business profile as claimed. |
| `business.verification.isVerified` | boolean | Whether Trustpilot shows the business as verified. |
| `review` | object | One public Trustpilot review and its available context. |
| `review.id` | string | Stable public identifier for the review. |
| `review.url` | string | Direct URL for the review on Trustpilot. |
| `review.title` | string | Public title written for the review. |
| `review.text` | string | Full public review text. |
| `review.rating` | integer | Star rating given in the review, from 1 to 5. |
| `review.publishedDate` | string | Date when the review was published. |
| `review.experienceDate` | string | Date of the customer experience reported in the review. |
| `review.languageCode` | string | Detected review language code when available. |
| `review.isVerified` | boolean | Whether Trustpilot marks the review as verified. |
| `review.usefulVotes` | integer | Useful-vote count shown for the review when available. |
| `review.summary` | string | Concise plain-language summary of the review. |
| `review.reviewer` | object | Public reviewer identity and activity details when available. |
| `review.reviewer.name` | string | Public name shown for the reviewer. |
| `review.reviewer.location` | string | Public reviewer location when available. |
| `review.reviewer.reviewCount` | integer | Number of reviews shown as written by the reviewer. |
| `review.reply` | object | Public business reply when one is present. |
| `review.reply.text` | string | Full public text of the business reply. |
| `review.reply.publishedDate` | string | Date when the business reply was published. |

**Genuine review row**

This complete public row came from a successful current-beta run. Optional fields that were not present in that source response are absent.

```json
{
  "business": {
    "id": "46ad346800006400050092d0",
    "name": "Amazon",
    "trustpilotUrl": "https://www.trustpilot.com/review/www.amazon.com",
    "reputation": {
      "overallRating": 1.6,
      "totalReviewCount": 48875,
      "starDistribution": {
        "oneStar": 32685,
        "twoStars": 2951,
        "threeStars": 1867,
        "fourStars": 2448,
        "fiveStars": 8924
      }
    },
    "categories": [
      "Shoe Store",
      "Clothing Store",
      "Book Store",
      "Hobby Store"
    ],
    "websiteUrl": "https://www.amazon.com",
    "location": {
      "country": "GB"
    },
    "description": "Online shopping from the earth's biggest selection of books, magazines, music, DVDs, videos, electronics, computers, software, apparel & accessories, shoes, jewelry, tools & hardware, housewares, furniture, sporting goods, beauty & personal care, broadband & dsl, gourmet food & just about anything else.",
    "verification": {
      "isClaimed": true,
      "isVerified": false
    }
  },
  "review": {
    "id": "6a98700b37492d7fc714a128",
    "url": "https://www.trustpilot.com/reviews/6a98700b37492d7fc714a128",
    "title": "Il kindle è una fregatura",
    "text": "Non voglio fare una recensione su amazon in sè, non essendoci una sezione apposta mi limiterò a parlare di un prodotto amazon: il kindle. Una delle peggiori esperienze della mia vita. Ho avuto un kindle, in realtà probabilmente non me ne sarei fatto nulla ma tutti ne parlavano bene e l’ho provato. Prendi il fire 6 dicevano, ok prendo il fire 6, ma che schifezza! In pratica è un mini tablet che vorrebbe sembrare un ipad mini che però non vale l’1% di un ipad mini. Una cosa terrificante. Per un po’, qualche mese, non l’ho usato e mai l’avessi fatto, non si accendeva più. Si trovano in amazon informazioni per risolvere il problema? A quanto pare no, ma ancora peggio sanno che può succedere questo problema. Che tristezza sembra quasi al pari di obsolescenza programmata, una pratica nota nella tecnologia ma non viene considerata tale, il problema è che loro sanno che il problema esiste ma non fanno nulla",
    "rating": 1,
    "publishedDate": "2026-09-02",
    "experienceDate": "2026-09-02",
    "isVerified": false,
    "summary": "Il kindle è una fregatura",
    "languageCode": "it",
    "usefulVotes": 0,
    "reviewer": {
      "name": "Antonio",
      "location": "IT",
      "reviewCount": 24
    }
  }
}
```

#### 💳 Pricing

The primary pay-per-event charge is `$0.00001` for each public business review saved to the dataset. A run with no saved review does not trigger this review event.

#### 🔌 Integrations

Use the dataset link in the output to inspect rows or export them as JSON or CSV in Apify. The dataset can also be read through the Apify API.

For a visual guide, watch:

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What does the Actor return for each review?

Each row has one `business` object and one `review` object. This joins the review text, rating, dates, and source links with the business rating, review count, star distribution, categories, and available public profile details.

##### What is the difference between the two review dates?

`publishedDate` is when the review was posted on Trustpilot. `experienceDate` is when the customer says the experience happened. They can be different dates.

##### Can I get only certain star ratings?

Yes. Set `ratingFilter.minStars` and `ratingFilter.maxStars` to the same value for an exact rating. Use different values for a range, or leave both empty for every rating.

##### Can I filter by language, date, reply, or review text?

Yes. Use `languageCodes`, `publishedFrom`, `publishedTo`, `repliedOnly`, or `reviewKeyword`. The date limits use the `YYYY-MM-DD` format.

##### What happens when optional source data is missing?

Fields such as contact details, reviewer context, useful votes, and replies may be absent when the public Trustpilot page does not provide them. The Actor does not fill in missing source values.

##### How are duplicate reviews handled?

The first eligible match is saved as soon as it is found. If the same source review appears again through another URL, keyword, or similar submitted value, the later match is ignored. One row does not combine evidence from later matches.

##### Can I use a business keyword instead of a URL?

Yes. Choose `Business keywords` in `Find reviews by`, then add ordinary business keywords or short phrases. The Actor uses them to find matching Trustpilot business pages.

##### Does it need a Trustpilot login or source credential?

No. The Actor reads public Trustpilot business pages without a Trustpilot login or a customer-provided source credential.

##### What if no review matches my filters?

A narrow combination of stars, language, dates, reply status, and review keyword can leave no matching review rows. Widen or remove a filter when you need more matches.

##### How many reviews can I collect for one company?

Set a positive `maxReviewsPerCompany` value to limit one company. Leave it empty to collect all available public reviews until the source is exhausted. The input schema has no fixed upper bound for this field.

##### How many company URLs can I submit?

The `companyUrls` field accepts up to 200 company targets in one run.

##### Does the Actor return reviewer contact details?

No personal reviewer contact fields are part of the public output. The row can include a reviewer's public name, location, and review count when available. Business contact fields are separate and contain public business details when available.

### 📝 Changelog

**v0.0** (02-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~trustpilot-business-reviews/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Yelp Business Review Scraper](https://apify.com/maximedupre/yelp-business-reviews): Collect full-text reviews and ratings for public Yelp businesses.
- [Yelp Scraper: Reputation Monitor](https://apify.com/maximedupre/yelp-reputation-monitor): Track public Yelp ratings, review evidence, and changes for local businesses.
- [Facebook Reviews Scraper](https://apify.com/maximedupre/facebook-reviews-scraper): Collect public Facebook Page recommendations and review engagement.
- [Google Maps List Scraper: 30+ Fields Per Place](https://apify.com/maximedupre/google-maps-shared-list-scraper): Export local place ratings, review counts, and public business details from shared lists.
- [Trustpilot Reviews Scraper Pro](https://apify.com/crawlerbros/trustpilot-reviews-scraper-pro): Collect Trustpilot reviews with rating, language, date, keyword, verification, and reply filters.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `discoveryMethod` (type: `string`):

Choose how to find the Trustpilot business pages to process.

## `companyUrls` (type: `array`):

Add one or more full URLs. Each URL can be a Trustpilot business review page or a company domain. Up to 200 company targets are supported. Use this field when Find reviews by is Trustpilot pages or domains.

## `businessKeywords` (type: `array`):

Add one or more ordinary business keywords or short phrases. The Actor uses them to find matching Trustpilot business pages. Use this field when Find reviews by is Business keywords.

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

Optional positive whole number of reviews to collect for each company. Leave empty to collect all available public reviews until the source is exhausted.

## `ratingFilter` (type: `object`):

Optionally filter reviews by stars. Set minimum and maximum to the same number for an exact rating, or use different numbers for a range. Leave both empty to include every rating.

## `languageCodes` (type: `array`):

Optionally include only reviews in the listed languages. Enter language codes such as en or de, or leave this field empty to include all available languages.

## `publishedFrom` (type: `string`):

Only include reviews published on or after this date. Use YYYY-MM-DD.

## `publishedTo` (type: `string`):

Only include reviews published on or before this date. Use YYYY-MM-DD.

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

Turn on to include only reviews marked as verified. Leave off to include all reviews.

## `repliedOnly` (type: `boolean`):

Turn on to include only reviews with a public business reply. Leave off to include reviews with or without a reply.

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

Optionally include only reviews whose title or full text contains this keyword. Leave empty to include all reviews.

## `__concurrency` (type: `integer`):

Internal optimization concurrency.

## Actor input object example

```json
{
  "discoveryMethod": "trustpilotPages",
  "companyUrls": [
    {
      "url": "https://www.trustpilot.com/review/example.com"
    }
  ],
  "businessKeywords": [
    "coffee shop",
    "accounting software"
  ],
  "maxReviewsPerCompany": 1,
  "publishedFrom": "2024-01-01",
  "publishedTo": "2024-12-31",
  "verifiedOnly": false,
  "repliedOnly": false,
  "reviewKeyword": "delivery",
  "__concurrency": 16
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the collected Trustpilot business reviews.

# 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 = {
    "discoveryMethod": "trustpilotPages",
    "companyUrls": [
        {
            "url": "https://www.trustpilot.com/review/www.amazon.com"
        }
    ],
    "maxReviewsPerCompany": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/trustpilot-business-reviews").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 = {
    "discoveryMethod": "trustpilotPages",
    "companyUrls": [{ "url": "https://www.trustpilot.com/review/www.amazon.com" }],
    "maxReviewsPerCompany": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/trustpilot-business-reviews").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 '{
  "discoveryMethod": "trustpilotPages",
  "companyUrls": [
    {
      "url": "https://www.trustpilot.com/review/www.amazon.com"
    }
  ],
  "maxReviewsPerCompany": 1
}' |
apify call maximedupre/trustpilot-business-reviews --silent --output-dataset

```

## MCP server setup

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

```

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/jThR7mp3gVQQwgNd5/builds/qY7sfEYQz2VyO5Nd7/openapi.json
