# Trustpilot Reviews Scraper | Review, Rating & Company Reply (`eiv/trustpilot-reviews-scraper`) Actor

Export every review a company has on Trustpilot - rating, full review text, title, reviewer, country, dates, the company's reply, and whether the review was invited or left unprompted. Filter by star rating or by date. No login and no API key.

- **URL**: https://apify.com/eiv/trustpilot-reviews-scraper.md
- **Developed by:** [Eimantas V](https://apify.com/eiv) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 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.
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

Pull a company's reviews from Trustpilot — the star rating, the full review
text, who wrote it, when, and what the company said back.

Give it a domain like `klarna.com`, or paste the address bar from any
Trustpilot page. You get one row per review and one summary row per company. No
login, no API key, no browser extension.

***

### What you get on every review

| Field | What it is |
|---|---|
| `rating` | 1 to 5 stars |
| `title`, `text` | The review as written, in full — not truncated |
| `publishedAt` | When the review went up |
| `experiencedAt` | When the experience actually happened, which is often a different date |
| `authorName`, `authorCountry` | Who wrote it and where they are |
| `authorReviewCount` | How many reviews that person has written in total |
| `replyText`, `repliedAt` | The company's public reply, where there is one |
| `isVerified` | Whether **Trustpilot** verified the review |
| `source` | `BusinessGeneratedLink` if the company invited the review, `Organic` if the customer came on their own |
| `verificationLevel` | `invited` or `not-verified` |
| `likes` | How many people marked it useful |
| `language` | The language the review is in |
| `isFiltered`, `isPending` | Trustpilot's own moderation state |
| `reviewId`, `url` | So you can open any row and check it by hand |

And one row per company: `totalReviewsReported` (what Trustpilot says the
company has), `reviewsFetched`, `pagesFetched`, and `stoppedOn` — so you always
know whether you got everything or hit a limit you set.

#### The field most people come for

`source` separates **invited** reviews from **organic** ones. A company that
emails every customer a review link and a company whose customers show up
unprompted can have the same 4.3 rating and mean completely different things.
That distinction is on every row.

Trustpilot also publishes a `verificationSource` field, and this Actor passes
it through — but do not filter on it. It reads `invitation` even on reviews
that are `Organic` and unverified, so it does not mean what its name suggests.
`source` is the field that answers the question.

***

### What it is good for

- **Competitor research** — pull a competitor's whole review history and read
  what their customers actually complain about, by month, by rating.
- **Voice of customer** — feed the text into your own analysis. Every review
  comes through whole, so nothing is cut off mid-sentence.
- **Reply-gap analysis** — `replyText` is empty on every review the company
  never answered. Filter to 1- and 2-star reviews with no reply and you have a
  list of unhappy customers nobody spoke to.
- **Screening a list of companies** — feed a thousand domains and get back
  which ones are on Trustpilot at all, what they score, and how many reviews
  they have.
- **Keeping a dataset current** — set **Published on or after** to your last
  run and it stops as soon as it reaches reviews you already have.

***

### Input

| Setting | What it does |
|---|---|
| **Companies** | One or more domains, or Trustpilot URLs. `klarna.com`, `www.klarna.com` and `https://www.trustpilot.com/review/klarna.com` are all the same company and are only fetched once. |
| **Star rating** | Return only 1-star reviews, only 5-star, and so on. Leave on *Every rating* for all of them. |
| **Published on or after** | Skip anything older. The run stops as soon as a page has nothing newer, so this is also the cheapest way to top up an existing dataset. |
| **Maximum reviews per company** | A ceiling per company. |
| **Maximum reviews in the run** | A ceiling across the whole run, so a long list of companies cannot cost more than you meant it to. |

There is deliberately **no sort option**. Trustpilot's `sort` parameter is
accepted and then ignored by their own site — it returns the identical page —
so offering a control that silently does nothing would be worse than not
offering one. Reviews come back newest first.

#### Proxy

Leave the proxy on **Unblocker**. Trustpilot sits behind a web application
firewall that refuses ordinary datacenter and residential addresses — every
page tried through those came back blocked. Unblocker is the group that works,
and it is already the default.

***

### What a row looks like

```json
{
  "reviewId": "6ab62c73e3c427c6022cbf40",
  "companyDomain": "klarna.com",
  "companyName": "Klarna",
  "rating": 4,
  "title": "helpful useful service",
  "text": "really helpful most of the time, just really frustrating that I cant buy now pay later and sometimes i cant even pay in 3",
  "publishedAt": "2026-09-25T10:10:27.000Z",
  "experiencedAt": "2026-09-25T00:00:00.000Z",
  "authorName": "Simon G",
  "authorCountry": "GB",
  "authorReviewCount": 6,
  "isVerified": true,
  "source": "BusinessGeneratedLink",
  "verificationSource": "invitation",
  "replyText": null,
  "repliedAt": null,
  "likes": 0,
  "language": "en",
  "url": "https://www.trustpilot.com/review/klarna.com"
}
```

`replyText` is `null` when the company has not replied — not an empty string,
so you can tell "no reply" from "replied with nothing".

***

### Pricing

**$0.50 per 1,000 reviews**, plus **$0.007** for each company looked up.
Starting a run costs $0.00005. Lower rates on Bronze, Silver and Gold plans.

A few real examples at the standard rate:

| What you run | What it costs |
|---|---|
| One company, 200 most recent reviews | $0.11 |
| One company, everything it will give (~1,100) | $0.56 |
| 50 competitors, 200 most recent each | $5.35 |
| 1,000 domains, just checking which are on Trustpilot | $7.00 |

The same review is never charged twice inside a run. Trustpilot's pages repeat
themselves — a single page typically carries 47 review objects that are only 39
distinct reviews — and duplicates are removed before anything is billed.

A company this Actor could not reach at all is never charged. A company that
turns out to have no reviews, or no Trustpilot page, **is** charged the lookup:
finding that out costs the same as finding anything else, and for a screening
run it is usually the answer you wanted.

***

### How many reviews you can get

**Roughly 1,100 per company** — about five times what Trustpilot's own listing
will give you in one go.

Trustpilot serves ten pages and then stops producing new reviews, whatever the
company's size. Measured on `klarna.com`, which has 603,266 reviews and hands
over 221 of them before the listing runs dry. That is the limit most Trustpilot
scrapers hit.

The limit is **per query**, though, not per company. Ask for 1-star reviews and
you get a fresh ten pages of those. So when a company runs dry, this Actor goes
back and walks each star rating separately, skipping anything it already has.
It happens automatically — there is no setting for it. Just leave **Maximum
reviews per company** above about 220 and it will go as deep as Trustpilot
allows.

Ask for fewer than that and it does the single cheap pass, because there is no
point paying for depth you did not want.

### Limits worth knowing

- Reviews come back **newest first**, within each star rating. There is no way
  to start from the oldest.
- Only reviews Trustpilot shows publicly. Reviews it has removed are not there
  to be scraped.
- `isVerified` means Trustpilot verified the *review*. It is not the same as
  the reviewer having a verified account, and the two are reported separately
  so you are never guessing which one you have.
- Ratings are per review. The company's overall TrustScore is a weighted,
  time-decayed figure Trustpilot calculates itself and does not publish per
  review, so it is not something this Actor can derive for you.

***

### Legal

This Actor reads pages Trustpilot publishes to anyone with a browser, with no
login and no account. It collects no private data and nothing behind a sign-in.
Reviewer display names and countries are published by Trustpilot on the public
page; if you are in the EU or the UK and intend to store them, that is personal
data and GDPR applies to what you do with it — have a lawful basis before you
run this at scale.

Trustpilot is a trademark of Trustpilot A/S. This Actor is not affiliated with,
endorsed by, or connected to Trustpilot.

# Actor input Schema

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

The companies to pull reviews for. Use the company's domain - klarna.com - or paste the address bar from its Trustpilot page. www. and https:// are fine either way.

## `stars` (type: `string`):

Return only reviews with this rating. Leave on "Every rating" for all of them.

## `since` (type: `string`):

Skip reviews published before this date, and stop as soon as a page has nothing newer. Reviews come back newest first, so this is also the cheapest way to keep a dataset up to date. Format: YYYY-MM-DD.

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

Stop each company at this many reviews. Trustpilot's own listing caps out around 220 per rating, so anything above that makes this Actor walk the ratings one at a time to reach roughly 1,100. Lower it if you only want the most recent handful.

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

A ceiling across every company in the run, so a long list of companies cannot cost more than you meant it to.

## `requestDelayMs` (type: `integer`):

How long to wait between page requests. The default is fine; raise it only if you are pulling very large companies and want to be gentle.

## `proxyConfig` (type: `object`):

Trustpilot sits behind a WAF that refuses both the datacenter and the residential pools, so this Actor needs the UNBLOCKER group. Changing it away from Unblocker will return nothing.

## Actor input object example

```json
{
  "companies": [
    "klarna.com"
  ],
  "stars": "",
  "maxReviewsPerCompany": 100,
  "maxTotalReviews": 100,
  "requestDelayMs": 300,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

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

No description

## `companies` (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": [
        "klarna.com"
    ],
    "maxReviewsPerCompany": 100,
    "maxTotalReviews": 100,
    "proxyConfig": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("eiv/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": ["klarna.com"],
    "maxReviewsPerCompany": 100,
    "maxTotalReviews": 100,
    "proxyConfig": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("eiv/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": [
    "klarna.com"
  ],
  "maxReviewsPerCompany": 100,
  "maxTotalReviews": 100,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call eiv/trustpilot-reviews-scraper --silent --output-dataset

```

## MCP server setup

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