---
title: "Trustpilot scraper"
description: "Scrape Trustpilot company pages as JSON: TrustScore, star distribution, review count, AI summary and reviews with rating, text, date and country. One API request."
canonical: https://www.zenrows.com/scrape/trustpilot
updated: 2026-10-20
---

# Trustpilot scraper

The Zenrows Trustpilot scraper turns any Trustpilot company page into structured JSON: TrustScore, rating label, total reviews, reviews in the last 12 months, the star distribution, Trustpilot's AI review summary, categories, and each review with rating, title, text, date, language and reviewer country. Fetch in Adaptive Stealth Mode opens the page, and Extract returns the fields. Run it from an API call, the CLI or an AI agent.

- Site: trustpilot.com
- Returns: TrustScores, star distributions and reviews

## Run it: one Trustpilot company in, JSON out

```json Input
{
  "url": "https://www.trustpilot.com/review/www.amazon.com",
  "mode": "auto",
  "extract": "auto"
}
```

```json Output
{
  "company": {
    "name": "Amazon",
    "website_url": "https://www.amazon.com",
    "trustpilot_profile_url": "https://www.trustpilot.com/review/www.amazon.com",
    "country": "United Kingdom",
    "claimed_profile": true,
    "claimed_since": "2015-02-18T19:08:43.000Z"
  },
  "aggregate_rating": {
    "trust_score": 1.6,
    "rating_label": "bad",
    "total_reviews": 49938,
    "reviews_last_12_months": 9258
  },
  "reviews": [
    {
      "review_id": "6ad5d417421b2119ddc582c0",
      "rating": 4,
      "title": "On the whole, I'm impressed.",
      "body": "Our busy lives have meant that online shopping has been becoming more appealing. So much of their operation has been highly efficient, on almost every occasion…",
      "date_published": "2026-10-19T10:25:59.000Z",
      "label": "Unprompted review",
      "language": "en",
      "reviewer_name": "P. S.",
      "reviewer_country": "GB",
      "reviewer_total_reviews": 191
    }
  ]
}
```

Request and output of a live call to Amazon's Trustpilot page on Oct 20, 2026, trimmed for length. A field is returned when the page shows it.

## What data can you scrape from Trustpilot?

A Trustpilot company page carries the company's score, how its ratings split, Trustpilot's own summary and a page of reviews. These are the fields teams use most, with the path where each lives in the JSON.

| Field | What it holds | Example |
|---|---|---|
| `company.name` | The company as Trustpilot lists it | `Amazon` |
| `company.website_url` | The domain the profile belongs to | `https://www.amazon.com` |
| `company.claimed_profile` | Whether the company manages its Trustpilot page | `true` |
| `company.claimed_since` | When the company claimed the page | `2015-02-18T19:08:43.000Z` |
| `aggregate_rating.trust_score` | The TrustScore out of 5 | `1.6` |
| `aggregate_rating.rating_label` | Trustpilot's word for the score | `bad` |
| `aggregate_rating.total_reviews` | All reviews on the profile | `49938` |
| `aggregate_rating.reviews_last_12_months` | Reviews in the past year | `9258` |
| `rating_distribution[]` | Count and share of each star level | `{ "stars": 1, "count": 33607, "percentage": 67 }` |
| `ai_review_summary.summary_text` | Trustpilot's AI summary of recent reviews | `Considering 6,138 reviews, most reviewers…` |
| `categories[]` | The categories the company is listed in, with links | `{ "name": "Book Store" }` |
| `reviews[].rating` | Stars given in the review, 1 to 5 | `4` |
| `reviews[].title` | The review headline | `On the whole, I'm impressed.` |
| `reviews[].body` | The full review text | `Our busy lives have meant…` |
| `reviews[].date_published` | When the review went live, in UTC | `2026-10-19T10:25:59.000Z` |
| `reviews[].label` | How the review was collected | `Unprompted review` |
| `reviews[].reviewer_country` | The reviewer's country code | `GB` |
| `reviews[].review_id` | Trustpilot's review ID, for dedupe | `6ad5d417421b2119ddc582c0` |

## How to scrape Trustpilot with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Build the company URL.** Trustpilot keys every company page on its domain: `https://www.trustpilot.com/review/<domain>`. Add `?page=2`, `?stars=1` or `?languages=all` to the URL to page through or filter the reviews.
3. **Send it with the default configuration**: Adaptive Stealth Mode to open the page and Extract to return the fields.
4. **Read `parsed`** from the response. For score tracking across many companies, keep only the rating group and skip the review text.
5. **Run your company list in Batch** once one page comes back the way you want.

