# Trustpilot Reviews Scraper | Ratings & Replies (`peerless_columbine/trustpilot-reviews-data-scraper`) Actor

Scrape public Trustpilot reviews, star ratings, company replies and company data. Filter by language, rating and date; export JSON/CSV for customer feedback analysis and reputation monitoring.

- **URL**: https://apify.com/peerless\_columbine/trustpilot-reviews-data-scraper.md
- **Developed by:** [tingyou333 zhuang](https://apify.com/peerless_columbine) (community)
- **Categories:** Marketing, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.10 / 1,000 delivered reviews

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?

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 Scraper | Ratings & Replies

Scrape public Trustpilot reviews, star ratings, company replies and company data. Filter by language, rating and date; export JSON/CSV for customer feedback analysis and reputation monitoring.

**Useful for:** Review customer complaints; compare company responses; monitor recent reviews by rating and language.

**Why choose this Actor:** Select ratings, languages and publication boundaries before exporting reviews with company context. Source coverage reports make partial collection visible.

### Try a small sample

1. Click **Try for free**, then open **Input** and switch to JSON.
2. Paste the example below and click **Start**. It uses a small result limit.
3. Open the dataset to inspect results, then export JSON, CSV or Excel. Source restrictions can still cause partial or failed runs.

```json
{
  "companyUrls": [
    "pipedrive.com"
  ],
  "maxReviewsPerCompany": 20,
  "languages": [
    "all"
  ],
  "sort": "recency",
  "includeCompanyInfo": true
}
```

### Cost at a glance

Primary billing unit: **Delivered review**. Rates below are per **1,000** primary events.

| Free plan | Starter / Bronze | Scale / Silver | Business / Gold and higher |
|---:|---:|---:|---:|
| $0.3 | $0.27 | $0.22 | $0.1 |

Platform compute, proxy, transfer and storage are additional. Other event types, where enabled, are listed in the **Pricing** tab. “Try for free” uses available account credits; it does not make usage unlimited or unmetered.

**Coverage to know:** Complete historical coverage is not guaranteed. Source totals and filtered feeds can disagree; inspect coverage warnings before treating an export as exhaustive.

### Guides and full reference

Collect public reviews, reviewer information, company replies and company metadata from Trustpilot. Export JSON or CSV and use the Actor from the Apify API or scheduled tasks. No personal account or browser cookies are required.

Bounded cloud collection and delivery-billing tests have passed. Public-source access limits apply; complete historical coverage is not guaranteed. This Actor is not affiliated with Trustpilot.

Use a domain or an HTTPS `trustpilot.com/review/...` company URL. Limits apply separately to each company and count matching reviews delivered to the dataset. Query parameters in a company URL are ignored: set the corresponding input fields explicitly.

### Input reference

| Input | Default | Behavior |
| --- | --- | --- |
| `companyUrls` | Required | Nonempty array of domains or Trustpilot company URLs. Exact duplicate inputs are removed. |
| `maxReviewsPerCompany` | `0` | Maximum matching reviews per company; zero means no result cap. Set a cap for an initial trial. |
| `stars` | `[]` | Any of `"1"` through `"5"`, as strings. Empty means all ratings. |
| `languages` | `[]` | Empty preserves the website language default, commonly English. `["all"]` requests all languages; individual language codes select those languages. |
| `sort` | `"recency"` | `"recency"` or `"relevance"`, as ordered by the source. |
| `date` | `""` | All dates, or `last30days`, `last3months`, `last6months`, `last12months`. Source applies these relative windows. |
| `publishedAfter` | Unset | Strictly newer than this ISO date or timestamp. A date means midnight UTC; timestamps must contain a timezone. |
| `verified` | `false` | Requests the source's verified feed. Output eligibility accepts verified/invited review labels; reviewer identity verification is separate. |
| `withReplies` | `false` | Only reviews with a company reply. |
| `includeCompanyInfo` | `true` | Include company fields alongside each review. |

For multiple requested languages, the Actor reads the all-language feed and filters the union locally, preserving source order. This can fetch substantially more reviews than it returns. With recency sorting, `publishedAfter` stops pagination after the first fetched page reaches the exact publication cutoff. Observed publication dates must be nonincreasing within and across fetched pages; otherwise the target fails. Relevance sorting scans the selected feed because that order cannot establish a time boundary. Use a source `date` window where appropriate to reduce work.

### Output fields

| Group | Fields |
| --- | --- |
| Review | `reviewId`, `reviewUrl`, `title`, `text`, `rating`, `publishedDate`, `experienceDate`, `updatedDate`, `language`, `likes`, `source` |
| Review verification | `verificationLevel`, `isVerified` |
| Reviewer | `authorName`, `authorId`, `authorImage`, `authorReviewCount`, `country`, `authorIsVerified` |
| Reply | `replyMessage`, `replyPublishedDate`, `replyUpdatedDate` |
| Company | `companyName`, `companyDomain`, `companyTrustScore`, `companyStars`, `companyTotalReviews`, `companyCategories`, `companyUrl`, `companyId` |
| Additional source fields | `submittedDate`, `sameCompanyReviewCount` |

Unavailable source values remain null. Company fields are omitted when `includeCompanyInfo` is false. `companyTrustScore` is the numeric score; `companyStars` is the displayed star value and can differ. `authorIsVerified` does not establish that a review is verified.

Four dataset views display Reviews, Authors and verification, Company replies, and Company metadata. JSON export contains all fields, regardless of the selected table view.

### Example review record

A frozen example from the private cloud probe epbvRwqm6BefjIJCY; company totals and replies can change later.

```json
{
  "reviewId": "6a9803f1574b106456ec6975",
  "reviewUrl": "https://www.trustpilot.com/reviews/6a9803f1574b106456ec6975",
  "title": "The meeting was really helpful",
  "text": "The meeting was really helpful and Rafael very easy to talk to. I got good advice and look forward for our next session. ",
  "rating": 5,
  "publishedDate": "2026-09-02T13:09:37.000Z",
  "experienceDate": "2026-09-02T00:00:00.000Z",
  "updatedDate": null,
  "language": "en",
  "likes": 0,
  "verificationLevel": "invited",
  "isVerified": false,
  "source": "BasicLink",
  "authorName": "Marian Seppälä",
  "authorId": "6a9803e3452b16209f4da30a",
  "authorImage": "https://user-images.trustpilot.com/6a9803e3452b16209f4da30a/73x73.png",
  "authorReviewCount": 1,
  "country": "SE",
  "replyMessage": "Hi Marian,\n\nThank you for sharing your feedback!\n\nWe’re glad to hear that you found the meeting helpful and that the team made the session easy and comfortable. \nIt’s great to know that you received useful advice and are looking forward to the next session.\n\nBest regards,\nPipedrive Team",
  "replyPublishedDate": "2026-09-02T13:19:01.000Z",
  "replyUpdatedDate": null,
  "authorIsVerified": false,
  "submittedDate": null,
  "sameCompanyReviewCount": 1,
  "companyName": "Pipedrive",
  "companyDomain": "pipedrive.com",
  "companyTrustScore": 4.4,
  "companyStars": 4.5,
  "companyTotalReviews": 3447,
  "companyCategories": [
    "Business to Business Service",
    "CRM Provider",
    "Software Company"
  ],
  "companyUrl": "https://www.trustpilot.com/review/pipedrive.com",
  "companyId": "514581950000640005241c4f"
}
```

### Counts, limits and failures

The `OUTPUT` key-value-store record provides per-company delivered/fetched counts, page counts, actual source filters, source totals, limit/exhaustion status and `failedTargets`. Source `filteredTotal` and profile `companyTotal` measure different populations. For a language union, `filteredTotal` describes the all-language feed read, not just the delivered languages. Exhausting a selected feed does not prove every review counted on the company profile is publicly accessible.

The Actor validates company identity, pagination counts, applied filters, duplicate IDs and cross-page consistency. A changing source total or inconsistent page fails the target rather than claiming complete history. Only a `www.` domain alias is accepted automatically; other identity changes are rejected.

Network timeouts, connection resets and HTTP 429/500/502/503/504 receive at most one retry per page, sharing a two-navigation budget with query-redirect recovery. Invalid input and inconsistent data are not treated as empty results. HTTP 404 fails immediately. Challenges that do not clear through normal loading time out; there is no CAPTCHA solver.

A failed company does not discard earlier successful companies or already delivered reviews. **Inspect `failedTargets` even if the run status is SUCCEEDED.** All-company failure makes the run fail. A genuine empty selected feed succeeds with zero reviews.

### API example

Store your Apify token in an environment variable; never put it in the Actor input.

```bash
curl --request POST \
  --header "Authorization: Bearer $APIFY_TOKEN" \
  --header 'Content-Type: application/json' \
  --data '{"companyUrls":["pipedrive.com"],"maxReviewsPerCompany":20}' \
  'https://api.apify.com/v2/acts/peerless_columbine~trustpilot-reviews-data-scraper/runs'
```

The response contains the run ID and dataset ID. Poll `/v2/actor-runs/{runId}` until terminal, retrieve `/v2/datasets/{defaultDatasetId}/items`, and inspect the default key-value store's `OUTPUT` record for completeness and failures. Use your own Apify account and API token.

### Verification and current limits

Bounded cloud tests cover Pipedrive combinations of star/date/language/reply filters, multi-page acquisition, verified/relevance sorting, genuine empty results, multiple companies and `www` redirects. A German/French union delivered four matching reviews after fetching 180 reviews across nine pages. These examples do not establish a general success-rate or cost advantage.

Input and principal output names target compatibility with `automation-lab/trustpilot` build 0.1.46. Exact paid-run value parity has not been established. Transient retry fault tests are local; cloud failure/recovery coverage is still being expanded. Owner PPE cap/empty tests pass; customer settlement, full cost comparison and broader workload validation remain pending. No revenue or universal competitor superiority is claimed.

### Pricing

Delivered reviews per 1,000: Free $0.30; Bronze $0.27; Silver $0.22; Gold $0.10; Platinum $0.10; Diamond $0.10. Platform usage is additional. No custom start event fee; even zero-result runs may incur platform usage. This replaces the earlier internal $0.003 startup draft. Owner cloud tests verified two delivered rows/two events at the event cap and zero review events for empty results. Owner tests do not establish customer settlement.

When the event budget is exhausted, the Actor stops delivering, marks budgetReached, and lists unstarted companies under skippedTargets. This is a partial result, not an exhausted feed.

When cursorReached is true, the run reached the requested publication boundary; it did not exhaust all historical reviews. Reviews at the exact timestamp are excluded. This does not detect edits to reviews published before the cursor.

### Python client example

Use the `apify-client` package. The iterator handles dataset pagination; checking the run and diagnostics prevents silently treating a partial run as complete.

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("peerless_columbine/trustpilot-reviews-data-scraper").call(
    run_input={"companyUrls": ["pipedrive.com"], "maxReviewsPerCompany": 20}
)
if run is None or run["status"] != "SUCCEEDED":
    raise RuntimeError("Actor did not complete successfully")
record = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("OUTPUT")
summary = record["value"]
if summary["failedTargets"] or summary.get("budgetReached"):
    raise RuntimeError(f"Partial run: {summary}")
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(review["reviewId"], review["rating"], review["text"])
```

The requested result cap can intentionally produce a partial historical feed even when no target failed. Use each target's `limitReached`, `cursorReached` and `exhaustedSelectedFeed` fields to distinguish these outcomes. Configure schedules and integrations in Apify Console; they are platform features, not custom notification logic in this Actor.

### Known source login limit

A cloud run of the last12months Pipedrive feed was redirected to Trustpilot login on page11 after200 delivered reviews, although the selected total was398. This run failed with partial data; complete long-history extraction is not verified. Login redirects stop the target without retry or personal credentials. Previously verified complete6-page/4-page feeds remain bounded evidence, not a guarantee of unrestricted history.

Delivery counts use the SDK accepted count for priced review events. Reviews rejected by the event budget do not increase `rowsSaved`. Free or zero-priced writes can still save records. A positive automatic dataset-item fee alongside the review fee is rejected to prevent duplicate charges. An uncertain write is reported as a target failure and is not automatically replayed. These controls do not remove the documented source-access limits.

Repeated company inputs are merged after domain normalization, including the equivalent `www` alias. The first submitted form is retained, so entering both `example.com` and `www.example.com` does not create two crawls or duplicate review charges. Other subdomains remain separate targets. This uses the same company-identity rule as source-page validation.

### Reading completion and failure reports

The **Source counts, limits and failed targets** output opens the native key-value
record list. Open `OUTPUT` for per-company delivery counts, parsed source pages,
fetched reviews, limits, budget stops and failures. The raw API record remains
`/v2/key-value-stores/{storeId}/records/OUTPUT`.

`pagesFetched` counts successfully parsed source pages even if later continuity,
filtering or delivery validation fails. Failed targets also retain `reviewsFetched`;
these counts do not mean those reviews were delivered or the source was complete.
If both the requested result cap and event budget are reached on the same review,
`limitReached` and `budgetReached` are both true. Inspect `skippedTargets` for
companies not started after the budget stop.

### Measured customer-cost examples

The default run limit is 900 seconds with 1,024 MB of memory. Console/API overrides take precedence. A longer timeout does not solve source login restrictions.

The table reprices measured private-run resource quantities using the [public platform tariffs](https://apify.com/pricing) and our current Bronze result fee ($0.27 per 1,000 delivered reviews, no custom start fee). It includes compute, transfers and run storage operations; it is not a customer invoice. Historical samples may precede the active fee configuration.

| Observed workload | Delivered reviews | Result fee | Platform resources | Modeled total |
| --- | ---: | ---: | ---: | ---: |
| One complete selected three-month feed | 109 | $0.029430 | $0.002901 | $0.032331 |
| One complete selected German-language feed | 78 | $0.021060 | $0.002521 | $0.023581 |
| Multiple-language filter sample | 4 | $0.001080 | $0.002313 | $0.003393 |
| Two reviews, stopped at event budget | 2 | $0.000540 | $0.001404 | $0.001944 |

These examples exclude monthly plan commitment, taxes, post-run downloads and time-based retention. Source size, filters, retries and runtime versions can change costs. A sparse language filter can fetch substantially more than it delivers; an event budget does not cap platform-resource spending. No uniform cost per 1,000 reviews, unrestricted-history support or future savings guarantee follows from these samples.

#### Public star-feed coverage

For chronological requests above200 results (or unlimited), when the source reports more than200 matching reviews, this version merges the five public star-filter lists by publication time. It retains all original filters, checks ordering and duplicates, and never requests beyond the exposed ten-page anonymous range of any individual list. If one required list still exceeds that range, coverage remains blocked; unrestricted history is not promised.

The source can report a different total on its unfiltered landing than the sum of its star-filter lists. Valid rows are retained, but `sourceTotalsConsistent=false`, `exhaustedSelectedFeed=false`, and a warning make clear that global completeness is unverified. `partitionTotal` and `exhaustedPartitions` describe only those independently fetched lists. A bounded result is not complete history even when the requested result limit is met.

# Actor input Schema

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

Enter Trustpilot company URLs (e.g., https://www.trustpilot.com/review/example.com) or just the domain (e.g., example.com). One per line.

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

Maximum number of reviews to scrape per company. Set to 0 for unlimited reviews.

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

Filter reviews by star rating. Select one or more ratings (for example, 1 star and 5 stars) or leave empty for all ratings.

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

ISO language codes. Empty uses the website default, commonly English; all selects all languages. Multiple codes read the all-language feed and filter matching output, which can increase platform usage.

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

Order by newest publication first (recency, default) or source relevance.

## `date` (type: `string`):

Optional Trustpilot date preset. Choose last 30 days, 3 months, 6 months, or 12 months; leave empty for all dates.

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

Only save reviews published strictly after this ISO date or date-time. Use YYYY-MM-DD (midnight UTC) or a timestamp with timezone such as 2026-09-01T12:00:00Z. With recency sorting, pagination stops once older reviews are reached.

## `verified` (type: `boolean`):

Only scrape verified reviews.

## `withReplies` (type: `boolean`):

Only scrape reviews that have a company reply.

## `includeCompanyInfo` (type: `boolean`):

Include company metadata (trust score, total reviews, categories) in each review record.

## Actor input object example

```json
{
  "companyUrls": [
    "pipedrive.com"
  ],
  "maxReviewsPerCompany": 20,
  "languages": [
    "en"
  ],
  "sort": "recency",
  "date": "",
  "verified": false,
  "withReplies": false,
  "includeCompanyInfo": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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 = {
    "companyUrls": [
        "pipedrive.com"
    ],
    "maxReviewsPerCompany": 20,
    "languages": [
        "en"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("peerless_columbine/trustpilot-reviews-data-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 = {
    "companyUrls": ["pipedrive.com"],
    "maxReviewsPerCompany": 20,
    "languages": ["en"],
}

# Run the Actor and wait for it to finish
run = client.actor("peerless_columbine/trustpilot-reviews-data-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 '{
  "companyUrls": [
    "pipedrive.com"
  ],
  "maxReviewsPerCompany": 20,
  "languages": [
    "en"
  ]
}' |
apify call peerless_columbine/trustpilot-reviews-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,peerless_columbine/trustpilot-reviews-data-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/v85T9OX2kyPlDgHzD/builds/cwgQkSWjR78ufiAdq/openapi.json
