# Trustpilot Scraper (`devon_gtme/trustpilot-scraper`) Actor

Scrape Trustpilot business profiles, ratings, and customer reviews. Extract structured data from any business listed on Trustpilot, or browse by category.

- **URL**: https://apify.com/devon\_gtme/trustpilot-scraper.md
- **Developed by:** [Devon Kellar](https://apify.com/devon_gtme) (community)
- **Categories:** Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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/platform/actors/running/actors-in-store#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 Scraper

Trustpilot doesn't offer a free or unrestricted API for review data. This actor extracts business profiles, ratings, and customer reviews from Trustpilot at scale.

Supported features:

- Scrape any business profile by URL (e.g. `/review/www.wayfair.com`)
- Scrape category listings (e.g. `/categories/electronics_technology`)
- Extract full company info: TrustScore, stars, review count, verified/claimed status, website, address, categories, description, logo
- Extract individual customer reviews with rating, title, body, date, author, verified status, and business reply
- Two scrape modes: `listing` (cards only, fast) or `full` (profile pages + reviews)
- Review pagination across multiple pages per business
- Filter reviews by minimum star rating

### Use cases

- **Reputation monitoring** — track TrustScore and review trends for your brand or competitors
- **Sentiment analysis** — extract review text at scale for NLP processing
- **Competitive intelligence** — benchmark category leaders on review volume and rating
- **Customer voice research** — discover common complaints/praise themes
- **Lead generation** — build lists of businesses by category, country, and trust score

### Input parameters

**domains** — (Array of strings) The simplest way to scrape businesses. Just paste the domain — `wayfair.com`, `www.wayfair.com`, `https://wayfair.com` all work. The actor constructs the Trustpilot URL automatically.

**startUrls** — (Array, advanced) Full Trustpilot URLs. Use for category pages (`/categories/...`) or country-prefixed URLs (`/uk/review/...`). For business pages, prefer `domains` — easier and cleaner.

**scrapeMode** — `listing` (extract from category cards only — fast, no review data) or `full` (visit each business page for complete data + reviews). Default `full`.

Listing mode emits a subset of the full schema (`url`, `name`, `domain`, `trustScore`, `stars`, `reviewCount`, `primaryCategory`, `categories`, `country`). Note that `country` in listing mode comes from the category card and is the **display name** ("United States"), while full mode pulls `country` from `contactInfo` as an **ISO code** ("US"). Both fields use the same name so consumers can branch on `scrapeMode`.

**includeReviews** — Extract individual reviews. Only used in full mode. Default `true`.

**maxReviewsPerBusiness** — Max reviews per business. `0` = all visible. Default `20`. Higher values trigger review pagination across pages.

**reviewStartPage** — First review page to scrape (1 = newest). Trustpilot orders reviews newest-first per page. Set to `2` to skip the most recent ~20 reviews. Default `1`.

**reviewEndPage** — Last review page to scrape. `0` = no limit. Combine with `reviewStartPage` for a windowed slice of reviews (e.g. start=1 end=5 = newest 100 reviews).

**starsFilter** — (Array) Only fetch reviews with these star ratings. `[1]` = 1-star only, `[1,2]` = 1-2 star. Empty = all. Uses Trustpilot's native `?stars=` URL filter — server-side, no extra cost.

**reviewsSince / reviewsUntil** — (YYYY-MM-DD) Only keep reviews published in this date range. Client-side filter applied after fetch.

**minReviewRating** — Filter out reviews below this star rating (1-5). `0` = no filter. Default `0`.

**endPage** — Stop category pagination after this page. `0` = no limit. Default `0`.

**maxItems** — Max total businesses. `0` = no limit. Default `0`.

**proxy** — Proxy config. Residential proxies required for Cloudflare bypass.

### Tips

- Drop business URLs directly into `startUrls` for targeted scraping — much faster than category traversal.
- Country variants work: `https://www.trustpilot.com/uk/review/www.example.com`.
- Set `maxReviewsPerBusiness: 0` to scrape every review (warning: large businesses have 10k+).
- Cloudflare can be flaky — first attempts sometimes fail and auto-retry on a different proxy IP.

### Compute unit consumption

Playwright + residential proxy + Cloudflare resolution overhead — similar to the TrustRadius scraper.

- **Listing mode** (~20 businesses per category page): ~0.005 CU per page
- **Full mode** (single business, 1 page of reviews): ~0.01 CU
- **Full mode with deep review pagination** (50+ reviews per business): ~0.02-0.05 CU per business

Memory: 2048 MB recommended.

### Input examples

#### Scrape a few specific businesses with reviews

```json
{
    "domains": ["wayfair.com", "overstock.com"],
    "scrapeMode": "full",
    "includeReviews": true,
    "maxReviewsPerBusiness": 50,
    "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

#### Only 1-star reviews (server-side filter)

```json
{
    "domains": ["wayfair.com"],
    "starsFilter": [1],
    "maxReviewsPerBusiness": 50,
    "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

#### Reviews from a specific recency window

```json
{
    "domains": ["wayfair.com"],
    "reviewStartPage": 1,
    "reviewEndPage": 3,
    "maxReviewsPerBusiness": 0,
    "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

#### Reviews in a date range

```json
{
    "domains": ["wayfair.com"],
    "reviewsSince": "2026-04-01",
    "reviewsUntil": "2026-04-30",
    "maxReviewsPerBusiness": 200,
    "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

#### Bulk scrape a category (cards only)

```json
{
    "startUrls": [
        { "url": "https://www.trustpilot.com/categories/electronics_technology" }
    ],
    "scrapeMode": "listing",
    "endPage": 5,
    "maxItems": 100,
    "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

#### Filter for high-rated reviews only

```json
{
    "startUrls": [
        { "url": "https://www.trustpilot.com/review/www.wayfair.com" }
    ],
    "includeReviews": true,
    "maxReviewsPerBusiness": 100,
    "minReviewRating": 4,
    "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Output schema

```json
{
    "url": "https://www.trustpilot.com/review/www.wayfair.com",
    "name": "Wayfair USA",
    "domain": "www.wayfair.com",
    "trustScore": 1.4,
    "stars": 1.5,
    "reviewCount": 5515,
    "primaryCategory": "Furniture Store",
    "categoryHierarchy": {
        "top": "Home & Garden",
        "mid": "Furniture Stores",
        "bottom": "Furniture Store"
    },
    "categories": ["Furniture Store", "Bedroom Furniture Store", "Children's Store", "..."],
    "country": "US",
    "website": "https://www.wayfair.com/",
    "phone": "1-877-Wayfair",
    "email": "Service@Wayfair.com",
    "address": { "street": "", "city": "Boston", "zip": "02116", "country": "US" },
    "description": "",
    "aiSummary": "Evaluating 737 reviews, most reviewers were let down by their experience overall...",
    "logo": "https://...",
    "isClaimed": true,
    "isVerified": false,
    "verification": {
        "verifiedByGoogle": false,
        "verifiedPaymentMethod": false,
        "verifiedUserIdentity": false
    },
    "claimedDate": "2017-04-03T15:56:22.000Z",
    "isAskingForReviews": false,
    "replyBehavior": {
        "replyPercentage": 92.59,
        "averageDaysToReply": 0.16,
        "lastReplyToNegativeReview": "2026-05-10 16:59:13 UTC"
    },
    "reviews": [
        {
            "id": "abc123",
            "rating": 5,
            "title": "Great experience",
            "body": "...",
            "date": "2026-04-10T12:34:56Z",
            "experienceDate": "2026-04-08T00:00:00Z",
            "author": "Jane D.",
            "authorLocation": "US",
            "authorReviewCount": 3,
            "verified": true,
            "language": "en",
            "reply": "Thanks for your feedback...",
            "replyDate": "2026-04-11T09:00:00Z"
        }
    ],
    "scrapeMode": "full"
}
```

#### Output fields

| Field | Description |
|-------|-------------|
| `url` | Trustpilot business URL |
| `name` | Business display name |
| `domain` | Identifying domain |
| `trustScore` | TrustScore (1.0 - 5.0) |
| `stars` | Star rating (1-5) |
| `reviewCount` | Total reviews on Trustpilot |
| `primaryCategory` | Most specific category |
| `categoryHierarchy` | `top` / `mid` / `bottom` levels from Trustpilot breadcrumb |
| `categories` | All assigned Trustpilot category names |
| `country` | Country code from `contactInfo` |
| `website` | Company website URL |
| `phone` | Phone number |
| `email` | Contact email |
| `address` | `street`, `city`, `zip`, `country` |
| `description` | Business description (empty if Trustpilot only has boilerplate) |
| `aiSummary` | **Trustpilot's AI-generated digest of reviews** |
| `logo` | Logo image URL |
| `isClaimed` | Business has claimed their profile |
| `isVerified` | True if any of the three `verification.*` flags is true |
| `verification` | All three verification booleans (Google, payment, identity) |
| `claimedDate` | When the business claimed their profile |
| `isAskingForReviews` | Whether the business is actively soliciting reviews |
| `replyBehavior` | `replyPercentage` to negative reviews, `averageDaysToReply`, `lastReplyToNegativeReview` |
| `reviews` | Array of review objects |

# Actor input Schema

## `domains` (type: `array`):

One business per line — just the domain (e.g. wayfair.com, www.wayfair.com). The actor constructs the Trustpilot URL automatically. Easier than pasting full Trustpilot URLs.

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

Optional — paste full Trustpilot URLs. Useful for category pages (/categories/...) or country-prefixed URLs (/uk/review/...). For business pages, prefer the 'Business domains' field above.

## `scrapeMode` (type: `string`):

"listing" extracts data from category cards only (fast). "full" visits each business page for complete data + reviews.

## `includeReviews` (type: `boolean`):

Extract individual reviews for each business. Only used in full mode. Increases run time.

## `maxReviewsPerBusiness` (type: `integer`):

Maximum reviews to scrape per business. 0 = no limit (paginate until last page). Only used when Include Reviews is enabled.

## `reviewStartPage` (type: `integer`):

First review page to scrape (1 = newest reviews). Trustpilot orders reviews newest-first, so reviewStartPage=2 skips the most recent 20 reviews.

## `reviewEndPage` (type: `integer`):

Last review page to scrape. 0 = no limit. Use with reviewStartPage to scrape a window of reviews by recency.

## `starsFilter` (type: `array`):

Only fetch reviews with these star ratings, e.g. \[1] for 1-star only or \[1,2] for 1-2 star. Empty = all stars. Uses Trustpilot's native ?stars= URL filter (server-side, efficient).

## `reviewsSince` (type: `string`):

Only keep reviews published on or after this date (ISO format YYYY-MM-DD). Empty = no filter.

## `reviewsUntil` (type: `string`):

Only keep reviews published on or before this date (ISO format YYYY-MM-DD). Empty = no filter.

## `minReviewRating` (type: `integer`):

Only keep reviews with star rating >= this value (1-5). 0 = no filter. Prefer starsFilter for new use.

## `endPage` (type: `integer`):

Stop category listing pagination after this page number. 0 = no limit.

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

Maximum total businesses to scrape. 0 = no limit.

## `proxy` (type: `object`):

Proxy settings. Trustpilot has Cloudflare/PerimeterX protection — residential proxies required for reliability.

## Actor input object example

```json
{
  "domains": [
    "wayfair.com",
    "overstock.com"
  ],
  "startUrls": [],
  "scrapeMode": "full",
  "includeReviews": true,
  "maxReviewsPerBusiness": 20,
  "reviewStartPage": 1,
  "reviewEndPage": 0,
  "starsFilter": [],
  "reviewsSince": "",
  "reviewsUntil": "",
  "minReviewRating": 0,
  "endPage": 0,
  "maxItems": 0,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "domains": [
        "wayfair.com",
        "overstock.com"
    ],
    "startUrls": [],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devon_gtme/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 = {
    "domains": [
        "wayfair.com",
        "overstock.com",
    ],
    "startUrls": [],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("devon_gtme/trustpilot-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "domains": [
    "wayfair.com",
    "overstock.com"
  ],
  "startUrls": [],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call devon_gtme/trustpilot-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=devon_gtme/trustpilot-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7IGRdwwehbFbv7Mbh/builds/ZEqqeHD3XAEcoQhck/openapi.json