```python Python
# pip install requests
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": "https://www.trustpilot.com/review/www.amazon.com",
    "mode": "auto",          # Adaptive Stealth Mode
    "extract": "auto",       # structured JSON
}
response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
response.raise_for_status()

data = response.json()["parsed"]
score = data["aggregate_rating"]
print(data["company"]["name"], score["trust_score"], score["total_reviews"])
for review in data["reviews"]:
    print(review["rating"], review["date_published"][:10], review["title"])
```

```javascript Node.js
// Node 18+ (built-in fetch)
const params = new URLSearchParams({
  apikey: "YOUR_ZENROWS_API_KEY",
  url: "https://www.trustpilot.com/review/www.amazon.com",
  mode: "auto",
  extract: "auto",
});

const response = await fetch(`https://api.zenrows.com/v1/?${params}`, {
  signal: AbortSignal.timeout(180_000),
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);

const { parsed } = await response.json();
console.log(parsed.company.name, parsed.aggregate_rating.trust_score);
console.table(parsed.rating_distribution);
```

```bash cURL
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.trustpilot.com%2Freview%2Fwww.amazon.com&mode=auto&extract=auto"

# Only the fields you need
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.trustpilot.com%2Freview%2Fwww.amazon.com&mode=auto&extract=auto&extract_fields=company.name%2Caggregate_rating.trust_score%2Caggregate_rating.total_reviews%2Crating_distribution"
```

```python Python SDK
# pip install zenrows
from zenrows import ZenRowsClient

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
reviews = []
for page in range(1, 4):  # the first three pages of one-star reviews
    response = client.get(
        f"https://www.trustpilot.com/review/www.amazon.com?stars=1&page={page}",
        params={"mode": "auto", "extract": "auto"},
    )
    reviews += response.json()["parsed"]["reviews"]
print(len(reviews), "reviews")
```

## Input

The scraper takes one Trustpilot URL per request, plus the options below. The same parameters go into every task of a Batch job, so the input for a competitor set is a list of company URLs with these settings.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | A company page, `https://www.trustpilot.com/review/<domain>`, with optional `page`, `stars`, `languages` or `sort` filters in the query string |
| `mode` | string | `auto` | Adaptive Stealth Mode: starts with the lightest setup and adds rendering and protected-site handling only when the page needs them |
| `extract` | string | `auto` | Returns the page's fields as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Comma-separated paths to keep, such as `aggregate_rating,rating_distribution` |
| `proxy_country` | string | any | Two-letter country code. Trustpilot favors reviews in the visitor's language on the first page |
| `wait_for` | string | none | A CSS selector to wait for before the page is read |
| `session_id` | integer | none | Reuse the same session while you page through one company's reviews, up to 10 minutes |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto"
  },
  "tasks": [
    { "url": "https://www.trustpilot.com/review/www.amazon.com", "external_id": "amazon" },
    { "url": "https://www.trustpilot.com/review/www.amazon.com?page=2", "external_id": "amazon-p2" },
    { "url": "https://www.trustpilot.com/review/www.ebay.com", "external_id": "ebay" }
  ]
}
```

## Output

Every response is JSON with two keys: `html`, the page as Trustpilot served it, and `parsed`, the structured record. One company page returns the profile, the score and a page of reviews, here split into two blocks for reading. Both are trimmed outputs of the same live request.

```json Company and rating
{
  "company": {
    "name": "Amazon",
    "website_url": "https://www.amazon.com",
    "trustpilot_profile_url": "https://www.trustpilot.com/review/www.amazon.com",
    "country": "United Kingdom",
    "claimed_profile": true,
    "claimed_since": "2015-02-18T19:08:43.000Z",
    "description": "Online shopping from the earth's biggest selection of books, magazines, music, DVDs, videos, electronics…"
  },
  "aggregate_rating": {
    "trust_score": 1.6,
    "rating_label": "bad",
    "total_reviews": 49938,
    "reviews_last_12_months": 9258
  },
  "rating_distribution": [
    { "stars": 5, "count": 8956, "percentage": 18 },
    { "stars": 4, "count": 2461, "percentage": 5 },
    { "stars": 3, "count": 1896, "percentage": 4 },
    { "stars": 2, "count": 3018, "percentage": 6 },
    { "stars": 1, "count": 33607, "percentage": 67 }
  ],
  "ai_review_summary": {
    "based_on_review_count": 6138,
    "summary_text": "Considering 6,138 reviews, most reviewers were ultimately let down by their experience overall. Customers frequently experience frustrating delivery delays…"
  },
  "categories": [
    { "name": "Book Store", "category_url": "/categories/book_store" },
    { "name": "Clothing Store", "category_url": "/categories/clothing_store" }
  ]
}
```

```json Reviews
{
  "reviews": [
    {
      "review_id": "6ad5d417421b2119ddc582c0",
      "review_url": "/reviews/6ad5d417421b2119ddc582c0",
      "rating": 4,
      "title": "On the whole, I'm impressed.",
      "body": "Our busy lives have meant that online shopping has been becoming more appealing. So much of their operation has been highly efficient, on almost every occasion…",
      "date_published": "2026-10-19T10:25:59.000Z",
      "label": "Unprompted review",
      "language": "en",
      "reviewer_name": "P. S.",
      "reviewer_country": "GB",
      "reviewer_profile_url": "/users/538199560000640001756da5",
      "reviewer_total_reviews": 191
    },
    {
      "review_id": "6ad65a9a832c1b3392dd0ffb",
      "review_url": "/reviews/6ad65a9a832c1b3392dd0ffb",
      "rating": 1,
      "title": "Worst Customer Support Award Goes to You",
      "body": "Amazon used to be a great place to shop, but it seems to be getting worse by the day. First, they’ve made it incredibly difficult to contact customer support…",
      "date_published": "2026-10-19T19:59:54.000Z",
      "label": "Unprompted review",
      "language": "en",
      "reviewer_name": "S. B.",
      "reviewer_country": "CA",
      "reviewer_profile_url": "/users/5a35a7240000ff000af2228d",
      "reviewer_total_reviews": 32
    }
  ]
}
```

A review page holds 20 reviews, so a spreadsheet is one `pd.json_normalize(parsed["reviews"])` away in pandas. For an LLM, ask for Markdown instead and the reviews come back as plain text.

## Scrape Trustpilot from your coding agent

Claude Code, Cursor, Codex and any MCP client can read Trustpilot reviews from a prompt.

The agent sends the same Fetch and Extract request a developer would, so it reads the JSON above. Connect the Zenrows MCP server once, or give the agent the CLI and let it run commands in the terminal.

```bash Connect the MCP server (Claude Code)
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp
```

```json MCP config (Cursor, Claude Desktop, Windsurf)
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"],
      "env": { "ZENROWS_API_KEY": "YOUR_ZENROWS_API_KEY" }
    }
  }
}
```

```bash Or run the CLI
npx -y @zenrows/cli init
zenrows extract "https://www.trustpilot.com/review/www.amazon.com"
```

```text Then ask your agent
Use Zenrows to read the first three pages of one-star reviews at
https://www.trustpilot.com/review/www.amazon.com?stars=1
Group the complaints into themes (delivery, refunds, support, account),
count each theme and quote one review per theme with its date.
```

## Scrape Trustpilot at scale with Batch and Crawl

**Batch** runs a list of Trustpilot URLs as one job, in parallel, with your own ID on each result. Put a competitor set in it for a daily TrustScore check, or list `?page=1` to `?page=50` of one company to collect its review history.

**Crawl** finds the company pages for you. Start it on a Trustpilot category, keep the links that contain `/review/`, and it returns every company page it reaches with its score and latest reviews.

```bash Batch (cURL)
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "regular",
    "status": "closed",
    "zenrows_params": { "mode": "auto", "extract": "auto" },
    "tasks": [
      { "url": "https://www.trustpilot.com/review/www.amazon.com", "external_id": "amazon" },
      { "url": "https://www.trustpilot.com/review/www.ebay.com", "external_id": "ebay" }
    ]
  }'

# Read the results when the job finishes
curl "https://async.api.zenrows.com/v1/jobs/JOB_ID/results?status=successful" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY"
```

```bash Batch (CLI)
# companies.jsonl: one {"url": "https://www.trustpilot.com/review/...", "external_id": "...", "extract": "auto"} per line
zenrows batch create companies.jsonl --wait
zenrows batch results <job-id> --out trustpilot.jsonl
```

```bash Crawl (cURL)
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.trustpilot.com/categories/clothing_store",
    "depth": 1,
    "max_pages": 200,
    "include_patterns": ["/review/"]
  }'
```

**Scheduled jobs** run the same Batch job on a timetable, on Zenrows' side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can tell your app when a run finishes, and you can pause or resume the schedule at any time, with no cron server to keep alive.

```bash Scheduled job (cURL)
# Runs every day on Zenrows' side; each run keeps its own results
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "type": "scheduled",
      "status": "closed",
      "schedule": {
        "rate": {
          "every": 1,
          "unit": "day"
        }
      },
      "zenrows_params": {
        "mode": "auto",
        "extract": "auto"
      },
      "tasks": [
        {
          "url": "https://www.trustpilot.com/review/www.amazon.com",
          "external_id": "trustpilot"
        }
      ]
    }'

# Or at set times: "schedule": { "calendar": { "times_of_day": ["09:00"],
#   "cadence": { "weekly": { "days": ["mon", "thu"] } } }, "timezone": "Europe/Madrid" }
```

## What teams do with Trustpilot data

| Use case | Data they pull | Who runs it |
|---|---|---|
| Reputation monitoring | TrustScore, review count and new one and two star reviews, daily | CX, support and PR teams |
| Competitor benchmarking | Scores and star distributions of every rival in a category | Marketing and strategy teams |
| Complaint analysis | Review text, rating and date, grouped by theme | Product, operations and CX analysts |
| Vendor and merchant due diligence | Score, claimed status, review volume and recent reviews | Procurement, risk and payments teams |
| Lead scoring and enrichment | TrustScore and review count added to a list of company domains | Sales and growth teams |
| Sentiment models and RAG | Reviews with rating labels and language codes | Data science and AI teams |

## Tips for scraping Trustpilot

- **Build URLs from the domain.** Trustpilot's company page is `/review/` plus the domain, sometimes with `www.` and sometimes without. Open one in a browser once to confirm which form a company uses.
- **Page through with `?page=`.** Each page holds 20 reviews. Loop from 1 until `reviews[]` comes back empty, and set the same `session_id` for one company's pages.
- **Filter in the URL, not in your code.** `?stars=1`, `?languages=all` and `?date=last30days` cut the pages you need before you request them.
- **Use `review_id` to dedupe.** The same review can appear on two pages if new reviews arrive while you page through, so store each ID once.
- **Read the label.** `Unprompted review` and invited reviews carry different weight in an analysis, so keep `label` next to the rating.
- **Track `reviews_last_12_months`, not only the total.** A company with a long history can hide a recent drop in volume behind a large `total_reviews`.

## Frequently asked questions

### Is it legal to scrape Trustpilot?

Collecting the public parts of Trustpilot, such as TrustScores, star distributions and review text that anyone can read, is common for reputation monitoring and research. Reviewer names and profiles are personal data under laws such as the GDPR and the CCPA, so keep only what you need, and drop or pseudonymize names when you analyze text. Check Trustpilot's terms for your use case and ask a lawyer if you are unsure.

### Is there an official Trustpilot API?

Yes, for Trustpilot's business customers. You get an API key through a Trustpilot business account, and most endpoints cover your own company: your reviews, invitations and replies. Teams that need scores and reviews of other companies, such as competitors or suppliers, collect the public pages with a scraper.

### What Trustpilot pages can I scrape?

Company review pages ( /review/<domain> ) with any of their filters and pages, and category pages ( /categories/<name> ) that list companies. Send the URL as it appears in your browser. For employer reviews, see the Glassdoor scraper , and for software reviews, the Capterra scraper .

### Can I scrape all reviews of a company?

Yes. Each page returns 20 reviews; request ?page=2 , ?page=3 and onwards to go back in time. Run the page URLs in Batch to collect a full history in one job.

### Can I get the TrustScore and star distribution only?

Yes. Keep only the paths you need, such as aggregate_rating and rating_distribution , and the response skips the reviews. That is the setup for daily score tracking across hundreds of companies.

### How do I scrape Trustpilot with Python?

Send a GET request to https://api.zenrows.com/v1/ with your API key, the company URL, Adaptive Stealth Mode and Extract, as in the Python example above. The response's parsed key holds the company, score and reviews as a dictionary. The zenrows package on PyPI wraps the same request.

### How many Trustpilot reviews can I scrape?

Send one URL per request, or a list of company and page URLs as a Batch job that runs them in parallel and keeps your own ID on each result. One Batch job accepts more than 10,000 URLs, inline or as a CSV file.

### Can AI agents scrape Trustpilot with Zenrows?

Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Ask for the companies and reviews you want in plain language and the agent calls Fetch and Extract for you.

### Can I scrape Trustpilot on a schedule?

Yes. Create a scheduled Batch job with your Trustpilot URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time.

### Which integrations work with the Trustpilot scraper?

Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. A common setup sends every new one-star review to Slack or a help desk from n8n or Make. See the integrations page for the full list.

### What format does the data come in?

JSON by default, with the structured record in parsed and the original page in html . You can also ask for the page as Markdown or plain text, which is what most LLM and RAG pipelines want.

All scrapers: https://www.zenrows.com/scrape. Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
